diff --git a/app/build.gradle b/app/build.gradle
index d875c460e8..8f19b7eedc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -22,14 +22,6 @@ jacoco {
toolVersion = "0.8.3"
}
-ext {
- powermockVersion = "1.7.3"
- dexmakerVersion = "1.2"
- retrofit2Version = '2.9.0'
- okhttp3Version = '4.7.2'
-}
-
-
repositories {
jcenter { url "https://jcenter.bintray.com/" }
mavenCentral()
@@ -128,7 +120,7 @@ android {
targetSdkVersion 28
multiDexEnabled true
versionCode 1500
- version "2.7.0"
+ version "2.7.2-dev"
buildConfigField "String", "VERSION", '"' + version + '"'
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"'
@@ -230,11 +222,9 @@ android {
allprojects {
repositories {
- jcenter()
flatDir {
dirs 'libs'
}
- maven { url 'https://jitpack.io' }
}
}
@@ -247,66 +237,11 @@ dependencies {
implementation project(':danar')
implementation project(':rileylink')
implementation project(':medtronic')
+ implementation project(':omnipod')
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.3'
- implementation 'com.google.firebase:firebase-auth:19.3.1'
- implementation 'com.google.firebase:firebase-database:19.3.1'
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation 'androidx.legacy:legacy-support-v13:1.0.0'
- implementation 'androidx.legacy:legacy-support-v4:1.0.0'
- implementation 'androidx.cardview:cardview:1.0.0'
- implementation 'androidx.biometric:biometric:1.0.1'
- implementation 'androidx.recyclerview:recyclerview:1.1.0'
- 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-ktx:${activityVersion}"
- implementation "androidx.fragment:fragment:${fragmentVersion}"
- implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
- implementation 'com.google.android.material:material:1.1.0'
-
- implementation "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
-
- implementation "com.j256.ormlite:ormlite-core:${ormLiteVersion}"
- implementation "com.j256.ormlite:ormlite-android:${ormLiteVersion}"
- implementation("com.github.tony19:logback-android-classic:1.1.1-6") {
- exclude group: "com.google.android", module: "android"
- }
- implementation 'org.apache.commons:commons-lang3:3.10'
- implementation 'org.slf4j:slf4j-api:1.7.30'
- // Graphview cannot be upgraded
- 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.4", ext: "aar")
- implementation("com.google.android:flexbox:0.3.0") {
- exclude group: "com.android.support"
- }
- implementation("io.socket:socket.io-client:1.0.0") {
- // excluding org.json which is provided by Android
- exclude group: "org.json", module: "json"
- }
- implementation "com.google.code.gson:gson:2.8.6"
- implementation('com.google.guava:guava:29.0-jre') {
- exclude group: "com.google.code.findbugs", module: "jsr305"
- }
- implementation 'com.google.code.findbugs:jsr305:3.0.2'
-
- implementation 'net.danlew:android.joda:2.10.6'
-
- implementation 'org.mozilla:rhino:1.7.12'
-
- implementation 'com.github.DavidProdinger:weekdays-selector:1.1.0'
-
- implementation 'com.github.kenglxn.QRGen:android:2.6.0'
- implementation 'com.eatthepath:java-otp:0.2.0'
-
- testImplementation "junit:junit:4.13"
+ testImplementation "junit:junit:$junit_version"
testImplementation 'org.json:json:20200518'
testImplementation "org.mockito:mockito-core:2.8.47"
testImplementation "org.powermock:powermock-api-mockito2:${powermockVersion}"
@@ -321,31 +256,16 @@ dependencies {
testImplementation "org.skyscreamer:jsonassert:1.5.0"
testImplementation "org.hamcrest:hamcrest-all:1.3"
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
-
- // new for tidepool
- implementation "com.squareup.okhttp3:okhttp:$okhttp3Version"
- implementation "com.squareup.okhttp3:logging-interceptor:$okhttp3Version"
- implementation "com.squareup.retrofit2:retrofit:$retrofit2Version"
- implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit2Version"
- implementation "com.squareup.retrofit2:converter-gson:$retrofit2Version"
-
- // Phone checker
- implementation 'com.scottyab:rootbeer-lib:0.0.8'
-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0-alpha03'
- androidTestImplementation 'androidx.test.ext:junit:1.1.1'
- androidTestImplementation 'androidx.test:rules:1.3.0-beta01'
+ androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
+ androidTestImplementation "androidx.test:rules:$androidx_rules"
androidTestImplementation 'com.google.code.findbugs:jsr305:3.0.2'
/* Dagger2 - We are going to use dagger.android which includes
* support for Activity and fragment injection so we need to include
* the following dependencies */
- implementation "com.google.dagger:dagger-android:$dagger_version"
- implementation "com.google.dagger:dagger-android-support:$dagger_version"
+
+
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
@@ -354,15 +274,6 @@ dependencies {
kapt "com.google.dagger:dagger-compiler:$dagger_version"
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
-
- //WorkManager
- implementation 'androidx.work:work-runtime:2.3.4'
- implementation 'androidx.work:work-runtime-ktx:2.3.4'
- implementation 'androidx.work:work-rxjava2:2.3.4'
-
- implementation 'com.google.androidbrowserhelper:androidbrowserhelper:1.1.0'
-
- implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
}
/*
diff --git a/app/libs/com.atech-software.android.library.wizardpager-1.1.4.aar b/app/libs/com.atech-software.android.library.wizardpager-1.1.4.aar
deleted file mode 100644
index af0c6511cf..0000000000
Binary files a/app/libs/com.atech-software.android.library.wizardpager-1.1.4.aar and /dev/null differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 96763d8274..e0e2a6b05b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
@@ -71,6 +72,10 @@
+ 60 && glucose_status.delta == 0 && glucose_status.short_avgdelta > -1 && glucose_status.short_avgdelta < 1 && glucose_status.long_avgdelta > -1 && glucose_status.long_avgdelta < 1 ) {
+ } else if ( bg > 60 && glucose_status.delta == 0 && glucose_status.short_avgdelta > -1 && glucose_status.short_avgdelta < 1 && glucose_status.long_avgdelta > -1 && glucose_status.long_avgdelta < 1 && !isSaveCgmSource) {
if ( glucose_status.last_cal && glucose_status.last_cal < 3 ) {
rT.reason = "CGM was just calibrated";
} else {
diff --git a/app/src/main/assets/revoked_certs.txt b/app/src/main/assets/revoked_certs.txt
index 41177d5667..e0d12d2a46 100644
--- a/app/src/main/assets/revoked_certs.txt
+++ b/app/src/main/assets/revoked_certs.txt
@@ -2,3 +2,5 @@
51:6D:12:67:4C:27:F4:9B:9F:E5:42:9B:01:B3:98:E4:66:2B:85:B7:A8:DD:70:32:B7:6A:D7:97:9A:0D:97:10
#Leaked
55:5D:70:C9:BE:10:41:7E:4B:01:A9:C4:C6:44:4A:F8:69:71:35:25:ED:95:23:16:C7:15:E8:EB:C6:08:FC:B1
+E0:71:A3:6E:96:60:5A:FC:B3:77:DB:2F:C4:E0:92:F3:39:A6:27:24:91:F5:7E:BB:55:9B:60:C6:CC:A3:03:41
+32:99:61:C4:A0:92:E8:D2:C7:65:04:74:04:17:7E:2D:2A:16:2A:5A:63:48:69:6A:0A:C4:53:3C:7C:78:22:95
diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.kt b/app/src/main/java/info/nightscout/androidaps/MainActivity.kt
index ff35d585ee..709e290e8d 100644
--- a/app/src/main/java/info/nightscout/androidaps/MainActivity.kt
+++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.kt
@@ -27,9 +27,10 @@ import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayoutMediator
import com.joanzapata.iconify.Iconify
import com.joanzapata.iconify.fonts.FontAwesomeModule
-import info.nightscout.androidaps.activities.ProfileHelperActivity
+import dev.doubledot.doki.ui.DokiActivity
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
import info.nightscout.androidaps.activities.PreferencesActivity
+import info.nightscout.androidaps.activities.ProfileHelperActivity
import info.nightscout.androidaps.activities.SingleFragmentActivity
import info.nightscout.androidaps.activities.StatsActivity
import info.nightscout.androidaps.events.EventAppExit
@@ -45,6 +46,8 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
import info.nightscout.androidaps.plugins.constraints.signatureVerifier.SignatureVerifierPlugin
import info.nightscout.androidaps.plugins.constraints.versionChecker.VersionCheckerUtils
+import info.nightscout.androidaps.plugins.general.maintenance.ImportExportPrefs
+import info.nightscout.androidaps.plugins.general.maintenance.PrefsFileContract
import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus
import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin
import info.nightscout.androidaps.setupwizard.SetupWizardActivity
@@ -68,6 +71,7 @@ import javax.inject.Inject
import kotlin.system.exitProcess
class MainActivity : NoSplashAppCompatActivity() {
+
private val disposable = CompositeDisposable()
@Inject lateinit var aapsLogger: AAPSLogger
@@ -87,10 +91,17 @@ class MainActivity : NoSplashAppCompatActivity() {
@Inject lateinit var constraintChecker: ConstraintChecker
@Inject lateinit var signatureVerifierPlugin: SignatureVerifierPlugin
@Inject lateinit var config: Config
+ @Inject lateinit var importExportPrefs: ImportExportPrefs
private lateinit var actionBarDrawerToggle: ActionBarDrawerToggle
private var pluginPreferencesMenuItem: MenuItem? = null
+ val callForPrefFile = registerForActivityResult(PrefsFileContract()) {
+ it?.let {
+ importExportPrefs.importSharedPreferences(this, it)
+ }
+ }
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Iconify.with(FontAwesomeModule())
@@ -126,16 +137,17 @@ class MainActivity : NoSplashAppCompatActivity() {
if (it.recreate) recreate()
else setupViews()
setWakeLock()
- }) { fabricPrivacy::logException }
+ }, fabricPrivacy::logException)
)
disposable.add(rxBus
.toObservable(EventPreferenceChange::class.java)
.observeOn(AndroidSchedulers.mainThread())
- .subscribe({ processPreferenceChange(it) }) { fabricPrivacy::logException }
+ .subscribe({ processPreferenceChange(it) }, fabricPrivacy::logException)
)
if (!sp.getBoolean(R.string.key_setupwizard_processed, false) && !isRunningRealPumpTest()) {
- val intent = Intent(this, SetupWizardActivity::class.java)
- startActivity(intent)
+ protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, {
+ startActivity(Intent(this, SetupWizardActivity::class.java))
+ })
}
androidPermission.notifyForStoragePermission(this)
androidPermission.notifyForBatteryOptimizationPermission(this)
@@ -163,8 +175,8 @@ class MainActivity : NoSplashAppCompatActivity() {
override fun onResume() {
super.onResume()
protectionCheck.queryProtection(this, ProtectionCheck.Protection.APPLICATION, null,
- UIRunnable(Runnable { OKDialog.show(this, "", resourceHelper.gs(R.string.authorizationfailed), Runnable { finish() }) }),
- UIRunnable(Runnable { OKDialog.show(this, "", resourceHelper.gs(R.string.authorizationfailed), Runnable { finish() }) })
+ UIRunnable { OKDialog.show(this, "", resourceHelper.gs(R.string.authorizationfailed)) { finish() } },
+ UIRunnable { OKDialog.show(this, "", resourceHelper.gs(R.string.authorizationfailed)) { finish() } }
)
}
@@ -183,14 +195,14 @@ class MainActivity : NoSplashAppCompatActivity() {
val pageAdapter = TabPageAdapter(this)
main_navigation_view.setNavigationItemSelectedListener { true }
val menu = main_navigation_view.menu.also { it.clear() }
- for (p in activePlugin.pluginsList) {
+ for (p in activePlugin.getPluginsList()) {
pageAdapter.registerNewFragment(p)
if (p.isEnabled() && p.hasFragment() && !p.isFragmentVisible() && !p.pluginDescription.neverVisible) {
val menuItem = menu.add(p.name)
menuItem.isCheckable = true
menuItem.setOnMenuItemClickListener {
val intent = Intent(this, SingleFragmentActivity::class.java)
- intent.putExtra("plugin", activePlugin.pluginsList.indexOf(p))
+ intent.putExtra("plugin", activePlugin.getPluginsList().indexOf(p))
startActivity(intent)
main_drawer_layout.closeDrawers()
true
@@ -228,7 +240,7 @@ class MainActivity : NoSplashAppCompatActivity() {
if (permissions.isNotEmpty()) {
if (ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED) {
when (requestCode) {
- AndroidPermission.CASE_STORAGE -> //show dialog after permission is granted
+ AndroidPermission.CASE_STORAGE -> //show dialog after permission is granted
OKDialog.show(this, "", resourceHelper.gs(R.string.alert_dialog_storage_permission_text))
AndroidPermission.CASE_LOCATION, AndroidPermission.CASE_SMS, AndroidPermission.CASE_BATTERY, AndroidPermission.CASE_PHONE_STATE, AndroidPermission.CASE_SYSTEM_WINDOW -> {
@@ -263,8 +275,8 @@ class MainActivity : NoSplashAppCompatActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
- R.id.nav_preferences -> {
- protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, Runnable {
+ R.id.nav_preferences -> {
+ protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, {
val i = Intent(this, PreferencesActivity::class.java)
i.putExtra("id", -1)
startActivity(i)
@@ -272,17 +284,19 @@ class MainActivity : NoSplashAppCompatActivity() {
return true
}
- R.id.nav_historybrowser -> {
+ R.id.nav_historybrowser -> {
startActivity(Intent(this, HistoryBrowseActivity::class.java))
return true
}
- R.id.nav_setupwizard -> {
- startActivity(Intent(this, SetupWizardActivity::class.java))
+ R.id.nav_setupwizard -> {
+ protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, {
+ startActivity(Intent(this, SetupWizardActivity::class.java))
+ })
return true
}
- R.id.nav_about -> {
+ R.id.nav_about -> {
var message = "Build: ${BuildConfig.BUILDVERSION}\n"
message += "Flavor: ${BuildConfig.FLAVOR}${BuildConfig.BUILD_TYPE}\n"
message += "${resourceHelper.gs(R.string.configbuilder_nightscoutversion_label)} ${nsSettingsStatus.nightscoutVersionName}"
@@ -295,14 +309,15 @@ class MainActivity : NoSplashAppCompatActivity() {
.setIcon(iconsProvider.getIcon())
.setMessage(messageSpanned)
.setPositiveButton(resourceHelper.gs(R.string.ok), null)
- .create().also {
- it.show()
- (it.findViewById(android.R.id.message) as TextView).movementMethod = LinkMovementMethod.getInstance()
+ .setNeutralButton(resourceHelper.gs(R.string.cta_dont_kill_my_app_info)) { _, _ -> DokiActivity.start(context = this@MainActivity) }
+ .create().apply {
+ show()
+ findViewById(android.R.id.message)?.movementMethod = LinkMovementMethod.getInstance()
}
return true
}
- R.id.nav_exit -> {
+ R.id.nav_exit -> {
aapsLogger.debug(LTag.CORE, "Exiting")
rxBus.send(EventAppExit())
finish()
@@ -312,7 +327,7 @@ class MainActivity : NoSplashAppCompatActivity() {
R.id.nav_plugin_preferences -> {
val plugin = (main_pager.adapter as TabPageAdapter).getPluginAt(main_pager.currentItem)
- protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, Runnable {
+ protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, {
val i = Intent(this, PreferencesActivity::class.java)
i.putExtra("id", plugin.preferencesId)
startActivity(i)
@@ -325,12 +340,12 @@ class MainActivity : NoSplashAppCompatActivity() {
return true
}
*/
- R.id.nav_defaultprofile -> {
+ R.id.nav_defaultprofile -> {
startActivity(Intent(this, ProfileHelperActivity::class.java))
return true
}
- R.id.nav_stats -> {
+ R.id.nav_stats -> {
startActivity(Intent(this, StatsActivity::class.java))
return true
}
diff --git a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt
index d7ffdc5358..16a870ce61 100644
--- a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt
+++ b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt
@@ -7,9 +7,6 @@ import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.os.Bundle
import androidx.annotation.XmlRes
import androidx.preference.*
-import dagger.android.AndroidInjector
-import dagger.android.DispatchingAndroidInjector
-import dagger.android.HasAndroidInjector
import dagger.android.support.AndroidSupportInjection
import info.nightscout.androidaps.Config
import info.nightscout.androidaps.R
@@ -58,9 +55,10 @@ import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
import javax.inject.Inject
-class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListener, HasAndroidInjector {
+class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListener {
private var pluginId = -1
+ private var filter = ""
@Inject lateinit var rxBus: RxBusWrapper
@Inject lateinit var resourceHelper: ResourceHelper
@@ -102,11 +100,6 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
@Inject lateinit var nsSettingStatus: NSSettingsStatus
@Inject lateinit var openHumansUploader: OpenHumansUploader
- // TODO why?
- @Inject lateinit var androidInjector: DispatchingAndroidInjector
-
- override fun androidInjector(): AndroidInjector = androidInjector
-
override fun onAttach(context: Context) {
AndroidSupportInjection.inject(this)
super.onAttach(context)
@@ -115,11 +108,13 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
override fun setArguments(args: Bundle?) {
super.setArguments(args)
pluginId = args?.getInt("id") ?: -1
+ filter = args?.getString("filter") ?: ""
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("id", pluginId)
+ outState.putString("filter", filter)
}
override fun onDestroy() {
@@ -150,6 +145,9 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
if (bundle.containsKey("id")) {
pluginId = bundle.getInt("id")
}
+ if (bundle.containsKey("filter")) {
+ filter = bundle.getString("filter") ?: ""
+ }
}
if (pluginId != -1) {
addPreferencesFromResource(pluginId, rootKey)
@@ -175,7 +173,8 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
addPreferencesFromResourceIfEnabled(localInsightPlugin, rootKey, config.PUMPDRIVERS)
addPreferencesFromResourceIfEnabled(comboPlugin, rootKey, config.PUMPDRIVERS)
addPreferencesFromResourceIfEnabled(medtronicPumpPlugin, rootKey, config.PUMPDRIVERS)
- addPreferencesFromResourceIfEnabled(virtualPumpPlugin, rootKey, !config.NSCLIENT)
+ addPreferencesFromResource(R.xml.pref_pump, rootKey, config.PUMPDRIVERS)
+ addPreferencesFromResourceIfEnabled(virtualPumpPlugin, rootKey)
addPreferencesFromResourceIfEnabled(insulinOrefFreePeakPlugin, rootKey)
addPreferencesFromResourceIfEnabled(nsClientPlugin, rootKey)
addPreferencesFromResourceIfEnabled(tidepoolPlugin, rootKey)
@@ -190,6 +189,7 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
}
initSummary(preferenceScreen, pluginId != -1)
preprocessPreferences()
+ if (filter != "") updateFilterVisibility(filter, preferenceScreen)
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
@@ -251,6 +251,10 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
}
}
+ private fun addPreferencesFromResource(@Suppress("SameParameterValue") @XmlRes preferencesResId: Int, key: String?, enabled: Boolean) {
+ if (enabled) addPreferencesFromResource(preferencesResId, key)
+ }
+
@SuppressLint("RestrictedApi")
private fun addPreferencesFromResource(@XmlRes preferencesResId: Int, key: String?) {
val xmlRoot = preferenceManager.inflateFromResource(context,
@@ -283,6 +287,33 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
}
}
+ private fun updateFilterVisibility(filter: String, p: Preference): Boolean {
+
+ var visible = false
+
+ if (p is PreferenceGroup) {
+ for (i in 0 until p.preferenceCount) {
+ visible = updateFilterVisibility(filter, p.getPreference(i)) || visible
+ }
+ if (visible && p is PreferenceCategory) {
+ p.initialExpandedChildrenCount = Int.MAX_VALUE
+ }
+ } else {
+ if (p.key != null) {
+ visible = visible || p.key.contains(filter, true)
+ }
+ if (p.title != null) {
+ visible = visible || p.title.contains(filter, true)
+ }
+ if (p.summary != null) {
+ visible = visible || p.summary.contains(filter, true)
+ }
+ }
+
+ p.isVisible = visible
+ return visible
+ }
+
private fun updatePrefSummary(pref: Preference?) {
if (pref is ListPreference) {
pref.setSummary(pref.entry)
@@ -386,4 +417,9 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
}
return super.onPreferenceTreeClick(preference)
}
+
+ fun setFilter(filter: String) {
+ this.filter = filter
+ updateFilterVisibility(filter, preferenceScreen)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.kt
index ea90f4b250..3a2fda604b 100644
--- a/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.kt
+++ b/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.kt
@@ -2,11 +2,14 @@ package info.nightscout.androidaps.activities
import android.content.Context
import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceScreen
import info.nightscout.androidaps.R
import info.nightscout.androidaps.utils.locale.LocaleHelper
import info.nightscout.androidaps.utils.resources.ResourceHelper
+import kotlinx.android.synthetic.main.activity_preferences.*
import javax.inject.Inject
class PreferencesActivity : NoSplashAppCompatActivity(), PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
@@ -14,18 +17,31 @@ class PreferencesActivity : NoSplashAppCompatActivity(), PreferenceFragmentCompa
@Inject lateinit var resourceHelper: ResourceHelper
var preferenceId = 0
+ var myPreferenceFragment: MyPreferenceFragment? = null
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_single_fragment)
+ setContentView(R.layout.activity_preferences)
+
+ pref_filter.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
+ override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
+ filterPreferences()
+ }
+
+ override fun afterTextChanged(s: Editable) {}
+ })
+
title = resourceHelper.gs(R.string.nav_preferences)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
- val myPreferenceFragment = MyPreferenceFragment()
+ myPreferenceFragment = MyPreferenceFragment()
preferenceId = intent.getIntExtra("id", -1)
val args = Bundle()
args.putInt("id", preferenceId)
- myPreferenceFragment.arguments = args
- supportFragmentManager.beginTransaction().replace(R.id.frame_layout, myPreferenceFragment).commit()
+ args.putString("filter", pref_filter.text.toString())
+ myPreferenceFragment?.arguments = args
+ supportFragmentManager.beginTransaction().replace(R.id.frame_layout, myPreferenceFragment!!).commit()
}
override fun onPreferenceStartScreen(caller: PreferenceFragmentCompat, pref: PreferenceScreen): Boolean {
@@ -44,4 +60,8 @@ class PreferencesActivity : NoSplashAppCompatActivity(), PreferenceFragmentCompa
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(LocaleHelper.wrap(newBase))
}
+
+ private fun filterPreferences() {
+ myPreferenceFragment?.setFilter(pref_filter.text.toString())
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt
index 0193b690a6..862509249e 100644
--- a/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt
+++ b/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt
@@ -9,6 +9,8 @@ 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.plugins.general.maintenance.ImportExportPrefs
+import info.nightscout.androidaps.plugins.general.maintenance.PrefsFileContract
import info.nightscout.androidaps.utils.locale.LocaleHelper
import info.nightscout.androidaps.utils.protection.ProtectionCheck
import javax.inject.Inject
@@ -16,9 +18,16 @@ import javax.inject.Inject
class SingleFragmentActivity : DaggerAppCompatActivity() {
@Inject lateinit var pluginStore: PluginStore
@Inject lateinit var protectionCheck: ProtectionCheck
+ @Inject lateinit var importExportPrefs: ImportExportPrefs
private var plugin: PluginBase? = null
+ val callForPrefFile = registerForActivityResult(PrefsFileContract()) {
+ it?.let {
+ importExportPrefs.importSharedPreferences(this, it)
+ }
+ }
+
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_single_fragment)
diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
index ef38b9e44e..679e119b21 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
@@ -417,6 +417,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
try {
getDaoBgReadings().update(bgReading);
openHumansUploader.enqueueBGReading(bgReading);
+ aapsLogger.debug(LTag.DATABASE, "BG: Updating record from: "+ bgReading.toString());
+ scheduleBgHistoryChange(bgReading.date); // trigger cache invalidation
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt
index 1c0583f042..ef728a2193 100644
--- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt
@@ -10,6 +10,7 @@ import info.nightscout.androidaps.dana.di.DanaModule
import info.nightscout.androidaps.danar.di.DanaRModule
import info.nightscout.androidaps.danars.di.DanaRSModule
import info.nightscout.androidaps.plugins.pump.common.dagger.RileyLinkModule
+import info.nightscout.androidaps.plugins.pump.omnipod.dagger.OmnipodModule
import javax.inject.Singleton
@Singleton
@@ -29,6 +30,7 @@ import javax.inject.Singleton
WizardModule::class,
RileyLinkModule::class,
MedtronicModule::class,
+ OmnipodModule::class,
APSModule::class,
PreferencesModule::class,
OverviewModule::class,
diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/CommandQueueModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/CommandQueueModule.kt
index e9339e187b..014a8de8e3 100644
--- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/CommandQueueModule.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/CommandQueueModule.kt
@@ -26,4 +26,5 @@ abstract class CommandQueueModule {
@ContributesAndroidInjector abstract fun commandTempBasalAbsoluteInjector(): CommandTempBasalAbsolute
@ContributesAndroidInjector abstract fun commandTempBasalPercentInjector(): CommandTempBasalPercent
@ContributesAndroidInjector abstract fun commandSetUserSettingsInjector(): CommandSetUserSettings
+ @ContributesAndroidInjector abstract fun commandCustomCommandInjector(): CommandCustomCommand
}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/FragmentsModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/FragmentsModule.kt
index 0af077c632..42dd3e2972 100644
--- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/FragmentsModule.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/FragmentsModule.kt
@@ -36,6 +36,7 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.dialog.RileyL
import info.nightscout.androidaps.plugins.pump.insight.LocalInsightFragment
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicFragment
import info.nightscout.androidaps.plugins.pump.medtronic.dialog.RileyLinkStatusDeviceMedtronic
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.OmnipodOverviewFragment
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpFragment
import info.nightscout.androidaps.plugins.source.BGSourceFragment
import info.nightscout.androidaps.plugins.treatments.TreatmentsFragment
@@ -67,6 +68,7 @@ abstract class FragmentsModule {
@ContributesAndroidInjector abstract fun contributesLoopFragment(): LoopFragment
@ContributesAndroidInjector abstract fun contributesMaintenanceFragment(): MaintenanceFragment
@ContributesAndroidInjector abstract fun contributesMedtronicFragment(): MedtronicFragment
+ @ContributesAndroidInjector abstract fun contributesOmnipodFragment(): OmnipodOverviewFragment
@ContributesAndroidInjector abstract fun contributesNSProfileFragment(): NSProfileFragment
@ContributesAndroidInjector abstract fun contributesNSClientFragment(): NSClientFragment
@ContributesAndroidInjector
diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt
index 75c834977a..b28073a055 100644
--- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt
@@ -31,6 +31,7 @@ import info.nightscout.androidaps.plugins.general.persistentNotification.Persist
import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin
import info.nightscout.androidaps.plugins.general.wear.WearPlugin
import info.nightscout.androidaps.plugins.general.xdripStatusline.StatusLinePlugin
+import info.nightscout.androidaps.plugins.insulin.InsulinLyumjevPlugin
import info.nightscout.androidaps.plugins.insulin.InsulinOrefFreePeakPlugin
import info.nightscout.androidaps.plugins.insulin.InsulinOrefRapidActingPlugin
import info.nightscout.androidaps.plugins.insulin.InsulinOrefUltraRapidActingPlugin
@@ -41,6 +42,7 @@ import info.nightscout.androidaps.plugins.pump.combo.ComboPlugin
import info.nightscout.androidaps.plugins.pump.insight.LocalInsightPlugin
import info.nightscout.androidaps.plugins.pump.mdi.MDIPlugin
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin
+import info.nightscout.androidaps.plugins.pump.omnipod.OmnipodPumpPlugin
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin
@@ -82,6 +84,12 @@ abstract class PluginsModule {
@IntKey(40)
abstract fun bindInsulinOrefUltraRapidActingPlugin(plugin: InsulinOrefUltraRapidActingPlugin): PluginBase
+ @Binds
+ @AllConfigs
+ @IntoMap
+ @IntKey(42)
+ abstract fun bindInsulinLyumjevPlugin(plugin: InsulinLyumjevPlugin): PluginBase
+
@Binds
@AllConfigs
@IntoMap
@@ -148,6 +156,12 @@ abstract class PluginsModule {
@IntKey(150)
abstract fun bindMedtronicPumpPlugin(plugin: MedtronicPumpPlugin): PluginBase
+ @Binds
+ @PumpDriver
+ @IntoMap
+ @IntKey(155)
+ abstract fun bindOmnipodPumpPlugin(plugin: OmnipodPumpPlugin): PluginBase
+
@Binds
@NotNSClient
@IntoMap
diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/ServicesModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/ServicesModule.kt
index ec71d8a4ad..6ba01130ae 100644
--- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/ServicesModule.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/ServicesModule.kt
@@ -10,6 +10,7 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.Riley
import info.nightscout.androidaps.plugins.pump.insight.InsightAlertService
import info.nightscout.androidaps.plugins.pump.insight.connection_service.InsightConnectionService
import info.nightscout.androidaps.plugins.pump.medtronic.service.RileyLinkMedtronicService
+import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.service.RileyLinkOmnipodService
import info.nightscout.androidaps.services.AlarmSoundService
import info.nightscout.androidaps.services.DataService
import info.nightscout.androidaps.services.LocationService
@@ -29,4 +30,5 @@ abstract class ServicesModule {
@ContributesAndroidInjector abstract fun contributesInsightConnectionService(): InsightConnectionService
@ContributesAndroidInjector abstract fun contributesRileyLinkService(): RileyLinkService
@ContributesAndroidInjector abstract fun contributesRileyLinkMedtronicService(): RileyLinkMedtronicService
+ @ContributesAndroidInjector abstract fun contributesRileyLinkOmnipodService(): RileyLinkOmnipodService
}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/SkinsModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/SkinsModule.kt
index cd71cc8fd2..feb0b2f812 100644
--- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/SkinsModule.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/SkinsModule.kt
@@ -9,6 +9,7 @@ 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 info.nightscout.androidaps.skins.SkinLowRes
import javax.inject.Qualifier
@Module
@@ -32,6 +33,12 @@ open class SkinsModule {
@IntKey(20)
fun bindsSkinLargeDisplay(skinLargeDisplay: SkinLargeDisplay): SkinInterface = skinLargeDisplay
+ @Provides
+ @Skin
+ @IntoMap
+ @IntKey(30)
+ fun bindsSkinLowRes(skinLowRes: SkinLowRes): SkinInterface = skinLowRes
+
@Qualifier
annotation class Skin
}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/CalibrationDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/CalibrationDialog.kt
index 10c10b27f5..894f017995 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/CalibrationDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/CalibrationDialog.kt
@@ -58,7 +58,7 @@ class CalibrationDialog : DialogFragmentWithDate() {
val units = profileFunction.getUnits()
val unitLabel = if (units == Constants.MMOL) resourceHelper.gs(R.string.mmol) else resourceHelper.gs(R.string.mgdl)
val actions: LinkedList = LinkedList()
- val bg = overview_calibration_bg.value
+ val bg = overview_calibration_bg?.value ?: return false
actions.add(resourceHelper.gs(R.string.treatments_wizard_bg_label) + ": " + Profile.toCurrentUnitsString(profileFunction, bg) + " " + unitLabel)
if (bg > 0) {
activity?.let { activity ->
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt
index 22ed2bb688..f911c1ef66 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt
@@ -150,7 +150,7 @@ class CarbsDialog : DialogFragmentWithDate() {
}
override fun submit(): Boolean {
- val carbs = overview_carbs_carbs.value.toInt()
+ val carbs = overview_carbs_carbs?.value?.toInt() ?: return false
val carbsAfterConstraints = constraintChecker.applyCarbsConstraints(Constraint(carbs)).value()
val units = profileFunction.getUnits()
val activityTTDuration = defaultValueHelper.determineActivityTTDuration()
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/CareDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/CareDialog.kt
index bad46290aa..3dae80e53f 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/CareDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/CareDialog.kt
@@ -122,7 +122,7 @@ class CareDialog : DialogFragmentWithDate() {
}
}
- val bg = Profile.fromMgdlToUnits(GlucoseStatus(injector).getGlucoseStatusData()?.glucose
+ val bg = Profile.fromMgdlToUnits(GlucoseStatus(injector).glucoseStatusData?.glucose
?: 0.0, profileFunction.getUnits())
val bgTextWatcher: TextWatcher = object : TextWatcher {
override fun afterTextChanged(s: Editable) {}
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/ExtendedBolusDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/ExtendedBolusDialog.kt
index 78b436269a..dce221bf9a 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/ExtendedBolusDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/ExtendedBolusDialog.kt
@@ -62,7 +62,7 @@ class ExtendedBolusDialog : DialogFragmentWithDate() {
}
override fun submit(): Boolean {
- val insulin = SafeParse.stringToDouble(actions_extendedbolus_insulin.text)
+ val insulin = SafeParse.stringToDouble(actions_extendedbolus_insulin?.text ?: return false)
val durationInMinutes = actions_extendedbolus_duration.value.toInt()
val actions: LinkedList = LinkedList()
val insulinAfterConstraint = constraintChecker.applyExtendedBolusConstraints(Constraint(insulin)).value()
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/FillDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/FillDialog.kt
index 24b2f798ea..167ee2cd84 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/FillDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/FillDialog.kt
@@ -85,7 +85,7 @@ class FillDialog : DialogFragmentWithDate() {
}
override fun submit(): Boolean {
- val insulin = SafeParse.stringToDouble(fill_insulinamount.text)
+ val insulin = SafeParse.stringToDouble(fill_insulinamount?.text ?: return false)
val actions: LinkedList = LinkedList()
val insulinAfterConstraints = constraintChecker.applyBolusConstraints(Constraint(insulin)).value()
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt
index f1c9c406db..881d5f8de0 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt
@@ -129,7 +129,7 @@ class InsulinDialog : DialogFragmentWithDate() {
override fun submit(): Boolean {
val pumpDescription = activePlugin.activePump.pumpDescription
- val insulin = SafeParse.stringToDouble(overview_insulin_amount.text)
+ val insulin = SafeParse.stringToDouble(overview_insulin_amount?.text ?: return false)
val insulinAfterConstraints = constraintChecker.applyBolusConstraints(Constraint(insulin)).value()
val actions: LinkedList = LinkedList()
val units = profileFunction.getUnits()
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/ProfileSwitchDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/ProfileSwitchDialog.kt
index 5ea091fa28..31cc463bdc 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/ProfileSwitchDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/ProfileSwitchDialog.kt
@@ -52,7 +52,7 @@ class ProfileSwitchDialog : DialogFragmentWithDate() {
overview_profileswitch_duration.setParams(savedInstanceState?.getDouble("overview_profileswitch_duration")
?: 0.0, 0.0, Constants.MAX_PROFILE_SWITCH_DURATION, 10.0, DecimalFormat("0"), false, ok)
overview_profileswitch_percentage.setParams(savedInstanceState?.getDouble("overview_profileswitch_percentage")
- ?: 100.0, Constants.CPP_MIN_PERCENTAGE.toDouble(), Constants.CPP_MAX_PERCENTAGE.toDouble(), 1.0, DecimalFormat("0"), false, ok)
+ ?: 100.0, Constants.CPP_MIN_PERCENTAGE.toDouble(), Constants.CPP_MAX_PERCENTAGE.toDouble(), 5.0, DecimalFormat("0"), false, ok)
overview_profileswitch_timeshift.setParams(savedInstanceState?.getDouble("overview_profileswitch_timeshift")
?: 0.0, Constants.CPP_MIN_TIMESHIFT.toDouble(), Constants.CPP_MAX_TIMESHIFT.toDouble(), 1.0, DecimalFormat("0"), false, ok)
@@ -91,7 +91,7 @@ class ProfileSwitchDialog : DialogFragmentWithDate() {
?: return false
val actions: LinkedList = LinkedList()
- val duration = overview_profileswitch_duration.value.toInt()
+ val duration = overview_profileswitch_duration?.value?.toInt() ?: return false
if (duration > 0)
actions.add(resourceHelper.gs(R.string.duration) + ": " + resourceHelper.gs(R.string.format_mins, duration))
val profile = overview_profileswitch_profile.selectedItem.toString()
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/TempBasalDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/TempBasalDialog.kt
index 68be68e060..cf8fad96b6 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/TempBasalDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/TempBasalDialog.kt
@@ -84,7 +84,7 @@ class TempBasalDialog : DialogFragmentWithDate() {
override fun submit(): Boolean {
var percent = 0
var absolute = 0.0
- val durationInMinutes = actions_tempbasal_duration.value.toInt()
+ val durationInMinutes = actions_tempbasal_duration?.value?.toInt() ?: return false
val profile = profileFunction.getProfile() ?: return false
val actions: LinkedList = LinkedList()
if (isPercentPump) {
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/TempTargetDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/TempTargetDialog.kt
index e4f5208471..9bdf58287f 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/TempTargetDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/TempTargetDialog.kt
@@ -116,7 +116,7 @@ class TempTargetDialog : DialogFragmentWithDate() {
override fun submit(): Boolean {
val actions: LinkedList = LinkedList()
- val reason = overview_temptarget_reason.selectedItem.toString()
+ val reason = overview_temptarget_reason?.selectedItem?.toString() ?: return false
val unitResId = if (profileFunction.getUnits() == Constants.MGDL) R.string.mgdl else R.string.mmol
val target = overview_temptarget_temptarget.value
val duration = overview_temptarget_duration.value.toInt()
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/TreatmentDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/TreatmentDialog.kt
index 429862ede9..c54f7b8378 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/TreatmentDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/TreatmentDialog.kt
@@ -94,7 +94,7 @@ class TreatmentDialog : DialogFragmentWithDate() {
override fun submit(): Boolean {
val pumpDescription = activePlugin.activePump.pumpDescription
- val insulin = SafeParse.stringToDouble(overview_treatment_insulin.text)
+ val insulin = SafeParse.stringToDouble(overview_treatment_insulin?.text ?: return false)
val carbs = SafeParse.stringToInt(overview_treatment_carbs.text)
val recordOnlyChecked = overview_treatment_record_only.isChecked
val actions: LinkedList = LinkedList()
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt
index fb28182e33..17ed64b96f 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt
@@ -108,7 +108,7 @@ class WizardDialog : DaggerDialogFragment() {
if (profileFunction.getUnits() == Constants.MGDL)
treatments_wizard_bg_input.setParams(savedInstanceState?.getDouble("treatments_wizard_bg_input")
- ?: 0.0, 0.0, 500.0, 1.0, DecimalFormat("0.0"), false, ok, textWatcher)
+ ?: 0.0, 0.0, 500.0, 1.0, DecimalFormat("0"), false, ok, textWatcher)
else
treatments_wizard_bg_input.setParams(savedInstanceState?.getDouble("treatments_wizard_bg_input")
?: 0.0, 0.0, 30.0, 0.1, DecimalFormat("0.0"), false, ok, textWatcher)
diff --git a/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.kt b/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.kt
index df22cabde6..e72154ab1c 100644
--- a/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.kt
+++ b/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.kt
@@ -8,6 +8,7 @@ import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView
+import androidx.lifecycle.lifecycleScope
import com.jjoe64.graphview.GraphView
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
@@ -37,7 +38,6 @@ 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
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.*
@@ -168,7 +168,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
if (it.cause is EventCustomCalculationFinished) {
updateGUI("EventAutosensCalculationFinished", bgOnly = false)
}
- }) { fabricPrivacy::logException }
+ }, fabricPrivacy::logException )
)
disposable.add(rxBus
.toObservable(EventAutosensBgLoaded::class.java)
@@ -178,12 +178,12 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
if (it.cause is EventCustomCalculationFinished) {
updateGUI("EventAutosensCalculationFinished", bgOnly = true)
}
- }) { fabricPrivacy::logException }
+ }, fabricPrivacy::logException )
)
disposable.add(rxBus
.toObservable(EventIobCalculationProgress::class.java)
.observeOn(AndroidSchedulers.mainThread())
- .subscribe({ overview_iobcalculationprogess?.text = it.progress }) { fabricPrivacy::logException }
+ .subscribe({ overview_iobcalculationprogess?.text = it.progress }, fabricPrivacy::logException )
)
disposable.add(rxBus
.toObservable(EventRefreshOverview::class.java)
@@ -193,7 +193,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
prepareGraphs()
updateGUI("EventRefreshOverview", bgOnly = false)
}
- }) { fabricPrivacy::logException }
+ }, fabricPrivacy::logException )
)
if (start == 0L) {
// set start of current day
@@ -256,7 +256,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
}
private fun runCalculation(from: String) {
- GlobalScope.launch(Dispatchers.Default) {
+ lifecycleScope.launch(Dispatchers.Default) {
treatmentsPluginHistory.initializeData(start - T.hours(8).msecs())
val end = start + T.hours(rangeToDisplay.toLong()).msecs()
iobCobCalculatorPluginHistory.stopCalculation(from)
@@ -273,7 +273,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
val lowLine = defaultValueHelper.determineLowLine()
val highLine = defaultValueHelper.determineHighLine()
- GlobalScope.launch(Dispatchers.Main) {
+ lifecycleScope.launch(Dispatchers.Main) {
historybrowse_noprofile?.visibility = (profile == null).toVisibility()
profile ?: return@launch
diff --git a/app/src/main/java/info/nightscout/androidaps/historyBrowser/TreatmentsPluginHistory.kt b/app/src/main/java/info/nightscout/androidaps/historyBrowser/TreatmentsPluginHistory.kt
index caa0fb1b1a..f9d0a4019b 100644
--- a/app/src/main/java/info/nightscout/androidaps/historyBrowser/TreatmentsPluginHistory.kt
+++ b/app/src/main/java/info/nightscout/androidaps/historyBrowser/TreatmentsPluginHistory.kt
@@ -7,6 +7,7 @@ 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.general.nsclient.UploadQueue
import info.nightscout.androidaps.plugins.treatments.TreatmentService
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
import info.nightscout.androidaps.utils.DateUtil
@@ -27,8 +28,10 @@ class TreatmentsPluginHistory @Inject constructor(
profileFunction: ProfileFunction,
activePlugin: ActivePluginProvider,
nsUpload: NSUpload,
- fabricPrivacy: FabricPrivacy, dateUtil: DateUtil
-) : TreatmentsPlugin(injector, aapsLogger, rxBus, resourceHelper, context, sp, profileFunction, activePlugin, nsUpload, fabricPrivacy, dateUtil) {
+ fabricPrivacy: FabricPrivacy,
+ dateUtil: DateUtil,
+ uploadQueue: UploadQueue
+) : TreatmentsPlugin(injector, aapsLogger, rxBus, resourceHelper, context, sp, profileFunction, activePlugin, nsUpload, fabricPrivacy, dateUtil, uploadQueue) {
init {
onStart()
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java
index 0040dbc6fc..af8f4e3125 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java
@@ -22,6 +22,7 @@ import javax.inject.Singleton;
import dagger.Lazy;
import dagger.android.HasAndroidInjector;
import info.nightscout.androidaps.BuildConfig;
+import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp;
@@ -55,10 +56,10 @@ import info.nightscout.androidaps.plugins.aps.loop.events.EventLoopUpdateGui;
import info.nightscout.androidaps.plugins.aps.loop.events.EventNewOpenLoopNotification;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
+import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
-import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.plugins.general.wear.ActionStringHandler;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished;
@@ -95,9 +96,8 @@ public class LoopPlugin extends PluginBase implements LoopInterface {
private final FabricPrivacy fabricPrivacy;
private final NSUpload nsUpload;
private final HardLimits hardLimits;
- private Notification notification;
- private CompositeDisposable disposable = new CompositeDisposable();
+ private final CompositeDisposable disposable = new CompositeDisposable();
private static final String CHANNEL_ID = "AndroidAPS-Openloop";
@@ -126,6 +126,7 @@ public class LoopPlugin extends PluginBase implements LoopInterface {
AAPSLogger aapsLogger,
RxBusWrapper rxBus,
SP sp,
+ Config config,
ConstraintChecker constraintChecker,
ResourceHelper resourceHelper,
ProfileFunction profileFunction,
@@ -147,6 +148,7 @@ public class LoopPlugin extends PluginBase implements LoopInterface {
.pluginName(R.string.loop)
.shortName(R.string.loop_shortname)
.preferencesId(R.xml.pref_loop)
+ .enableByDefault(config.getAPS())
.description(R.string.description_loop),
aapsLogger, resourceHelper, injector
);
@@ -415,7 +417,7 @@ public class LoopPlugin extends PluginBase implements LoopInterface {
resultAfterConstraints.smb = 0;
}
- if (lastRun != null) {
+ if (lastRun != null && lastRun.getConstraintsProcessed() != null) {
prevCarbsreq = lastRun.getConstraintsProcessed().carbsReq;
}
@@ -551,6 +553,9 @@ public class LoopPlugin extends PluginBase implements LoopInterface {
rxBus.send(new EventLoopUpdateGui());
}
});
+ } else {
+ lastRun.setTbrSetByPump(result);
+ lastRun.setLastTBRRequest(lastRun.getLastAPSRun());
}
rxBus.send(new EventLoopUpdateGui());
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSAMA/DetermineBasalAdapterAMAJS.java
index a5b4fdff9b..a6876a3144 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSAMA/DetermineBasalAdapterAMAJS.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSAMA/DetermineBasalAdapterAMAJS.java
@@ -40,7 +40,7 @@ import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
import info.nightscout.androidaps.utils.sharedPreferences.SP;
public class DetermineBasalAdapterAMAJS {
- private HasAndroidInjector injector;
+ private final HasAndroidInjector injector;
@Inject AAPSLogger aapsLogger;
@Inject ConstraintChecker constraintChecker;
@Inject SP sp;
@@ -48,7 +48,7 @@ public class DetermineBasalAdapterAMAJS {
@Inject TreatmentsPlugin treatmentsPlugin;
@Inject OpenHumansUploader openHumansUploader;
- private ScriptReader mScriptReader;
+ private final ScriptReader mScriptReader;
private JSONObject mProfile;
private JSONObject mGlucoseStatus;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSAMA/OpenAPSAMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSAMA/OpenAPSAMAPlugin.java
index 0cb082f368..25d3981c47 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSAMA/OpenAPSAMAPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSAMA/OpenAPSAMAPlugin.java
@@ -189,9 +189,9 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface {
}
- if (!hardLimits.checkOnlyHardLimits(profile.getDia(), "dia", hardLimits.getMINDIA(), hardLimits.getMAXDIA()))
+ if (!hardLimits.checkOnlyHardLimits(profile.getDia(), "dia", hardLimits.minDia(), hardLimits.maxDia()))
return;
- if (!hardLimits.checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", hardLimits.getMINIC(), hardLimits.getMAXIC()))
+ if (!hardLimits.checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", hardLimits.minIC(), hardLimits.maxIC()))
return;
if (!hardLimits.checkOnlyHardLimits(profile.getIsfMgdl(), "sens", hardLimits.getMINISF(), hardLimits.getMAXISF()))
return;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java
index 058ae596bd..1013434c95 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java
@@ -55,7 +55,7 @@ public class DetermineBasalAdapterSMBJS {
@Inject OpenHumansUploader openHumansUploader;
- private ScriptReader mScriptReader;
+ private final ScriptReader mScriptReader;
private JSONObject mProfile;
private JSONObject mGlucoseStatus;
private JSONArray mIobData;
@@ -65,6 +65,7 @@ public class DetermineBasalAdapterSMBJS {
private boolean mMicrobolusAllowed;
private boolean mSMBAlwaysAllowed;
private long mCurrentTime;
+ private boolean mIsSaveCgmSource;
private String storedCurrentTemp = null;
private String storedIobData = null;
@@ -108,6 +109,7 @@ public class DetermineBasalAdapterSMBJS {
aapsLogger.debug(LTag.APS, "MicroBolusAllowed: " + (storedMicroBolusAllowed = "" + mMicrobolusAllowed));
aapsLogger.debug(LTag.APS, "SMBAlwaysAllowed: " + (storedSMBAlwaysAllowed = "" + mSMBAlwaysAllowed));
aapsLogger.debug(LTag.APS, "CurrentTime: " + (storedCurrentTime = "" + mCurrentTime));
+ aapsLogger.debug(LTag.APS, "isSaveCgmSource: " + mIsSaveCgmSource);
DetermineBasalResultSMB determineBasalResultSMB = null;
@@ -237,7 +239,8 @@ public class DetermineBasalAdapterSMBJS {
boolean tempTargetSet,
boolean microBolusAllowed,
boolean uamAllowed,
- boolean advancedFiltering
+ boolean advancedFiltering,
+ boolean isSaveCgmSource
) throws JSONException {
String units = profile.getUnits();
@@ -282,7 +285,7 @@ public class DetermineBasalAdapterSMBJS {
mProfile.put("A52_risk_enable", SMBDefaults.A52_risk_enable);
boolean smbEnabled = sp.getBoolean(resourceHelper.gs(R.string.key_use_smb), false);
- mProfile.put("SMBInterval", sp.getInt("key_smbinterval", SMBDefaults.SMBInterval));
+ mProfile.put("SMBInterval", sp.getInt(R.string.key_smbinterval, SMBDefaults.SMBInterval));
mProfile.put("enableSMB_with_COB", smbEnabled && sp.getBoolean(R.string.key_enableSMB_with_COB, false));
mProfile.put("enableSMB_with_temptarget", smbEnabled && sp.getBoolean(R.string.key_enableSMB_with_temptarget, false));
mProfile.put("allowSMB_with_high_temptarget", smbEnabled && sp.getBoolean(R.string.key_allowSMB_with_high_temptarget, false));
@@ -354,6 +357,7 @@ public class DetermineBasalAdapterSMBJS {
mCurrentTime = now;
+ mIsSaveCgmSource = isSaveCgmSource;
}
private Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.java
index 3e54eb8a3a..e631a84955 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.java
@@ -220,9 +220,9 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface, Constr
}
- if (!hardLimits.checkOnlyHardLimits(profile.getDia(), "dia", hardLimits.getMINDIA(), hardLimits.getMAXDIA()))
+ if (!hardLimits.checkOnlyHardLimits(profile.getDia(), "dia", hardLimits.minDia(), hardLimits.maxDia()))
return;
- if (!hardLimits.checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", hardLimits.getMINIC(), hardLimits.getMAXIC()))
+ if (!hardLimits.checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", hardLimits.minIC(), hardLimits.maxIC()))
return;
if (!hardLimits.checkOnlyHardLimits(profile.getIsfMgdl(), "sens", hardLimits.getMINISF(), hardLimits.getMAXISF()))
return;
@@ -270,7 +270,8 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface, Constr
isTempTarget,
smbAllowed.value(),
uam.value(),
- advancedFiltering.value()
+ advancedFiltering.value(),
+ activePlugin.getActiveBgSource().getClass().getSimpleName().equals("DexcomPlugin")
);
} catch (JSONException e) {
fabricPrivacy.logException(e);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderFragment.kt
index 3badb56824..09bbf3c04d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderFragment.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderFragment.kt
@@ -5,12 +5,9 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.widget.CheckBox
-import android.widget.ImageButton
-import android.widget.LinearLayout
-import android.widget.RadioButton
-import android.widget.TextView
+import android.widget.*
import androidx.annotation.StringRes
+import androidx.core.content.ContextCompat
import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.Config
import info.nightscout.androidaps.R
@@ -129,6 +126,7 @@ class ConfigBuilderFragment : DaggerFragment() {
val baseView: LinearLayout = fragment.layoutInflater.inflate(R.layout.configbuilder_single_plugin, null) as LinearLayout
private val enabledExclusive: RadioButton
private val enabledInclusive: CheckBox
+ private val pluginIcon: ImageView
private val pluginName: TextView
private val pluginDescription: TextView
private val pluginPreferences: ImageButton
@@ -137,6 +135,7 @@ class ConfigBuilderFragment : DaggerFragment() {
init {
enabledExclusive = baseView.findViewById(R.id.plugin_enabled_exclusive)
enabledInclusive = baseView.findViewById(R.id.plugin_enabled_inclusive)
+ pluginIcon = baseView.findViewById(R.id.plugin_icon)
pluginName = baseView.findViewById(R.id.plugin_name)
pluginDescription = baseView.findViewById(R.id.plugin_description)
pluginPreferences = baseView.findViewById(R.id.plugin_preferences)
@@ -175,6 +174,12 @@ class ConfigBuilderFragment : DaggerFragment() {
enabledInclusive.isChecked = plugin.isEnabled(pluginType)
enabledInclusive.isEnabled = !plugin.pluginDescription.alwaysEnabled
enabledExclusive.isEnabled = !plugin.pluginDescription.alwaysEnabled
+ if(plugin.menuIcon != -1) {
+ pluginIcon.visibility = View.VISIBLE
+ pluginIcon.setImageDrawable(context?.let { ContextCompat.getDrawable(it, plugin.menuIcon) })
+ } else {
+ pluginIcon.visibility = View.GONE
+ }
pluginName.text = plugin.name
if (plugin.description == null)
pluginDescription.visibility = View.GONE
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.kt
index 598ddf085f..58d31eb29b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.kt
@@ -46,17 +46,17 @@ class ConfigBuilderPlugin @Inject constructor(
}
private fun setAlwaysEnabledPluginsEnabled() {
- for (plugin in activePlugin.pluginsList) {
+ for (plugin in activePlugin.getPluginsList()) {
if (plugin.pluginDescription.alwaysEnabled) plugin.setPluginEnabled(plugin.getType(), true)
}
storeSettings("setAlwaysEnabledPluginsEnabled")
}
override fun storeSettings(from: String) {
- activePlugin.pluginsList
+ activePlugin.getPluginsList()
aapsLogger.debug(LTag.CONFIGBUILDER, "Storing settings from: $from")
activePlugin.verifySelectionInCategories()
- for (p in activePlugin.pluginsList) {
+ for (p in activePlugin.getPluginsList()) {
val type = p.getType()
if (p.pluginDescription.alwaysEnabled && p.pluginDescription.alwaysVisible) continue
if (p.pluginDescription.alwaysEnabled && p.pluginDescription.neverVisible) continue
@@ -82,7 +82,7 @@ class ConfigBuilderPlugin @Inject constructor(
private fun loadSettings() {
aapsLogger.debug(LTag.CONFIGBUILDER, "Loading stored settings")
- for (p in activePlugin.pluginsList) {
+ for (p in activePlugin.getPluginsList()) {
val type = p.getType()
loadPref(p, type, true)
if (p.getType() == PluginType.PUMP) {
@@ -110,7 +110,7 @@ class ConfigBuilderPlugin @Inject constructor(
}
fun logPluginStatus() {
- for (p in activePlugin.pluginsList) {
+ for (p in activePlugin.getPluginsList()) {
aapsLogger.debug(LTag.CONFIGBUILDER, p.name + ":" +
(if (p.isEnabled(PluginType.GENERAL)) " GENERAL" else "") +
(if (p.isEnabled(PluginType.TREATMENT)) " TREATMENT" else "") +
@@ -147,7 +147,7 @@ class ConfigBuilderPlugin @Inject constructor(
}
}
- fun performPluginSwitch(changedPlugin: PluginBase, enabled: Boolean, type: PluginType) {
+ override fun performPluginSwitch(changedPlugin: PluginBase, enabled: Boolean, type: PluginType) {
changedPlugin.setPluginEnabled(type, enabled)
changedPlugin.setFragmentVisible(type, enabled)
processOnEnabledCategoryChanged(changedPlugin, type)
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/PluginStore.kt b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/PluginStore.kt
index 3958f17d78..05b020fac4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/PluginStore.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/PluginStore.kt
@@ -15,13 +15,13 @@ class PluginStore @Inject constructor(
lateinit var plugins: List<@JvmSuppressWildcards PluginBase>
- private var activeBgSource: BgSourceInterface? = null
- private var activePump: PumpInterface? = null
+ private var activeBgSourceStore: BgSourceInterface? = null
+ private var activePumpStore: PumpInterface? = null
private var activeProfile: ProfileInterface? = null
- private var activeAPS: APSInterface? = null
- private var activeInsulin: InsulinInterface? = null
- private var activeSensitivity: SensitivityInterface? = null
- private var activeTreatments: TreatmentsInterface? = null
+ private var activeAPSStore: APSInterface? = null
+ private var activeInsulinStore: InsulinInterface? = null
+ private var activeSensitivityStore: SensitivityInterface? = null
+ private var activeTreatmentsStore: TreatmentsInterface? = null
fun loadDefaults() {
verifySelectionInCategories()
@@ -71,34 +71,34 @@ class PluginStore @Inject constructor(
// PluginType.APS
if (!config.NSCLIENT && !config.PUMPCONTROL) {
pluginsInCategory = getSpecificPluginsList(PluginType.APS)
- activeAPS = getTheOneEnabledInArray(pluginsInCategory, PluginType.APS) as APSInterface?
- if (activeAPS == null) {
- activeAPS = getDefaultPlugin(PluginType.APS) as APSInterface
- (activeAPS as PluginBase).setPluginEnabled(PluginType.APS, true)
+ activeAPSStore = getTheOneEnabledInArray(pluginsInCategory, PluginType.APS) as APSInterface?
+ if (activeAPSStore == null) {
+ activeAPSStore = getDefaultPlugin(PluginType.APS) as APSInterface
+ (activeAPSStore as PluginBase).setPluginEnabled(PluginType.APS, true)
aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting APSInterface")
}
- setFragmentVisiblities((activeAPS as PluginBase).name, pluginsInCategory, PluginType.APS)
+ setFragmentVisiblities((activeAPSStore as PluginBase).name, pluginsInCategory, PluginType.APS)
}
// PluginType.INSULIN
pluginsInCategory = getSpecificPluginsList(PluginType.INSULIN)
- activeInsulin = getTheOneEnabledInArray(pluginsInCategory, PluginType.INSULIN) as InsulinInterface?
- if (activeInsulin == null) {
- activeInsulin = getDefaultPlugin(PluginType.INSULIN) as InsulinInterface
- (activeInsulin as PluginBase).setPluginEnabled(PluginType.INSULIN, true)
+ activeInsulinStore = getTheOneEnabledInArray(pluginsInCategory, PluginType.INSULIN) as InsulinInterface?
+ if (activeInsulinStore == null) {
+ activeInsulinStore = getDefaultPlugin(PluginType.INSULIN) as InsulinInterface
+ (activeInsulinStore as PluginBase).setPluginEnabled(PluginType.INSULIN, true)
aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting InsulinInterface")
}
- setFragmentVisiblities((activeInsulin as PluginBase).name, pluginsInCategory, PluginType.INSULIN)
+ setFragmentVisiblities((activeInsulinStore as PluginBase).name, pluginsInCategory, PluginType.INSULIN)
// PluginType.SENSITIVITY
pluginsInCategory = getSpecificPluginsList(PluginType.SENSITIVITY)
- activeSensitivity = getTheOneEnabledInArray(pluginsInCategory, PluginType.SENSITIVITY) as SensitivityInterface?
- if (activeSensitivity == null) {
- activeSensitivity = getDefaultPlugin(PluginType.SENSITIVITY) as SensitivityInterface
- (activeSensitivity as PluginBase).setPluginEnabled(PluginType.SENSITIVITY, true)
+ activeSensitivityStore = getTheOneEnabledInArray(pluginsInCategory, PluginType.SENSITIVITY) as SensitivityInterface?
+ if (activeSensitivityStore == null) {
+ activeSensitivityStore = getDefaultPlugin(PluginType.SENSITIVITY) as SensitivityInterface
+ (activeSensitivityStore as PluginBase).setPluginEnabled(PluginType.SENSITIVITY, true)
aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting SensitivityInterface")
}
- setFragmentVisiblities((activeSensitivity as PluginBase).name, pluginsInCategory, PluginType.SENSITIVITY)
+ setFragmentVisiblities((activeSensitivityStore as PluginBase).name, pluginsInCategory, PluginType.SENSITIVITY)
// PluginType.PROFILE
pluginsInCategory = getSpecificPluginsList(PluginType.PROFILE)
@@ -112,33 +112,33 @@ class PluginStore @Inject constructor(
// PluginType.BGSOURCE
pluginsInCategory = getSpecificPluginsList(PluginType.BGSOURCE)
- activeBgSource = getTheOneEnabledInArray(pluginsInCategory, PluginType.BGSOURCE) as BgSourceInterface?
- if (activeBgSource == null) {
- activeBgSource = getDefaultPlugin(PluginType.BGSOURCE) as BgSourceInterface
- (activeBgSource as PluginBase).setPluginEnabled(PluginType.BGSOURCE, true)
+ activeBgSourceStore = getTheOneEnabledInArray(pluginsInCategory, PluginType.BGSOURCE) as BgSourceInterface?
+ if (activeBgSourceStore == null) {
+ activeBgSourceStore = getDefaultPlugin(PluginType.BGSOURCE) as BgSourceInterface
+ (activeBgSourceStore as PluginBase).setPluginEnabled(PluginType.BGSOURCE, true)
aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting BgInterface")
}
- setFragmentVisiblities((activeBgSource as PluginBase).name, pluginsInCategory, PluginType.PUMP)
+ setFragmentVisiblities((activeBgSourceStore as PluginBase).name, pluginsInCategory, PluginType.PUMP)
// PluginType.PUMP
pluginsInCategory = getSpecificPluginsList(PluginType.PUMP)
- activePump = getTheOneEnabledInArray(pluginsInCategory, PluginType.PUMP) as PumpInterface?
- if (activePump == null) {
- activePump = getDefaultPlugin(PluginType.PUMP) as PumpInterface
- (activePump as PluginBase).setPluginEnabled(PluginType.PUMP, true)
+ activePumpStore = getTheOneEnabledInArray(pluginsInCategory, PluginType.PUMP) as PumpInterface?
+ if (activePumpStore == null) {
+ activePumpStore = getDefaultPlugin(PluginType.PUMP) as PumpInterface
+ (activePumpStore as PluginBase).setPluginEnabled(PluginType.PUMP, true)
aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting PumpInterface")
}
- setFragmentVisiblities((activePump as PluginBase).name, pluginsInCategory, PluginType.PUMP)
+ setFragmentVisiblities((activePumpStore as PluginBase).name, pluginsInCategory, PluginType.PUMP)
// PluginType.TREATMENT
pluginsInCategory = getSpecificPluginsList(PluginType.TREATMENT)
- activeTreatments = getTheOneEnabledInArray(pluginsInCategory, PluginType.TREATMENT) as TreatmentsInterface?
- if (activeTreatments == null) {
- activeTreatments = getDefaultPlugin(PluginType.TREATMENT) as TreatmentsInterface
- (activeTreatments as PluginBase).setPluginEnabled(PluginType.TREATMENT, true)
+ activeTreatmentsStore = getTheOneEnabledInArray(pluginsInCategory, PluginType.TREATMENT) as TreatmentsInterface?
+ if (activeTreatmentsStore == null) {
+ activeTreatmentsStore = getDefaultPlugin(PluginType.TREATMENT) as TreatmentsInterface
+ (activeTreatmentsStore as PluginBase).setPluginEnabled(PluginType.TREATMENT, true)
aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting PumpInterface")
}
- setFragmentVisiblities((activeTreatments as PluginBase).name, pluginsInCategory, PluginType.TREATMENT)
+ setFragmentVisiblities((activeTreatmentsStore as PluginBase).name, pluginsInCategory, PluginType.TREATMENT)
}
/**
@@ -203,27 +203,31 @@ class PluginStore @Inject constructor(
// ***** Interface *****
- override fun getActiveBgSource(): BgSourceInterface {
- return activeBgSource ?: checkNotNull(activeBgSource) { "No bg source selected" }
- }
+ override val activeBgSource: BgSourceInterface
+ get() = activeBgSourceStore ?: checkNotNull(activeBgSourceStore) { "No bg source selected" }
- override fun getActiveProfileInterface(): ProfileInterface =
- activeProfile ?: checkNotNull(activeProfile) { "No profile selected" }
+ override val activeProfileInterface: ProfileInterface
+ get() = activeProfile ?: checkNotNull(activeProfile) { "No profile selected" }
- override fun getActiveInsulin(): InsulinInterface =
- activeInsulin ?: checkNotNull(activeInsulin) { "No insulin selected" }
+ override val activeInsulin: InsulinInterface
+ get() = activeInsulinStore ?: checkNotNull(activeInsulinStore) { "No insulin selected" }
- override fun getActiveAPS(): APSInterface =
- activeAPS ?: checkNotNull(activeAPS) { "No APS selected" }
+ override val activeAPS: APSInterface
+ get() = activeAPSStore ?: checkNotNull(activeAPSStore) { "No APS selected" }
- override fun getActivePump(): PumpInterface =
- activePump ?: checkNotNull(activePump) { "No pump selected" }
+ override val activePump: PumpInterface
+ get() = activePumpStore ?: checkNotNull(activePumpStore) { "No pump selected" }
- override fun getActiveSensitivity(): SensitivityInterface =
- activeSensitivity ?: checkNotNull(activeSensitivity) { "No sensitivity selected" }
+ override val activeSensitivity: SensitivityInterface
+ get() = activeSensitivityStore
+ ?: checkNotNull(activeSensitivityStore) { "No sensitivity selected" }
- override fun getActiveTreatments(): TreatmentsInterface =
- activeTreatments ?: checkNotNull(activeTreatments) { "No treatments selected" }
+ override val activeTreatments: TreatmentsInterface
+ get() = activeTreatmentsStore
+ ?: checkNotNull(activeTreatmentsStore) { "No treatments selected" }
+
+ override val activeOverview: OverviewInterface
+ get() = getSpecificPluginsListByInterface(OverviewInterface::class.java).first() as OverviewInterface
override fun getPluginsList(): ArrayList = ArrayList(plugins)
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/events/EventConfigBuilderUpdateGui.kt b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/events/EventConfigBuilderUpdateGui.kt
index 26904127dd..8d24c912ad 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/events/EventConfigBuilderUpdateGui.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/events/EventConfigBuilderUpdateGui.kt
@@ -2,5 +2,4 @@ package info.nightscout.androidaps.plugins.configBuilder.events
import info.nightscout.androidaps.events.EventUpdateGui
-class EventConfigBuilderUpdateGui : EventUpdateGui() {
-}
\ No newline at end of file
+class EventConfigBuilderUpdateGui : EventUpdateGui()
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt
index cc57908438..1c33eb7a2f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt
@@ -1,6 +1,6 @@
package info.nightscout.androidaps.plugins.constraints.objectives
-import android.app.Activity
+import androidx.fragment.app.FragmentActivity
import com.google.common.base.Charsets
import com.google.common.hash.Hashing
import dagger.android.HasAndroidInjector
@@ -116,7 +116,7 @@ class ObjectivesPlugin @Inject constructor(
sp.putBoolean(R.string.key_objectiveusescale, false)
}
- fun completeObjectives(activity: Activity, request: String) {
+ fun completeObjectives(activity: FragmentActivity, request: String) {
val requestCode = sp.getString(R.string.key_objectives_request_code, "")
var url = sp.getString(R.string.key_nsclientinternal_url, "").toLowerCase(Locale.getDefault())
if (!url.endsWith("/")) url = "$url/"
@@ -145,7 +145,7 @@ class ObjectivesPlugin @Inject constructor(
}
}
- fun allPriorAccomplished(position: Int) : Boolean {
+ fun allPriorAccomplished(position: Int): Boolean {
var accomplished = true
for (i in 0 until position) {
accomplished = accomplished && objectives[i].isAccomplished
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective.java b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective.java
index c15e1f8599..feef4a4222 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective.java
@@ -8,6 +8,7 @@ import android.widget.CheckBox;
import android.widget.TextView;
import androidx.annotation.StringRes;
+import androidx.fragment.app.FragmentActivity;
import java.util.ArrayList;
import java.util.List;
@@ -25,9 +26,9 @@ public abstract class Objective {
@Inject public SP sp;
@Inject public ResourceHelper resourceHelper;
- private String spName;
- @StringRes private int objective;
- @StringRes private int gate;
+ private final String spName;
+ @StringRes private final int objective;
+ @StringRes private final int gate;
private long startedOn;
private long accomplishedOn;
List tasks = new ArrayList<>();
@@ -110,12 +111,12 @@ public abstract class Objective {
return true;
}
- public void specialAction(Activity activity, String input) {
+ public void specialAction(FragmentActivity activity, String input) {
}
public abstract class Task {
@StringRes
- private int task;
+ private final int task;
private Objective objective;
ArrayList hints = new ArrayList<>();
@@ -137,8 +138,6 @@ public abstract class Objective {
return isCompleted();
}
- ;
-
public String getProgress() {
return resourceHelper.gs(isCompleted() ? R.string.completed_well_done : R.string.not_completed_yet);
}
@@ -159,7 +158,7 @@ public abstract class Objective {
public class MinimumDurationTask extends Task {
- private long minimumDuration;
+ private final long minimumDuration;
MinimumDurationTask(long minimumDuration) {
super(R.string.time_elapsed);
@@ -196,7 +195,7 @@ public abstract class Objective {
@StringRes
int question;
ArrayListDein Telefon lädt nun Daten zu Open Human hoch.Einrichtung fehlgeschlagenEs gab einen Fehler. Bitte logge Dich erneut ein, um fortzufahren. Entschuldigung & Danke!
- Dies ist ein Open-Source-Tool, das Deine Daten nach Open Humans kopiert. Wir behalten uns keine Rechte vor, Deine Daten ohne Deine ausdrückliche Genehmigung an Dritte weiterzugeben. Die Daten, die das Projekt und die Anwendung erhalten, werden über eine zufällige Benutzer-ID identifiziert und nur dann sicher auf ein Open Humans-Konto übertragen, wenn Du diesem Vorgang zugestimmt habst. Du kannst das Hochladen beenden und Deine hochgeladenen Daten jederzeit über www.openhumans.org löschen.
+ Dies ist ein Open-Source-Tool, das Deine Daten zu Open Humans hochlädt. Wir behalten uns keine Rechte vor, Deine Daten ohne Deine ausdrückliche Genehmigung an Dritte weiterzugeben. Die Daten, die das Projekt und die Anwendung erhalten, werden über eine zufällige Benutzer-ID identifiziert und nur nach Deiner Zustimmung sicher auf ein Open Humans-Konto übertragen. Du kannst das Hochladen beenden und Deine hochgeladenen Daten jederzeit über www.openhumans.org löschen.Verstanden und akzeptiert. LoginLogout
@@ -1215,4 +1177,8 @@ Unerwartetes Verhalten.Worker State: %sDaten hochgeladenDie folgenden Daten werden auf Dein Open Humans-Konto hochgeladen: Glukosewerte, Boli, Kohlenhydrate, Careportal-Ereignisse (außer Notizen), erweiterte Boli, Profilwechsel, Gesamttagesdosen, temporäre Basalwerte, Temporäre Ziele, Einstellungen, Anwendungsversion, Gerätemodell und Bildschirmabmessungen. Vertrauliche oder private Informationen wie z.B. Deine Nightscout-URL oder Dein API-Secret werden nicht hochgeladen.
+ RileyLink Status:
+ Filter
+ Lokales Profil kann nicht erstellt werden. Profil ist ungültig.
+ Don\'t kill my app?
diff --git a/app/src/main/res/values-el-rGR/exam.xml b/app/src/main/res/values-el-rGR/exam.xml
index b65ee7b54a..276f8a8ab7 100644
--- a/app/src/main/res/values-el-rGR/exam.xml
+++ b/app/src/main/res/values-el-rGR/exam.xml
@@ -16,7 +16,6 @@
Το προφίλ NS μπορεί να χρησιμοποιηθεί, αλλά όχι να ρυθμιστεί.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileΘέμα: Αποσύνδεση από την Αντλία
- Τι πρέπει να γίνει όταν αποσυνδέεται η αντλία;Πατήστε το κουμπί \"Αποσύνδεση αντλίας\", έτσι ώστε το AAPS να ξέρει ότι δεν χορηγείται ινσουλίνη.Πατήστε το κουμπί \"Αναστολή κυκλώματος\", έτσι ώστε το AAPS να σταματά το κύκλωμα, ενώ η αντλία είναι αποσυνδεδεμένη.Μην αλλάζετετίποτα στο AAPS, απλά αποσυνδέστε την αντλία.
@@ -131,8 +130,6 @@
Υψηλή αναλογία IC οδηγεί σε λιγότερη χορήγηση ινσουλίνης για μια δεδομένη ποσότητα υδατανθράκων.Μικρή αναλογία IC οδηγεί σε λιγότερη χορήγηση ινσουλίνης για μια δεδομένη ποσότητα υδατανθράκων.Αν έχετε 0 COB Ενεργούς Υδατ., αλλάζοντας την αναλογία IC θα οδηγήσει σε μια διαφορετική ποσότητα ινσουλίνης για να διορθωθεί μια συγκεκριμένη τιμή BG.
- Το IC θα είναι διαφορετικό αν υπολογίζετε το ψωμί ως 10g ή 12g.
- Η έννοια του IC είναι: Πόσες φέτες ψωμί καλύπτονται από 1 μονάδα ινσουλίνης.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uΘέμα: Αλλαγή Προφίλ Όταν καθορίζεται 90% στην αλλαγή προφίλ…
diff --git a/app/src/main/res/values-el-rGR/objectives.xml b/app/src/main/res/values-el-rGR/objectives.xml
index 3bad200cdb..7757690cff 100644
--- a/app/src/main/res/values-el-rGR/objectives.xml
+++ b/app/src/main/res/values-el-rGR/objectives.xml
@@ -1,6 +1,5 @@
- ΠίσωΈναρξηΕπικύρωση%1$d. Στόχος
diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml
index cd6f51b85b..06af6c0c3d 100644
--- a/app/src/main/res/values-el-rGR/strings.xml
+++ b/app/src/main/res/values-el-rGR/strings.xml
@@ -24,14 +24,12 @@
Σας επιτρέπει να ορίσετε το μέγιστο της δράσης της ινσουλίνης και πρέπει να χρησιμοποιείται μόνο από προχωρημένους χρήστεςΕνεργοποιήστε ή απενεργοποιήστε την εφαρμογή που ενεργοποιεί το κύκλωμα.Συγχρονίζει τα δεδομένα σας με το Nightscout
- Κατάσταση του αλγόριθμου για το 2016Κατάσταση του αλγόριθμου για το 2017Ο πιο πρόσφατος αλγόριθμος για προχωρημένους χρήστεςΕμφανίζει την τρέχουσα κατάσταση του κυκλώματός σας και τα πλήκτρα για τις πιο κοινές ενέργειεςΕμφανίζει μία τρέχουσα ειδοποίηση με σύντομη επισκόπηση του τι κάνει το κύκλωμα τώραΟρίστε ένα προφίλ που είναι διαθέσιμο εκτός σύνδεσης.Παρέχει το προφίλ που έχετε ορίσει στο Nightscout
- Ορίστε ένα προφίλ με μόνο μία χρονική περίοδο.Η ολοκλήρωση της αντλίας, για τις αντλίες Accu-Check Combo, απαιτεί να έχετε εγκαταστήσει ruffyΟλοκλήρωση αντλίας για ανθρώπους που κάνουν εντατικοποιημένο σχήμα ενέσεων για την θεραπεία τουςΟλοκλήρωση αντλίας για αντλίες που δεν έχουν κανέναν οδηγό ακόμα (Ανοιχτό Κύκλωμα)
@@ -82,7 +80,6 @@
ΔιαμόρφωσηΕπισκόπησηΠροφίλ NS
- Απλό ΠροφίλΘεραπείεςΕικονική ΑντλίαΦροντίδα
@@ -104,7 +101,6 @@
APSΜετά από επεξεργασία περιορισμώνΠροσωρινός Ρυθμός ορίστηκε από την αντλία
- Τελευταία εφαρμογήΔΕΝ ΕΠΙΛΕΧΘΗΚΕ APS Ή ΒΡΕΘΗΚΕ ΑΠΟΤΕΛΕΣΜΑΑσφάλειαΠροσθήκη απενεργοποιημένη
@@ -136,16 +132,10 @@
ΆλλοΜετρητήςΑισθητήρας
- Υδατάνθρακες
- ΙνσουλίνηΏρα γεύματος
- ΔιαχωρισμόςΔιάρκεια
- Ποσοστό
- ΑπόλυτοΣημειώσειςΠροφίλ
- Εισαγωγή απόΤύπος ΓλυκόζηςΔεν φορτώθηκε προφίλ από το NS ακόμαΠροσ Ρυθμός
@@ -173,10 +163,6 @@
Για αποστολή καλιμπραρίσματος %1$.2f στείλτε με κωδικό %2$sΑποτυχία BolusΆδεια για απομακρυσμένες εντολές μέσω SMS
- Ρυθμίσεις προφίλ DanaR
- DIA [h]
- Διάρκεια Δράσης Ινσουλίνης
- ΑνέβασμαΤο bolus σταμάτησεΤο bolus σταματάειΤο κύκλωμα απενεργοποιήθηκε
@@ -218,11 +204,9 @@
Η αντλία δεν έχει ρυθμιστεί!Πλήρωση/ΓέμισμαΠαρακαλώ ελέγξτε ότι η ποσότητα ταιριάζει με τις προδιαγραφές του σετ έγχυσης!
- ΆλλοΠλήκτρο 1Πλήκτρο 2Πλήκτρο 3
- Εύρος στόχου:Εύρος εμφάνισηςΥψηλό και Χαμηλό σημείο για την γραφική στην Επισκόπηση και SmartwatchΧΑΜΗΛΟ σημείο
@@ -255,7 +239,6 @@
ΔΡΑΣΗΔιαμόρφωσηΚΥΚΛΩΜΑ
- SPOAPSLPΑΡΧΙΚΗ
@@ -279,7 +262,6 @@
Προσοχή!\nΣυνήθως δεν χρειάζεται να αλλάξετε αυτές τις τιμές. Κάντε κλικ ΕΔΩ, ΔΙΑΒΑΣΤΕ τις πληροφορίες και σιγουρευτείτε ότι τις καταλαβαίνετε πριν τις αλλάξετε.Μη έγκυρος αριθμός τηλεφώνου για SMSΚαλιμπράρισμα
- Να σταλεί η βαθμονόμηση %1$.1f στο xDrip;xDrip+ μη εγκατεστημένοΤο καλιμπράρισμα εστάλει στο xDripΤο καλιμπράρισμα στάλθηκε. Η λήψη πρέπει να είναι ενεργοποιημένη στο xDrip.
@@ -311,17 +293,14 @@
Δείξε αναλυτικά IOBΧώρισε την IOB σε bolus και βασικό στο ρολόιαποτυχία - ελέγξτε τηλέφωνο
- Ηλικία χρήστηΠαιδίΈφηβοςΕνήλικαςΑντίσταση ινσουλίνης ενηλίκων
- Παρακαλώ επιλέξτε ηλικία χρήστη για να ορισθούν όρια ασφαλείαςGlimp%1$s χρειάζεται λίστα βελτιστοποίησης μπαταρίας για σωστή απόδοσηΚύκλωμα σε αναστολήΑναστολή (%1$d m)
- Superbolus (%1$d m)Αναστολή κυκλώματοςΚύκλωμα σε αναστολή για 1hΚύκλωμα σε αναστολή για 2h
@@ -344,7 +323,6 @@
Η εφαρμογή καταγραφής ξεκινά από το NSΈξοδος από το application για την εφαρμογή των ρυθμίσεωνΠοιο τύπο ινσουλίνης χρησιμοποιείτε;
- Γρήγορη ΙνσουλίνηNovorapid, Novolog, HumalogFiaspINS
@@ -368,10 +346,6 @@
Μη φόρτωση στο NSΌλα τα δεδομένα που αποστέλλονται στην NS έχουν καταργηθεί. Το AAPS συνδέεται με NS, αλλά δεν γίνεται καμία αλλαγή στα NSΑκύρωση Εκτεταμμένου bolus
- Χρόνος ζωής Αισθητήρα
- Χρόνος ζωής Κάνουλας
- Χρόνος ζωής Ινσουλίνης
- Χρόνος ζωής μπαταρίας αντλίαςΕπιλογές συναγερμούΟριακή τιμή για παλιά δεδομένα [min]Επείγουσα οριακή τιμή για παλιά δεδομένα [min]
@@ -383,20 +357,14 @@
Ανίχνευση ευαισθησίαςΠοιος αλγόριθμος ευαισθησίας να χρησιμοποιηθεί;SENS
- Ευαισθησία Oref0Ευαισθησία Oref1Ευαισθησία AAPSΡύθμιση απορρόφησηςΜέγιστος χρόνος απορρόφησης γεύματος [h]Χρόνος σε ώρες που περιμένουμε να απορροφηθούν όλοι οι υδατάνθρακες ενός γεύματος
- SAGE
- IAGE
- CAGE
- PBAGEOAPSUPLDBAS
- EXTΚρατήστε την οθόνη ενεργήΑποτρέψετε το Android να απενεργοποιήσει την οθόνη. Χωρίς σύνδεση με το φορτιστή, αποφορτίζει πολύ γρήγορα την μπαταρία.Ενεργοποιώντας το autosense θυμηθείτε να εισάγετε όλους τους υδατάνθρακες. Διαφορετικά, οι αποκλίσεις των υδατανθράκων θα εντοπιστούν λανθασμένα ως αλλαγή ευαισθησίας!!
@@ -407,10 +375,6 @@
Οι τιμές δεν αποθηκεύτηκαν!Ενεργοποιήστε εκπομπές σε άλλες εφαρμογές (όπως το xDrip). Μην το ενεργοποιήσετε εάν έχετε περισσότερες από μία εγκατεστημένες εφαρμογές του AAPS ή NSClient!Ενεργοποιήστε τις τοπικές αποστολές.
- ΔΡΑΣΤΗΡΙΟΤΗΤΑ & FEEDBACK
- ΥΔΑΤΑΝΘΡΑΚΕΣ & BOLUS
- CGM & OPENAPS
- ΑΝΤΛΙΑΔιάρκεια [min]OpenAPS SMBΕνεργοποίηση UAM
@@ -509,7 +473,6 @@
ΚενήΚανονικήΗ ώρα της αντλίας χρειάζεται ανανέωση
- ΠροειδοποίησηΕπιβεβαιώθηκε η ειδοποίηση ΑΚΥΡΩΣΗΣ TBRΗ αντλία δεν είναι διαθέσιμη. Δεν χορηγήθηκε το bolusΗ έγχυση bolus απέτυχε. Δεν φαίνεται να παραδόθηκε κάποιο bolus. Για να σιγουρευτείτε, ελέγξτε την αντλία για να αποφευχθεί διπλό bolus. Για ασφάλεια σε λάθος του προγράμματος, δεν επιτρέπετε ξανά bolus αυτόματα.
@@ -518,7 +481,6 @@
Δεν υπάρχει αρκετή ινσουλίνη στην αμπούλα για το bolusΣφάλμα έγχυσης εκτεταμένου bolusSight
- πρινΠάντα ενεργό SMBΕνεργοποιήστε τις ΜΜΕ ανεξάρτητα από τα bolus. Πιθανόν μόνο με πηγές BG με καλό φιλτράρισμα δεδομένων, όπως το G5Ενεργοποίηση SMB μετά από υδατάνθρακες
@@ -567,7 +529,6 @@
Εκκίνηση TT ΥπογλυκαιμίαςΕκτελείται έκδοση Dev. Το κλειστό κύκλωμα είναι απενεργοποιημένο.Μηχανική λειτουργία ενεργοποιημένη
- Η μηχανική λειτουργία δεν είναι ενεργοποιημένη και δεν είναι ελευθερωμένηΑνάγνωση βασικού προφίλΤο ιστορικό της αντλίας έχει αλλάξει μετά την εκτέλεση του υπολογισμού του bolus. Το bolus δεν εκτελέστηκε. Παρακαλούμε να υπολογίσετε ξανά αν είναι ακόμα απαραίτητο.Το bolus εκτελέστηκε με επιτυχία, αλλά η καταχώριση στην θεραπεία απέτυχε. Αυτό μπορεί να συμβεί εάν χορηγηθούν δύο bolus ίδιου μεγέθους μέσα σε 2 λεπτά. Ελέγξτε το ιστορικό της αντλίας και το ιστορικό στο μενού Θεραπείες και χρησιμοποιείστε το Careportal για να εισαγάγετε τα στοιχεία που λείπουν. Βεβαιωθείτε ότι δεν εισάγετε το ίδιο μέγεθος στον ακριβώς ίδιο χρόνο.
@@ -577,7 +538,6 @@
Ο βασικός ρυθμός της αντλίας έχει αλλάξει αλλά η ανάγνωση έχει αποτύχειΈλεγχος για αλλαγές στο ιστορικόΠολλαπλά bolus της ίδιας ποσότητας φορτώθηκαν μέσα σε ένα λεπτό. Μόνο μία εγγραφή μπορεί να προστεθεί στη θεραπεία. Ελέγξτε την αντλία και προσθέστε χειροκίνητα το bolus χρησιμοποιώντας το Careportal. Σιγουρευτείτε ότι δημιουργήσατε ένα bolus σε χρόνο που να μη γίνεται άλλο bolus.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)Το τελευταίο bolus είναι παλαιότερο από 24 ώρες ή είναι προγραμματισμένο στο μέλλον. Ελέγξτε αν είναι σωστή η ώρα στην αντλία.Η ημερομηνία/ώρα έγχυσης του bolus φαίνεται λάθος. Το IOB είναι λάθος. Ελέγξτε την ώρα/ημερομηνία της αντλίας.Η αλλαγή προφίλ λείπει. Αλλάξτε το προφίλ ή πατήστε \"Ενεργοποίηση Προφίλ\" στο Τοπικό Προφίλ.
@@ -608,7 +568,6 @@
To SMB δεν επιτρέπεται σε λειτουργία ανοιχτού κυκλώματοςΦαγητόεπαναφορά
- Αποσυνδέθηκε (%1$d m)Μέγιστη συνολική IOB το OpenAPS δεν μπορεί να πάει πάνω από [U]Αυτή η τιμή ονομάζεται μέγιστη IOB στο OpenAPS\nTο OpenAPS δεν θα προσθέσει περισσότερη ινσουλίνη αν η τρέχουσα IOB είναι μεγαλύτερη από αυτή την τιμήΗ αντλία σταμάτησε
@@ -622,7 +581,6 @@
ΠροηγΟδηγός εγκατάστασηςΤΕΛΟΣ
- Επιλέξτε τη γλώσσα σαςΠρώτη αύξηση ινσουλίνηςΔεύτερη αύξηση ινσουλίνηςΤρίτη αύξηση ινσουλίνης
@@ -652,25 +610,20 @@
Γενικές ΡυθμίσειςΕνεργοποίηση NSClientΚαλώς ήρθατε στον οδηγό εγκατάστασης. Θα σας καθοδηγήσει μέσα από το πρόγραμμα εγκατάστασης\n
- Ρύθμιση αντλίαςΚατάσταση ανάγνωσηςΑλλαγές πρέπει να γίνουν στο NSΠαράλειψη του \"Οδηγού εγκατάστασης\"Πατήστε το παρακάτω πλήκτρο για να ενεργοποιήσετε το AndroidAPS για να προτείνει/κάνει αλλαγές στον βασικό ρυθμό
- Ρυθμίστε την προσθήκη APS
- Ρυθμίσετε την προσθήκη ΕυαισθησίαΗ προσθήκη Ευαισθησία χρησιμοποιείται για την ανίχνευση αλλαγών στην ευαισθησία και τον υπολογισμό του COB. Για περισσότερες πληροφορίες εδώ:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBΤο NSClient χειρίζεται τη σύνδεση με το Nightscout. Μπορείτε να παραλείψετε αυτό τώρα αλλά δεν θα μπορείτε να ολοκληρώσετε τους Στόχους μέχρι να κάνετε τις ρυθμίσεις του.Προσοχή: Τα νέα προφίλ ινσουλίνης απαιτούν DIA τουλάχιστον 5 ωρών. Η DIA 5-6 ώρες στα νέα προφίλ είναι ισοδύναμα με DIA των 3 ωρών στα παλιά προφίλ ινσουλινών.
- Διαμόρφωση πηγής BGΕπιλέξτε μια πηγή του προφίλ. Για ένα παιδί, χρησιμοποιήστε το προφίλ NS. Εάν κανείς δεν σας ακολουθεί μέσω NS, πιθανότατα προτιμάτε Τοπικό προφίλ. Σημειώστε ότι ορίζετε μόνο την πηγή προφίλ. Για να χρησιμοποιείται το προφίλ πρέπει να το ενεργοποιήσετε εκτελώντας το \"Προφίλ αλλαγής\"Επιλέξτε έναν από τους διαθέσιμους αλγόριθμους. Ταξινομούνται από το παλαιότερο στον νεότερο. Ένας νεότερος είναι συνήθως καλύτερος και πιο επιθετικός. Επομένως, αν είστε καινούριος στο κλειστό κύκλωμα, θα πρέπει πρώτα να επιλέξετε μόνο το AMA και όχι το τελευταίο. Μην ξεχάσετε να διαβάσετε το εγχειρίδιο του OpenAPS και να κάνετε τις ρυθμίσεις προτού αρχίσετε να το χρησιμοποιείτε.Ξεκινήστε τον πρώτο στόχοΆδειαΖητείστε άδειαΑίτημα
- Ρυθμίστε την προσθήκη ινσουλίνηςΈξοδοςΆνοιγμα μενού πλοήγησηςΚλείσιμο μενού πλοήγησης
@@ -704,7 +657,6 @@
Ρυθμίσεις Αρχείου ΚαταγραφήςΕπαναφορά προεπιλογώνΔυσλειτουργία NSClient. Εξετάστε την επανεκκίνηση του NS και του NSClient.
- ASΈκδοση %1$s διαθέσιμηΧρονική μετατόπισηΠροτιμώμενη λειτουργία APS
diff --git a/app/src/main/res/values-es-rES/exam.xml b/app/src/main/res/values-es-rES/exam.xml
index d10c0449d3..28d0238733 100644
--- a/app/src/main/res/values-es-rES/exam.xml
+++ b/app/src/main/res/values-es-rES/exam.xml
@@ -17,7 +17,6 @@
El perfil NS puede ser usado pero no configurado.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileTema: Desconectando de la bomba
- ¿Qué se debe hacer al desconectar la bomba?Haga clic en \"Desconectar bomba\" para que AAPS sepa que no se está inyectando insulina.Haga clic en \'Suspender lazo \' para que la AAPS deje de estar en lazo cerrado mientras la bomba está desconectada.No cambies nada en AAPS, sólo desconecta la bomba.
@@ -134,8 +133,8 @@
Los ratios IC más altos conducen a menos insulina entregada por una cantidad determinada de carbohidratos.Los ratios IC más bajos conducen a menos insulina entregada por una cantidad determinada de carbohidratos.Si tiene 0 COB, cambiar la ratio IC conducirá a una cantidad distinta de insulina para corregir un valor de glucemia determinado.
- El IC será diferente si cuenta con una unidad de pan como 10g o 12g.
- IC significa: Cuántas unidades de pan están cubiertas por 1U de insulina.
+ El IC será diferente si cuenta una unidad de carbohidratos como 10g o 12g.
+ IC significa: Cuántas unidades de carbohidratos están cubiertas por 1U de insulina.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uTema: Cambio de perfil Especificando el 90% en el cambio de perfil…
diff --git a/app/src/main/res/values-es-rES/objectives.xml b/app/src/main/res/values-es-rES/objectives.xml
index d1377e8706..8c2b0070b2 100644
--- a/app/src/main/res/values-es-rES/objectives.xml
+++ b/app/src/main/res/values-es-rES/objectives.xml
@@ -1,6 +1,5 @@
- AtrásInicioVerificar%1$d. Objetivo
diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml
index 8b89da173b..6749d356ef 100644
--- a/app/src/main/res/values-es-rES/strings.xml
+++ b/app/src/main/res/values-es-rES/strings.xml
@@ -21,17 +21,16 @@
Muestra los ajustes preestablecidos de alimentos definidos en NightscoutAjustes de insulina preestablecidos para Humalog y NovoRapid /NovoLogAjuste preestablecido para insulina Fiasp
+ Ajuste de insulina para LyumjevPermite definir el pico de la actividad de la insulina. Debe ser utilizado únicamente por usuarios avanzadosActivar o desactivar la posibilidad para activar el lazo.Sincroniza tus datos con Nightscout
- Estado del algoritmo en 2016Estado del algoritmo en 2017Algoritmo más reciente para usuarios avanzadosMuestra el estado actual de tu lazo y los botones para las acciones más usadasMuestra una notificación en curso con un breve resumen de lo que está haciendo tu lazoDefinir un perfil disponible fuera de linea.Proporciona el perfil definido en Nightscout
- Definir un perfil con un solo bloque de tiempo.Integración de bombas de insulina Accu-Check Combo, necesita tener ruffy instaladoIntegración de bomba de insulina para personas que usan varias inyecciones diarias para su terapia de diabetesIntegración para bombas de insulina que aún no tienen ningún controlador/driver (lazo abierto)
@@ -83,7 +82,6 @@
Tabla de configuracionesInicioPerfil NS
- Perfil simpleTratamientosBomba virtualPortal de Tratamientos
@@ -105,13 +103,11 @@
APSTras procesar las restriccionesBasal temporal en la bomba
- Última aceptadaNO APS Seleccionado o resultado entregadoSeguridadComplemento desactivadoViolación restriccionesError de administración del bolo
- Valor basal [%]Aceptar nueva basal temporal:TratamientoCalculadora
@@ -140,17 +136,11 @@
OtroMedidorSensor
- Carbohidratos
- InsulinaTiempo absorción
- DividirDuración
- Dosis
- AbsolutoNotasHora del eventoPerfil
- Introducido porTipo de glucosaPendiente carga perfil NSBasal Temporal
@@ -174,6 +164,9 @@
¡Importación cancelada! ¡Las preferencias NO se han importado!¡No se pueden importar preferencias!Por favor, vuelve a la pantalla principal e inténtalo de nuevo.
+ Contraseña Maestra antigua
+ Este archivo se ha exportado y cifrado con una contraseña maestra diferente. Insertar contraseña maestra antigua para descifrar el archivo.
+ Como resultado de la importación correcta, la contraseña maestra actual SE SUSTITUIRÁ por la contraseña maestra antigua!Seleccionar fichero para importarPor favor, compruebe las preferencias antes de importar:¡Las preferencias no se pueden importar!
@@ -211,7 +204,6 @@
Error de descifrado, ¡la contraseña proporcionada no es válida o se ha modificado el archivo de ajustes! Puede suceder que el archivo importado se haya exportado con una contraseña maestra distinta.Falta la configuración de cifrado, ¡el formato configuración no es válido!¡Algoritmo de cifrado no soportado o no especificado!
- exportado hoyexportado hace %1$sexportado en %1$sexportado hace menos de una hora
@@ -243,10 +235,6 @@
Objetivo %1$s para %2$d minutos establecido correctamenteObjetivo temporal cancelado con éxitoPermitir comandos remotos vía SMS
- Configuración perfil DanaR
- Tiempo de acción de la insulina [h]
- Duración de actividad de insulina
- SubiendoBolo interrumpidoDeteniendo boloLazo se ha desactivado
@@ -257,7 +245,7 @@
El valor %1$s está fuera de límitesPara conectar la infusora responder con el código %1$sError al conectar a la bomba
- Para desconectar la bomba durante %1dminutos responde con el código %2$s
+ Para desconectar la bomba durante %1$dminutos responde con el código %2$sBomba desconectadaBomba reconectadaComando remoto no permitido
@@ -301,7 +289,6 @@
¡Bomba no iniciada!Rellenar/Llenar¡Por favor asegurar que la cantidad coincide con la especificación del set de infusión!
- OtrosLlenar/Rellenar cantidad de insulina estándarBotón 1Botón 2
@@ -309,7 +296,6 @@
Unidades:UnidadesTiempo de acción de la insulina
- Rango Objetivo:Rango de visualizaciónMarcas Alta y Baja para gráficos en pantalla Inicio y SmartwatchMarca BAJA
@@ -343,7 +329,6 @@
ACCCONFLAZO
- PERFSIMOAPSPERFLOCINICIO
@@ -368,7 +353,6 @@
Atención!\nNormalmente no tienes que editar los valores a continuación. Por favor PINCHA AQUI y LEE el texto y asegúrate que lo has ENTENDIDO antes de cambiar alguno de estos valores.Número de teléfono incorrecto para SMSCalibración
- ¿Enviar la calibración %1$.1f a xDrip?xDrip+ no instaladoCalibración mandada a xDripCalibración enviada. La recepción debe estar habilitada en xDrip.
@@ -401,12 +385,13 @@
Separar IOB en bolo y base en el relojsin efecto - por favor verificar en móviln/a
- Edad paciente
+ Tipo pacienteMenor de edadAdolescenteAdultoAdulto resistente a la insulina
- Por favor elige la edad del paciente para ajustar los límites de seguridad
+ Embarazo
+ Por favor seleccione el tipo de paciente para establecer límites de seguridadNombre del pacienteProporcione el nombre de paciente o el apodo para diferenciar entre varias configuracionesUsuario
@@ -414,7 +399,6 @@
%1$s necesita una optimización de la batería para funcionar óptimamenteLoop desactivadoDesactivado (%1$d m)
- Superbolo (%1$d m)Suspender lazoDesactivar lazo por 1hDesactivar lazo por 2h
@@ -437,7 +421,6 @@
Registrar el inicio de la aplicación en NSSaliendo de la aplicación para aplicar ajustes.¿Qué tipo de insulina está utilizando?
- Insulina acción rápidaNovorapid, Novolog, HumalogFiaspINS
@@ -450,6 +433,8 @@
Umbral crítico de la edad de la insulina [h]Umbral de advertencia de la edad del sensor [h]Umbral crítico de la edad del sensor [h]
+ Umbral de advertencia de nivel de batería del sensor [%]
+ Umbral crítico de nivel de batería del sensor [%]Umbral de advertencia de nivel de pila [h]Umbral crítico de nivel de batería [h]Umbral de advertencia de nivel de reservorio [U]
@@ -475,11 +460,13 @@
Datos no mandados a NSTodos los datos mandados a NS son borrados. AAPS esta conectado a NS pero no hay cambios en NSCancelar bolo extendido
- Edad sensor
- Edad cánula
- Edad insulinaCambio de perfil
- Edad batería bomba
+ Sensor
+ Cánula
+ Insulina
+ Batería de la bomba
+ edad:
+ nivel:Opciones alarmaCrear notificaciones de alarmas NSCrear notificaciones de avisos de NS
@@ -493,20 +480,14 @@
Detección sensibilidad¿Que algoritmo de sensibilidad se debe usar?SENS
- Sensibilidad Oref0Sensibilidad Oref1Sensibilidad AAPSAjustes absorciónTiempo max absorción comida [h]Tiempo en horas en el que se espera que todos los carbohidratos hayan sido absorbidos
- SAGE
- IAGE
- CAGE
- PBAGEOAPSUPLDBAS
- EXTMantener pantalla activaEvitar que Android apague la pantalla. Consume mucha energía cuando no esta enchufado.Al activar Autosens recuerda introducir todos carbohidratos comidos. Sino las desviaciones de carbohidratos serán identificadas incorrectamente como un cambio de sensibilidad !!
@@ -517,10 +498,6 @@
Valores no guardados!Habilite las transmisiones a otras aplicaciones (como xDrip). ¡ No habilite si tiene más de una instancia de AAPS o NSClient instalada!Permitir emisión de mensajes localmente.
- ACTIVIDAD Y FEEDBACK
- CARBS Y BOLUS
- CGM Y OPENAPS
- BOMBADuración [min]OpenAPS SMBActivar UAM
@@ -532,6 +509,7 @@
Free-Peak OrefRapid-Acting OrefUltra-Rapid Oref
+ LyumjevDIA de %1$f demasiado corto - usando %2$f!ACTIVAR PERFILINVALIDO
@@ -559,6 +537,7 @@
Bomba no alcanzableFaltan lecturas BGUsa avisos del sistema para alarmas y avisos
+ Aumentar gradualmente el volumen de alertas y notificacionesAlarma localAlarma si no llegan datos BGAlarma si bomba no es alcanzable
@@ -572,7 +551,6 @@
Mostrar detalles deltaMostrar delta con un decimal masCon qué frecuencia se administrarán los SMB en min
- Minutos máximos SMBMinutos máximos de basal para limitar SMBMinutos máximos de UAM SMBMinutos máximos de basal para limitar SMB para UAM
@@ -626,7 +604,6 @@
VacíoNormalSe necesita actualizar reloj de la bomba
- AlertaTBR CANCELADA, advertencia aceptadaBomba inalcanzable. No se administró ningún BoloEmisión del bolo fallada. Ningún bolo se ha emitido. Para asegurarse, por favor controle la bomba para evitar bolo doble. Para evitar bugs no se reinician bolos automáticamente.
@@ -635,7 +612,6 @@
No hay suficiente insulina en el depósito para emitir boloError al emitir bolo extendidoSight
- haceEstablecer basales temporales neutrasSi está activado, cancelará un basal temporal antes del final de cada hora. Este método puede ayudar a evitar que algunas bombas pitan/vibran al final de la hora.Habilitar SMB siempre
@@ -694,7 +670,6 @@
Inicio OT HipoEjecutando versión dev. Lazo cerrado no disponible.Modo de ingeniería activado
- Modo de ingeniería no está activado y no disponible en esta ramaLeyendo perfil basalEl historial de la bomba ha cambiado después de que se realizó el cálculo del bolo. El bolo no fue entregado. Por favor, vuelva a calcular si aún se necesita un bolo.El bolo se administró con éxito, pero falló la incorporación de la entrada del tratamiento. Esto puede suceder si se administran dos bolos pequeños del mismo tamaño en los últimos dos minutos. Verifique el historial de la bomba y las entradas de tratamiento y use el portal de tratamientos para agregar entradas faltantes. Asegúrese de no agregar ninguna entrada para el mismo minuto exacto y la misma cantidad.
@@ -704,7 +679,7 @@
Tasa Basal cambiada en bomba, pero falló al leerComprobando cambios en el historialMúltiples bolos con la misma cantidad en el mismo minuto fueron importados. Sólo se puede agregar un registro a los tratamientos. Verifique la bomba y agregue manualmente un registro de bolo usando la pestaña Careportal. Asegúrese de crear un bolo con un tiempo que no use otro bolo.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ \n\ndocumentación:\nhttps://androidaps.readthedocs.io\n\nfacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsersEl último bolo tiene más de 24 horas o está en el futuro. Comprueba que la fecha en la bomba está configurada correctamente.La hora / fecha del bolo administrado en la bomba parece incorrecta; es probable que la IOB sea incorrecta. Verifique la hora / fecha de la bomba.Falta Cambio de Perfil. Haga un Cambio de Perfil o presione \"Activar perfil\" en PerfilLocal.
@@ -735,7 +710,6 @@
SMB no permitido en modo de lazo abiertoComidareestablecer
- Desconectado (%1$d m)Máximo IOB total que OpenAPS no puede superar [U]Este valor se denomina IOB máx. En el contexto de OpenAPS\nOpenAPS no agregará más insulina si el IOB actual es mayor que este valorBomba parada
@@ -749,7 +723,6 @@
AntAsistente de configuraciónFINALIZAR
- Selecciona tu idiomaPrimer incremento insulinaSegundo incremento insulinaTercer incremento insulina
@@ -779,20 +752,18 @@
Configuración generalActivar NSClientBienvenido al asistente de instalación. Le guiará a través del proceso de configuración\n
- Ajustes de la bombaLeer estadoCambios deben hacerse en NSSaltar asistente de configuraciónPresiona el botón de abajo para permitir a AndroidAPS sugerir/hacer cambios en basales
- Configurar complemento APS
- Configurar complemento SensibilidadEl complemento de sensibilidad es usado para detectar la sensibilidad y cálculo de COB. Para más info ver:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSCliente controla la conexión con Nightscout. Puedes saltar este paso ahora pero no podrás completar los objetivos hasta que lo configures.Por favor, recuerde: nuevos perfiles de insulina requieren DIA de al menos 5h. DIA de 5-6h en nuevos perfiles es lo mismo que DIA de 3h en perfiles antiguos.
- Configurar origen de BGSelecciona origen de perfil. Si el usuario es un niño debe seleccionar perfil NS. Si no hay nadie siguiendo tu Nightscout probablemente preferirás perfil Local. Recuerde que sólo está seleccionando el origen del perfil. Para usarlo debe activarlo ejecutando \"Cambio Perfil\"Selecciona uno de los algoritmos disponibles. Están ordenados de más antiguos a más recientes. Los nuevos son más potentes y agresivos. Por ello, si eres usuario nuevo, se recomienda empezar con AMA y no con el último. No olvides leer la documentación de OpenAPS y configurarlo antes de usarlo.
+ Esperando la conexión de RileyLink…\n
+ Nota: Puede continuar la configuración una vez que la bomba se haya inicializado.\nComienza tu primer objetivoPermisoPedir permiso
@@ -800,7 +771,6 @@
La aplicación necesita permiso de ubicación para la exploración de BT e identificación de WiFiLa aplicación necesita permiso de almacenamiento para poder almacenar archivos de registro y valores de exportaciónSolicitar
- Configurar complemento de insulinaSalirAbrir navegaciónCerrar navegación
@@ -840,7 +810,6 @@
Ajustes del registroRestablecer valores predeterminadosNSClient fallando. Considera reiniciar NS y NSClient.
- ASVersión %1$s disponibleRetardoModo preferido de APS
@@ -982,6 +951,7 @@
restricción de almacenamiento internoLibera al menos %1$d MB de almacenamiento interno. ¡Loop desactivado!Formato incorrecto
+ La duración de TBR debe ser un múltiplo de %1$d minutos y mayor a 0.Código incorrecto. Comando cancelado.Sin configurarCambio de perfil creado
@@ -1077,12 +1047,9 @@
Seleccionado:Unidades¿Desea cambiar el perfil y descartar los cambios realizados al perfil actual?
- Activado
- DesactivadoLimpieza finalizadaLimpieza iniciada¿Desea reiniciar el objetivo? Puedes perder tu progreso.
- Ninguna bomba seleccionadaSeleccione las unidades en las que desea visualizar los valoresSubir cambios de perfil local a NSDIA (Duración Insulina Activa)
@@ -1103,7 +1070,6 @@
EnviarPerfil más común:Nota: Sólo los datos visibles en esta pantalla se cargarán de forma anónima. El ID se asigna a esta instalación de AndroidAPS. Puede volver a enviar datos si cambia su perfil principal, pero deja que se ejecute al menos una semana para que el resultado sea visible en el tiempo en rango. Agradecemos su ayuda.
- EncuestaEntrada de edad no válidaPeso no válidoEntrada % invalida
@@ -1123,31 +1089,35 @@
¿Borrar cola? ¡Se perderán todos los datos de la cola!El uso de la función de bolo extendido detendrá el modo de bucle cerrado durante el tiempo de ejecución del bolo extendido. ¿Realmente quieres esto?Bucle cerrado inhabilitado debido a la ejecución del bolo extendido
- EB\"Verificación de teléfono\"Menú gráfico
- ASTiempo requerido de SMBTiempo de ejecución de SMBTiempo requerido para Basal temporalTiempo de ejecución para Temp BasalAlertas de bomba Insight
+ desde la aplicación de autenticación para: %1$s seguido de PINHabilitar autentificadorComandos de autentificación usando One Time Password de Google Autenticator o apps 2FA similar.
+ PIN obligatorio adicional al final del tokenLos dígitos adicionales se deben memorizar y pegar al final de cada una de las contraseñas generadas por One Time PasswordConfiguración de autentificación
- OTP para comprobar:
+ Código para comprobar:
+ OTP + PIN
+ El código de verificación consta de 6 dígitos mostrados por la aplicación Authenticator (conocido como OTP) seguido de 3 o más dígitos del PIN obligatorio.Restablecer autentificadoresRestablecer clave de autentificación¿Está seguro de que desea restablecer la clave del autenticador? Los autenticadores configurados actualmente no seran válidos, y tendrá que volver a configurarlos.¡Se ha generado una clave de autenticador nueva! Utilice QRCode actualizado para suministrar autenticadores.
+ Exportando OTP secreto
+ ¿Está seguro que desea copiar OTP secreto al portapapeles?\n\nSolamente lo necesitarías si tu aplicación de autenticador tiene problemas para escanear QRCode, quieres introducirlo manualmente o quieres configurar el token de hardware OTP usando la aplicación dedicada.
+ OTP secreto (en formato Base32) exportado y copiado en portapapeles. Pegalo en el autenticador o grabador hardware OTP!1. Instalar autenticador2. Escanea el código para instalar códigos AndroidAPS OTP3. Probar la contraseña de Uso únicoRestablecer autentificadoresEn cada teléfono seguidor, instale la aplicación Authenticator que admita tokens RFC 6238 TOTP. Las aplicaciones gratuitas populares son:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- NO COMPARTA este código en línea!\nUsa sólo para la instalación de la Aplicación google Authenticator en teléfonos seguidores.Al resetear el autenticador haces que todos los autenticadores ya provistos no sean válidos. ¡Necesitarás configurarlos de nuevo!Al conectarAl desconectar
@@ -1161,6 +1131,7 @@
Copiar ajustes de NS¿Copiar los ajustes de NS (si existe)?Tema original
+ Baja resoluciónLos botones siempre se muestran en la parte inferior de la pantallaPantalla grandeTema
@@ -1175,4 +1146,38 @@
Edad: %1$.0f Peso: %2$.0f kg% de basalPerfil DPV por defecto
+ Open Humans
+ Finalizando la configuración de Open Humans…
+ Esto puede tardar un tiempo. No apague su teléfono o este plugin.
+ Configuración finalizada
+ Tu teléfono subirá los datos a Open Humans pronto.
+ Su teléfono está subiendo datos a Open Humans ahora.
+ Fallo en la configuración
+ Se ha producido un error. Vuelva a iniciar sesión para poder continuar. Lo siento & ¡Gracias!
+ Esta es una herramienta de código abierto que copiará sus datos a Open Humans. No conservamos ningún derecho a compartir sus datos con terceros sin su autorización explícita. Los datos que el proyecto y la aplicación reciben se identifican mediante un ID de usuario aleatorio y sólo se transmitirán de forma segura a una cuenta de Open Humans con la autorización de dicho proceso. Puedes dejar de subir y borrar tus datos en cualquier momento a través de www.openhumans.org.
+ Entiendo y acepto.
+ Login
+ Cerrar sesión
+ ¿Realmente quieres cerrar sesión y dejar de donar datos a la ciencia?
+ ID de miembro del proyecto: %s
+ Tamaño de Cola: %d
+ Condiciones de Uso
+ No has accedido
+ Primero debe aceptar los términos de uso.
+ Sesión iniciada correctamente
+ La configuración ahora se completará en segundo plano. Gracias por cargar sus datos.\n\nPor favor, mantenga este plugin y su teléfono encendido por un un momento mientras se completa la configuración.
+ Completando inicio de sesión…
+ Dona tus datos a la ciencia
+ OH
+ Has cerrado la sesión de Open Humans
+ Haga clic aquí para iniciar sesión de nuevo si no tenía esa intención.
+ Subir datos solo si está conectado a WiFi
+ Sólo subir datos si se está cargando
+ Worker State: %s
+ Datos subidos
+ Los siguientes datos se cargarán en su cuenta de Open Humans: valores de glucosa, bolos, carbohidratos, eventos de la bomba (excepto notas), bolos extendidos, cambios de perfil, dosis diarias totales, valores basales temporales, objetivos de temperatura, preferencias, versión de la aplicación, modelo del dispositivo y dimensiones de la pantalla. No se cargará información secreta o privada, como su URL de Nightscout o el API secreto.
+ Estado de RileyLink:
+ Filtro
+ No se puede crear el perfil local. El perfil no es válido.
+ ¿No matar mi aplicación?
diff --git a/app/src/main/res/values-fr-rFR/exam.xml b/app/src/main/res/values-fr-rFR/exam.xml
index 3111898534..b8a58ceefe 100644
--- a/app/src/main/res/values-fr-rFR/exam.xml
+++ b/app/src/main/res/values-fr-rFR/exam.xml
@@ -17,7 +17,6 @@
Le profil NS peut être utilisé, mais il n\'est pas configuré.https://androidaps.readthedocs.io/en/latest/CROWDIN/fr/Configuration/Config-Builder.html#profileRubrique : Déconnexion de la pompe
- Que faire en déconnectant la pompe ?Cliquez sur \"Déconnecter la pompe\" pour que APS sache qu\'aucune insuline ne soit délivrée.Cliquez sur \"Suspendre la boucle\" pour que AAPS s\'arrête tant que la pompe est déconnectée.Ne changez rien dans AAPS, débranchez juste la pompe.
@@ -134,8 +133,8 @@
Les ratios G/I plus élevés conduisent à moins d\'insuline injectée pour une quantité donnée de glucides.Les ratios G/I plus faibles conduisent à moins d\'insuline injectée pour une quantité donnée de glucides.Si vous avez 0 GA, changer le ratio G/I conduira à différentes quantités d\'insuline pour corriger une valeur de glycémie donnée.
- Le G/I sera différent si vous comptez l\'unité de pain à 10g ou à 12g.
- Le G/I (Ratio Glucides/Insuline) est : combien d\'unités de pain sont couverte par 1U d\'insuline.
+ Le G/I sera différent si vous comptez l\'unité (d\'échange) de pain à 10g ou à 12g.
+ Le G/I (Ratio Glucides/Insuline) est : combien d\'unités (d\'échange) de pain sont couverte par 1U d\'insuline.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uRubrique : Changement de profil Quand on renseigne 90% dans le changement de profil…
diff --git a/app/src/main/res/values-fr-rFR/objectives.xml b/app/src/main/res/values-fr-rFR/objectives.xml
index a9031a324e..3156059769 100644
--- a/app/src/main/res/values-fr-rFR/objectives.xml
+++ b/app/src/main/res/values-fr-rFR/objectives.xml
@@ -1,6 +1,5 @@
- RetourDépartVérifier%1$d. Objectif
diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml
index 8a5253187f..da6abe681f 100644
--- a/app/src/main/res/values-fr-rFR/strings.xml
+++ b/app/src/main/res/values-fr-rFR/strings.xml
@@ -21,17 +21,16 @@
Affiche les aliments définis par défaut dans NightscoutRéglages pour les insulines Humalog et NovoRapid / NovoLogRéglages pour l\'insuline Fiasp
+ Réglages pour l\'insuline LyumjevPermet de définir le pic de l’activité de l’insuline et ne doit être utilisé que par les utilisateurs avancésActiver ou désactiver la mise en œuvre déclenchant la Boucle.Synchronise vos données avec Nightscout
- État de l’algorithme en 2016État de l’algorithme en 2017Algorithme le plus récent pour les utilisateurs avancésAffiche l’état actuel de votre Boucle et des boutons d’actions les plus courantesAffiche une notification en cours avec un bref aperçu de ce que fait votre BoucleDéfinissez un profil qui est disponible hors ligne.Fournit le profil que vous avez défini dans Nightscout
- Définir un profil avec un seul bloc de temps.Intégration des pompes Accu-Chek Combo il faut avoir Ruffy installéIntégration pompe pour les personnes qui font des injections quotidiennes multiples pour le traitement de leur diabèteIntégration pour les pompes qui n’ont pas encore de pilote (Boucle Ouverte)
@@ -83,7 +82,6 @@
Générateur de configurationAperçuProfil NS
- Profil simpleTraitementsPompe virtuelleCareportal
@@ -105,13 +103,11 @@
APSAprès traitement des restrictionsBasal temporaire défini par la pompe
- Dernière activationPas d\'APS séléctionné ou pas de résultat fourniSécuritéPlugin désactivéViolation des restrictionsErreur injection bolus
- Valeur Basal [%]Accepter nouveau basal temporaire :TraitementAssistant
@@ -140,17 +136,11 @@
AutreLecteurCapteur
- Glucides
- InsulineDécalage horaire
- DiviserDurée
- Pourcentage
- AbsoluNotesHeure événementProfil
- Entré parSource de GlycémiePas de profil téléchargé encore depuis NSBasal Temporaire
@@ -214,7 +204,6 @@
Erreur de décryptage, le mot de passe fourni est invalide ou le fichier de paramètres à été modifié ! Cela peut arriver si le fichier a été exporté avec un mot de passe principal différent.Configuration du cryptage manquant, format des paramètres invalide !Algorithme de cryptage non pris en charge ou non spécifié !
- exporté aujourd\'huiexporté il y a %1$sexporté à %1$sexporté il y a moins d\'une heure
@@ -228,13 +217,13 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Communicateur SMSNuméros de tél autorisés+XXXXXXXXXX;+YYYYYYYYYY
- Renvoyer le code %2$s pour injecter le bolus %1$.2fU
- Pour injecter le bolus repas de %1$.2fU renvoyer le code %2$s
- Pour définir la Cible Temp %1$s renvoyer le code %2$s
- Pour annuler la Cible Temp renvoyer le code %1$s
- Pour désactiver les commandes à distance SMS renvoyer le code %1$s.\n\nGardez à l\'esprit que vous ne pourrez le réactiver que directement à partir de l\'application AAPS du smartphone maître.
+ Pour injecter le bolus de %1$.2f U, renvoyez le code %2$s
+ Pour injecter le bolus repas de %1$.2f U, renvoyez le code %2$s
+ Pour définir la cible temp %1$s, renvoyez le code %2$s
+ Pour annuler la cible temp, renvoyez le code %1$s
+ Pour désactiver les commandes à distance SMS, renvoyez le code %1$s.\n\nGardez à l\'esprit que vous ne pourrez le réactiver que directement à partir de l\'application AAPS du smartphone maître.Service de commande à distance SMS arrêté. Pour le réactiver, utilisez AAPS sur le smartphone maître.
- Renvoyer le code %2$s pour envoyer la calibration %1$.2f
+ Pour envoyer la calibration %1$.2f, renvoyez le code %2$sÉchec du BolusNombre minimum de minutes qu\'il doit y avoir entre un bolus distant et le suivantCombien de minutes doit-il y avoir, au minimum, entre un bolus et le suivant
@@ -247,10 +236,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Cible %1$s pendant %2$d minutes définie avec succèsCible Temp annulée avec succèsAutoriser les commandes à distance par SMS
- Paramètres du profil DanaR
- Durée d\'Action [h]
- Durée d\'Action de l\'Insuline
- Téléchargement en coursBolus arrêtéArrêter bolusLa Boucle a été désactivée
@@ -259,22 +244,22 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
La Boucle est activée%1$.2f limité à %2$.2fLa valeur %1$s est en dehors des limites
- Pour connecter la pompe, répondre avec le code %1$s
+ Pour connecter la pompe, renvoyez le code %1$sEchec de la connexion pompe
- Pour déconnecter la pompe pendant %1d minutes, répondre avec le code %2$s
+ Pour déconnecter la pompe pendant %1$d min, renvoyez le code %2$sPompe déconnectéePompe reconnectéeLa commande à distance n\'est pas autoriséeBolus à distance non disponible. Réessayez plus tard.
- Pour démarrer la basal de %1$.2f U/h pendant %2$d min, renvoyer le code %3$s
- Pour changer le profil vers %1$s %2$d%%, renvoyer le code %3$s
- Pour démarrer le bolus étendu de %1$.2f U/h pendant %2$d min, renvoyer le code %3$s
- Pour entrer %1$dg à %2$s renvoyer le code %3$s
- Pour démarrer la Basal %1$d%% pendant %2$d min, renvoyer le code %3$s
- Envoyer le code %2$s pour suspendre la Boucle pour %1$d minutes
- Pour reprendre la veuillez répondre avec le code %1$s
- Pour activer la boucle veuillez répondre avec le code %1$s
- Pour désactiver la boucle veuillez répondre avec le code %1$s
+ Pour démarrer la basal de %1$.2f U/h pendant %2$d min, renvoyez le code %3$s
+ Pour changer le profil vers %1$s %2$d%%, renvoyez le code %3$s
+ Pour démarrer le bolus étendu de %1$.2f U/h pendant %2$d min, renvoyez le code %3$s
+ Pour entrer %1$dg à %2$s, renvoyez le code %3$s
+ Pour démarrer la Basal %1$d%% pendant %2$d min, renvoyez le code %3$s
+ Pour suspendre la boucle pendant %1$d min, renvoyez le code %2$s
+ Pour reprendre la boucle, renvoyez le code %1$s
+ Pour activer la boucle, renvoyez le code %1$s
+ Pour désactiver la boucle, renvoyez le code %1$sDémarrage réussi pour %1$.2fU/h de basal temporaire pour %2$d minLe Bolus étendu %1$.2fU pendant %2$d min a commencé avec succès%1$d g de glucides entrés avec succès
@@ -282,15 +267,15 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Démarrage réussi pour %1$d%% de Basal temporaire pour %2$d minLe démarrage du basal temporaire a échouéLe départ du Bolus étendu a échoué
- Envoyer le code %1$s pour arrêter la Basal temporaire
- Pour arrêter le Bolus étendu, renvoyer le code %1$s
+ Pour arrêter la basal temp, renvoyez le code %1$s
+ Pour arrêter le bolus étendu, renvoyez le code %1$sBasal temporaire annuléBolus étendu annuléEchec de l\'annulation du basal temporaireÉchec de l\'annulation du Bolus étenduCommande inconnue ou mauvaise réponseAssistant Rapide
- Paramètres de l\'Assistant Rapide
+ Assistant RapideTexte du bouton :Glucides:Valide:
@@ -305,15 +290,13 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Pompe non initialisée !Amorcer/RemplirVeuillez à ce que la quantité corresponde aux caractéristiques de votre cathéter !
- Autres
- Quantité d\'insuline par défaut pour Amorcer/Remplir
+ Insuline par défaut pour Amorcer/RemplirBouton 1Bouton 2Bouton 3Unités :UnitésDAI
- Fourchette cible :Fourchette de visualisationLes repères hauts et bas sur les graphiques pour l\'aperçu et la montreLigne BASSE
@@ -347,7 +330,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
ACTCONFBOUCLE
- P.S.OAPSPLACCUEIL
@@ -372,7 +354,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Attention !\nNormalement vous n\'avez pas à changer les valeurs mentionnées ci-dessous. SVP CLIQUEZ ICI et LISEZ bien le texte. Assurez-vous de bien le COMPRENDRE avant de changer n’importe laquelle de ces valeurs.Num tél du SMS est invalideÉtalonnage
- Envoyer la calibration %1$.1f à xDrip ?xDrip+ n\'est pas installéÉtalonnage envoyé à xDripÉtalonnage envoyé. La réception doit être activée dans xDrip.
@@ -405,12 +386,13 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Sur la montre, décomposer l’IA en IA bolus et IA basalSans succès - vérifiez votre téléphones/o
- Age du patient
+ Type de patient EnfantAdolescentAdulteAdulte résistant à l\'insuline
- Veuillez svp sélectionner l’âge du patient pour définir les limites de sécurité
+ Grossesse
+ Veuillez sélectionner le type de patient pour définir les limites de sécuritéNom du patientVeuillez indiquer un nom ou pseudo du patient pour différencier plusieurs configurationsPatient
@@ -418,7 +400,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
%1$s a besoin d\'optimisation de la batterie (whitelisting) pour une performance correcteLa Boucle est suspendueSuspendu (%1$d m)
- Superbolus (%1$d m)Suspendre la boucleSuspendre la Boucle pour 1hSuspendre la Boucle pour 2h
@@ -441,7 +422,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Démarrage AAPS entré dans NSSortir de l’application pour appliquer les nouveaux paramètres.Quel type d\'insuline utilisez-vous ?
- Insuline à action rapideNovorapid, Novolog, Humalog, ApidraFiaspINS
@@ -454,6 +434,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Seuil critique âge insuline [h]Seuil d\'alerte âge capteur [h]Seuil critique âge capteur [h]
+ Seuil d’alerte niveau pile capteur [%]
+ Seuil critique niveau pile capteur [%]Seuil d\'alerte âge pile [h]Seuil critique âge pile [h]Seuil d\'alerte niveau réservoir [U]
@@ -475,15 +457,17 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Barre d\'état pour xDrip (Montre)xdsAfficher l’Impact Glycémie
- Ajouter l’IG sur la vue générale
+ Ajouter l’IGly sur la vue généralePas de téléchargement vers NSToutes les données envoyées à NS sont abandonnées. AAPS est connecté à NS mais aucun changement n’est fait dans NSAnnuler Bolus étendu
- Age Capteur
- Age Cathéter
- Age InsulineChanger de profil
- Age Pile Pompe
+ Capteur
+ Canule
+ Insuline
+ Pile pompe
+ Âge:
+ Niveau:Options d\'alarmeCréer des notifications à partir des alarmes NSCréer des notifications à partir des notifications NS
@@ -497,20 +481,14 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Estimation de SensibilitéQuel algorithme de Sensibilité doit être utilisé ?SENS
- Sensibilité Oref0Sensibilité Oref1Sensibilité AAPS Paramètres d’absorptionDurée max d’absorption d\'un repas [h]Le temps estimé en heures pour une absorbption totale des glucides d’un repas
- AgeC
- AgeI
- AgeC
- PBAGEOAPSUPLDBAS
- EXTGarder l\'écran alluméEmpêcher Android d\'éteindre l\'écran. Ceci consommera beaucoup de batterie lorsque vous n’êtes pas connecté à une prise de courant.En activant la fonction Autosens, n’oubliez pas de rentrer tous les glucides consommés. Sinon les déviations de glucides seront incorrectement identifiées pour les changements de sensibilité !!
@@ -521,10 +499,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Valeurs non enregistrées !Active les diffusions vers d\'autres applications (comme xDrip). Ne pas activer si plusieurs instances d\'AAPS ou de NSClient sont installées !Activer les transmissions locales
- ACTIVITÉ et FEEDBACK
- GLUCIDES et BOLUS
- MGC et OPENAPS
- POMPEDurée [min]OpenAPS SMBActiver RNS
@@ -536,6 +510,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Profil d\'insuline ajustable OrefInsuline à Action Rapide Oref Insuline Ultra Rapide Oref
+ LyumjevDurée d’Action pour %1$f trop courte - utiliser %2$f à la place !Activer le profilINVALIDE
@@ -577,7 +552,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Afficher le delta détailléAfficher delta avec une décimale supplémentaireFréquence des SMB en min
- SMB minutes maxMax. minutes de basal pour limiter le SMBSMB RNS minutes maxMinutes de basal max pour limiter les SMB des RNS
@@ -631,7 +605,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
VideNormalMise à jour nécessaire de l\'heure de la pompe
- AttentionAlarme TBR ANNULÉ confirméeImpossible d\'établir la communication avec la pompe. Aucun bolus n\'a été administréAdministration bolus échouée. Il semble qu’aucun bolus n’a été administré. Pour être sûr, veuillez vérifier la pompe pour éviter un double bolus ensuite refaire le bolus une nouvelle fois.
@@ -640,7 +613,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Pas assez d\'insuline dans le réservoir pour le bolusErreur administration bolus étenduAC-I
- passé(e)sDéfinir des basals temp neutresSi activé, cela annulera une basal temp avant la fin de chaque heure. Cela peut aider à supprimer les bips/vibrations à chaque heure.Activer en permanence les SMB
@@ -699,7 +671,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Début Traitement HypoVersion Dev. La Boucle Fermée est désactivée.Mode ingénierie actif
- Le mode Ingénierie n\'est pas activé et n\'existe pas sur cette versionLecture du profil basalL\'historique de la pompe a été modifié depuis le calcul du bolus. Le bolus n\'a pas été administré. Merci de recalculer le bolus s\'il est toujours nécessaire.Le bolus a été délivré mais il n\'a pas pu être ajouté à l\'historique des traitements. Ceci peut se produire lorsque deux petits bolus de la même taille sont gérés dans les deux dernières minutes. Merci de vérifier l\'historique de la pompe et les entrées de traitements puis utilisez le Careportal pour y ajouter les entrées manquantes. Assurez-vous de ne pas ajouter des entrées au cours de la même minute et pour la même quantité d\'insuline.
@@ -709,7 +680,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Le pourcentage de basal a changé dans la pompe mais sa lecture a échouéVérification des modifications de l\'historiqueDe multiples bolus similaires viennent d\'être importés dans la même minute. Un seul enregistrement a pu être ajouté aux traitements. Merci de vérifier la pompe et d\'ajouter manuellement un enregistrement de bolus en utilisant l\'onglet Careportal. Assurez vous de créer ce bolus avec un temps différent de tous les autres Bolus.
- \n\nhttps://androidaps.readthedocs.io/en/latest/CROWDIN/fr\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)Le dernier bolus enregistré date d\'il y a plus de 24h ou est dans le futur. Vérifiez que la date dans la pompe est correctement définie.L\'heure/date sur la pompe du dernier bolus administré semble erroné. L\'IA est probablement incorrecte. Vérifiez l\'heure/date de la pompe.ProfileSwitch manquant. S’il vous plaît faire un changement de profil ou appuyez sur « Activer le profil » dans le LocalProfile.
@@ -740,7 +710,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
SMB non autorisé en mode Boucle OuverteAlimentsréinitialiser
- Déconnecté (%1$d m)IA totale maximale pour OpenAPS [U]Cette valeur est appelée Max IA (Insuline Active) dans le contaxte OpenAPS\nOpenAPS n’ajoutera pas plus d’insuline si l\'IA (Insuline Active) actuelle est supérieure à cette valeurPompe arrêtée
@@ -754,7 +723,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
PrécAssistant de configurationTERMINER
- Sélectionnez votre languePremier incrément d\'insulineDeuxième incrément d\'insulineTroisième incrément d\'insuline
@@ -784,20 +752,18 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Paramètres générauxActiver NSClientBienvenue à l\'assistant de configuration. Je vais vous guider à travers le processus de configuration\n
- Configuration pompeStatut de lectureDes modifications doivent être effectuées dans NSPasser l\'Assistant de configurationAppuyez sur le bouton ci-dessous pour autoriser AndroidAPS à suggérer/faire des changements de basal
- Configurer le plugin APS
- Configurer le plugin de SensibilitéLe plugin de Sensibilité est utilisé pour la détection de la Sensibilité et de calcul de glucides actifs. Pour plus d’informations visitez :https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBLe NSClient gère la connexion avec Nightscout. Vous pouvez sauter cette étape maintenant mais vous ne pourrez pas terminer les objectifs sans cette configuration.Rappel : les nouveaux profils d\'insuline requièrent une DIA d\'au moins 5h. Une DIA 5-6h dans les nouveaux profils d\'insuline équivaut à une DIA 3h dans les anciens profils d\'insuline.
- Configurez la source des glycémiesSélectionnez la source du profil. Si le patient est un enfant vous devriez utiliser un profil NS. Si personne ne vous suit sur Nightscout, vous préférerez probablement un profil local. N\'oubliez pas que vous êtes simplement en train de sélectionner la source du profil. Afin de pouvoir l\'utiliser vous devrez l\'activer via \"Changement de Profil\"Sélectionnez un des algorithmes disponibles. Ils sont organisés du plus ancien au plus récent. Les algorithmes les plus récents sont habituellement plus puissants et plus agressifs. De ce fait, si vous êtes un nouvel utilisateur, vous devriez probablement démarrer avec AMA au lieu de choisir un algorithme plus récent. N\'oubliez pas de lire la documentation OpenAPS et en faire la configuration avant utilisation.
+ En attente de connexion RileyLink...\n
+ Remarque : Vous pouvez continuer l\'installation une fois que la pompe a été initialisée.\nDémarrez votre premier objectifAutorisationDemande d\'autorisation
@@ -805,7 +771,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
L\'application a besoin de l\'autorisation de localisation pour l\'analyse BT et l\'identification WiFiL\'application a besoin d\'une autorisation de stockage pour pouvoir stocker les fichiers journaux et les paramètres d\'exportationDemande
- Configurer le plugin d\'insulineQuitterOuvrir navigationFermer navigation
@@ -820,7 +785,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
= 100]]>Cible temp. basse abaisse la sensibilité
- La résistance diminue la cible
+ Résistance diminue la cibleQuand une résistance est détectée, baisse de la glycémie cibleSensibilité augmente la cibleQuand une sensibilité est détectée, augmentation de la glycémie cible
@@ -845,7 +810,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Paramètres journalRéinitialiser les valeurs par défautDysfonctionnement NSClient. Faites une réinitialisation de NS et de NSClient.
- ASVersion %1$s disponibleDécalage horaireMode APS préféré
@@ -987,6 +951,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
stockage interne limitéBoucle désactivée ! Libérez au moins %1$d Mo du stockage interne !Format incorrect
+ La durée du DBT doit être un multiple de %1$d minutes et supérieure à 0.Code incorrect. Commande annulée.Non configuréChangement de profil effectué
@@ -1082,12 +1047,9 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Sélectionné :UnitésVoulez-vous changer de profil et annuler les modifications faites dans le profil actuel ?
- On
- OffRefaire l\'objectifSuppression démarréeVoulez-vous réinitialiser le début de l\'objectif ? Vous risquez de perdre vos progrès.
- Aucune pompe sélectionnéeSélectionnez les unités dans lesquelles vous souhaitez afficher les valeursRemonter les modifications de profil local dans NSDAI
@@ -1108,7 +1070,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
EnvoyerProfil le plus courant :Remarque : seules les données visibles sur cet écran seront téléchargées de manière anonyme. L\'ID est attribué à cette installation d\'AndroidAPS. Vous pouvez soumettre à nouveau des données si votre profil principal est modifié, mais laissez-le fonctionner au moins pendant une semaine pour rendre le résultat visible dans le temps. Votre aide est appréciée.
- SondageÂge invalidePoids invalide% saisi invalide
@@ -1128,10 +1089,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Effacer la file d\'attente ? Toutes les données en file d\'attente seront perdues !L\'utilisation du bolus étendu arrètera la boucle fermée pour la durée d\'exécution du bolus étendu. Voulez-vous vraiment le faire ?Boucle fermée désactivée à cause du bolus étendu
- EB\"Vérif. du téléphone\"Menu Graph
- ASHeure de demande SMBHeure d\'exécution SMBHeure de demande basal temp
@@ -1147,17 +1106,18 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Code à vérifier :OTP + PINLe code de vérification est composé de 6 chiffres affichés par l\'application Authenticator (appelée OTP) suivi du code PIN obligatoire constitué de 3 chiffres ou plus.
- OTP à vérifier :Réinitialiser les authentificateursRéinitialiser la clé de l\'AuthentificateurVoulez-vous réinitialiser la clé de l\'Authenticateur ? Cela rendra tous authentificateurs configurés invalides, et vous devrez les configurer à nouveau.Nouvelle clé de l\'Authenticateur générée ! Veuillez utiliser le QRCode mis à jour pour les authentificateurs.
+ Exportation de l\'OTP secret
+ Êtes-vous sûr de vouloir copier l\'OTP secret dans le presse-papiers ?\n\nVous pouvez en avoir besoin uniquement si votre application d\'authentification a des problèmes pour scanner le QRCode, si vous voulez le saisir manuellement ou si vous voulez configurer un jeton OTP matériel en utilisant une application dédiée.
+ OTP secret (au format Base32) exporté et copié dans le presse-papiers. Collez-le dans l\'authentificateur ou le graveur OTP matériel !1. Installation l\'Authentificateur2. Scan du code pour configurer les codes OTP AndroidAPS3. Test Mot-de-Passe-Unique (OTP)Réinitialiser les authentificateursSur chaque téléphone suiveur, installez une appli. Authentificateur qui prend en charge les jetons RFC 6238 TOTP. Les applications libres populaires sont:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- NE PAS PARTAGER ce code en ligne !\nUtilisez-le uniquement pour configurer l\'appli. Authenticateur sur les téléphones suiveurs.En réinitialisant l\'Authentificateur, vous invalidez tous les authentificateurs déjà initialisés. Vous devrez les reconfigurer !À la connexionÀ la déconnexion
@@ -1171,14 +1131,15 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Copier les paramètres depuis NSCopier les paramètres NS (s\'ils existent)?Thème d\'origine
- Les boutons sont toujours affichés en bas de l\'écran
+ Basse résolution
+ Boutons toujours en basGrand écranThèmeComparer les profilsAssistant ProfilProfil par défautProfil actuel
- Profil disponible
+ Profils disponiblesType de profilÂge: %1$.0f DTI: %2$.0f UÂge: %1$.0f DTI: %2$.0f U %3$d%%
@@ -1215,4 +1176,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
État du travail : %sDonnées transféréesLes données suivantes seront téléchargées sur votre compte Open Humans : glycémie, bolus, glucides, événements Careportal (sauf les notes), bolus étendus, changements de profil, doses quotidiennes totales, basales temporaires, cibles temporaires, préférences, version de l\'application, modèle de l\'appareil et dimensions de l\'écran. Les informations secrètes ou privées telles que votre URL Nightscout ou votre API secret ne seront pas téléchargés.
+ État du RileyLink :
+ Filtrer
diff --git a/app/src/main/res/values-ga-rIE/strings.xml b/app/src/main/res/values-ga-rIE/strings.xml
index 8f12c9934a..34e0398ac2 100644
--- a/app/src/main/res/values-ga-rIE/strings.xml
+++ b/app/src/main/res/values-ga-rIE/strings.xml
@@ -14,7 +14,6 @@
MM640gIOBCOB
- PBAGEOAPS
diff --git a/app/src/main/res/values-it-rIT/exam.xml b/app/src/main/res/values-it-rIT/exam.xml
index 41cbab4c33..cb3b7b3bf8 100644
--- a/app/src/main/res/values-it-rIT/exam.xml
+++ b/app/src/main/res/values-it-rIT/exam.xml
@@ -17,7 +17,6 @@
Il profilo NS può essere utilizzato, ma non configurato.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileArgomento: disconnessione dal micro
- Cosa dovrebbe essere fatto quando si disconnette il micro?Click su \'Disconnetti micro\' cosicché AAPS sappia che non viene erogata alcuna insulina.Click su \'Sospendi loop\' cosicché AAPS stoppi l\'attività di loop mentre il micro è disconnesso.Non cambiare alcunché in AAPS, solo disconnettere il micro.
diff --git a/app/src/main/res/values-it-rIT/objectives.xml b/app/src/main/res/values-it-rIT/objectives.xml
index 1eb4e508a1..433283bea9 100644
--- a/app/src/main/res/values-it-rIT/objectives.xml
+++ b/app/src/main/res/values-it-rIT/objectives.xml
@@ -1,6 +1,5 @@
- IndietroAvviaVerifica%1$d. Obiettivo
diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml
index 52b36d5793..cd843b947a 100644
--- a/app/src/main/res/values-it-rIT/strings.xml
+++ b/app/src/main/res/values-it-rIT/strings.xml
@@ -21,17 +21,16 @@
Visualizza i preset dei cibi definiti in NightscoutPreset per insulina Humalog e NovoRapid / NovoLogPreset per insulina Fiasp
+ Preset per insulina LyumjevTi consente di definire il picco di attività dell\'insulina e deve essere utilizzato solo dagli utenti avanzatiAttiva o disattiva l\'implementazione per la gestione del loop.Sincronizza i tuoi dati con Nightscout
- Stato dell\'algoritmo nel 2016Stato dell\'algoritmo nel 2017Algoritmo più recente per utenti avanzatiVisualizza lo stato corrente del tuo loop e i tasti per le azioni più comuniMostra una notifica persistente con una breve panoramica di ciò che sta facendo il tuo loopDefinisci un profilo che è disponibile offline.Fornisce il profilo che hai definito in Nightscout
- Definisci un profilo con un solo blocco temporale.Integrazione del microinfusore Accu-Chek Combo, è necessario avere ruffy installatoPer le persone in terapia multi-iniettivaPer microinfusori che non hanno ancora alcun driver (Loop aperto)
@@ -83,7 +82,6 @@
Configuratore strutturalePanoramicaProfilo NS
- Profilo sempliceTrattamentiMicro virtualePortale
@@ -105,13 +103,11 @@
APSDopo elaborazione vincoliBasale temporanea impostata dal micro
- Ultima attivazioneNESSUN APS SELEZIONATO O RISULTATO FORNITOSicurezzaIl plugin è disabilitatoViolazione dei vincoliErrore erogazione bolo
- Valore basale [%]Accetta nuova basale temporanea:TrattamentoCalcolatore
@@ -140,17 +136,11 @@
AltroGlucometroSensore
- CHO
- InsulinaOffset CHO
- FrazioneDurata
- Percentuale
- AssolutoNoteOra eventoProfilo
- Inserito daTipo glicemiaNessun profilo ancora caricato da NSBasale temporanea
@@ -214,7 +204,6 @@
Errore decrittazione, la password fornita è errata o il file delle impostazioni è stato modificato! È possibile che il file importato sia stato esportato con una diversa password master.Configurazione crittografia mancante, il formato delle impostazioni non è valido!Algoritmo di crittografia non supportato o non specificato!
- esportato oggiesportato %1$s faesportato il %1$sesportato meno di un\'ora fa
@@ -246,10 +235,6 @@
Target %1$s per %2$d minuti impostato con successoTemp-Target cancellato con successoConsenti comandi remoti tramite SMS
- Impostazioni profilo DanaR
- DIA [h]
- Durata azione dell\'Insulina
- CaricamentoBolo stoppatoStop del bolo in corsoIl loop è stato disabilitato
@@ -260,7 +245,7 @@
Il valore %1$s è fuori limite massimoPer connettere il micro rispondi col codice %1$sConnessione al micro fallita
- Per disconnettere il micro per %1d minuti rispondi col codice %2$s
+ Per disconnettere il micro per %1$d minuti rispondi col codice %2$sMicro disconnessoMicro riconnessoIl comando da remoto non è permesso
@@ -304,7 +289,6 @@
Micro non inizializzato!Carica/RiempiAssicurati che la quantità corrisponda alla specifica del tuo set di infusione!
- AltroCarica/Riempi: quantità standard di insulinaTasto 1Tasto 2
@@ -312,7 +296,6 @@
Unità:UnitàDIA
- Intervallo target:Intervallo di visualizzazioneLimite alto e basso per i grafici nella sezione Panoramica e sullo smartwatchLimite BASSO
@@ -346,7 +329,6 @@
AZNCONFLOOP
- PSOAPSPLHOME
@@ -371,7 +353,6 @@
Attenzione!\nNormalmente non dovresti modificare questi valori. FAI CLICK QUI e leggi il testo e assicurati di AVERLO CAPITO prima di cambiare uno di questi valori.Numero di telefono SMS non validoCalibrazione
- Inviare calibrazione %1$.1f a xDrip?xDrip+ non installatoCalibrazione inviata a xDripCalibrazione inviata. La ricezione deve essere abilitata in xDrip.
@@ -404,12 +385,13 @@
Dividi IOB in bolo e basale sulla watchfacenon riuscito - controlla il telefonon/a
- Età del paziente
+ Tipo pazienteBambinoAdolescenteAdultoAdulto insulino-resistente
- Seleziona l\'età del paziente per impostare i limiti di sicurezza
+ Gravidanza
+ Seleziona il tipo di paziente per configurare i limiti di sicurezzaNome pazienteFornisci il nome del paziente o il nickname per distinguere questa configurazione tra altreUtente
@@ -417,7 +399,6 @@
Per un buon funzionamento, %1$s ha bisogno di essere nella whitelist della funzione \"ottimizzazione batteria\" di AndroidLoop sospesoSospeso (%1$d m)
- Superbolo (%1$d m)Sospendi loopSospendi loop per 1hSospendi loop per 2h
@@ -440,7 +421,6 @@
Registra l\'avvio dell\'app in NSUscita dall\'applicazione per applicare le impostazioni.Quale tipo di insulina stai usando?
- Insulina Fast ActingNovorapid, Novolog, HumalogFiaspINS
@@ -453,6 +433,8 @@
Soglia età insulina critica [h]Soglia di avviso età sensore [h]Soglia età sensore critica [h]
+ Soglia di avviso livello batteria sensore [%]
+ Soglia livello batteria sensore critico [%]Soglia di avviso età batteria [h]Soglia età batteria critica [h]Soglia di avviso livello serbatoio [U]
@@ -478,11 +460,13 @@
Nessun caricamento in NSTutti i dati inviati a NS vengono rifiutati. AAPS è connesso a NS, ma non vengono apportate modificheCancella bolo esteso
- Età sensore
- Età cannula
- Età insulinaCambia profilo
- Età batteria micro
+ Sensore
+ Cannula
+ Insulina
+ Batteria micro
+ età:
+ livello:Opzioni allarmeCrea notifiche da allarmi NSCrea notifiche da avvisi NS
@@ -496,20 +480,14 @@
Rilevamento sensibilitàQuale algoritmo di sensibilità dovrebbe essere utilizzato?SENS
- Sensibilità Oref0Sensibilità Oref1Sensibilità AAPSImpostazioni assorbimentoMax tempo assorbimento pasto [h]Tempo in ore in cui è previsto che tutti i carboidrati del pasto vengano assorbiti
- SAGE
- IAGE
- CAGE
- MBAGEOAPSUPLDBAS
- EXTMantieni lo schermo accesoEvita che Android spenga lo schermo. Consumerà molta energia quando non è collegato alla presa di corrente.Attivando la funzione Autosense, ricorda di inserire tutti i carboidrati assunti. Altrimenti le deviazioni di glicemia dovute ai carboidrati saranno identificate erroneamente come variazione di sensibilità !!
@@ -520,10 +498,6 @@
Valori non memorizzati!Abilita le trasmissioni ad altre app (come xDrip). Non abilitare se hai installato più di un\'istanza di AAPS o NSClient!Abilita le trasmissioni locali.
- ATTIVITÀ & FEEDBACK
- CHO & BOLO
- CGM & OPENAPS
- MICRODurata [min]OpenAPS SMBAbilita UAM
@@ -535,6 +509,7 @@
Free-Peak OrefRapid-Acting OrefUltra-Rapid Oref
+ LyumjevDIA di %1$f troppo breve - utilizzo %2$f.Attiva profiloNON VALIDO
@@ -576,7 +551,6 @@
Mostra delta dettagliatoMostra delta con una cifra decimale in piùFrequenza erogazione SMB (min)
- Max minuti SMBMax minuti di basale a cui limitare SMBSMB UAM max minutiMax minuti di basale a cui limitare SMB per UAM
@@ -630,7 +604,6 @@
VuotoNormaleNecessario aggiornare orologio micro
- AvvisoAvviso TBR CANCELLATO: confermatoIl micro potrebbe non essere raggiungibile. Nessun bolo erogatoErogazione bolo fallita. Sembra che nessun bolo sia stato erogato. Per sicurezza, controlla il micro per evitare un doppio bolo e se è tutto ok, erogalo di nuovo. Come protezione da eventuali \"bug\", i boli non vengono ripetuti automaticamente.
@@ -639,7 +612,6 @@
Insulina nel serbatoio insufficiente per erogare il boloErrore erogazione bolo estesoSight
- faImposta basali temporanee neutreSe 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.Abilita SMB sempre
@@ -698,7 +670,6 @@
Avvia TT IpoglicemiaVersione sviluppatore in esecuzione. Loop chiuso disabilitato.Engineering mode abilitata
- Engineering mode non abilitata e non su \'release branch\'Lettura profilo basaleLo storico del micro è cambiato dopo il calcolo del bolo. Il bolo non è stato erogato. Ricalcolare se un bolo è ancora necessario.Bolo erogato con successo, ma non è possibile aggiungere la voce ai trattamenti. Questo può accadere se due piccoli boli della stessa quantità sono stati somministrati negli ultimi due minuti. Controlla lo storico del micro e le voci della sezione Trattamenti e utilizza la sezione Portale per aggiungere eventuali voci mancanti. Assicurati di non aggiungere voci che si riferiscano al medesimo minuto e alla stessa quantità.
@@ -708,7 +679,7 @@
Velocità basale cambiata sul micro, ma la sua lettura è fallitaControllo modifiche allo storicoSono appena stati importati più boli con la stessa quantità nello stesso minuto. Solo un record può essere aggiunto ai trattamenti. Controlla il micro e aggiungi manualmente un record di bolo utilizzando la sezione Portale. Assicurati di creare un bolo con un\'ora non utilizzata da nessun altro bolo.
- \n\nhttp://www.androidaps.org\n\nfacebook:\nhttp://facebook.androidaps.org
+ \n\ndocumentazione:\nhttps://androidaps.readthedocs.io\n\nfacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsers\nhttps://www.facebook.com/groups/aapsitaliaL\'ultimo bolo è più vecchio di 24 ore o ha una data nel futuro. Controlla che la data sul micro sia impostata correttamente.L\'ora/la data del bolo erogato sul micro sembra errata, IOB probabilmente non è corretto. Controlla l\'ora e/o la data del micro.Nessun cambio profilo. Effettua un cambio profilo o premi \"Attiva profilo\" nella sezione Profilo locale.
@@ -739,7 +710,6 @@
SMB non consentito in modalità loop apertoCiboreset
- Disconnesso (%1$d m)Max IOB totale a cui limitare OpenAPS [U]Questo valore è chiamato Max IOB nel contesto OpenAPS\nOpenAPS non aggiungerà ulteriore insulina se IOB corrente è maggiore di questo valoreMicro stoppato
@@ -753,7 +723,6 @@
IndietroConfigurazione guidataFINE
- Seleziona la tua linguaPrimo incremento di insulinaSecondo incremento di insulinaTerzo incremento di insulina
@@ -783,20 +752,18 @@
Impostazioni generaliAbilita NSClientBenvenuto nella configurazione guidata. Ti seguirò durante tutto il processo.\n
- Configurazione microLettura statoLe modifiche devono essere fatte in NSSalta configurazione guidataPremi il tasto in basso per permettere ad AndroidAPS di proporre/fare modifiche alla basale
- Configura il plugin APS
- Configura il plugin di sensibilitàIl plugin di sensibilità è utilizzato per il rilevamento della sensibilità all\'insulina e il calcolo di COB. Per ulteriori informazioni visita:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient gestisce la connessione a Nightscout. Puoi saltare questa parte ora, ma non sarai in grado di superare gli obiettivi fino a quando non ne porterai a termine la configurazione.Ricorda: i nuovi profili di insulina richiedono una DIA di almeno 5h. DIA di 5-6h sui nuovi profili sono uguali a DIA di 3h sui vecchi profili di insulina.
- Configura sorgente BGSeleziona il tipo di profilo. Se il paziente è un bambino dovresti utilizzare il profilo di NS. Se non c\'è nessuno a seguirti su Nightscout probabilmente preferirai il profilo locale. Ricorda che stai solo selezionando la sorgente del profilo. Per utilizzarlo devi attivarlo tramite l\'esecuzione del comando \"Cambio profilo\"Seleziona uno degli algoritmi disponibili. Sono ordinati dal più vecchio al più recente. L\'algoritmo più recente è solitamente più potente e più aggressivo. Pertanto, se sei un nuovo utente, probabilmente dovresti iniziare con AMA e non con l\'ultimo. Non dimenticare di leggere la documentazione di OpenAPS e di configurarlo prima dell\'uso.
+ Attesa connessione RileyLink…\n
+ Nota: Puoi continuare la configurazione una volta che il micro è stato inizializzato.\nAvvia il tuo primo obiettivoAutorizzazioneChiedi l\'autorizzazione
@@ -804,7 +771,6 @@
L\'applicazione richiede l\'accesso alla posizione per la scansione bluetooth e l\'identificazione WiFiL\'applicazione richiede l\'accesso alla memoria per memorizzare i file di log ed esportare le impostazioniRichiesta
- Configura il plugin InsulinaEsciApri navigazioneChiudi navigazione
@@ -844,7 +810,6 @@
Impostazioni LogRipristina valori predefinitiMalfunzionamento NSClient. Considera il riavvio di NS e NSClient.
- ASVersione %1$s disponibileOffsetModalità APS preferita
@@ -986,6 +951,7 @@
vincolo di archiviazione internaLibera almeno %1$d MB dalla memoria interna! Loop disabilitato!Formato errato
+ La durata del TBR deve essere un multiplo di %1$d minuti e maggiore di 0.Codice errato. Comando cancellato.Non configuratoCambio profilo creato
@@ -1081,12 +1047,9 @@
Selezionato:UnitàVuoi cambiare profilo e scartare le modifiche apportate al profilo corrente?
- On
- OffCancella completamentoCancella avvioVuoi resettare l\'avvio dell\'obiettivo? Potresti perdere i tuoi progressi.
- Nessun micro selezionatoSeleziona le unità in cui vuoi visualizzare i valoriCarica modifiche al profilo locale in NSDIA
@@ -1107,7 +1070,6 @@
InviaProfilo più comune:Nota: solo i dati visibili su questa schermata verranno caricati (in modo anonimo). Un ID è assegnato a questa installazione di AndroidAPS. Puoi inviare nuovamente i dati se il tuo profilo principale viene modificato, ma lascialo in esecuzione almeno per una settimana per rendere il risultato visibile nel time in range (TIR). Il tuo aiuto è apprezzato.
- SondaggioInserimento età non validoInserimento peso non validoInserimento % non valido
@@ -1127,10 +1089,8 @@
Cancellare la coda? Tutti i dati in coda andranno persi!L\'uso della funzione bolo esteso interromperà la modalità loop chiuso per il tempo di esecuzione del bolo esteso. Lo vuoi davvero?Loop chiuso disabilitato a causa dell\'esecuzione di un bolo esteso
- BE\"PhoneChecker\"Menu grafico
- ASRichiesta SMB (momento)Esecuzione SMB (momento)Richiesta basale temporanea (momento)
@@ -1146,17 +1106,18 @@
Codice controllo:OTP + PINIl codice di verifica è composto da 6 cifre visualizzate dall\'app autenticatore (note come OTP) seguite da 3 o più cifre del PIN obbligatorio.
- OTP per verifica:Resetta autenticatoriResetta chiave autenticatoreSei sicuro di resettare la chiave autenticatore? Renderà non validi tutti gli autenticatori attualmente configurati e sarà necessario configurarli nuovamente.La nuova chiave autenticatore è stata generata! Utilizza il QRCode aggiornato per fornire gli autenticatori.
+ Esportazione OTP secret
+ Sei sicuro di voler copiare l\'OTP secret negli appunti?\n\nPotresti averne bisogno solo se la tua app autenticatore ha problemi con la scansione del QRCode, vuoi inserirlo manualmente o vuoi configurare un token OTP hardware usando un\'app dedicata.
+ OTP secret (in formato Base32) esportato e copiato negli appunti. Incollalo nell\'autenticatore o nel configuratore hardware di OTP!1. Installa l\'autenticatore2. Scansione il codice per configurare i codici OTP di AndroidAPS3. Testa OTPResetta autenticatoriSu ogni telefono follower installa una app autenticatore che supporta i token RFC 6238 TOTP. App gratuite popolari sono:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- NON CONDIVIDERE questo codice online!\nUtilizzalo solo per configurare l\'app autenticatore sui telefoni follower.Resettando l\'autenticatore rendi non validi tutti gli autenticatori già forniti. Dovrai configurarli di nuovo!Alla connessioneAlla disconnessione
@@ -1170,6 +1131,7 @@
Copia impostazioni da NSCopiare impostazioni NS (se esiste)?Tema originale
+ Tema a bassa risoluzioneI tasti vengono sempre visualizzati nella parte inferiore dello schermoVisualizzazione ampiaTema
@@ -1214,4 +1176,8 @@
Worker State: %sDati caricatiI seguenti dati verranno caricati sul tuo account Open Humans: valori glicemia, boli, carboidrati, eventi portale (eccetto note), boli estesi, cambi profilo, dosi giornaliere totali (TDD), basali temporanee, target temporanei, preferenze, versione dell\'applicazione, modello del dispositivo e dimensioni dello schermo. Informazioni segrete o private come l\'URL di Nightscout o l\'API secret non verranno caricate.
+ Stato RileyLink:
+ Filtro
+ Impossibile creare il profilo locale. Il profilo non è valido.
+ Non terminare l\'app?
diff --git a/app/src/main/res/values-iw-rIL/exam.xml b/app/src/main/res/values-iw-rIL/exam.xml
index 3ea04e700d..e765607abd 100644
--- a/app/src/main/res/values-iw-rIL/exam.xml
+++ b/app/src/main/res/values-iw-rIL/exam.xml
@@ -1,2 +1,167 @@
-
+
+ מה נכון לגבי משך פעילות אינסולין (DIA)?
+ נושא: משך פעילות אינסולין
+ הערך המינימלי הוא 3 שעות.
+ הערך המינימלי הוא 5 שעות.
+ https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html?#insulin
+ המשמעות שווה לערך ה-DIA שמשמש את המשאבה.
+ עליכם לקבוע את הערך האישי לכם (עליו להיות לכל הפחות 5 שעות).
+ נושא: ערך מטרה זמני בהיפוגליקמיה
+ מהי הסיבה העיקרית להגדרת ערך \"ערך מטרה זמני בהיפו\" ?
+ כדי למנוע מרמת הסוכר מלרדת נמוך אם יש כבר מינון בזאלי זמני אפס.
+ כדי למנוע מ-AAPS להזריק יותר מדי אינסולין לאחר עלייה ברמת הגלוקוז כתוצאה מפחמימות פשוטות שנאכלו כטיפול בהיפו.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/temptarget.html
+ באיזה פרופיל אפשר להשתמש ולהגדיר במצב לא מקוון?
+ נושא: פרופיל לא מקוון
+ ניתן להשתמש ב-Nightscout אך לא ניתן להגדירו.
+ https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profile
+ נושא: התנתקות מהמשאבה
+ לחצו \"ניתוק משאבה\" כדי ש-AAPS יידע שלא יינתן איסולין.
+ לחצו \"השהיית לולאה\" כדי ש-AAPS יעצור את הלולאה בזמן שהמשאבה מנותקת.
+ לא לשנות דבר ב-AAPS, רק לנתק את המשאבה.
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#other-settings
+ נושא: הגדרות AndroidAPS
+ מהן שיטות העבודה המומלצות לגיבוי ההגדרות שלכם?
+ ייצוא ההגדרות בתפריט התחזוקה אל מכשירכם.
+ גיבוי הקובץ המיוצא למקום נוסף כמו דוא\"ל, דרופבוקס, גוגל דרייב…
+ ייצוא ההגדרות מיד לאחר התקנת AAPS.
+ ייצוא לאחר שינוי בהגדרות.
+ ייצוא ההגדרות לאחר סיום משימה.
+ ייצוא לאחר סיום ההגדרה הראשונית.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/ExportImportSettings.html
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#what-emergency-equipment-is-recommended-to-take-with-me
+ נושא: קריאות סנסור לא יציבות
+ מה לעשות אם נתוני הסנסור לא יציבים?
+ שום דבר. AAPS יטפל בזה בעצמו.
+ להשבית את הלולאה כדי למנוע מינון יתר.
+ להחליף את הסנסור.
+ כבה את הטלפון.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Smoothing-Blood-Glucose-Data-in-xDrip.html#smoothing-blood-glucose-data
+ לוודא שאפליקציית הסנסור מתקנת את נתוני הקריאה.
+ נושא: התעמלות
+ איך עוזרים למערכת להתמודד עם התעמלות?
+ שימוש בפונקציית ערך מטרה זמני.
+ בחירת פרופיל עם אחוז נמוך מ-100%.
+ בחירת פרופיל עם אחוז גבוה מ-100%.
+ הפסק את הלולאה.
+ הגדרת ערך מטרה של התעמלות לפני תחילת האימון.
+ הגדרת ערך מטרה של התעמלות אחרי תחילת האימון מובילה לתוצאות טובות פחות מאשר הגדרה לפני תחילת אימון.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/temptarget.html#activity-temp-target
+ נושא: לולאה מושבתת\מושהית
+ האם אני מקבל\ת אינסולין כאשר הלולאה מושבתת/מושהית?
+ כן, אינסולין בזאלי ממשיך להינתן.
+ לא, אספקת האינסולין נפסקת.
+ נושא: מדידת בזאלי, יחס תיקון ויחס פחמימות
+ מתי עלי לאמת את ערכי הבזאלי ואת יחסי התיקון והפחמימות?
+ לפני שאני מתחיל\ה לולאה.
+ כאשר יש היפוגליקמיה לעיתים קרובות.
+ כאשר יש היפרגליקמיה לעיתים קרובות.
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#androidaps-settings
+ נושא: דרישות מוקדמות
+ מה אני צריך\ה?
+ הגדרת פרופיל אישי (מינון בזאלי-Basal, יחס אינסולין\פחמימה- IC, פקטור תיקון-ISF, משך פעילות אינסולין-DIA).
+ מחשב ליצירת קובץ ה-APK.
+ טלפון נתמך.
+ מכונית.
+ Nightscout לצורך הגדרת ערכים.
+ חשבון Tidepool.
+ חשבון Google.
+ חשבון Github.
+ ניסיון בפיתוח אנדרואיד.
+ משאבת מנימד 670G.
+ https://androidaps.readthedocs.io/en/latest/EN/Module/module.html
+ שעון חכם.
+ סנסור נתמך.
+ נושא: עדכון AndroidAPS
+ מה נכון?
+ על Git להיות מותקן.
+ עדכנו כשיש גרסה חדשה ועשו זאת כשיש לכם זמן.
+ השתמשו באותם מפתחות חתימה.
+ לעולם לא לעדכן את האפליקציה אם היא פועלת כראוי.
+ בקשו עזרה מחבר להשגת קובץ ה-APK החדש.
+ https://androidaps.readthedocs.io/en/latest/EN/Installing-AndroidAPS/Update-to-new-version.html#update-to-a-new-version-or-branch
+ נושא: פתרון בעיות
+ איפה לחפש עזרה?
+ הצטרפו לקבוצת AndroidAPS בפייסבוק.
+ קראו את הוראות AndroidAPS.
+ בקרו בחדר ה-Gitter של AndroidAPS.
+ בקשו תמיכה ל-AndroidAPS ב-Google
+ דברו עם האנדוקרינולוג שלכם.
+ https://androidaps.readthedocs.io/en/latest/EN/Installing-AndroidAPS/Update-to-new-version.html#troubleshooting
+ https://www.facebook.com/groups/AndroidAPSUsers/
+ https://gitter.im/MilosKozak/AndroidAPS
+ נושא: תוספי אינסולין
+ באיזה סוג של אינסולין מתאים לתוסף \"Ultra-Rapid-Oref\"?
+ Fiasp®
+ NovoRapid®
+ Humalog®
+ Actrapid®
+ https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#insulin
+ נושא: תוספי רגישות
+ לאיזה אלגוריתם רגישות יש טווח זמן הניתן להגדרה?
+ https://androidaps.readthedocs.io/en/latest/EN/Configuration/Sensitivity-detection-and-COB.html
+ באיזה תוסף רגישות חייבים להתשמש כדי לאפשר את פונקציית \"ארוחות לא מוכרזות\" (UAM)?
+ נושא: שגיאות רישום פחמימות
+ מה לעשות אם טעית ברישום הפחמימות?
+ ב\"טיפולים\", מחקו את רשומת הפחימות השגויה. רשמו פחמימות מחדש.
+ הזרקת אינסולין מדומה באמצעות הפונקציה \"מילוי חדש\"
+ נושא: מזון עם שומן וחלבון
+ מה לעשות אם האוכל שלך מכיל כמות גדולה של שומן ו\או חלבונים?
+ לחשב מחדש שומן וחלבונים כפחמימות והשתמש בפונקציית \"פחמימות ממושכות\".
+ חשב מחדש את השומן והחלבונים כפחמימות והוסף לבולוס.
+ השתמש בבולוס ממושך לכיסוי שומן וחלבונים.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Extended-Carbs.html
+ נושא: ניטור מרוחק
+ איך אפשר לפקח על AAPS של הילד שלך מרחוק?
+ באמצעות אתר Nightscout.
+ Dexcom Follow במקרה ומשתמשים באפליקציית Dexcom המקורית (לערכי סוכר בלבד).
+ שימוש ב-Dexcom Follow אם משתמשים באפליקציית xDrip.
+ xDrip פועל במצב עוקב.
+ אפליקציית Loop על iPhone.
+ אפליקציית Spike על iPhone.
+ https://androidaps.readthedocs.io/en/latest/EN/Children/Children.html
+ נושא: פקטור רגישות של אינסולין (יחס תיקון-ISF)
+ פקטור תיקון גבוה גורם להזרקה של פחות אינסולין בעת תיקון ערכי סוכר גבוהים
+ פקטור תיקון נמוך גורם להזרקה של פחות אינסולין בעת תיקון ערכי סוכר גבוהים.
+ שינוי פקטור תיקון אינו משפיע על כמות האינסולין שמוזרקת כאשר AAPS מתקן את ערכי הסוכר הגבוהים.
+ עליכם לציין את פקטור התיקון (ISF) בהעדפות.
+ שינוי ערך ISF בפרופיל שלכם מספיק כדי להחיל את השינוי.
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html
+ נושא: יחס אינסולין פחמימה (IC)
+ יחס אינסולין פחמימה גבוה גורם להזרקת פחות אינסולין עבור כל פחמימה.
+ יחס אינסולין פחמימה נמוך גורם להזרקת פחות אינסולין עבור כל פחמימה.
+ כאשר יש 0 פחמ\', שינוי יחס הפחמימות (IC) יוביל למינון שונה של אינסולין כדי לתקן ערך סוכר נתון.
+ יחס הפחמימות (IC) יהיה שונה אם ערך יחידת לחם ייספר כ-10 או 12 גר\'.
+ יחס הפחמימות (IC) הוא: כמה יחידות לחם מכוסות ע\"י יחידת אינסולין אחת.
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-u
+ נושא: החלפת פרופילים
+ כאשר בוחרים 90% בעת החלפת הפרופיל…
+ הבזאלי יהיה גבוה ב-10%.
+ הבזאלי יהיה נמוך ב-10%.
+ ערך יחס אינסולין פחמימה (IC) יהיה גבוה ב-10%.
+ ערך יחס אינסולין פחמימה (IC) יהיה נמוך ב-10%.
+ ערך פקטור התיקון (ISF) יהיה גבוה ב-10%.
+ ערך פקטור התיקון (ISF) יהיה נמוך ב-10%.
+ תקבלו בערך 10% פחות אינסולין.
+ ערך המטרה יהיה גבוה ב-10%.
+ ערך המטרה יהיה נמוך ב-10%.
+ רק ערך המטרה התחתון יהיה נמוך ב-10%.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html?highlight=profile%20switch#profile-switch
+ איך תעדכן את AAPS אם קמת שעה מוקדם?
+ אפעיל מצב פרופיל זמני עם היסט זמן של 1+
+ אפעיל מצב פרופיל זמני עם היסט זמן של 1-
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html?highlight=profile%20switch#timeshift
+ אפעיל מצב פרופיל זמני עם היסט זמן של 60+
+ אפעיל מצב פרופיל זמני עם היסט זמן של 60-
+ https://androidaps.readthedocs.io/en/latest/EN/Module/module.html#good-individual-dosage-algorithm-for-your-diabetes-therapy
+ נושא: עזרה עם בזאלים
+ היכן ניתן לקבל עזרה בנושא מינון בזאלי וכו\'.
+ צוות הסוכרת שלכם
+ Google
+ Facebook
+ תרופה אחרת
+ AAPS מוריד את הבזאלי כדי להעלות את רמת הגלוקוז בדם. תרופות מקבוצת מעכבי SGLT2 (גליפלוזינים) יכולים למנוע עלייה צפויה בסוכר וייתכן שייצרו חסר אינסולין מסוכן (DKA).
+\nשמותיהם המסחריים מוכרים הם: Invokana®, Forxiga®, Jardiance®, Steglatro®, Suglat®, Apleway®, Deberza®, Synjardy®, Vokanamet®, Xigduo®.\n\nאני מתחייב\ת שלא לקחת את התרופות הללו תוך שימוש ב-AAPS או שלא אאפשר את הלולאה לפני לקיחת התרופות הנ\"ל.
+
diff --git a/app/src/main/res/values-iw-rIL/insight_alert_codes.xml b/app/src/main/res/values-iw-rIL/insight_alert_codes.xml
index 3ea04e700d..a7c1fcf21a 100644
--- a/app/src/main/res/values-iw-rIL/insight_alert_codes.xml
+++ b/app/src/main/res/values-iw-rIL/insight_alert_codes.xml
@@ -1,2 +1,29 @@
-
+
+ תזכורת R1
+ תזכורת R2
+ תזכורת R3
+ תזכורת R4
+ תזכורת R7
+ אזהרה W31
+ אזהרה W32
+ אזהרה W33
+ אזהרה W34
+ אזהרה W36
+ אזהרה W38
+ אזהרה W39
+ תחזוקה M20
+ תחזוקה M21
+ תחזוקה M22
+ תחזוקה M23
+ תחזוקה M24
+ תחזוקה M25
+ תחזוקה M26
+ תחזוקה M27
+ תחזוקה M28
+ תחזוקה M29
+ תחזוקה M30
+ שגיאה E6
+ שגיאה E10
+ שגיאה E13
+
diff --git a/app/src/main/res/values-iw-rIL/insight_alert_descriptions.xml b/app/src/main/res/values-iw-rIL/insight_alert_descriptions.xml
index 3ea04e700d..0c30992caf 100644
--- a/app/src/main/res/values-iw-rIL/insight_alert_descriptions.xml
+++ b/app/src/main/res/values-iw-rIL/insight_alert_descriptions.xml
@@ -1,2 +1,24 @@
-
+
+ %1$d%%\nמשך: %2$s h]]>
+ %1$s U]]>
+ החלף סוללה.
+ קבע זמן/תאריך.
+ צור קשר עם תמיכת Accu-Chek.
+ %1$d%%\nמשך: %2$s h]]>
+ %1$s U כמות שניתנה: %2$s U]]>
+ הכנס מיכל.
+ החלף מיכל.
+ החלף סוללה.
+ בדוק סטטוס משאבה.
+ החלף פרפרית.
+ צור קשר עם תמיכת Accu-Chek.
+ החלף מיכל.
+ הפעילו מחדש את הורדת הנתונים.
+ בדוק סטטוס משאבה.
+ קבע סוג סוללה.
+ קבע סוג מיכל.
+ החלף סוללה ומיכל.
+ החלף מיכל.
+ שנה שפה.
+
diff --git a/app/src/main/res/values-iw-rIL/insight_alert_titles.xml b/app/src/main/res/values-iw-rIL/insight_alert_titles.xml
index 3ea04e700d..cfbe5d5f5b 100644
--- a/app/src/main/res/values-iw-rIL/insight_alert_titles.xml
+++ b/app/src/main/res/values-iw-rIL/insight_alert_titles.xml
@@ -1,2 +1,29 @@
-
+
+ הזרק בולוס
+ בולוס הוחמץ
+ תזכורת
+ החלף פרפרית
+ בזאלי זמני הסתיים
+ מכל מתרוקן
+ סוללה חלשה
+ תאריך/זמן לא תקין
+ תמה תקופת האחריות
+ בזאלי זמני בוטל
+ בולוס בוטל
+ אזהרת זמן השאלה
+ מכל לא הוכנס
+ מיכל ריק
+ סוללה ריקה
+ כיבוי אוטומטי - משאבה נעצרה
+ חסימה
+ נגמרה תקופת ההשאלה - סיום פעולה
+ החלפת מיכל לא הושלמה
+ הורדת הנתונים נכשלה
+ מצב השהייה הסתיים
+ סוג הסוללה לא נקבע
+ סוג המיכל לא נקבע
+ תקלה מכנית
+ תקלה בהחזרת הבוכנה לאחור
+ תקלת שפה
+
diff --git a/app/src/main/res/values-iw-rIL/insight_exceptions.xml b/app/src/main/res/values-iw-rIL/insight_exceptions.xml
index 3ea04e700d..bd248cdc35 100644
--- a/app/src/main/res/values-iw-rIL/insight_exceptions.xml
+++ b/app/src/main/res/values-iw-rIL/insight_exceptions.xml
@@ -1,2 +1,14 @@
-
+
+ החיבור נכשל
+ החיבור נותק
+ התחברות נדחתה
+ יצירת סוקט נכשלה
+ פג הזמן
+ מספר מרבי של סוגי בולוס מופעל
+ לא קיים בזאלי זמני לביטול
+ לא קיים בזאלי זמני לשינוי
+ לא קיים בולוס לביטול
+ משאבה כבר במצב זה
+ מצב הפעלה לא מורשה
+
diff --git a/app/src/main/res/values-iw-rIL/objectives.xml b/app/src/main/res/values-iw-rIL/objectives.xml
index 3ea04e700d..02a806b3f9 100644
--- a/app/src/main/res/values-iw-rIL/objectives.xml
+++ b/app/src/main/res/values-iw-rIL/objectives.xml
@@ -1,2 +1,74 @@
-
+
+ התחל
+ אמת
+ %1$d. משימה
+ מטרה %1$d לא החלה
+ משימה %1$d לא בוצעה במלואה
+ מגדיר ויזואליזציה, ניטור, נתוח של מינון בזאלי ויחסים
+ ודא כי רמת סוכר זמינה ב- Nightscout, ושנתוני האינסולין מהמשאבה נשלחים
+ התחלה עם לולאה פתוחה
+ השתמשו במצב לולאה פתוחה במשך מס\' ימים, וקבעו באופן ידני מס\' רב של פרופילי בזאלי זמניים. הגדירו והשתמשו במטרות זמניות ובמטרות ברירת מחדל (לדוגמא פעילות גופנית, או מתן פחמימות בהיפו)
+ הבנה של הלולאה הפתוחה שלך, לרבות הבזאלים הזמניים וההמלצות
+ בהתבסס על ניסיון זה, קבעו את הערך הבזאלי המקסימלי והגדירו אותו במשאבה
+ מתחילים לסגור את הלולאה עם השהיה עקב רמת גלוקוז נמוכה
+ הרץ בלולאה סגורה עם ערך IOB מקסימלי = 0 למשך מספר ימים, עם מעט ארועי השהיה עקב גלוקוז נמוך (LGS)
+ כוונון הלולאה הסגורה, תוך העלאה של ערך ה- IOB מעל 0 ובסופו של דבר הורדת ערכי המטרה של רמת הסוכר
+ לפני הורדת ערך רמת הסוכר, הפעל במשך מס\' ימים, עם לפחות לילה אחד ללא התרעת רמת סוכר נמוכה
+ במידת הצורך, בצעו התאמת בזאלי ויחסים, ולאחר מכן הפעילו את Autosens
+ שבוע של הפעלה מוצלחת של הלולאה במשך היום, עם הוספת ערכי פחמימות רגילים
+ הפעלת פונקציות נוספות לשימוש במשך היום, לדוגמה AMA (סיוע ארוחות מתקדם)
+ הפעלת פונקציות נוספות לשימוש במשך היום, כגון סופר מיקרו בולוסים (SMB)
+ הפעלת אוטומציה
+ חובה לקרוא את הויקי ולהעלות את ערך ה-maxIOB כדי להפעיל את ה- SMB כראוי. התחלה טובה תהיה maxIOB=בולוס ממוצע + 3 פעמים ערך הבזאלי היומי המקסימלי
+ קראו את המסמכים על כיצד האוטומציה פועלת. הגדירו את הכללים הפשוטים הראשונים שלכם. במקום פעולה, תנו ל-AAPS להציג הודעה בלבד. כאשר אתם בטוחים שהאוטומציה מופעלת כראוי, החליפו את ההודעה בפעולה אמיתית. (https://androidaps.readthedocs.io/en/latest/EN/Usage/Automation.html)
+ ערך הסוכר זמין ב-Nightscout
+ סטטוס המשאבה זמין ב-Nightscout
+ קביעות ידניות
+ הושלמו: %1$s
+ למדו כיצד לשלוט ב-AndoridAPS
+ בצעו פעולות שונות ב-AndroidAPS
+ הגדירו פרופיל 90% למשך 10 דקות (לחיצה ארוכה על שם הפרופיל במסך הסקירה הכללית)
+ דמו מקלחת. הגדירו ניתוק משאבה במשך שעה אחת (לחיצה ארוכה על לולאה פתוחה)
+ ... והתחברו מחדש באותה הדרך
+ צרו ערך מטרה זמני מותאם אישית במשך 10 דקות (לחיצה ארוכה על ערך המטרה הנוכחי)
+ ב-בונה התצורה יש להפעיל את תוסף הפעולות, להפוך אותו לגלוי ולהציג את תוכנו בתפריט העליון
+ הצג תוכן של תוסף לולאה
+ השתמשו בפונקציית קנה המידה ע\"י לחיצה ארוכה על תרשים הסוכר
+ הכנס
+ אם השתמשתם בלולאה סגורה במשך שלושה חודשים לפחות עם מערכות אחרות, תוכלו לבקש קוד לדילוג על המטרות. ראו: https://androidaps.readthedocs.io/en/latest/EN/Usage/Objectives.html#skip-objectives לפרטים נוספים.
+ קוד אושר
+ קוד בלתי חוקי
+ הוכח את הידע שלך
+ למדו וענו נכונה על שאלות
+ השבת תשובה מושבתת עד: %1$s
+ תשובה שגויה!
+ הבא שלא נעשה
+ בקשת קוד: %1$s
+ (בדקו את כל התשובות הנכונות)
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#what-to-do-when-taking-a-shower-or-bath
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#config-builder
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen
+ אין חיבור לאינטרנט
+ אחזור השעה נכשל
+ דרישות המשימה לא נענו
+
+ %1$d יום
+ %1$d ימים
+ %1$d ימים
+ %1$d ימים
+
+
+ %1$d שעה
+ %1$d שעות
+ %1$d שעות
+ %1$d שעות
+
+
+ %1$d דקה
+ %1$d דקות
+ %1$d דקות
+ %1$d דקות
+
+
diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml
index 76002e60dc..929b5ad16d 100644
--- a/app/src/main/res/values-iw-rIL/strings.xml
+++ b/app/src/main/res/values-iw-rIL/strings.xml
@@ -4,12 +4,1180 @@
+ בטיחות טיפולים
+ בולוס מקסימלי מותר [U]
+ מקסימום פחמימות מותר [g]
+ העדפותרענן טיפול מ-Nightscout
- בבקשה אתחל את הסמרטפון שלך או תרענן את אפלקצית AndroidAPS בהגדרות המערכת
-אחרת AndroidAPS לא יוכל לבצע רישום (חשוב לעקוב אחר ולוודא כי האלגוריתמים פועלים כראוי)!
+ איפוס מסדי נתונים
+ אתם בטוחים שאתם רוצים לאפס את מסדי הנתונים?
+ יציאה
+ השתמש תמיד בערכים בזאלים מוחלטים
+ נא לאתחל את הסמרטפון שלכם או הפעילו מחדש את אפלקציית AndroidAPS בהגדרות המערכת \nאחרת AndroidAPS לא יוכל לבצע רישום (חשוב לעקוב ולוודא כי האלגוריתמים פועלים כראוי)!
+ נראה שמכשיר זה אינו תומך ברשימת היתרים למיטוב הסוללה - ייתכן שתיתקל בבעיות ביצועים.
+ לחצנים לגישה מהירה לפונקציות שימושיות
+ משמש לקביעת תצורה של תוספים פעילים
+ תוכנית הלימודמציג את ההגדרות הקבועות מראש עבור מזון המוגדר ב-Nightscout
- להפעיל או לכבות את הלולאה.
- מסנכרן את הנתונים שלך עם Nightscout
+ הגדרת אינסולין ל-Humalog ו- NovoRapid / Novolog
+ הגדרת אינסולין ל-Fiasp
+ הגדרת אינסולין ל-Lyumjev
+ מאפשר לכם להגדיר את שיא פעילות האינסולין, לשימוש על ידי משתמשים מתקדמים בלבד
+ הפעלת או השבתת הלולאה.
+ מסנכרן את נתוניכם עם Nightscout
+ מצב האלגוריתם ב-2017
+ האלגוריתם העדכני ביותר, עבור משתמשים מתקדמים בלבד
+ מציג את המצב הנוכחי של הלולאה, ולחצני פעולות שימושיות
+ מציג הודעה קבועה עם סקירה קצרה של מה שהלולאה שלך עושה
+ הגדירו פרופיל שזמין באופן לא מקוון.יבא פרופיל מ- Nightscout
+ חיבור משאבת Accu-Chek Combo מחייב התקנת ruffy
+ טיפול בזריקות יום-יומיות
+ שילוב משאבה עבור משאבות אשר עדיין אין להם מנהל התקן כלשהו (לולאה פתוחה)
+ חישוב הרגישות נעשה בהתאם ל־Oref0, אך ניתן לשנות את מסגרת הזמן. ספיגת הפחמימות המינימלית מחושבת לפי משך ספיגת הפחמימות המרבי מההעדפות.
+ הרגישות מחושבת מנתונים מ-8 או 24 השעות האחרונות (הרגישות הנמוכה מביניהם). הפחמימות (אם לא נספגו) מפסיקות להיחשב לאחר משך זמן שהוגדר בהגדרות. פלאגין זה מחשב גם ארוחות לא מוכרזות (UAM).
+ הרגישות מחושבת כממוצע משוקלל מערכי הסטיות. ערכי סטיות חדשים יותר יזכו לשקלול גבוה יותר. ספיגת הפחמימות המינימלית מחושבת על בסיס נתון משך ספיגת פחמימות מקסימלי מההגדרות. אלגוריתם זה הוא המהיר ביותר במעקב אחר שינויי רגישות.
+ קבלת ערכי רמת סוכר מאפליקצית Eversense עם פאץ\'.
+ קבלת ערכי סוכר בדם מ-Glimp.
+ קבלת ערכי סוכר בדם מ-600SeriesAndroidUploader.
+ הורדת ערכי סוכר בדם מ-Nightscout
+ קבלת ערכי סוכר בדם מ-xDrip.
+ שמירת כל הטיפולים שנעשו
+ ניטור ושליטה ב-AndroidAPS באמצעות שעון WearOS.
+ הצג מידע אודות הלולאה במסך Xdrip בשעון החכם.
+ שליטה מרחוק על AndroidAPS באמצעות SMS.
+ אינסולין:
+ פחמימות:
+ IOB:
+ IOB:
+ IOB כולל:
+ פעילות IOB כוללת:
+ משך:
+ יחס:
+ אינסולין:
+ IOB:
+ IBO כולל:
+ ערכי סוכר בדם
+ TT
+ פחמימות
+ תיקון
+ בולוס פעיל
+ בצע כעת
+ משאבה וירטואלית
+ אישור
+ ההפעלה האחרונה
+ טעינת פרמטרים
+ מצב סוכר
+ בזאלי זמני נוכחי
+ נתוני אינסולין פעיל
+ פרופיל
+ נתוני ארוחה
+ תוצאה
+ תוצאה: %1$s %2$s
+ אין ערכי סוכר זמינים
+ בקשה
+ גלוקוז
+ דלתא
+ דלתא:
+ בונה התצורה
+ סקירה כללית
+ פרופיל Nightscout
+ טיפולים
+ משאבה וירטואלית
+ פורטל טיפולים
+ משאבה
+ עם איזו משאבה אתם מעוניינים להשתמש ב-AndroidAPS?
+ טיפולים
+ איזה תוסף ישמש לתפעול הטיפולים?
+ פרופיל
+ עם איזה פרופיל להשתמש ב- AndroidAPS?
+ APS
+ איזה אלגוריתם של APS יבצע התאמות טיפול?
+ כללי
+ מס\' תוספים כלליים שעשויים להיות יעילים.
+ אילו הגבלות פעילות?
+ מגבלות
+ לולאה
+ לולאה
+ השתמשו באפשרות זו כדי להפעיל את שילוב לולאת AndroidAPS.
+ APS
+ הגבלות לאחר עיבוד
+ קצב בזאלי זמני הוגדר במשאבה
+ לא נבחרה או סופקה תוצאה ע\"י APS
+ בטיחות
+ התוסף אינו זמין
+ הפרת הגבלות
+ שגיאה במתן בולוס
+ אשר בזאלי זמני חדש:
+ טיפול
+ מחשבון
+ ההגבלה הוחלה!
+ בולוס:
+ אינסולין בזאלי
+ אינסולין בזאלי:
+ שנה קלט!
+ מקור ערכי הסוכר
+ מהו מקור הנתונים של AndroidAPS?
+ xDrip
+ מצב APS
+ לולאה סגורה
+ לולאה פתוחה
+ השהיה בגלל ערך סוכר נמוך
+ לולאה כבויה
+ כיבוי לולאה
+ הפעלת לולאה
+ הצעה חדשה זמינה
+ המלצת פחמימות
+ גרסה לא נתמכת של Nightscout
+ לולאה הופסקה בעקבות מגבלות בתוקף
+ בזאלי פעיל
+ בולוס מעבר למגבלה
+ פחמימות מעבר למגבלה
+ אחר
+ מד
+ חיישן
+ זמן פחמימות
+ משך
+ הערות
+ שעת אירוע
+ פרופיל
+ סוג גלוקוז
+ פרופיל Nightscout טרם נטען
+ בזאלי זמני
+ בולוס ממושך
+ גירסת Nightscout:
+ חסרים %1$d גר\'
+ ההעדפות יוצאו
+ ייצא הגדרות ל
+ יבא הגדרות מ-
+ הגדרות מיובאות
+ הקובץ לא נמצא
+ ייצא הגדרות
+ יבא הגדרות
+ מינון בזאלי זמני מקסימלי (יח\'\שעה)
+ ערך זה נקרא בזאלי מרבי ב-OpenAPS
+ בזאלי פעיל מרבי ש-OpenAPS יכול לספק [U]
+ ערך זה נקרא אינסולין פעיל מקסימלי (Max IOB) ב-OpenAPS. זהו מקסימום האינסולין הפעיל ב-[U] ש-APS מאפשר.
+ אתם תתבקשו למלא סיסמה ראשית שתשמש להצפנת ההעדפות המיוצאות.
+ אתם תתבקשו למלא סיסמה ראשית שתשמש לפיענוח ההעדפות המיובאות.
+ ייצוא בוטל! ההגדרות לא יוצאו!
+ ייבוא בוטל! ההעדפות לא הובאו!
+ לא ניתן לייבא את ההגדרות!
+ נא לחזור למסך הראשי ולנסות שוב.
+ סיסמה ראשית ישנה
+ קובץ זה יוצא והוצפן באמצעות סיסמה ראשית שונה. אנא ספקו סיסמה ראשית זו כדי לפענח את הקובץ.
+ בעקבות ייבוא ההגדרות הסיסמה הראשית הקיימת תוחלף עם הסיסמה הראשית המיובאת!
+ בחרו קובץ לייבוא
+ בדקו את ההעדפות לפני ביצוע הייבוא:
+ ההעדפות לא ניתנות לייבוא!
+ אין לייבא העדפות אלה!
+ הסבר בעיות ייבוא…
+ פרטי בעיות ייבוא
+ ייבוא
+ ייבא בכל מקרה (מסוכן!)
+ ההעדפות נוצרו בגרסה אחרת של AAPS (%1$s) בעוד לך יש גירסה %2$s. \n\n חלק מההגדרות עלולות להיות חסרות או בלתי תקינות - לאחר הייבוא נא לבדוק ולעדכן את ההעדפות.
+ ההעדפות נוצרו במכשיר אחר. זה בסדר אם ייבאתם אותן ממכשיר ישן או שונה, אך וודאו שההעדפות שהובאו נכונות!
+ אתם משתמשים פורמט מיושן מגרסאות ישנות של AAPS, שאינו מאובטח! השתמשו בו רק כמוצא אחרון, אם אין לכם קובץ הגדרות בפורמט העדכני, של JSON.
+ ההעדפות המיובאות הן כבר בנות %1$s ימים! אולי יש לכם עדפות עדכניות יותר או שבחרתם קובץ לא נכון? זכרו לייצא את ההעדפות באופן סדיר!
+ פורמט תאריך ושעה לא חוקי!
+ ההעדפות נוצרו בגרסה משנית ישנה של AAPS. זה בסדר אם ייבאתם אותן לאחר שדרוג גרסה, אך וודאו שההעדפות שהובאו נכונות!
+ ההעדפות נוצרו בגרסה ראשית אחרת של AAPS. גרסאות ראשיות הן שונות מאוד והגדרותיהן עלולות להיות לא תואמות אחת לשניה. נא לוודא שההעדפות שהובאו נכונות!
+ פורמט הקובץ
+ נוצר ב-
+ גרסת AAPS
+ גרסת בנייה
+ ייצא את שם מכשיר המטופל
+ מייצא את דגם המכשיר
+ · הצפנת קבצים
+ פורמט ייצוא ישן
+ פורמט הצפנה חדש
+ פורמט דיבאג חדש (בלתי מוצפן)
+ פורמט ייצוא לא ידוע
+ קובץ ההגדרות פגום
+ קובץ ההגדרות מאובטח
+ משתמש בפורמט הגדרות בלתי מאובטח ובלתי מוצפן
+ שגיאה בפורמט JSON, חסר שדה חובה (פורמט, תוכן, מטא דאטה, בטיחות)
+ שגיאת פענוח, הסיסמה שהתקבלה לא מפענחת את הקובץ
+ בקרת קבצים (hash) חסרה, לא ניתן לאמת את אותנטיות ההגדרות!
+ הקובץ שונה לאחר הייצוא!
+ שגיאת פענוח, נתוח ההעדפות נכשל!
+ שגיאת פענוח, הסיסמה שסופקה אינה חוקית או שקובץ ההגדרות שונה! יתכן שהקובץ המיובא יוצא עם סיסמה ראשית אחרת.
+ תצורת הצפנה חסרה, פורמט ההגדרות אינו חוקי!
+ לא צוין או לא נתמך אלגוריתם ההצפנה!
+ יוצא לפני %1$s
+ יוצא ב %1$s
+ יוצא לפני פחות משעה
+ בספרייה: %1$s
+ הסכם רישיון למשתמש
+ לא מיועד לשימוש למטרת קבלת החלטות רפואיות. בעלי הזכויות מספקים את התוכנית כפי שהיא - \"AS IS\", ללא אחריות מכל סוג שהוא. כל סיכון הנובע מאיכות ו\או ביצועי התוכנה הוא באחריותך בלבד. במידה ותימצא תקלה בתוכנית, אתם תשאו בכל עלויות שיגרמו לך בשל התקלה.
+ אני מבין ומסכים
+ שמור
+ טעינה מחדש של הפרופיל
+ תקשורת SMS
+ מספרי טלפון מותרים
+ + XXXXXXXXXX; + YYYYYYYYYY
+ לאישור מתן בולוס %1$.2f יחידות יש להשיב עם הקוד %2$s
+ למתן %1$.2f יחידות בולוס ארוחה יש להשיב עם הקוד %2$s
+ להגדרת המטרה הזמנית %1$s יש להשיב עם הקוד %2$s
+ לביטול המטרה הזמנית יש להשיב עם הקוד %1$s
+ לביטול שירות השליטה מרחוק באמצעות SMS השיבו עם הקוד %1$s. \n\nהשירות ניתן להפעלה מחדש ממכשיר ה-AAPS הראשי בלבד.
+ שירות השליטה מרחוק באמצעות SMS מופסק. על מנת להפעילו, השתמשו בAAPS במכשיר הראשי.
+ כדי לשלוח ערך כיול %1$.2f יש להשיב עם הקוד %2$s
+ הבולוס נכשל
+ מספר הדקות המזערי שחייב לחלוף בין בולוס מרוחק אחד למשנהו
+ מספר הדקות המינימלי שצריכות לחלוף, בין בולוס אחד למשנהו
+ למען בטחונכם, על מנת לערוך את העדפה זו, עליכם להוסיף לפחות שני מספרי טלפון.
+ בולוס %1$.2fU ניתן בהצלחה
+ עומד להזריק %1$.2f יח\'
+ בולוס %1$.2fU ניתן בהצלחה
+ בולוס עבור ארוחה %1$.2fU ניתן בהצלחה
+ יעד %1$s עבור %2$d דקות
+ יעד %1$s עבור %2$d דקות הוגדר בהצלחה
+ יעד זמני בוטל בהצלחה
+ אפשר שליטה מרחוק באמצעות SMS
+ בולוס עצר
+ עצירת בולוס
+ הלולאה הושבתה
+ הלולאה הופעלה
+ לולאה מושבתת
+ לולאה פעילה
+ %1$.2f מוגבלת ל- %2$.2f
+ ערך %1$s הינו מחוץ לתחום
+ לחיבור המשאבה יש להשיב עם הקוד %1$s
+ החיבור אל המשאבה נכשל
+ לניתוק המשאבה למשך %1$d דקות השיבו עם הקוד %2$s
+ המשאבה מנותקת
+ המשאבה חוברה מחדש
+ פקודה מרוחקת אינה מותרת
+ בולוס מרחוק אינו זמין. נסו שוב מאוחר יותר.
+ להפעלת בזאלי %1$.2f יח\' לשעה למשך %2$d דקות יש להשיב עם הקוד %3$s
+ להחלפת פרופיל ל- %1$s %2$d % הקש קוד %3$s
+ למתן בולוס ממושך %1$.2f יח\' למשך %2$d דקות יש להשיב עם הקוד %3$s
+ למתן %1$d גר\' ב-%2$s יש להשיב עם הקוד %3$s
+ להפעלת בזאלי %1$d%% למשך %2$d דקות הקש קוד %3$s
+ להשהיית הלולאה למשך %1$d דקות יש להשיב עם הקוד %2$s
+ להפעלת הלולאה מחדש יש להשיב עם הקוד %1$s
+ כדי לאפשר הלולאה יש להשיב עם הקוד %1$s
+ להשבתת הלולאה יש להשיב עם הקוד %1$s
+ בזאלי זמני %1$.2f יחידות/שעה למשך %2$d דקות הופעל בהצלחה
+ בולוס ממושך %1$.2f יחידות למשך %2$d דקות הופעל בהצלחה
+ %1$d גר\' פחמימות נקלטו בהצלחה
+ קליטת %1$d גר\' פחמימות נכשלה
+ בזאלי זמני %1$d%% למשך %2$d דקות הופעל בהצלחה
+ הפעלת בזאלי זמני נכשלה
+ הפעלת בולוס ממושך נכשלה
+ להפסקת בזאלי זמני הקש קוד %1$s
+ להפסקת בולוס ממושך יש להשיב עם הקוד %1$s
+ בזאלי זמני בוטל
+ בולוס ממושך בוטל
+ ביטול בזאלי זמני ניכשל
+ ביטול בולוס ממושך נכשל
+ פקודה לא מוכרת או תגובה שגויה
+ אשף מהיר
+ הגדרות אשף מהיר
+ טקסט הלחצן:
+ פחמימות:
+ תקף:
+ הוספה
+ עריכה
+ הסרה
+ ארוחה
+ תיקון
+ פעולות
+ העלאה ל-nightscout בלבד (סנכרון מבוטל)
+ העלאה ל- NS בלבד. ללא השפעה על SGV אלא אם נבחר מקור מקומי כגון Xdrip. ללא השפעה על הפרופילים כל עוד פרופיל NS בשימוש.
+ משאבה לא הופעלה!
+ הפעלה/מילוי
+ נא ודאו שהכמות מתאימה למפרט ערכת העירוי שלכם!
+ מילוי\מילוי מראש כמויות סטנדרטיות של אינסולין
+ כפתור 1
+ כפתור 2
+ כפתור 3
+ יחידות:
+ יחידות
+ משך פעילות אינסולין
+ טווח להדמיה
+ סימוני גבוה ונמוך בתרשים סקירה כללית ובשעון חכם
+ סימון נמוך
+ סימון גבוה
+ Wear
+ שלח מחדש את כל הנתונים
+ פתיחת הגדרות Wear
+ ערכים בזאליים:
+ ערך הבסיס מתחת למינימום. פרופיל אינו מוגדר!
+ ערכי סוכר בדם:
+ ערכי סוכר אחרונים:
+ זריקות יומיות מרובות (MDI)
+ Minimed 640G
+ התראה מתמשכת
+ נתונים ישנים
+ לפני %1$d דקות
+ פרופיל מקומי
+ OpenAPS AMA
+ דלתא ממוצעת קצרה
+ דלתא ממוצעת ארוכה
+ מערך של %1$d אלמנטים. \n ערך נוכחי:
+ נתוני חישוב רגישות אוטו\'
+ תיקון באגים בסקריפט
+ שימוש בפונקציית חישוב רגישות אוטומטית (Autosens)
+ רענן אירועים מ-Nightscout
+ מחיקת טיפולים עתידיים
+ אכילה בקרוב
+ היפו
+ פעילות
+ מחיקת רשומה
+ ACT
+ CONF
+ לולאה
+ OAPS
+ LP
+ בית
+ VPUMP
+ NSPROFILE
+ TREAT
+ OBJ
+ WEAR
+ SMS
+ קצר את כותרות הלשוניות
+ התבסס על הפרש ממוצע קצר במקום הפרש פשוט\רגיל
+ לשימוש כאשר נתונים ממקור לא מפוקח כמו Xdrip אינם יציבים.
+ פרופיל
+ ערך ברירת מחדל: 3 מנגנון הגנה עיקרי של OpenAPS. מגביל את המינון הבזאלי לעד פי 3 מהמינון הבזאלי הגבוה ביותר שהוגדר. ברוב המקרים אין צורך לשנות ערך זה, אך יש לזכור שזו המשמעות של “3x max daily; 4x current” בדיון על מנגנוני הגנה.
+ ערך ברירת מחדל: 4 זהו החצי השני של מנגנון הגנה עיקרי של OpenAPS, והחצי השני של \"3x max daily; 4x current\" במנגנוני ההגנה. המשמעות היא שהמינון הבזאלי, ללא קשר למקסימום שנקבע במשאבה, אינו יכול להיות גבוה יותר ממספר זה כפול הקצב הבזאלי הנוכחי. מיועד למנוע כניסה לתחומים מסוכנים ע\"י קביעת קצב בזאלי גבוה לפני הבנה של פעולת האלגוריתם. שוב: ברירת המחדל היא x4, רוב המשתמשים לעולם אינם צריכים לשנות ערך זה ואם הם מרגישים שמנגנון הגנה זה מפריע להם, הפתרון הוא בשינוי של הגדרות אחרות.
+ ערך ברירת מחדל: 1.2\nזוהי מגבלת המכפיל של autosens (ובקרוב autotune) שמגדירה 20%% כיחס מקסימלי של autosens, אשר קובע בתורו את גובה הבזאלי המקסימלי, גובהו המינימלי של יחס התיקון, ואת המינימום של ערכי המטרה האפשריים.
+ ערך ברירת מחדל: 0.7\nבצד השני של מגבלות הבטיחות של autosens, ערך זה מגביל את יכולתו של autosens להוריד את הערכים הבזאליים ועד כמה יכול להעלות את יחס התיקון ואת ערכי מטרת הסוכר בדם.
+ Autosens מווסת גם את ערכי המטרה
+ ערך ברירת מחדל: התאמה מדויקת\n נועד לאפשר ל-Autosens לשנות את המטרה של ערכי הסוכר, בנוסף ליחס התיקון והבזאלים.
+ ערך ברירת מחדל: 2\n מעכב בולוס מופעל אחרי שאתם מזריקים בולוס ארוחה, כך שהלולאה לא תפצה ע\"י בזאלי זמני נמוך אחרי הארוחה. הדוגמה כאן וברירת המחדל היא 2; כך שהגדרה של משך פעילות אינסולין של 3 שעות משמעה שהעיכוב יחלוף בהדרגה בתוך 1.5 שעות (3 ש\' לחלק ל-2).
+ ערך ברירת מחדל: 3.0 (AMA) או 8.0 (SMB). זוהי הגדרת ברירת מחדל לספיגת פחמימות ב-5 דקות. ברירת המחדל היא 3mg/dL/5min. פעולה זו משפיעה על קצב הדעיכה של פחמ\' פעילות, ועל הנחת קצב ספיגת הפחמ\' בחישוב רמות סוכר עתידיות כשהן בירידה מהירה מהצפוי או עליה איטית מהצפוי.
+ שימו לב!\nבדרך כלל אינכם צריכים לשנות את הערכים שלהלן. נא ללחוץ כאן, לקרוא את הטקסט ולוודא שאתם מבינים אותו לפני שתשנו ערכים אלה.
+ מספר טלפון ל SMS לא תקין
+ כיול
+ xDrip+ אינו מותקן
+ כיול נשלח xDrip
+ הכיול נשלח. יש לאשר את הקבלה ב-xDrip.
+ xDrip אינו מקבל כיולים
+ משאבה מושהית
+ מבצע
+ הגדרות משאבה וירטואלית
+ טעינת מצב ל-Nightscout
+ NSClient
+ NSCI
+ כתובת URL:
+ גלילה אוטומטית
+ הפעל מחדש
+ NSClient
+ כתובת Nightscout
+ הזינו את כתובת ה-Nightscout שלכם
+ קוד API של Nightscout
+ קוד API של Nightscout
+ הזינו את קוד ה-API של Nightscout (מינימום 12 תווים)
+ ספק עכשיו
+ נקה תור
+ הצג תור
+ תור:
+ סטטוס:
+ מושהה
+ נקה יומן
+ ל-NSClient אין הרשאת כתיבה. סיסמת API שגויה?
+ הגדרות Wear
+ הצגת IOB מפורט
+ לחלק את ה IOB לבולוס ובזאלי במסך השעון
+ נכשל - נא לבדוק את הטלפון
+ לא זמין
+ סוג המטופל\ת
+ ילד/ה
+ מתבגר\ת
+ מבוגר\ת
+ מבוגר\ת עם תנגודת אינסולין גבוהה
+ הריון
+ נא לבחור את גיל המטופל\ת להתאמת מגבלות בטיחות
+ שם מטופל
+ נא לציין שם המטופל או כינוי, להבחנה בין מספר הגדרות
+ משתמש
+ Glimp
+ %1$s צריך ביטול אופטימיזציית סוללה בשביל תפקוד תקין
+ לולאה מושהית
+ מושהה (%1$d דק\')
+ השהה לולאה
+ השהה לולאה לשעה אחת
+ השהה לולאה ל-2 שע\'
+ השהה לולאה ל-3 שע\'
+ השהה לולאה ל-10 שע\'
+ השהה לולאה ל-%1$d דקות
+ נתק את המשאבה למשך 15 דקות
+ נתק את המשאבה למשך 30 דקות
+ נתק את המשאבה למשך שעה
+ נתק את המשאבה למשך שעתיים
+ נתק את המשאבה למשך שלוש שעות
+ חידוש
+ חיבור משאבה מחדש
+ משך שגוי
+ לולאה מושהית
+ לולאה חודשה
+ מגמה 15 דקות
+ פחמ\' פעילות
+ סופר בולוס
+ רשום הפעלת AAPS ב-Nightscout
+ יציאה מ-AAPS כדי להחיל הגדרות.
+ באיזה סוג של אינסולין אתה משתמש?
+ Novorapid, Novolog, Humalog
+ Fiasp
+ אינסולין
+ אפשר סופר בולוס באשף
+ אפשר פונקציית סופר בולוס באשף. אין להפעיל לפני שאתם יודעים להשתמש בה, שימוש לא נכון עלול לגרום למתן מינון יתר של אינסולין!
+ הצגת אורות חיווי במסך הבית
+ סף התראה לתוקף העירוי [h]
+ סף התראה קריטית לתוקף העירוי [h]
+ סף התראה לתוקף האינסולין [h]
+ סף התראה קריטית לתוקף האינסולין [h]
+ סף התראה של תוקף החיישן [h]
+ סף התראה קריטית של תוקף החיישן [h]
+ סף התראה של רמת סוללת החיישן [%]
+ סף התראה קריטית של רמת סוללת החיישן [%]
+ סף התראה של תוקף הסוללה [h]
+ סף התראה קריטית של תוקף הסוללה [h]
+ אזהרת סף של מיכל ריק [U]
+ אזהרת סף קריטית של מיכל ריק [U]
+ אזהרת סף של רמת הסוללה [%]
+ אזהרת סף קריטית של רמת הסוללה [%]
+ חיזוי
+ אינ\' פעיל
+ פחמ\' פעילות
+ בזאל\'
+ סטייה
+ פעילות
+ אבס\'
+ שיפוע
+ אודות
+ הרשאות SMS חסרות
+ הרשאת סטטוס הטלפון חסרה
+ מצב xDrip (שעון)
+ שורת מצב xDrip (שעון)
+ xDS
+ הצג השפעת רמת הסוכר
+ הוסף השפעת הסוכר לשורת הסטטוס
+ אין העלאה ל-Nightscout
+ כל הנתונים שנשלחו ל-Nightscout נזרקו. AAPS מחובר ל-Nightscout אך לא נעשו יותר שינויים בו
+ ביטול בולוס ממושך
+ החלפת פרופיל
+ סנסור
+ צינורית
+ אינסולין
+ סוללת משאבה
+ גיל:
+ רמה:
+ אפשרויות התראה
+ ייצר התראות מאזעקות של Nightscout
+ ייצר התראות מהכרזות של Nightscout
+ סף התיישנות נתונים [min]
+ סף התיישנות נתונים דחוף [min]
+ מרווחים בשביל autosens [h]
+ מספר השעות אחורה לחישוב רגישות (זמן הספיגה של פחמימות אינו נכלל)
+ משאבה
+ OpenAPS
+ מעלה
+ זיהוי רגישות
+ באיזה אלגוריתם זיהוי רגישות להשתמש?
+ רגישות
+ רגישות Oref1
+ רגישות AAPS
+ הגדרות ספיגה
+ זמן ספיגה מקסימלי של הארוחה [h]
+ מספר השעות בהן צפוי שכל הפחמימות מארוחה ייספגו
+ OAPS
+ מעלה
+ בזאלי
+ השאר את המסך דולק
+ מניעת כיבוי המסך. הדבר צורך הרבה כח סוללה.
+ בהפעלת פונקציית ה-Autosens יש לזכור שחייבים להזין למערכת את כל הפחמימות שנאכלו. אחרת פחמימות לא יזוהו נכון כשינוי ברגישות!
+ רגישות משוקללת ממוצעת
+ אישור
+ ביטול
+ לא כל הפרופילים נטענו!
+ הערכים לא נשמרו
+ אפשר שידורים לאפליקציות אחרות (כגון xDrip). אין להפעיל אם מותקן לכם יותר ממופע אחד של AAPS או NSClient!
+ אפשר שידורים מקומיים.
+ משך [min]
+ OpenAPS SMB
+ הפעלת UAM
+ אפשר SMB
+ השתמש בסופר מיקרו בולוסים במקום בבזאלי זמני לפעילות מהירה יותר
+ זיהוי של ארוחות לא מוכרזות
+ שעת שיא של עקומת IOB
+ זמן שיא [min]
+ Oref שיא חופשי
+ Oref אינסולין מהיר
+ Oref אינסולין אולטרה מהיר
+ Lyumjev
+ DIA במשך %1$f הוא קצר מדי - משתמש ב-%2$f במקום!
+ הפעלת פרופיל
+ לא חוקי
+ אחוזים
+ קיזוז זמנים
+ ברירות מחדל ערכי מטרה
+ משך אוכלים בקרוב
+ ערך מטרת אוכלים בקרוב
+ משך פעילות
+ ערך מטרת פעילות
+ משך היפו
+ ערך מטרת היפו
+ שימוש חוזר
+ שליטה מהשעון
+ הגדירו ערכי מטרה זמניים וציינו טיפולים מהשעון.
+ מזון
+ גר\'
+ ]]>
+ kJ
+ אנרגיה
+ חלבון
+ שומן
+ ]]>
+ הפקודה מבוצעת כעת
+ המשאבה אינה זמינה
+ לא התקבלו קריאות סוכר
+ שימוש בהודעות מערכת עבור התראות ודיווחים
+ הגבר את עוצמת הקול בהדרגה להתראות ולהודעות
+ התראות מקומיות
+ התראה אם לא התקבלו נתוני סוכר בדם
+ התראה אם המשאבה בלתי נגישה
+ סף משאבה בלתי נגישה [min]
+ התראה אם יש צורך בפחמימות
+ התרעה דחופה
+ מידע
+ אפליקלציית Eversense (עם פאץ\')
+ טעינת נתוני סוכר ל-Nightscout
+ הגדרות העלאת ערכי סוכר בדם
+ הצגת דלתא מפורטת
+ הצגת דלתא עם עוד נק\' עשרונית אחת
+ תדירות מתן SMB בדקות
+ מקסימום הדקות של בזאלי אליו SMB מוגבל
+ מקס\' דקות של SMB UAM
+ מקס\' דקות של בזאלי להגבלת SMB לארוחות לא מוכרזות
+ סף מינ\' הפחמימות הנדרשות להצעה
+ כמות הפחמ\' המינימלית (גר\') הדרושה כדי שתוצג התראה על הצעת פחמימות. לא תוצגנה התראות על הצעות הנמוכות מכמות זו.
+ שליחת נתוני סוכר אל xDrip
+ ב-Xdrip בחרו 640g/Eversense כמקור נתונים
+ רמת סוכר מ-NSClient
+ חישוב רמת הסוכר
+ חישוב IOB של בולוס
+ חישוב IOB של בזאלי
+ חישוב מגמה
+ חישוב סופר בולוס
+ כן
+ לא
+ חיובי בלבד
+ שלילי בלבד
+ חישוב פחמ\' פעילות
+ חישוב ערך מטרה זמני
+ הלולאה פעילה
+ נבחר APS
+ ל-NSClient יש הרשאת כתיבה
+ מצב סגור מופעל
+ IOB מקסימלי הוגדר כראוי
+ ערכי סוכר זמינים מהמקור הנבחר
+ מתכנת משאבה למתן בולוס
+ רענן
+ סטטוס
+ פעילות
+ אין חיבור כבר %1$d דקות
+ %1$d%% (%2$d דק\' נותרו)
+ מאתחל:
+ מושהה עקב שגיאה
+ מושהה על ידי המשתמש
+ פועל
+ ביטול בזאלי זמני
+ הגדרת בזאלי זמני (%1$d%% / %2$d דק\')
+ בולוס (%1$.1f יח\')
+ מרענן
+ הפעולה המבוקשת אינה נתמכת על ידי המשאבה
+ שימוש לא בטוח: בולוס ממושך או רב שלבי פעיל. מצב הלולאה הוגדר למושהה עקב סוכר נמוך למשך 6 שעות. רק בולוסים רגילים נתמכים במצב לולאה
+ שימוש לא בטוח: המשאבה משתמשת בפרופיל בזאלי שונה מהראשון. הלולאה הושבתה. בחרו את הפרופיל הראשון במשאבה ורעננו.
+ התבקש בולוסים זהים בשתי הדקות האחרונות. כדי למנוע בולוסים כפולים בטעות ולשמור מפני באגים הדבר אסור.
+ עכשיו
+ קריאת היסטוריית המשאבה
+ הגדרת פרופיל בזאלי
+ רמת מיכל נמוכה
+ סוללת המשאבה חלשה
+ המשאבה מציגה את השגיאה E%1$d: %2$s
+ נמוך
+ ריק
+ רגיל
+ דרוש עדכון שעון המשאבה
+ אזהרת ביטול בזאלי זמני אושרה
+ לא ניתן להתחבר למשאבה. הבולוס לא ניתן.
+ מתן הבולוס נכשל. נראה כי לא נמסר בולוס. כדי להיות בטוחים, יש לבדוק את המשאבה כדי למנוע בולוס כפול ואז להזריק שוב בולוס. כדי להגן מפני באגים, בולוסים אינם ניתנים מחדש אוטומטית.
+ רק %1$.2f מתוך %2$.2f יח\' מהבולוס המבוקש הוזרקו בשל שגיאה. בדקו את המשאבה כדי לוודא זאת ולבצע את הפעולות המתאימות.
+ אספקת הבולוס ואימות ההיסטוריה של המשאבה נכשלו, אנא בדקו את המשאבה. אם נמסר בולוס, הוא יתווסף לטיפולים במהלך החיבור הבא למשאבה.
+ לא נותר מספיק אינסולין במיכל בשביל להשלים את הבולוס
+ שגיאה במתן הבולוס הממושך
+ Insight
+ הגדרת קצב בזאלי ניטרלי
+ אם תופעל, היא תבטל בזאלי זמני לפני תום כל שעה. שיטה זו יכולה לעזור לבטל ציפצופים ורטט רבים בחלק מהמשאבות.
+ הפעלת SMB תמיד
+ אפשר SMB תמיד באופן עצמאי מבולוסים. אפשרי רק עם מקור ערכי סוכר עם דיוק של נתונים כמו G5
+ הפעלת SMB אחרי פחמימות
+ הפעלת SMB במשך 6 שע\' אחרי פחמימות, גם אם אין פחמ\' פעילות. אפשרי רק עם מקור ערכי סוכר עם דיוק נתונים כמו G5
+ הפעלת SMB עם פחמ\' פעילות
+ הפעלת SMB כשיש פחמ\' פעילות.
+ הפעלת SMB עם ערכי מטרה זמניים
+ הפעלת SMB כאשר יש ערך מטרה זמני פעיל (אכילה בקרוב, פעילות גופנית)
+ הפעלת SMB עם ערכי מטרה גבוהים
+ הפעלת SMB כאשר יש ערך מטרה זמני גבוה פעיל (פעילות, מעל 100 mg/dl או 5.5 mmol/l)
+ אינסולין
+ פחמימות
+ מקשים
+ שולח כיול ל- xDrip או פותח את חלון הכיול של G5
+ פותח xDrip, לחצני אחורה חוזר ל-AAPS
+ מספר פחמימות להוספה כאשר לוחצים על הלחצן
+ כמות האינסולין להוספה כאשר לוחצים על הלחצן
+ לא ניתן היה להפעיל את יישום סנסור. וודא שהוא מותקן.
+ סנסור
+ התעלם ל-5 דק\'
+ התעלם ל-15 דק\'
+ התעלם ל-30 דק\'
+ דרוש
+ דפדפן היסטוריה
+ דיווח על SMB
+ הצג SMB על השעון כמו בולוס סטנדרטי.
+ צור הודעות משגיאות
+ צור התראות על מפחמימות דרושות
+ יצירת הכרזת Nightscout עבור הודעות על שגיאות והתראות מקומיות (ניתנות להצגה בפורטל הטיפולים תחת \"טיפולים\")
+ ייצר הכרזות Nightscout עבור התראות מסוג פחמימות דרושות
+ הראה את התחזיות על לוח השעון.
+ חיזוי
+ אפשרויות נתונים
+ העלאה ל-Fabric
+ אפשר דיווח אוטומטי על קריסה ושליחת נתוני השימוש למפתחים דרך שירות fabric.io.
+ עדכנו את יישום ה-Dexcom שלכם לגרסה נתמכת
+ אפליקציית Dexcom אינה מותקנת.
+ התחל פעילות TT
+ התחל TT אוכלים בקרוב
+ TT
+ רישום בולוס ללא הזרקה
+ קטגוריה
+ תת קטגוריה
+ בולוס רשום בלבד (לא מוזרק על ידי המשאבה)
+ לטעינת הנתונים האוטומטית חסרים נתוני סוכר מ-Nightscout
+ SMB מוגדר באמצעות משאבה
+ פעילות
+ רגישות
+ חריגות
+ פחמימות פעילות
+ אניסולין פעיל
+ בזאלי
+ לא נבחרה פעולה, דבר לא יתבצע.
+ הפעלת היפו TT
+ רץ כעת במצב מפתחים. לולאה סגורה אינה מורשת.
+ מצב הנדסה מופעל
+ קריאת פרופיל בזאלי
+ היסטוריית המשאבה השתנתה לאחר ביצוע חישוב הבולוס. הבולוס לא הוזרק. אנא חשב מחדש אם יש עדיין צורך בבולוס.
+ הבולוס הוזרק בהצלחה אבל רישומו נכשל. זה יכול לקרות אם שני בולוסים קטנים, באותו הגודל, ניתנים בתוך שתי הדקות האחרונות. בדקו את היסטוריית המשאבה ואת ערכי הטיפול והשתמשו בפורטל הטיפולים להוספת ערכים חסרים. הקפידו לא להוסיף טיפולים זהים באותה דקה.
+ הגדרת ערך מטרה גבוה נדחתה כיוון שהחישוב לא לקח בחשבון שינוי שנעשה לאחרונה בהיסטוריית המשאבה
+ מרענן סטטוס משאבה
+ המינון הבזאלי במשאבה השתנה ויעודכן בקרוב
+ המינון הבזאלי במשאבה השתנה אך קריאתו נכשלה
+ בודק שינויים בהיסטוריה
+ בולוסים מרובים באותו הגודל בתוך הובאו באותה דקה. ניתן להוסיף רק רשומה אחת לטיפולים. בדקו את המשאבה והוסיפו באופן ידני רשומת בולוס בלשונית פורטל הטיפולים. יש ליצור רשומות בולוס עם זמנים שונים מבולוסים אחרים.
+ \n\nתיעוד:\nhttps://androidaps.readthedocs.io\n\nפייסבוק:\nhttps://www.facebook.com/groups/AndroidAPSUsers
+ הבולוס האחרון נרשם לפני 24 שעות או בשעה עתידית, נא לבדוק את כיוון השעון ותאריך במשאבה.
+ זמן\תאריך הבולוס שהוזרק מהמשאבה נראה לא נכון, IOB כנראה שגוי, בדקו את השעון ואת התאריך במשאבה.
+ שינוי פרופיל חסר. אנא החליפו פרופיל או לחצו על \"הפעל פרופיל\" בפרופיל המקומי.
+ ספירת בולוסים
+ ספירת TBR
+ המשאבה אינה מסוגלת לבצע בזאלי זמני
+ לא נקרא מינון בזאלי תקף מהמשאבה
+ מצב לולאה סגור מושבת בהעדפות
+ Autosens מושבת בהעדפות
+ SMB מושבת בהעדפות
+ UAM מושבת בהעדפות
+ UAM מושבת מפני שהוא מסתמך על תוסף רגישות של Oref1
+ מכפלת בזאלי מירבי
+ מכפלת בזאלי יומי מירבי
+ ניתן בולוס ב-3 הדקות האחרונות, מדלג על SMB
+ הבזאלי הוגדר כהלכה
+ הגבלת בולוס ממושך ל- %1$.1f יח\' בגלל %2$s
+ הגבלת מקסימום IOB ל-%1$.1f יח\' בגלל %2$s
+ הגבלת פחמימות ל-%1$d גר\' בגלל %2$s
+ הגבלת IOB ל-%1$.1f יח\' בגלל %2$s
+ ערך מקסימלי בהעדפות
+ מגבלה קשיחה
+ שימוש לא בטוח
+ קריאת סטטוס נכשלה
+ רשום החלפת אתר עירוי
+ רשום החלפת מכל אינסולין
+ SMB תמידי ו-SMB לאחר פחמימות מושבתים כיוון שמקור ערכי הסוכר הפעיל אינו תומך בסינון נתונים מתקדם
+ SMB אינו פעיל במצב לולאה פתוחה
+ מזון
+ איפוס
+ מינון אינסולין פעיל מרבי ממנו OpenAPS לא יחרוג [U]
+ ב-OpenAPS ערך זה נקרא מקסימום אינסולין פעיל (maxIOB). \nלא יוזרק עוד אינסולין אם כמות האינסולין הפעיל הנוכחי גדול מערך זה
+ המשאבה נעצרה
+ המשאבה הופעלה
+ המשאבה הושהתה
+ זמן ספיגה מקסימלי של הארוחה [h]
+ משך זמן בו כל ארוחה תחשב כנספגה. לא תהיה התחשבות בפחמימות שנותרו.
+ זמן
+ הצגת שדות הערות בתיבות דו-שיח של טיפול
+ הבא
+ הקודם
+ אשף ההתקנה
+ סיום
+ תוספת אינסולין ראשונה
+ תוספת אינסולין שניה
+ תוספת אינסולין שלישית
+ תוספת פחמימות ראשונה
+ תוספת פחמימות שניה
+ תוספת פחמימות שלישית
+ סנסור
+ השתמש בחיבור WiFi בלבד
+ WiFi SSID
+ במצב טעינה בלבד
+ הגדרות חיבור
+ SSID מורשים (מופרדים בנקודה-פסיק)
+ אפשר חיבור בנדידה
+ יחס autosens מקסימלי
+ יחס autosens מינימלי
+ נמנום בולוס - מחלק משך פעילות אינסולין
+ מכפלת בטיחות בזאלי יומי מירבי
+ מכפלת בטיחות בזאלי נוכחי
+ לא זמין
+ סוג משאבה וירטואלית
+ הגדרת משאבה
+ בולוס: צעד=%1$s\nבולוס ממושך: [צעד=%2$s, משך=%3$s מינ\'-%4$sש\']\nבזאלי: צעד=%5$s\nבזאלי זמני: %6$s (עם %7$s), משך=%8$s מינ\'-%9$sש\'\n%10$s
+ טעינת נתוני סוכר אוטומטית
+ הגדרות אשף
+ חישובים הכלולים בתוצאת האשף:
+ הגדרות תצוגה
+ הגדרות כלליות
+ אפשר NSClient
+ ברוכים הבאים לאשף ההתקנה. האשף ידריך אתכם בתהליך ההתקנה\n
+ קרא סטטוס
+ יש לבצע שינויים ב-Nightscout
+ דלג על אשף ההתקנה
+ לחצו על הלחצן למטה כדי לאפשר ל-AndroidAPS להציע\לבצע שינויים במינון הבזאלי
+ תוסף רגישות משמש לזיהוי רגישות וחישוב הפחמ\' הפעילות. לקבלת מידע נוסף, בקרו בכתובת:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSClient מטפל בחיבור ל-Nightscout. אפשר לדלג על החלק הזה עכשיו, אך לא תוכלו לעבור את המשימות מבלי להגדיר אותו.
+ חשוב לזכור: פרופילי אינסולין חדשים דורשים משך פעילות אינסולין (DIA) של 5 ש\' לפחות. ערך של 5-6 ש\' בפרופיל חדש שווה לערך של 3 ש\' בפרופילים ישנים.
+ נא לבחור מקור פרופיל. אם המטופל הוא ילד כדאי להשתמש בפרופיל NS. אם אף אחד לא עוקב אחרייך ב-Nightscout כנראה שתעדיף פרופיל מקומי. יש זכור כי אתם בוחרים רק את מקור הפרופיל. כדי להשתמש בו יש להפעילו הפעלת \"החלפת פרופיל\"
+ בחרו באחד מהאלגוריתמים הזמינים. הם ממוינים מהישן לחדש. אלגוריתם חדש יותר הוא בדרך כלל חזק ואגרסיבי יותר. לפיכך, אם אתם משתמשים חדשים רצוי שתתחילו עם AMA ולא עם האלגוריתם האחרון. נא לא לשכוח לקרוא את תיעוד OpenAPS ולהגדיר אותו כראוי לפני השימוש.
+ ממתין לחיבור לריילילינק…\n
+ הערה: ניתן להמשיך בהתקנה לאחר אתחול המשאבה.\n
+ התחלת המשימה הראשונה שלכם
+ הרשאה
+ מבקש הרשאה
+ האפליקציה צריכה הרשאת מערכת של חלונות לצורך התראות
+ דרושה הרשאת מיקום עבור סריקת בלוטות\' וזיהוי WiFi
+ דרושה הרשאת אחסון כדי שתוכלו לאחסן קובצי יומן והגדרות יצוא.
+ בקשה
+ יציאה
+ פתח ניווט
+ סגור ניווט
+ העדפות תוסף
+ הושלם, כל הכבוד!
+ עוד לא הושלם
+ זמן שחלף
+ Poctech
+ קבלת ערכי סוכר מיישום Poctech
+ קבלת ערכי סוכר מאפליקציית Tomato (התקן MiaoMiao)
+ ערך מטרה זמני גבוה מעלה את הרגישות
+ = 100]]>
+ ערך מטרה זמני נמוך מוריד את הרגישות
+
+ תנגודת מורידה את ערך המטרה
+ כשמזוהה תנגודת, הורד את ערך המטרה של הגלוקוז
+ רגישות מעלה את ערך המטרה
+ כשמזוהה רגישות, הגדל את ערך המטרה של הגלוקוז
+ הגדרת משאבה לא חוקית, בדקו את הוראות ההפעלה וודאו שתפריט \'מידע מהיר\' נקרא בשם QUICK INFO באמצעות תוכנת התצורה 360.
+ מותאם אישית
+ מחק אירועי \"AndroidAPS Started\"
+ נמצאו הגדרות שמורות
+ שימו לב: אם אתם מפעילים ומתחברים למשאבה פיזית, AndroidAPS יעתיק את הפרופיל הבזאלי אל המשאבה תוך דריסת הפרופיל שכבר שמור על המשאבה. יש שההגדרות הבזאליות שב-AndroidAPS נכונות. אם אינכם בטוחים או אינכם רוצים לשנות את הגדרות הבזאליות שעל המשאבה, לחצו על \'ביטול\' וחזרו על תהליך המעבר אל המשאבה במועד מאוחר יותר.
+ נתוני טיפול לא שלמים
+ הגדרות תחזוקה
+ נמען דוא\"ל
+ הצפנת הגדרות מיוצאות
+ מספר הרשומות למשלוח
+ תחזוקה
+ תחזוקה
+ מספק מספר פונקציות של תחזוקה (כגון משלוח יומן, מחיקת יומן).
+ שלח יומנים בדוא\"ל
+ מחק רישומים
+ לא ניתן להוסיף טיפול (אינסולין: %1$.2f, פחמ\': %2$d, בשעה: %3$s) לטיפולים. נא לבדוק ולהוסיף רשומה באופן ידני כנדרש.
+ פחמימות ממושכות: %1$d גר\' (%2$d ש\'), עיכוב %3$d דק\'
+ אין נתוני autosens זמינים
+ הגדרות יומן רישום
+ אפס לברירת המחדל
+ תקלה ב-NSClient. שקלו להפעיל את Nightscout ו-NSClient מחדש.
+ גרסה %1$s זמינה
+ היסט זמן
+ מצב APS מועדף
+ סה\"כ
+ חישוב
+ שלח קובצי יומן של היום למפתחים יחד עם זמן זה. מצב לא צפוי.
+ מינימום לבקשה לשינוי [%]
+ \'לולאה פתוחה\' תציג בקשת שינוי חדשה רק אם השינוי גדול מערך זה ב-%. ערך ברירת המחדל הוא 20%
+ מחפש התקנים…
+ הזיווג הושלם
+ האם הקודים המוצגים בהתקן זה ובמשאבה זהים?
+ זיווג Insight
+ Accu-Chek Insight
+ %1$.2f יח\' מתוך %2$.2f יח\' הוזרקו
+ %1$s: %2$s
+ הצינורית הוחלפה
+ שעון המשאבה עודכן
+ אישור
+ השתק
+ התראת משאבה
+ רישום החלפת אתר עירוי
+ רישום החלפת מכל
+ רישום החלפת צינורית
+ רישום החלפת סוללה
+ רישום שינויים במצב הפעלה
+ רישום התראות
+ הפעלת הדמיית בזאלי זמני
+ השתמש בבולוס ממושך במקום בזאלים זמניים לעקיפת הגבלת ה-250%
+ ביטול רטט בעת הזרקת בולוס ידנית
+ עבור בולוס רגיל וממושך (זמין רק עם קושחה 3.x של משאבת Insight)
+ ביטול רטט בעת הזרקת בולוס אוטומטית
+ עבור SMB ובזאלי זמני עם הדמייה (זמינה רק עם Insight עם קושחה גרסה 3 ומעלה)
+ עיכוב הניתוק [s]
+ מספר סידורי
+ גרסת תוכנה
+ גרסת תוכנת מעבד הממשק
+ גרסת תוכנת מעבד המחשב
+ גרסת תוכנת עיבוד MD tel
+ גרסת תוכנת עיבוד בטיחות
+ גרסת דף מידע בלוטות\'
+ כתובת בלוטות\'
+ נספח זהות מערכת
+ תאריך ייצור
+ מחיקת זיווג
+ פרטי זיווג
+ הפעל משאבה
+ עצור משאבה
+ מצב פעולה
+ סטטוס
+ מינון בולוס יומי מצטבר
+ מינון בזאלי יומי מצטבר
+ מינון יומי מצטבר כולל
+ משחזר
+ לא מזווג
+ התחברות אחרונה
+ החל
+ נעצר
+ %1$d%% למשך %2$d/%3$d דק\'
+ בולוס ממושך
+ בולוס רב שלבי
+ %1$.2f / %2$.2f יח\' במשך %3$d דק\'
+ אפשר התראה על סיום בזאלי זמני\n(הגדרת משאבה)
+ השבת התראה על סיום בזאלי זמני\n(הגדרת משאבה)
+ רענן
+ חיבור משאבת Accu-Chek Insight
+ לא הוכנס
+ חיבור אחרון: לפני %1$d דק\'
+ בזאלי זמני: %1$d%% במשך %2$d / %3$d דק\'
+ בולוס ממושך: %1$.2f / %2$.2f יח\' במשך %3$d דקות
+ בולוס רב שלבי: %1$.2f / %2$.2f יח\' למשך %3$d דק\'
+ מינון כולל: %1$.2f
+ מכל: %1$.2f יח\'
+ סול\': %1$d%%
+ משך זמן התאוששות מקסימלי [s]
+ משך זמן התאוששות מינימלי [s]
+ משך שחזור
+ מגבלת זמן במהלך לחיצת יד - אתחול בלוטות\'
+ א׳
+ ש\'
+ ו׳
+ ה\'
+ ד\'
+ ג\'
+ ב\'
+ פעולות אוטומציה המוגדרות ע\"י המשתמש
+ נא להזין שם לפעולה.
+ נא לציין טריגר אחד לפחות.
+ נא לציין פעולה אחת לפחות.
+ כבר מאופשר
+ כבר מושבת
+ כבר מושעה
+ חידוש לולאה
+ לא מושעה
+ הפעלת ערך מטרה זמני
+ הפסקת ערך מטרה זמני
+ פחות מ-
+ שווה או פחות מ-
+ שווה ל-
+ שווה או גדול מ-
+ גדול מ-
+ לא זמין
+ גלוקוז אינו זמין
+ גלוקוז %1$s %2$.0f %3$s
+ גלוקוז %1$s %2$.1f %3$s
+ אחוז פרופיל %1$s %2$d
+ אינסולין פעיל %1$s %2$.1f
+ וגם
+ או
+ או בררני
+ ב-%1$s
+ שימוש במיקום רשת
+ שימוש במיקום GPS
+ השתמש במיקום פסיבי
+ שירות מיקום
+ אוטומטי
+ אוטומציה
+ == ∑ %1$s יח\'
+ רישום החלפת סנסור ב-Nightscout
+ רישום אירוע \"החלפת סנסור\" ב-Nightscout באופן אוטומטי בעת הפעלת החיישן
+ Tomato (MiaoMiao)
+ Tomato
+ שם המשתמש שלכם להתחברות ל-Tidepool, בדרך כלל כתובת הדוא\"ל שלכם
+ שם משתמש להתחברות
+ סיסמת ההתחברות ל-Tidepool
+ סיסמת התחברות
+ בדיקת התחברות ל-Tidepool
+ אם האפשרות מופעלת, נתונים יועלו לכתובת https://int-app.tidepool.org במקום https://app.tidepool.org/
+ שימוש בשרתי אינטגרציה (בדיקה)
+ Tidepool
+ TDP
+ מעלה נתונים ל-Tidepool
+ העלאת נתוני סנסור
+ העלאת טיפולים (אינסולין, פחמימות)
+ העלאת בזאלים זמניים
+ העלאת החלפת פרופילים, ערכי מטרה זמניים
+ העלאת בדיקות סוכר
+ שינוי לשעון קיץ ב-24 השעות הקרובות
+ חל מעבר לשעון קיץ לפני פחות מ-3 שעות - לולאה סגורה מושבתת
+ אילוץ אחסון פנימי
+ יש לפנות לפחות %1$d מ\"ב מנפח האחסון של מכשירכם! הלולאה מושבתת!
+ פורמט שגוי
+ משך הבזאלי הזמני חייב להיות כפולה של %1$d דקות ויותר מ-0.
+ קוד שגוי. הפקודה בוטלה.
+ לא מוגדר
+ נוצרה החלפת פרופיל
+ זמן חוזרני
+ בכל
+ אף פעם
+ תנאי:
+ פעולה:
+ אינסולין פעיל [U]:
+ גלוקוז [%1$s]:
+ מחק
+ הוספה
+ העתקה
+ הוסף חדש
+ בודק גרסה
+ מאמת חתימה
+ זיהינו שאתם משתמשים בגרסה לא תקפה. הלולאה מושבתת!
+ גרסה ישנה
+ גרסה ישנה מאוד
+ גרסה חדשה זמינה כבר %1$d ימים! הגבלה להשהיה עקב סוכר נמוך תחל אחרי %2$d ימים, הלולאה תושבת אחרי %3$d ימים
+ שעתיים
+ אפליקציית Dexcom עם פאץ\'
+ דקס\'
+ קבלת ערכי רמת סוכר מאפליקציית Dexcom עם פאץ\'.
+ התראה
+ התראה: %1$s
+ הודעה:
+ אחוז הפרופיל
+ אחוז [%]:
+ הפעלת פרופיל %1$d%% במשך %2$d דק\'
+ הפעלת פרופיל %1$d%%
+ קיים
+ לא קיים
+ ערך מטרה זמני %1$s
+ חיבור בלוטות\' להתקן %1$s %2$s
+ התחברות למכשיר בלוטות\'
+ WiFi SSID %1$s %2$s
+ Autosens %1$s %2$s %%
+ Autosens %
+ %3$s %1$s %2$s
+ הפרש רמת סוכר
+ הפרש רמת סוכר [%1$s]
+ מיקום נוכחי
+ מיקום
+ רוחב:
+ אורך:
+ מרחק [m]:
+ שם:
+ %1$s %2$s
+ כאשר
+ כשנמצאים באזור
+ כשנמצאים מחוץ לאזור
+ כשנכנסים לאזור ששמו
+ כשעוזבים אזור ששמו
+ בולוס אחרון
+ הבולוס האחרון היה לפני %1$s %2$s דק\'
+ פחמ\' פעילות
+ פחמ\' פעילות %1$s %2$.0f
+ שם משימה
+ עריכה
+ בחרו סוג פעולה
+ בחירת סוג הטריגר
+ טריגרים:
+ הסר
+ תנאים מוקדמים:
+ החלפת פרופיל ל-
+ החלפת פרופיל ל-%1$s
+ חיבור אחרון למשאבה
+ חיבור אחרון למשאבה [לפני מס\' דקות]
+ חיבור אחרון למשאבה לפני %1$s %2$s דקות
+ שליחת מסרון: %1$s
+ שליחת מסרונים לכל המספרים
+ שליחת מסרון עם טקסט
+ פחמ\' פעילות לעומת אינ\' פעיל
+ מגבלת בולוס יושמה: %1$.2f עד %2$.2f יח\'
+ !!!!!! זוהתה ספיגת פחמימות איטית: %2$d%% מהזמן הצפוי. הערכת כמות הפחמימות הפעילות עלולה להיות ביתר ולכן תיתכן הזרקת אינסולין עודפת !!!!!!]]>
+ ספק את חלק זה מתוצאת אשף הבולוס [%]
+ אשף הבולוס מבצע חישוב אך רק חלק זה של האינסולין המחושב מוזרק. שימושי בשימוש עם אלגוריתם SMB.
+ טוען...
+ נודניק
+ טווח זמן
+ הזמן בין %1$s ו- %2$s
+ בין
+ מגדיל את ערך מקסימום הבזאלי מפני שהוא נמוך מערכו המרבי בפרופיל
+ גוף ההודעה אינו חוקי
+ %1$s פקטור הרגישות: %2$.1f
+ %1$.0f גר\' יחס פחמ\': %2$.1f
+ %1$.1f גר\' יחס פחמ\':%2$.1f
+ %1$d%%
+ אשף בולוס
+ דק\'
+ שם הפרופיל:
+ נבחר:
+ יחידות
+ האם ברצונכם להחליף את הפרופיל ולזנוח את השינויים שבוצעו בפרופיל הנוכחי?
+ ביטול השלמה
+ ביטול התחלה
+ האם ברצונכם לאפס את התחלת המשימה? אתם עלולים לאבד את התקדמותכם במשימה.
+ בחרו את היחידות שבהן ברצונכם להציג ערכים
+ העלאת שינויים בפרופיל המקומי ל-Nightscout
+ DIA
+ IC
+ ISF
+ ע\' מטרה
+ שכפול
+ יש לשמור או לאפס תחילה את השינויים הנוכחיים
+ למחוק את הפרופיל הנוכחי?
+ ליצור פרופיל מקומי חדש מפרופיל זה?
+ שם הפרפיל מכיל נקודות.\nשם כזה אינו נתמך ע\"י Nightscout \nהפרופיל לא הועלה ל-Nightscout.
+ ערך נמוך יותר באזור הטווח (הצגה בלבד)
+ ערך גבוה יותר באזור הטווח (הצגה בלבד)
+ סדר מחדש
+ גיל:
+ משקל:
+ מס\' זיהוי:
+ עדכן
+ הפרופיל הנפוץ ביותר:
+ הערה: רק נתונים הגלויים במסך זה יועלו באופן אנונימי. הזיהוי מוקצה להתקנה זו של AndroidAPS. תוכלו לשלוח שוב נתונים אם הפרופיל הראשי שלכם ישונה, אך תנו לו לרוץ במשך שבוע לפחות כדי להפוך את התוצאה לגלויה בזמן בטווח. עזרתכם מוערכת.
+ רשומת גיל לא חוקית
+ רשומת משקל לא חוקית
+ רשומת אחוזים לא חוקית
+ %1$s: נמוך: %2$02d%% בטווח: %3$02d%% גבוה: %4$02d%%]]>
+ ממוצע
+ זמן בטווח
+ מוניטור פעילות
+ האם ברצונכם לאפס את הסטטיסטיקות הפעילות?
+ סטטיסטיקה
+ רמת גלוקוז אקראית
+ הפקת נתוני גלוקוז אקראיים (מצב הדגמה בלבד)
+ ערכי גלוקוז בדם
+ כלים
+ הצג חישוב
+ אירוע אוטומציה
+ כבר מוגדר
+ לנקות את התור? כל הנתונים בתור יאבדו!
+ שימוש בבולוס ממושך יפסיק את מצב הלולאה הסגורה לזמן פעילות הבולוס. אתם בטוחים שאתם רוצים להמשיך?
+ הלולאה הסגורה מופסקת עקב מתן בולוס ממושך
+ \"בודק טלפון\"
+ תפריט תרשים
+ זמן בקשת SMB
+ זמן ביצוע SMB
+ זמן בקשת בזאלי זמני
+ זמן הפעלת בזאלי זמני
+ התראות משאבת Insight
+ מיישום מאמת עבור: %1$s ואחריו PIN
+ אפשר מאמת
+ אמת פקודות באמצעות סיסמאות חד פעמיות שהופקו ע\"י מאמת Google או יישומי 2FA אחרים.
+ תוספת PIN חובה בסוף האסימון
+ ספרות נוספות שיש לשנן ולהדביק בסוף כל אחת מהסיסמאות החד פעמיות
+ הגדרת מאמת
+ קוד לבדיקה:
+ OTP + PIN
+ קוד האימות מורכב מ-6 ספרות המוצגות על ידי יישום מאמת (הידוע בתור OTP) ואחריו 3 או יותר ספרות של PIN הכרחי.
+ איפוס מאמתים
+ איפוס מפתח אימות
+ האם אתם בטוחים שברצונכם לאפס את מפתח האימות? איפוס יהפוך את כל המאמתים המוגדרים כעת לבלתי תקפים, ותצטרכו להגדיר אותם מחדש.
+ מפתח אימות חדש הופק! נא להשתמש בקוד QR מעודכן כדי לאפשר אימות.
+ יצוא סוד OTP
+ אתם בטוחים שברצונכם להעתיק את סוד ה-OTP ללוח ההעתקה?\n\nייתכן שתצטרכו לעשות זאת רק אם יישום האימות נתקל בבעיות בסריקת קוד QR, או שברצונכם להכניס אותו ידנית או להגדיר אסימון OTP של חומרה באמצעות יישום ייעודי.
+ סוד OTP (בפורמט Base32) יוצא והועתק אל לוח ההעתקה. הדביקו אותו לתוך תוכנת האימות או בחומרת צריבת OTP!
+ 1. התקנת מאמת
+ 2. קוד סריקה להגדרת קודי OTP של AndroidAPS
+ 3. ניסוי סיסמה חד-פעמית
+ איפוס מאמתים
+ בכל אחד מהטלפונים העוקבים, התקינו יישום מאמת התומך באסימוני RFC 6238 TOTP. יישומים פופולריים בחינם הם:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
+ אתחול המאמת גורם למאמתים שסופקו לכם להפסיק להיות חוקיים ויהיה צורך להגדירם שוב!
+ בחיבור
+ בניתוק
+ חיזוי
+ שיפוע הסטייה
+ ההרשאה נכשלה
+ אינסולין מוחלט
+ הסיסמה הראשית משמשת להצפנת גיבוי וכדי לעקוף את האבטחה ביישום. זכרו אותה או שמרו אותה במקום בטוח.
+ סיסמה ראשית נוכחית
+ אורות חיווי
+ העתקת הגדרות מ-Nightscout
+ להעתיק הגדרות מ-Nightscout (אם קיימות)?
+ סקין מקורי
+ סקין רזולוציה נמוכה
+ לחצנים מוצגים תמיד בתחתית המסך
+ תצוגה גדולה
+ סקין
+ השוואת פרופילים
+ עוזר פרופילים
+ פרופיל ברירת מחדל
+ פרופיל נוכחי
+ פרופיל זמין
+ סוג פרופיל
+ גיל: %1$.0f יח\' מינון יומי כולל: %2$.0f יח\'
+ גיל: %1$.0f יח\' מינון יומי כולל: %2$.0f יח\' %3$d%%
+ גיל: %1$.0f יח\' משקל: %2$.0f ק\"ג
+ % של הבזאלי
+ פרופיל ברירת מחדל
+ Open Humans
+ מסיים התקנת Open Humans…
+ זה עלול לקחת זמן מה. נא לא לכבות את את המכשיר או את התוסף.
+ ההתקנה הושלמה
+ מכשירכם ישלח את מידע ל-Open Humans בהקדם.
+ מכשירכם שולח כעת את המידע ל-Open Humans.
+ ההתקנה נכשלה
+ חלה שגיאה. בבקשה נסו להתחבר שוב כדי להמשיך. סליחה ותודה!
+ זהו כלי קוד פתוח שיעתיק את הנתונים שלכם ל-Open Humans. אין לנו זכויות לחלוק את הנתונים שלך עם צדדים שלישיים ללא אישורכם המפורש. הנתונים שהפרויקט והיישום מקבלים מזוהים באמצעות מספר זיהוי משתמש אקראי ויעברו באופן מאובטח לחשבון Open Humans באישורכם. תוכלו להפסיק לשלוח ולמחוק את נתוניכם בכל עת דרך www.openhumans.org.
+ אני מבינ/ה ומסכימ/ה.
+ התחברות
+ התנתקות
+ אתם בטוחים שברצונכם להתנתק ולהפסיק לתרום מידע למדע?
+ זיהוי משתתף פרויקט: %s
+ גודל התור: %d
+ תנאי השימוש
+ לא מחובר/ת
+ עליכם להסכים לתנאי השימוש.
+ ההתחברות הצליחה
+ ההתקנה תושלם כעת ברקע. תודה על שליחת הנתונים שלכם.\n\nאנא השאירו את תוסף זה ואת מכשיר הטלפון שלכם מופעל לזמן קצר כדי להשלים את ההתקנה.
+ משלים התחברות…
+ תרמו את נתוניכם למדע
+ OH
+ התנתקתם מ-Open Humans
+ לחצו כאן כדי להתחבר מחדש אם זה לא היה בכוונה.
+ אפשר העלאה רק אם מחובר ל-WiFi
+ אפשר העלאה רק בזמן טעינת הסוללה
+ מצב עובד: %s
+ נתונים שהועלו
+ הנתונים הבאים יועלו לחשבון Open Humans שלכם: ערכי גלוקוז, בולוסים, פחמימות, אירועים מפורטל הטיפולים (מלבד הערות), בולוסים ממושכים, החלפות פרופיל, מינונים יומיים כוללים, באזאלים זמניים, ערכי מטרה זמניים, העדפות, גרסת יישום, דגם המכשיר ומממדי המסך. מידע סודי או פרטי כגון כתובת ה-Nightscout האישית או סוד ה-API שלכם לא יועלו.
+ מצב ריילילינק:
+ סינון
+ לא ניתן ליצור פרופיל מקומי. הפרופיל אינו חוקי.
+ לא להשבית את האפליקציה שלי?
diff --git a/app/src/main/res/values-ko-rKR/exam.xml b/app/src/main/res/values-ko-rKR/exam.xml
index ee3cb67160..9b93976ddb 100644
--- a/app/src/main/res/values-ko-rKR/exam.xml
+++ b/app/src/main/res/values-ko-rKR/exam.xml
@@ -16,7 +16,6 @@
NS 프로파일이 사용될 수 있지만, 오프라인 상에서 설정할 수는 없습니다.https://androidaps.readthedocs.io/en/latest/CROWDIN/ko/Configuration/Config-Builder.html#profile주제: 펌프 일시중지하기
- 펌프 일시중지할땐 무엇을 해야합니까?인슐린이 주입되지 않을것이라는 것을 AAPS가 인지하도록 \'펌프 일시중지\'를 누릅니다.펌프가 일시중지되는 동안 \'Loop 일시중지\'를 눌러서 Loop를 중지합니다.AAPS에선 아무 작업도 하지 않고, 그냥 펌프와 연결을 해제합니다.
@@ -131,8 +130,6 @@
높은 IC 비율은 탄수화물 섭취시 인슐린이 보다 덜 주입되게 합니다.낮은 IC 비율은 탄수화물 섭취시 인슐린이 보다 덜 주입되게 합니다.COB가 0 인 경우 IC 비율을 변경하면 혈당을 교정하기 위해 다른 양의 인슐린이 주입됩니다.
- 빵유닛(Bread Unit)을 10g 혹은 12g으로 계산한다면 IC 값도 달라집니다.
- IC의 의미는 다음과 같습니다: 1U의 인슐린으로 얼마나 많은 빵유닛(Bread Units)이 처리되는지.https://androidaps.readthedocs.io/en/latest/CROWDIN/ko/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-u주제: 프로파일 변경프로파일을 90%로 설정하면 어떻게 됩니까?
diff --git a/app/src/main/res/values-ko-rKR/objectives.xml b/app/src/main/res/values-ko-rKR/objectives.xml
index 86f97a4f64..9346ad91fe 100644
--- a/app/src/main/res/values-ko-rKR/objectives.xml
+++ b/app/src/main/res/values-ko-rKR/objectives.xml
@@ -1,6 +1,5 @@
- 뒤로시작확인%1$d. 목표
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index afbaedee45..e33f6dc7a1 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -24,14 +24,12 @@
인슐린활동의 피크를 직접 정의할 수 있습니다. 고급 사용자만 사용해야 합니다.Loop를 활성화 혹은 비활성화합니다.Nightscout과 데이터 동기화하기
- 2016년의 알고리즘2017년의 알고리즘고급사용자를 위한 가장 최신의 알고리즘현재 Loop 상태와 기본 기능 버튼을 표시합니다.Loop가 어떤 작동하는지에 대한 간략한 개요를 연속 알림으로 보여줍니다.오프라인에서 사용 가능한 프로파일을 정의하십시오.Nightscout에서 정의한 프로필을 사용합니다.
- 하나의 시간대만 설정 가능한 단순 프로파일아큐-첵 Combo 펌프와 연동, ruffy 설치 필요다회요법으로 관리하는 사용자를 위한 설정가상용 펌프를 위한 설정(Open Loop)
@@ -82,7 +80,6 @@
구성 관리자홈NS 프로파일
- Simple 프로파일관리가상펌프케어포털
@@ -104,13 +101,11 @@
APS제약 적용 후펌프에 의한 임시Basal 설정
- 최근 실행APS가 선택되지 않았거나 계산된 결과가 없습니다.안전성플러그인이 사용불가능 합니다제한 위반Bolus 주입 에러
- Basal 값 [%]새 임시Basal 적용:관리계산기
@@ -137,17 +132,11 @@
기타측정기센서
- 탄수화물
- 인슐린탄수화물 시간
- 분할기간
- 퍼센트
- 절대값노트이벤트 시간프로파일
- 입력자혈당 종류아직 NS에서 프로파일을 로드하지 못했습니다.임시Basal
@@ -186,10 +175,6 @@
%2$d 분 동안 목표 %1$s 설정이 완료되었습니다임시 목표 취소가 완료되었습니다SMS 원격 명령 사용하기
- DanaR 프로파일 설정
- 인슐린활동시간(DIA) [h]
- 인슐린 활동 기간
- 업로드중Bolus 중지됨Bolus 중지중Loop가 중지되었습니다.
@@ -233,14 +218,12 @@
펌프가 초기화 되지 않았습니다!교체/채움양이 인퓨전세트의 사양과 일치하는지 확인하세요!
- 기타버튼1버튼2버튼3단위:단위DIA
- 목표 범위:차트 표시 범위홈화면/스마트워치의 차트에서 표시되는 고/저혈당 선저혈당 선
@@ -274,7 +257,6 @@
ACTCONFLOOP
- SPOAPSLP홈
@@ -298,7 +280,6 @@
주의!\n보통의 경우 아래의 값을 변경하면 안됩니다. 이 값들을 변경하기 전에 반드시 이곳을 클릭하고 글을 정독해서 확실하게 이해를 하여야 합니다.SMS폰번호가 유효하지 않습니다보정
- 보정값 %1$.1f을 xDrip에 전송하시겠습니까?xDrip+가 설치되지 않았습니다보정이 xDrip으로 전송되었습니다보정 전송됨. xDrip에서 수신이 되도록 설정되어 있어야 합니다.
@@ -330,17 +311,14 @@
IOB 자세하게 보여주기워치페이스에 IOB를 Bolus IOB와 Basal IOB로 나누어서 보여줍니다.성공하지 못했습니다. 폰을 확인하세요
- 나이어린이청소년성인인슐린 저항성 높은 성인
- 안전제한을 설정하기 위해 당뇨인의 나이를 선택하세요Glimp최적의 성능을 위해 %1$s에서 배터리 최적화를 해제해야합니다.Loop 일시중지일시중지중 (%d분)
- Superbolus (%1$d 분)Loop 일시중지1시간동안 Loop 일시중지2시간동안 Loop 일시중지
@@ -363,7 +341,6 @@
앱시작을 NS에 기록하기설정을 적용하기위해 앱을 종료합니다.어떤 종류의 인슐린을 사용합니까?
- 초속형 인슐린노보래피드, 휴마로그, 에피드라피아스프(Fiasp)INS
@@ -387,11 +364,7 @@
NS에 업로드하지 않기NS로 보낼 모든 데이터가 버려집니다. AAPS는 NS에 연결되어 있지만 NS에는 변화가 없을것입니다.확장Bolus 취소
- 센서 사용기간
- 캐뉼라 사용기간
- 인슐린 사용기간프로파일 변경 실행
- 펌프배터리사용기간알람 옵션누락 데이터 기준값 [min]위험 누락 데이터 기준값 [min]
@@ -403,20 +376,14 @@
민감도 감지어떤 민감도 알고리즘을 사용하겠습니까?민감도
- 민감도 Oref0민감도 Oref1민감도 AAPS흡수 설정식사 최대 흡수 시간 [h]식사로 섭취한 탄수화물이 모두 흡수될기까지 예상되는 시간
- SAGE
- IAGE
- CAGE
- PBAGEOAPSUPLDBAS
- EXT화면을 켜진 상태로 유지안드로이드의 화면이 꺼지는 것을 방지합니다. 전원이 공급되어 있지 않으면 전력소모가 큽니다.Autosense 기능을 켜면 모든 섭취된 탄수화물양을 입력하십시오. 그렇지 않으면 탄수화물 편차(deviations)가 민감도 변화로 잘못 인식될것입니다!!
@@ -427,10 +394,6 @@
값이 저장되지 않았습니다!다른 앱 (예 : xDrip)으로 데이터 전송을 활성화합니다. AAPS 또는 NSClient 인스턴스를 두 개 이상 설치 한 경우 활성화하지 마세요!Local Broadcasts 활성화하기
- 활동 & 피드백
- 탄수화물 & Bolus
- CGM & OPENAPS
- 펌프기간 [min]OpenAPS SMBUAM 활성화하기
@@ -480,7 +443,6 @@
혈당 업로드 설정델타(혈당증분값) 자세히 보여주기소수점 자리 추가된 증분값 보여주기
- SMB 최대 분SMB가 Basal을 제한할 수 있는 최대 시간(분)혈당 데이터를 xDrip+에 전송하기xDrip+ 데이터 소스에서 640g/Eversense을 선택하세요
@@ -530,7 +492,6 @@
비어 있음보통펌프 시간 업데이트가 필요합니다.
- 경고임시기초주입 취소 경고가 확인되었습니다.펌프를 사용할 수 없습니다. Bolus 주입이 실행되지 않았습니다.Bolus 주입이 실패하였습니다. 주입된 Bolus가 없는 것으로 보입니다. 이중으로 Bolus가 주입되는 것을 방지하기 위해 펌프를 확인한 다음 다시 Bolus를 주입하세요. 버그를 방지하기 위해 Bolus 주입이 자동으로 재시도되지 않습니다.
@@ -539,7 +500,6 @@
Bolus 주입 위한 인슐린이 주사기에 부족합니다.확장Bolus 주입 에러Sight
- 전항상 SMB 사용하기Bolus와 독립적으로 항상 SMB를 사용합니다. G5처럼 잘 필터된 혈당출처와만 사용이 가능합니다.탄수화물 이후 SMB를 사용합니다.
@@ -588,7 +548,6 @@
저혈당 임시목표 시작개발자버전을 실행중입니다. Closed Loop는 비활성화 됩니다.전문가 모드 사용
- 전문가 모드가 활성화되어 있지 않고 Release 버전이 실행되고 있지 않습니다.Basal 프로파일 읽는중Bolus 계산이 수행된 후 펌프 이력이 변경되었습니다. Bolus가 주입되지 않았습니다. Bolus가 여전히 필요하다면 다시 계산하세요.Bolus가 성공적으로 주입되었지만, 관리 항목에 추가하지 못했습니다. 이것은 동일한 양의 소량의 2개의 Bolus가 최근 2 분 이내에 주입되는 경우에 발생할 수 있습니다. 펌프 이력과 관리 항목을 확인하고 손실된 항목을 추가하기위해 케어포털을 이용하세요. 동일한 시간과 인슐린양의 항목을 추가하지 마세요.
@@ -598,7 +557,6 @@
펌프의 Basal 양이 변경되었지만 읽기를 실패했습니다.이력 변경 확인중동일한 시간(분)에 동일한 양의 2개이상의 Bolus가 주입되었습니다. 오직 하나의 기록만이 관리에 입력될 수 있습니다. 펌프를 확인한 후 케어포털 탭에서 Bolus 기록을 수동으로 추가하세요. 동일한 시간에 동일한 양의 Bolus를 주입하지 않도록 하세요.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)최근 Bolus가 24시간 전 혹은 미래에 있습니다. 펌프의 날짜가 제대로 설정되어 있는지 확인해보세요.펌프에서 주입된 Bolus의 시간/날짜가 잘못되었습니다. IOB가 부정확할 수 있습니다. 펌프 시간/날짜를 확인하세요.프로파일변경 누락. 로컬 프로파일에서 프로파일 변경을 하거나 \"프로파일 활성화하기\"를 누르세요.
@@ -629,7 +587,6 @@
Open Loop모드에선 SMB가 허용되지 않습니다.Food재설정
- 연결 끊어짐 (%1$d분)OpenAPS가 초과 할 수 없는 총 IOB의 최대량 [U]이 값은 OpenAPS에서 Max IOB라고 합니다\n현재 IOB가 이 값보다 크면 OpenAPS는 인슐린을 추가로 주입하지 않습니다.펌프 중지
@@ -643,7 +600,6 @@
이전설정 마법사완료
- 언어를 선택하세요1차 인슐린 증분2차 인슐린 증분3차 인슐린 증분
@@ -673,18 +629,14 @@
일반 설정NSClient 활성화하기설정 마법사에 오신것을 환영합니다. 설정 마법사가 설정 과정을 안내하여 줄것입니다.
- 펌프 설정상태 불러오기오직 NS에서 변경해야합니다.설정 마법사 건너뛰기AndroidAPS가 Basal 변화를 제안 혹은 실행하게 하려면 아래 버튼을 누르세요.
- APS 플러그인 설정하기
- 민감도 플러그인 설정하기민감도 플러그인은 민감도감지와 COB 계산을 위해 사용됩니다. 더 많은 정보는 다름 링크를 방문하세요.https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient는 Nightscout와의 연결을 처리합니다. 이 부분을 건너뛸 수 있지만 설정하기 전엔 목적을 수행할 수 없습니다.새로운 인슐린 프로파일은 최소 5시간의 DIA가 요구됩니다. 새로운 프로파일의 DIA 5-6시간은 구식 인슐린 프로파일의 DIA 3시간과 동일합니다.
- 혈당 출처 설정하기프로파일 소스를 선택해주세요. 당뇨인이 어린이라면 NS 프로파일을 선택하여야 합니다. Nightscout으로 관리해줄 사람이 없다면 당신은 로컬 프로파일을 선호할 수도 있습니다. 여기선 프로파일의 소스를 선택할 뿐이라는 것을 명심하세요. 그 프로파일을 실제 사용하려면 \"프로파일 변경\"을 실행하여 프로파일을 활성화 시켜야합니다.사용 가능한 알고리즘 중 하나를 선택하세요. 과거부터 최신의 순으로 정렬이 되어 있습니다. 일반적으로 새로운 알고리즘은 보다 강력하고 공격적입니다. 따라서 당신이 신규 사용자라면 최신의 알고리즘보단 AMA로 시작하는것이 나을 수 있습니다. 사용 전에 OpenAPS 문서를 읽어보고 설정하는 것을 잊지마세요.첫번째 목표를 시작하세요.
@@ -692,7 +644,6 @@
권한 요청하기알림에 대한 시스템 창 권한이 필요합니다요청
- 인슐린 플러그인 설정하기종료메뉴 열기메뉴 닫기
@@ -726,7 +677,6 @@
로그 설정기본값으로 초기화NSClient가 정상적으로 작동하지 않습니다. Nightscout와 NSClient를 재시작 해보세요.
- AS%1$s 버전이 사용 가능합니다.시간 이동선호하는 APS 모드
@@ -953,12 +903,9 @@
선택:단위프로파일을 변경하고 현재 프로파일에 대한 변경 사항을 버리시겠습니까?
- 켜기
- 끄기완료 초기화시작 초기화목표를 초기화하시겠습니까? 진행상황이 삭제됩니다.
- 펌프가 선택되지 않음사용하시는 혈당 단위를 선택하세요로컬 프로파일 변경을 NS에 업로드하기DIA
@@ -977,7 +924,6 @@
확인가장 많이 사용된 프로파일:참고: 이 화면에 보이는 데이터만 익명으로 업로드됩니다. ID는 AndroidAPS 설치에 할당됩니다. 기본 프로파일이 변경되면 데이터를 다시 제출할 수 있지만 어느정도 시간 범위의 결과가 보이도록 최소 1주일 이상 실행하여 주세요. 당신의 도움 감사하겠습니다.
- 조사유효하지 않은 나이입니다유효하지 않은 몸무게입니다%1$s: Low: %2$02d%% In: %3$02d%% High: %4$02d%%]]>
@@ -996,10 +942,8 @@
대기열을 삭제하시겠습니까? 대기열에 있는 모든 데이터가 삭제됩니다!확장 Bolus 기능을 사용하는 동안에는 Closed Loop 모드가 중지됩니다. 정말 원하십니까?확장 Bolus 사용으로 인해 Closed Loop가 비활성화됨
- EB\"전화확인\"차트 메뉴
- ASSMB 요청시간SMB 실행시간임시 Basal 요청시간
diff --git a/app/src/main/res/values-lt-rLT/exam.xml b/app/src/main/res/values-lt-rLT/exam.xml
index dd8f3aba08..729d2bcc81 100644
--- a/app/src/main/res/values-lt-rLT/exam.xml
+++ b/app/src/main/res/values-lt-rLT/exam.xml
@@ -17,7 +17,6 @@
NS Profilis gali būti naudojamas, bet nekonfigūruojamas.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileTema: Atsijungimas nuo Pompos
- Ką reikėtų daryti, kai atjungiama pompa?Spustelėkite Atjungti pompą, kad AAPS žinotų, kad insulinas nėra leidžiamas.Paspauskite Sustabdyti ciklą, kad AAPS sustabdytų ciklą, kai pompa yra atjungta.Nieko nekeiskite AAPS, tiesiog atjunkite pompą.
@@ -134,8 +133,6 @@
Didesnis insulino ir angliavandenių IA santykis reiškia, kad mažiau insulino reikia padengti tam tikram angliavandenių kiekiui.Mažesnis insulino ir angliavandenių IA santykis reiškia, kad mažiau insulino reikia padengti tam tikram angliavandenių kiekiui.Jei turite 0 AAO (aktyvių angliavandenių organizme), pakeitus IA, glikemija bus koreguojama kitokiu insulino kiekiu.
- IA vertė skirsis priklausomai nuo to, ar duonos vienetui skaičiuojate 10g, ar 12g angliavandenių.
- IA reiškia: kiek vienas vienetas insulino dengia duonos vienetų.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uTema: Profilio keitimas Kai profilio keitime nustatote 90%…
diff --git a/app/src/main/res/values-lt-rLT/objectives.xml b/app/src/main/res/values-lt-rLT/objectives.xml
index b833792c44..8c6b7b53e1 100644
--- a/app/src/main/res/values-lt-rLT/objectives.xml
+++ b/app/src/main/res/values-lt-rLT/objectives.xml
@@ -1,6 +1,5 @@
- AtgalPradėtiPatikrinti%1$d. tikslas
diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/app/src/main/res/values-lt-rLT/strings.xml
index 9e370cf365..cfde105ef1 100644
--- a/app/src/main/res/values-lt-rLT/strings.xml
+++ b/app/src/main/res/values-lt-rLT/strings.xml
@@ -21,17 +21,16 @@
Rodyti maisto ruošinius iš NightscoutNustatymai Humalog ir NovoRapid / NovoLog insulinamsNustatymai Fiasp insulinui
+ Nustatymai Lyumjev insulinuiLeidžia pasirinkti insulino veikimo piką ir turėtų būti naudojama tik patyrusių vartotojųAktyvuoja arba deaktyvuoja Ciklo paleidimą.Sinchronizuoja duomenis su Nightscout
- 2016 m. algoritmas2017 m. algoritmasNaujausias algoritmas patyrusiems vartotojamsRodo dabartinę Ciklo būseną ir pagrindinių veiksmų mygtukusRodo atsinaujinančius pranešimus su trumpa Ciklo veiklos apžvalgaNustatykite vietinį profilį.Nustato profilį, kuris įvestas Nightscout puslapyje
- Nustato profilį su vieninteliu laiko bloku.Accu-Chek Combo pompos integracija, reikalinga Ruffy programėlėIntegracija žmonėms, naudojantiems insulino injektoriusIntegracija pompoms, kurios dar neturi reikalingo valdiklio (Atviras Ciklas)
@@ -83,7 +82,6 @@
KonfigūracijaApžvalgaNS profilis
- Paprastas profilisTerapijaVirtuali pompaPriežiūra
@@ -105,13 +103,11 @@
DKSPritaikius apribojimusLaikina bazė nustatyta pompoje
- Paskutinis veiksmasNEPASIRINKTA DKS ARBA NĖRA REZULTATOSaugumasĮskiepis išjungtasApribojimų pažeidimasBoluso suleidimo klaida
- Valandinė bazė [%]Patvirtinti naują laikiną bazę:TerapijaSkaičiuotuvas
@@ -140,17 +136,11 @@
KitiMatuoklisSensorius
- AV
- InsulinasAV laikas
- IšskaidytiTrukmė
- Procentai
- AbsoliutusPastabosĮvykio laikasProfilis
- ĮvedėGliukozės tipasDar negautas joks profilis iš NSLaikina bazė
@@ -214,7 +204,6 @@
Iššifravimas klaida, slaptažodis yra neteisingas arba nustatymų failas buvo pakeistas! Taip nutinka, jei importuotas failas buvo eksportuotas su kitu slaptažodžiu.Trūksta šifravimo sąrankos parametrų, nustatymų formatas yra neteisingas!Nepalaikomas arba nepatikslintas šifravimo algoritmas!
- eksportuota šiandieneksportuota prieš %1$seksportuota %1$seksportuota mažiau nei prieš valandą
@@ -246,10 +235,6 @@
Tikslas %1$s %2$d min. nustatytas sėkmingaiLaikinas tikslas atšauktas sėkmingaiLeisti nuotolines komandas SMS žinutėmis
- DanaR profilio nustatymai
- IVT [h]
- Insulino veikimo trukmė
- SiunčiamaBolusas sustabdytasBolusas stabdomasCiklas buvo išjungtas
@@ -260,7 +245,6 @@
Vertė %1$s viršija griežtą limitąPompos prijungimui atsakykite su kodu %1$sNepavyko prisijungti prie pompos
- Norėdami atjungti pompą %1d min., atsakykite kodu %2$sPompa atjungtaPompa prijungtaNuotolinis valdymas negalimas
@@ -304,7 +288,6 @@
Pompa neprijungta!UžpildymasĮsitikinkite, kad nurodytas kiekis atitinka Jūsų infuzijos rinkinio specifikaciją!
- KitaStandartiniai insulino kiekiai kateterio/kaniulės užpildymuiMygtukas 1Mygtukas 2
@@ -312,7 +295,6 @@
Vienetai:VienetaiIVT
- Tikslinis diapazonas:Vizualizacijos diapazonasAukštoji ir žemoji riba Apžvalgos grafikuose bei išmaniuosiuose laikrodžiuoseŽemoji riba
@@ -346,7 +328,6 @@
VEIKSKONFCIKLAS
- PPAtvCiklasVPPRADŽIA
@@ -371,7 +352,6 @@
Dėmesio!\nPaprastai neturėtumėte keisti šių, žemiau esančių, reikšmių. Prašome PASPAUSTI ČIA ir PERSKAITYKITE tekstą ir įsitikinkite, kad SUPRANTATE prieš keisdami bet kurią iš šių verčių.Neteisingas SMS telefono numerisKalibravimas
- Siųsti kalibraciją %1$.1f į xDrip?xDrip+ neįdiegtaKalibracija nusiųsta į xDripKalibracija išsiųsta. xDrip programoje turi būti įgalintas gavimas.
@@ -404,12 +384,10 @@
Rodyti laikrodyje bazės ir bolusų AIOBandymas nesėkmingas - pasitikrinkite telefonąn/a
- Paciento amžiusVaikasPaauglysSuaugęsInsulinui rezistentiškas suaugęs
- Pasirinkite paciento amžių saugumo riboms nustatytiPaciento vardasPateikite paciento vardą arba slapyvardį, kad galima būtų atskirti tarp skirtingų konfigūracijų.Vartotojas
@@ -417,7 +395,6 @@
%1$s įtraukite į baterijos optimizavimo baltąjį sąrašą tinkamam veikimui užtikrintiCiklas sustabdytasSustabdyta (%1$d m)
- Superbolusas (%1$d m)Sustabdyti cikląSustabdyti ciklą 1 valSustabdyti ciklą 2 val
@@ -440,7 +417,6 @@
Siųsti programos paleidimo žymę į NSUždarant aplikaciją, taikyti nustatymus.Kokio tipo insuliną naudojate?
- Greito veikimo insulinasNovorapid, Novolog, HumalogFiaspINS
@@ -478,11 +454,7 @@
Nėra įkėlimų į NSVisi duomenys, kurie gali būti siunčiami į NS, paliekami. AAPS yra susieta su NS, bet jokie pokyčiai NS nedaromiAtšaukti ištęstą bolusą
- Sensorius
- Kateteris
- InsulinasProfilio keitimas
- BaterijaAliarmų nustatymaiSukurti pranešimus iš NS aliarmųSukurkite pranešimus iš NS perspėjimų
@@ -496,20 +468,14 @@
Jautrumo nustatymasKurį jautrumo nustatymo algoritmą naudoti?JAUTR
- Jautrumo nustatymo algoritmas Oref0Jautrumo nustatymo algoritmas Oref1Jautrumo nustatymo algoritmas AAPSAngliavandenių įsisavinimo parametraiMaksimalus angliavandenių įsisavinimo laikas [h]Laikas, per kurį visi maisto angliavandeniai, tikėtina, bus įsisavinti
- SAMŽ
- IAMŽ
- KAMŽ
- PBAMŽOAPSSiuntVB
- IštBolLaikyti ekraną įjungtąNeleidžia Android sistemai išjungti ekrano. Naudojama daug energijos, jei telefonas neprijungtas prie maitinimo šaltinio.Įjungę Autosens funkciją nepamirškite įvedinėti visus valgomus angliavandenius. To nedarant, angliavandenių sukeliami gliukozės svyravimai bus klaidingai identifikuojami kaip jautrumo pasikeitimai!
@@ -520,10 +486,6 @@
Reikšmės neišsaugotos!Įgalinti perdavimą į kitas programas (pvz., „XDrip“). Neįgalinkite, jei įdiegta daugiau nei vienas AAPS arba NSClient egzempliorius!Įgalinti lokalų duomenų perdavimą.
- AKTYVUMAS & ATGALINIS RYŠYS
- ANGLIAVANDENIAI & BOLUSAI
- NGJ & OPENAPS
- POMPATrukmė [min]OpenAPS SMBĮjungti NDM
@@ -535,6 +497,7 @@
Oref be pikoGreito veikimo OrefStaigaus veikimo Oref
+ LyumjevIVT %1$f per trumpa - bus naudojama %2$f!Aktyvuoti profilįKLAIDA
@@ -576,7 +539,6 @@
Rodyti gliukozės pokyčio detalesRodyti pokytį su reikšme po kablelioKaip dažnai SMB bus leidžiami, min.
- SMB maks. minutėsSMB atitinka valandinės bazės insulino kiekį, kuris gaunamas ne daugiau, kaip perNDM SMB maks. min.NDM SMB atitinka valandinės bazės insulino kiekį, kuris gaunamas ne daugiau, kaip per
@@ -630,7 +592,6 @@
TuščiasNormalusBūtina atnaujinti pompos laikrodį
- PerspėjimasLaikinos bazės atšaukimo perspėjimas patvirtintasNepavyko prijungti pompos. Bolusas nesuleistasBoluso suleisti nepavyko. Panašu, kad nė kiek insulino nesuleista. Patikrinkite pompos įstoriją, kad įsitikintumėte tuo, ir bandykite vėl. Bolusai nekartojami automatiškai, siekiant apsisaugoti nuo programos klaidų.
@@ -639,7 +600,6 @@
Rezervuare nepakanka insulino bolusuiIštęstinio boluso suleidimo klaidaSight
- priešNustatyti neutralią laikiną bazęJei įjungta, laikina valandinė bazė bus anuliuota iki kiekvienos valandos pabaigos. Šis metodas gali padėti išvengti kai kurių pompų pypsėjimo ar vibravimo.Leisti SMB visada
@@ -698,7 +658,6 @@
Pradėti \"Hipo\" LTNaudojama neužbaigta versija. Uždaras ciklas neaktyvus.Inžinerinis režimas įjungtas
- Inžinerinis režimas negalimas vartotojo atšakojeNuskaitomas bazės profilisSkaičiuojant bolusą pasikeitė pompos istorija. Bolusas nesuleistas. Prašome perskaičiuoti, jei boluso vis dar reikia.Bolusas sėkmingai suleistas, tačiau įrašas žurnale neįvestas. Taip gali nutikti, jei du vienodi nedideli bolusai suleisti per pastarąsias 2 min. Patikrinkite pompos istoriją ir įrašų žurnalą bei naudodamiesi Careportal įveskite trūkstamus įrašus. Patikrinkite, ar įvedamas įrašas neturi tokios pat laiko žymos ir insulino kiekio, kaip jau egzistuojantis.
@@ -708,7 +667,6 @@
Valandinė bazė pompoje pasikeitė, bet nuskaityti nepavykoTikrinami istorijos pokyčiaiKeletas bolusų su tuo pačiu kiekiu buvo importuoti per tą pačią minutę. Tik vienas įrašas gali būti pridėtas. Prašome patikrinti pompą ir rankiniu būdu įveskite bolusą, naudojant Priežiūra skiltį. Įsitikinkite, kad boluso įrašo laikas nesutampa su kitais įrašais.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)Paskutinis bolusas įrašytas anksčiau nei prieš 24 val. arba yra ateityje. Prašome patikrinti, ar data pompoje nustatyta teisingai.Suleisto boluso laikas/data pompoje yra neteisingas, AIO panašu yra nekorektiškas. Prašome patikrinti pompos laiką/datą.Neatliktas profilio keitimas. Prašome atlikti profilio keitimą arba paspausti \"Aktyvuoti profilį\" Vietinio profilio (VP) skiltyje.
@@ -739,7 +697,6 @@
SMB neleidžiami atviro ciklo režimeMaistasatstatyti
- Nesujungta (%1$d min.)Maksimalus bendras AIO, kurio negali viršyti OpenAPS [U]Ši vertė yra vadinama Maks AIO OpenAPS kontekste\nOpenAPS nepridės daugiau insulino, jei dabartinis AIO yra didesnis už šią vertęPompa sustabdyta
@@ -753,7 +710,6 @@
AnkstesnisSąrankos vedlysUŽBAIGTI
- Pasirinkite kalbąPirmas insulino dozės žingsnisAntras insulino dozės žingsnisTrečias insulino dozės žingsnis
@@ -783,20 +739,18 @@
Bendrieji nustatymaiĮjungti NSClientSveiki atvykę į sąrankos vedlį. Jis lydės jus per visą nustatymų procesą\n
- Pompos nustatymaiStatuso nuskaitymasPakeitimai turi būti daromi NSPraleisti sąrankos vedlįPaspauskite mygtuką žemiau, norėdami leisti AndroidAPS patarti/atlikti bazės pakeitimus
- Konfigūruoti DKS įskiepį
- Konfigūruoti Jautrumo nustatymo įskiepįJautrumo įskiepis yra naudojamas jautrumo aptikimui ir AAO skaičiavimams. Daugiau informacijos:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient palaiko ryšį su Nightscout. Jūs galite praleisti šią dalį dabar, bet negalėsite baigti mokymosi programos, kol nenustatysite ryšio su NS.Atminkite: DKS profiliams reikia IVT bent 5 val. IVT = 5 - 6 val DKS profilyje atitinka IVT = 3 val sename (pompos terapijos) insulino profilyje.
- Sukonfigūruoti KG šaltinįPrašome pasirinkti profilį. Jei pacientas yra vaikas, turite naudoti NS profilį. Jei niekas neseka jūsų Nightscout platformoje, tada geriau pasirinkti Vietinį profilį. Atminkite, kad čia Jūs tik pasirenkate profilio šaltinį. Norėdami jį aktyvuoti, turite atlikti Profilio keitimąPasirinkite vieną iš esamų algoritmų. Jie yra išdėstyti nuo seniausio iki naujausio. Naujesni algoritmai yra galingesni ir agresyvesni. Taigi jei esate naujas vartotojas, geriau pradėti nuo AMA, o ne naujesnio. Nepamirškite perskaityti dokumentaciją ir sukonfigūruoti jį prieš naudojant.
+ Laukiama RileyLink ryšio...\n
+ Pastaba: sąranką galite tęsti, kai tik inicijuojama pompa.\nPradėti jūsų pirmąjį tiksląLeidimasPrašyti leidimo
@@ -804,7 +758,6 @@
Programai reikia vietos nustatymo leidimo, kad būtų galima naudoti Bluetooth ir WiFiAplikacijai reikia leidimo prieigai prie saugyklos, kad galėtų išsaugoti žurnalo įrašus ir eksportavimo nustatymusUžklausa
- Konfigūruoti insulino įskiepįIšeitiAtidaryti meniuUždaryti meniu
@@ -844,7 +797,6 @@
Įrašų nustatymaiAtkurti numatytuosiusNSClient sutrikimas. Reikėtų paleisti iš naujo NS ir NSClient.
- ASVersiją %1$s jau galima naudotiLaiko poslinkisPageidaujamas DKS režimas
@@ -986,6 +938,7 @@
vidinės saugyklos apribojimasAtlaisvinkite ne mažiau kaip %1$d MB iš vidinės atminties! Ciklas išjungtas!Neteisingas formatas
+ Laikinos bazės trukmė turi būti kartotinė %1$d minučių ir didesnė nei 0.Neteisingas kodas. Komanda atšaukta.NesukonfigūruotaProfilio perjungimas sukurtas
@@ -1081,12 +1034,9 @@
Parinkta:VienetaiAr norite pakeisti profilį ir atsisakyti pakeitimų, atliktų dabartiniame profilyje?
- Įjungta
- IšjungtaIšvalyti užbaigtusIšvalyti pradėtusAr norite iš naujo nustatyti tikslų pradžią? Jūs galite prarasti jau pasiektus.
- Pompa nepasirinktaPasirinkite vienetus, kurių vertes norite parodytiĮkelti vietinio profilio pakeitimus į NSIVT
@@ -1107,7 +1057,6 @@
PateiktiDažniausiai naudojamas profilis:Pastaba: anonimiškai bus įkelti tik tie duomenys, kurie matomi šiame ekrane. Šiam diegimui AndroidAPS priskiria ID. Galite pateikti duomenis dar kartą, jei pasikeitė jūsų pagrindinis profilis. Vis dėlto leiskite jam veikti bent savaitę, kad jo rezultatas būtų matomas laiko diapazone. Ačiū už palaikymą.
- ApklausaNeteisingas amžiaus įrašasNeteisingas svorio įrašasNetinkamas % įrašas
@@ -1127,10 +1076,8 @@
Išvalyti eilę? Visi eilės duomenys bus prarasti!Ištęsto boluso funkcija sustabdys uždaro ciklo režimą ištęsto boluso veikimo metu. Ar tikrai norite patvirtinti savo pasirinkimą?Uždara ciklas išjungtas dėl ištęsto boluso veikimo
- IB (Ištęstas bolusas)\"PhoneChecker\"Grafiko meniu
- ASSMB užklausos laikasSMB įvykdymo laikasLaikinos bazės užklausos laikas
@@ -1146,17 +1093,18 @@
Kodas patikrinimui:OTP + PINPatvirtinimo kodą sudaro 6 skaitmenys, kuriuos rodo Authenticator programa (dar vadinama OTP), po 3 ar daugiau privalomo PIN skaitmenų.
- OTP tikrinimas:Atstatyti tapatybės nustatymąAtstatyti autentifikatoriaus kodąAr tikrai norite iš naujo nustatyti autentifikatoriaus raktą? Dėl to visi šiuo metu konfigūruojami autentifikatoriai negalios, ir jums reikės juos nustatyti dar kartą.Sukurtas naujas autentifikavimo raktas! Autentifikatoriams pateikti naudokite atnaujintą QR kodą.
+ Eksportuojamas OTP kodas
+ Ar tikrai norite nukopijuoti OTP slaptažodį į mainų sritį?\n\nTai gali būti reikalinga tik tuo atveju, jei jūsų programai kyla problemų identifikuojant nuskaitant QR kodą. Arba norite jį įvesti rankiniu būdu ar sukonfigūruoti įrangos OTP prieigos raktą naudodami specialią programą.
+ OTP kodas (Base32 formatas) eksportuotas ir nukopijuotas į mainų sritį. Įklijuokite jį į autentifikatorių arba OTP programą!1. Įdiegti Authenticator2. Nuskanuoti kodą AndroidAPS OTP kodų nustatymyu3. Patikrinti vienkartinį slaptažodįAtstatyti tapatybės nustatymąKiekviename telefone, palaikančiame RFC 6238 TOTP prieigos raktus, įdiekite autentifikavimo programą. Populiariausios nemokamos programos yra:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- NESIDALINKITE šiuo kodu internete!\nNaudokite tik nustatydami Authenticator programą sekėjų telefonuose.Jei iš naujo nustatysite autentifikavimo priemonę, visi esami autentifikatoriai taps negaliojantys. Tada turėsite juos vėl nustatyti!Sujungimo metuIšjungimo metu
@@ -1213,4 +1161,6 @@
Įkelti tik akumuliatoriaus įkrovimo metuDarbinė Būklė: %sĮkelti duomenis
+ Į jūsų Open Humans paskyrą bus įkelti šie duomenys: glikemijos reikšmės, bolusai, angliavandeniai, priežiūros portalo įvykiai (išskyrus pastabas), ištęstiniai bolusai, profilio pakeitimai, visos paros dozės, laikinos valandinės bazės, laikini tikslai, nustatymai, programos versija, įrenginio modelis ir ekrano matmenys. Konfidenciali ar privati informacija, pvz., Jūsų Nightscout URL arba API slaptažodis, nebus įkelta.
+ RileyLink statusas:
diff --git a/app/src/main/res/values-nl-rNL/exam.xml b/app/src/main/res/values-nl-rNL/exam.xml
index a63d6cda98..659cfc4461 100644
--- a/app/src/main/res/values-nl-rNL/exam.xml
+++ b/app/src/main/res/values-nl-rNL/exam.xml
@@ -17,7 +17,6 @@
NS-Profiel kan worden gebruikt, maar niet worden aangepast.https://androidaps.readthedocs.io/en/latest/CROWDIN/nl/Configuration/Config-Builder.html#profielOnderwerp: Ontkoppelen van de Pomp
- Wat moet er gebeuren bij het loskoppelen van de pomp?Klik op \'pomp ontkoppelen\' zodat AAPS weet dat er geen insuline wordt afgeleverd.Klik op \'lus onderbreken\' zodat AAPS stopt met loopen terwijl de pomp is losgekoppeld.Verander niets in AAPS, koppel gewoon de pomp af.
@@ -134,8 +133,8 @@
Hogere KH ratios leiden tot minder insuline afgifte voor een bepaalde hoeveelheid koolhydraten.Lagere KH ratios leiden tot minder insuline afgifte voor een bepaalde hoeveelheid koolhydraten.Als je 0 COB hebt zal het veranderen van KH ratio leiden tot een andere hoeveelheid insuline om jouw BG te corrigeren.
- KH ratio zal anders zijn als je een brood-eenheid telt als 10g of 12g.
- KH ratio betekent: Hoeveel brood-eenheden gebruik je voor 1U insuline.
+ KH ratio zal anders zijn als je een brood-eenheid telt als 10g of 12g koolhydraten.
+ KH ratio betekent: Hoeveel koolhydraten gebruik je voor 1E insuline.https://androidaps.readthedocs.io/en/latest/CROWDIN/nl/Getting-Started/FAQ.html#Koolhydraat-ratio-KH-g-EOnderwerp: Profiel wissels Bij het opgeven van 90% in je profiel wissel…
diff --git a/app/src/main/res/values-nl-rNL/objectives.xml b/app/src/main/res/values-nl-rNL/objectives.xml
index 60da77c374..6775abbffb 100644
--- a/app/src/main/res/values-nl-rNL/objectives.xml
+++ b/app/src/main/res/values-nl-rNL/objectives.xml
@@ -1,6 +1,5 @@
- TerugStartVerifieer%1$d. Doel
diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml
index de2ca26119..e7c9775423 100644
--- a/app/src/main/res/values-nl-rNL/strings.xml
+++ b/app/src/main/res/values-nl-rNL/strings.xml
@@ -21,17 +21,16 @@
Toon de instellingen voor Voeding in NightscoutInsuline instelling voor Humalog en NovoRapid / NovoLogInsuline instelling voor Fiasp
+ Insuline instelling voor LyumjevHiermee kan je de piek van de insulineactiviteit definiëren en deze mag alleen worden gebruikt door gevorderde gebruikersActiveer of deactiveer de implementatie die de Loop triggert.Synchroniseert je data met Nightscout
- Het algoritme uit 2016Het algoritme uit 2017Meest recente algoritme voor gevorderde gebruikersToont de huidige Loop-status en knoppen voor meest gebruikte actiesToont een permanente melding met een beknopt overzicht van hetgeen de Loop momenteel doetMaak een profiel dat je offline kunt gebruiken.Gebruik profiel(en) die je hebt aangemaakt in Nightscout
- Maak een profiel met slechts één tijdsblok.Pomp integratie voor Accu-Chek Combo pompen, vereist dat ruffy geïnstalleerd isPomp integratie voor mensen met pen-therapie (meerdere dagelijkse injecties)Pomp integratie voor pompen, waar nog geen driver voor is (Open Loop)
@@ -83,7 +82,6 @@
ConfiguratorOverzichtNS Profiel
- Eenvoudig profielBehandelingenVirtuele PompCareportal
@@ -105,13 +103,11 @@
APSBerekening met toepassing van limietenTijdelijk basaal gezet door pomp
- Laatste uitvoeringGEEN APS GESELECTEERD OF TOEGEKEND RESULTAATVeiligheidPlugin is gedeactiveerdIn strijd met beperkingenBolus toedien storing
- Basaal waarde [%]Accepteer nieuw tijdelijk basaal:BolusBolus wizard
@@ -140,22 +136,17 @@
AndereMeterSensor
- Koolhydraten
- InsulineKH tijdsduur
- SplitsenTijdsduur
- Procent
- AbsoluutNotitiesTijdstip gebeurtenisProfiel
- Ingegeven doorGlucose typeNog geen profiel geladen van NSTijdelijk basaalVertraagde bolusNightscout versie:
+ Er ontbreekt %1$d gInstellingen geëxporteerdExporteer instellingen naarImporteer instellingen van
@@ -171,6 +162,11 @@
Je wordt gevraagd om een masterwachtwoord. Daarmee worden geïmporteerde instellingen ontsleuteld.Exporteren geannuleerd! Instellingen zijn NIET geëxporteerd!Importeren geannuleerd! Instellingen zijn NIET geïmporteerd!
+ Kan voorkeuren niet importeren!
+ Ga terug naar het hoofdscherm en probeer opnieuw.
+ Oud hoofdwachtwoord
+ Dit bestand is geëxporteerd en gecodeerd met een ander hoofdwachtwoord. Geef het oude hoofdwachtwoord op om het bestand te kunnen decoderen.
+ Als gevolg van het importeren, zal het huidige hoofdwachtwoord worden vervangen door het oude hoofdwachtwoord!Kies bestand om te importerenControleer instellingen voor het importeren:Instellingen kunnen niet worden geïmporteerd!
@@ -208,7 +204,6 @@
Decoderingsfout, het opgegeven wachtwoord is ongeldig of het instellingenbestand is gewijzigd / mee geknoeid. Wellicht was het geïmporteerde bestand geëxporteerd met een ander masterwachtwoord.Ontbrekende versleutelingsconfiguratie, instellingen indeling is ongeldig!Niet-ondersteund of niet opgegeven versleutelingsalgoritme!
- vandaag geëxporteerd%1$s geleden geëxporteerdgeëxporteerd op %1$sminder dan een uur geleden geëxporteerd
@@ -232,14 +227,14 @@
Minimum aantal minuten dat moet verstrijken tussen de ene bolus op afstand en de volgendeHoeveel minuten er ten minste moeten verstrijken tussen de ene bolus en de volgendeVoor de veiligheid moet je ten minste 2 telefoonnummers toevoegen om deze instelling te kunnen bijwerken.
+ Bolus van %1$.2f E succesvol toegediend
+ %1$.2f E toedienen
+ Bolus van %1$.2f E succesvol toegediend
+ Maaltijdbolus van %1$.2f E succesvol toegediendStreefdoel %1$s gedurende %2$d minutenStreefdoel %1$s gedurende %2$d minuten succesvol ingesteldTijdelijk streefdoel is geannuleerdSta SMS commando\'s toe
- DanaR profiel instellingen
- DIA [uur]
- Duur van insuline activiteit
- UploadenBolus gestoptStoppen van bolusLoop was uitgeschakeld
@@ -250,12 +245,14 @@
Waarde %1$s valt buiten de toegestane harde limietenOm verbinding te maken met pomp antwoord met code %1$sVerbinding maken met pomp is mislukt
- Om verbinding te verbreken met pomp gedurende %1d minuten antwoord met code %2$s
+ Om de pomp te ontkoppelen voor %1$d minuten antwoord met code %2$sPomp verbinding verbrokenPomp opnieuw verbondenCommando\'s op afstand zijn niet toegestaanBolus op afstand niet beschikbaar. Probeer het later opnieuw.
+ Om een basaal van %1$.2f E/uur voor %2$d min te starten, antwoord met code %3$sOm naar profiel %1$s %2$d%% te wisselen antwoord met code %3$s
+ Om een vertraagde bolus van %1$.2f E voor %2$d min te starten, antwoord met code %3$sAntwoord met code %3$s om %1$dg in te voeren op %2$sOm een basaal van %1$d%% voor %2$d min te starten antwoord met code %3$sOm de loop te onderbreken voor %1$d minuten antwoord met de code %2$s
@@ -264,6 +261,7 @@
Om loop uit te schakelen antwoord met code %1$sTijdelijk basaal %1$.2fE/u voor %2$d minuten succesvol gestartVertraagde bolus %1$.2fE voor %2$d minuten succesvol gestart
+ Koolhydraten %1$d g succesvol ingevoerdInvoeren van %1$dg koolhydraten is misluktTijdelijk basaal van %1$d%% voor %2$d minuten succesvol gestartStart tijdelijk basaal mislukt
@@ -291,7 +289,6 @@
Pomp niet geïnitialiseerd!Ontlucht/vulVerzeker u dat de vulhoeveelheid overeenkomt met de infusieset!
- AndereVul/Prime standaard insuline hoeveelhedenKnop 1Knop 2
@@ -299,7 +296,6 @@
Eenheden:EenhedenDIA
- Streefdoel:Bereik voor visualisatieHoge en lage grens voor grafieken op het Overzicht en op WearLAAG grens
@@ -333,7 +329,6 @@
ACTCONFLOOP
- EPOAPSLPHOME
@@ -358,7 +353,6 @@
Opgelet!\n Onderstaande waardes moeten normaal gezien niet worden aangepast. KLIK HIER en LEES de tekst zodat je alles volledig BEGRIJPT voordat je een waarde wijzigt.Foutief SMS telefoon nummerKalibratie
- Calibratie %1$.1f naar xDrip verzenden?xDrip+ niet geïnstalleerdKalibratie naar xDrip verzondenKalibratie verzonden. Het ontvangen van kalibraties moet actief zijn in xDrip.
@@ -391,12 +385,13 @@
Splits IOB in bolus en basaal op de watchfaceNiet geslaagd - controleer de telefoonn.v.t.
- Leeftijd Patient
+ Type patiëntKindTienerVolwasseneinsuline resistente volwassene
- Kies leeftijd van de patient voor veiligheids limieten
+ Zwangerschap
+ Selecteer het type patiënt om de veiligheidslimieten in te stellenNaam patiëntGeef de naam of roepnaam van de patiënt op om onderscheid te maken tussen meerdere setupsGebruiker
@@ -404,7 +399,6 @@
Voor een goede werking van %1$s moeten de accubesparing-opties zijn uitgeschakeld in de telefooninstellingenLoop pauzerenGepauzeerd (%1$d m)
- Superbolus (%1$d m)Onderbreek LoopOnderbreek loop voor 1uOnderbreek loop voor 2u
@@ -427,7 +421,6 @@
Log app start naar NSSluiten van applicatie om instellingen bij te werken.Welk soort insuline gebruik je?
- Snel werkende insulineNovorapid, Novolog, HumalogFiaspINS
@@ -440,6 +433,8 @@
Drempel alarm insuline leeftijd [h]Drempel waarschuwing sensor leeftijd [h]Drempel alarm sensor leeftijd [h]
+ Drempel waarschuwing batterij niveau [%]
+ Drempel alarm batterij niveau [%]Drempel waarschuwing batterij leeftijd [h]Drempel alarm batterij niveau [h]Drempel waarschuwing reservoir niveau [E]
@@ -465,11 +460,13 @@
Geen upload naar NSAAPS is verbonden met NS maar er worden geen wijzigingen uitgevoerd op NSAnnuleer vertraagde bolus
- Ouderdom sensor
- Ouderdom infusie set
- Ouderdom insulineProfiel wissel uitvoeren
- Ouderdom batterij
+ Sensor
+ Canule
+ Insuline
+ Pomp batterij
+ leeftijd:
+ level:Alarm optiesMaak meldingen van NS alarmenMaak meldingen van NS aankondigingen
@@ -483,20 +480,14 @@
Gevoeligheid detectieWelke gevoeligheid algoritme moet worden gebruikt?SENS
- Gevoeligheid Oref0Gevoeligheid Oref1Gevoeligheid AAPSOpname instellingenMax absorptietijd maaltijd [uur]Verwachte tijd in uren totdat alle koolhydraten opgenomen zijn
- SAGE
- IAGE
- CAGE
- PBAGEOAPSUPLDBAS
- EXTLaat scherm aanVoorkomen dat Android het scherm uitschakelt. Dit kost veel accuvoeding als je de telefoon niet aan de oplader hebt.Bij het gebruik van Autosense, vergeet niet alle opgenomen koolhydraten in te geven. Anders zullen BG wijzigingen door maaltijden foutief geïnterpreteerd worden !!
@@ -507,10 +498,6 @@
Waarden niet opgeslagen!Schakel broadcasts in naar andere apps (zoals xDrip). Schakel niet in als je NSClient of meer dan één installatie van AAPS hebt geïnstalleerd!Activeer locaal delen.
- ACTIVITEIT & FEEDBACK
- KOOLHYDRATEN & BOLUS
- CGM & OPENAPS
- POMPTijdsduur [min]OpenAPS SMBActiveer UAM
@@ -522,6 +509,7 @@
Free-Peak OrefSnel-werkende OrefUltra-Rapid Oref
+ LyumjevDIA van %1$f te kort - %2$f wordt inplaats gebruikt!Activeer profielOngeldig
@@ -549,6 +537,7 @@
Pomp niet beschikbaarGeen BG metingenGebruik systeem notificaties voor waarschuwingen en notificaties
+ Volume van notificaties en meldingen geleidelijk verhogenLokaal gegenereerde waarschuwingenAlarm als er geen BG gegevens ontvangen zijnWaarschuwing bij niet bereikbare pomp
@@ -562,7 +551,6 @@
Toon gedetailleerde deltaToon delta met een extra decimaal puntTijdsinterval in minuten tussen afgeven van SMBs
- SMB max minutenMax minuten basaal om SMB tot te limiterenUAM SMB max minutenMax minuten basaal om SMB tot te limiteren voor UAM
@@ -616,7 +604,6 @@
LeegNormaalPomp klok moet bijgesteld worden
- WaarschuwingTBR GEANNULEERD waarschuwing is bevestigdEr kon geen verbinding met de pomp gemaakt worden. De Bolus is niet toegediend.Bolus toedienen mislukt. Waarschijnlijk is er geen bolus toegediend. Gelieve de pomp te controleren om een dubbele bolus te voorkomen. Indien nodig geef je een nieuwe bolus. Als bescherming tegen programmeerfouten worden bolussen niet automatisch opnieuw uitgevoerd.
@@ -625,7 +612,6 @@
Niet genoeg insuline aanwezig in reservoir voor de bolusVertraagde bolus toedieningsfoutInsight
- voorbijStel neutraal tijdelijk basaal inAls deze optie is ingeschakeld, wordt een tijdelijk basaal geannuleerd vlak voor het einde van elk uur. Handige optie voor sommige pompen die elk uur piepen/vibreren zolang een tijdelijk basaal actief is.Activeer SMB altijd
@@ -637,6 +623,7 @@
Gebruik SMB met tijdelijke streefdoelenGebruik SMB bij een actief tijdelijk streefdoel (eet binnenkort, activiteit)Gebruik SMB met een hoog tijdelijk streefdoel
+ Schakel SMB in wanneer er een hoog tijdelijk doel actief is (uitvoeren boven 100 mg/dl of 5,5 mmol/l)InsulineKoolhydratenKnoppen
@@ -670,6 +657,7 @@
Geen bolus toedienen enkel in behandelingen zettenCategorieSubcategorie
+ Bolus wordt alleen geregistreerd (niet toegediend door pomp)Automatische onbekende BGs aanvullen van NSSMB op de pomp ingesteldActiviteit
@@ -682,7 +670,6 @@
Start Hypo TTDev versie actief. Closed loop gedeactiveerdEngineering modus is geactiveerd
- Engineering modus is niet geactiveerd en dit is niet de release brancheBasaal profiel wordt gelezenDe pomp historiek is gewijzigd nadat de bolus berekend was. De bolus is Niet toegediend. Programmeer een nieuwe bolus indien nodig.Bolus succesvol toegediend, maar toevoegen van de behandeling is gefaald. Dit kan voorvallen wanneer twee kleine bolussen van dezelfde grote gekozen waren gedurende de laatste 2 minuten. Controleer aub de pomphistoriek en de behandelingen, voeg de ontbrekende toe via het Careportal. Let op dat je geen 2 dezelfde hoeveelheden hebt op hetzelfde ogenblik.
@@ -692,7 +679,6 @@
Basaal patroon op de pomp is gewijzigd, maar kunnen niet worden uitgelezenControle van historiek op wijzigingenVerschillende bolussen met dezelfde hoeveelheid op hetzelfde tijdstip zijn geïmporteerd. Er is er maar 1 toegevoegd aan de behandelingen lijst. Controleer op de pomp en voeg eventueel toe via het Careportal menu. Er mogen geen 2 bolussen op hetzelfde tijdstip aanwezig zijn.
- \n\nhttp://www.androidaps.org \n\nfacebook:\nhttp://facebook.androidaps.orgDe laatste bolus is ouder dan 24 uren of bevind zich in de toekomst. Controleer de datum en tijd in de pomp aub.Datum/tijd van de geleverde bolus op de pomp is niet correct, IOB is waarschijnlijk foutief. Controleer aub de datum/tijd op de pomp.Profiel wissel ontbreekt. Doe aub een profiel wissel of duw op Activeer Profiel in het Lokale profiel.
@@ -723,7 +709,6 @@
SMB niet toegestaan in Open Loop modusVoedingReset
- Verbinding verbroken (%1$d m)Max totaal IOB dat OpenAPS niet kan overschrijden [E]Deze waarde heet MAX IOB in OpenAPS context\nOpenAPS zal geen extra insuline toedienen als de actuele IOB onderstaande waarde overschreden heeftPomp gestopt
@@ -737,7 +722,6 @@
VorigeSetup WizardFINISH
- Selecteer uw taalEerste insuline incrementTweede insuline incrementDerde insuline increment
@@ -767,27 +751,25 @@
Algemene instellingenNSClient inschakelenWelkom bij de wizard setup. Het zal je begeleiden door het setup-process\n
- Pomp setupLees statusWijzigingen moeten worden gedaan in NightscoutDe installatiewizard overslaanDruk op de knop hieronder om AndroidAPS basaalwijzigingen te laten voorstellen/uitvoeren
- APS plugin configureren
- Gevoeligheid plugin configurerenGevoeligheid plugin wordt gebruikt voor de detectie van de gevoeligheid en COB berekening. Voor meer info bezoek:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient zorgt voor verbinding met Nightscout. Je kunt dit deel nu overslaan, maar pas de Doelen afronden als je het hebt ingesteld.Onthoud: nieuwe insuline profielen vereisen een minimale DIA van 5 uur. DIA 5 – 6h op nieuw profiel is gelijk aan DIA 3h op oude insuline profielen.
- BG bron configurerenKies een bron van het profiel. Als de patiënt een kind is, moet u het NS-profiel gebruiken. Als er niemand is die je volgt op Nightscout, zul je waarschijnlijk een lokaal profiel prefereren. Onthoud dat u alleen de profielbron selecteert. Om het te gebruiken, moet u het activeren door \"Profiel wisselen\" uit te voerenSelecteer een van beschikbare algoritmen. Ze zijn gesorteerd van oudste naar nieuwste. Nieuwer algoritme is meestal krachtiger en agressiever. Dus als je een nieuwe looper bent, kun je waarschijnlijk beginnen met AMA en niet met de nieuwste. Vergeet niet de OpenAPS-documentatie te lezen en deze vóór gebruik te configureren.
+ Wachten op verbinding met RileyLink…\n
+ Opmerking: je kunt de setup voortzetten zodra de pomp geïnitialiseerd is.\nStart je eerste DoelToestemmingVragen om toestemmingToepassing vereist systeemvenstermachtiging voor meldingenApp heeft locatie toestemming nodig voor Bluetooth scan en WiFi identificatie
+ Applicatie heeft toestemming nodig om log bestanden op te slaan en instellingen te exporterenVerzoek
- Gevoeligheid plugin configurerenAfsluitenOpen navigatieSluit navigatie
@@ -827,7 +809,6 @@
Log instellingenTerug naar standaardinstellingenNSClient werkt niet goed. Overweg een herstart van NS en NSClient.
- ASVersie %1$s is beschikbaarTijdverschuivingVoorkeur APS-modus
@@ -841,6 +822,7 @@
Worden dezelfde codes weergegeven op dit apparaat als op je pomp?Insight koppelenAccu-Chek Insight
+ %1$.2f E / %2$.2f E toegediend%1$s: %2$sSlang vervangenPomp tijd bijgewerkt
@@ -898,6 +880,7 @@
Vertraagd: %1$.2f / %2$.2f U gedurende %3$d minMultiwave: %1$.2f / %2$.2f E gedurende %3$d minTDD: %1$.2f
+ Reservoir: %1$.2f EBatt.: %1$d%%Max. herstel duur [s]Min. herstel duur [s]
@@ -967,6 +950,7 @@
interne opslag bijna volMaak minstens %1$d MB vrij in interne opslag! Loop is uitgeschakeld!Verkeerde invoer
+ Tijdelijk basaal duur moet een veelvoud van %1$d minuten en groter dan 0 zijn.Verkeerde code. Opdracht geannuleerd.Niet ingesteldProfiel wissel aangemaakt
@@ -1040,6 +1024,8 @@
Stuur SMS: %1$sSMS verzenden naar alle nummersStuur SMS met tekst
+ COB vs IOB
+ Bolusbeperking toegepast: %1$.2f E naar %2$.2f E!!! Trage koolhydraat absorptie gedetecteerd: %2$d%% van de tijd. Controleer je berekening nogmaals. COB kan zijn overschat waardoor er misschien meer insuline wordt afgegeven!!! zijn]]>Voer dit deel van het bolus wizard resultaat uit [%]Bolus wizard voert de berekening uit maar alleen dit deel van berekende insuline wordt geleverd. Handig in combinatie met het SMB algoritme.
@@ -1060,12 +1046,9 @@
Geselecteerd:EenhedenWilt u van profiel wisselen en de wijzigingen in het huidige profiel ongedaan maken?
- Aan
- UitVoltooiing wissenWissen gestartWil je dit leerdoel opnieuw starten? Je kunt je voortgang verliezen.
- Geen pomp geselecteerdSelecteer eenheden waarin je waarden wilt weergevenUpload lokale profielwijzigingen naar NSDIA
@@ -1075,6 +1058,7 @@
DuplicerenHuidige wijzigingen eerst opslaan of ongedaan makenHuidige profiel verwijderen?
+ Nieuw lokaal profiel aanmaken van dit profiel?Profielnaam bevat punten.\nDit wordt niet ondersteund door NS.\nProfiel is niet geüpload naar NS.Laagste waarde in bereik (alleen weergave)Hoogste waarde in bereik (alleen weergave)
@@ -1085,9 +1069,9 @@
VerzendenMeest voorkomende profiel:Opmerking: Alleen gegevens die zichtbaar zijn op dit scherm worden anoniem geüpload. ID is toegewezen aan deze installatie van AndroidAPS. U kunt gegevens opnieuw indienen als uw hoofdprofiel wordt gewijzigd, maar laat het ten minste een week draaien om resultaat zichtbaar te maken in de tijd in het bereik. Uw hulp wordt gewaardeerd.
- EnquêteOngeldige leeftijd invoerOngeldige gewicht invoer
+ Ongeldig % invoer%1$s: Laag: %2$02d%% In: %3$02d%% Hoog: %4$02d%%]]>GemiddeldeTIR
@@ -1104,31 +1088,35 @@
Wachtrij leegmaken? Alle gegevens in de wachtrij zullen verloren gaan!Gebruik van Vertraagde bolus functie zal de closed loop modus stoppen voor de duur van de vertraagde bolus. Wil je dit toch?Closed loop modus uitgeschakeld vanwege afgeven Vertraagde bolus
- VertrB\"PhoneChecker\"Grafiek menu
- ASSMB aanvraagtijdSMB uitvoeringstijdTijdelijk basaal aanvraag tijdTijdelijke basaal uitvoering tijdInsight pomp waarschuwingen
+ van de Authenticator-app voor: %1$s gevolgd door PINAuthentificatie inschakelenAuthentificeer SMS commando\'s met behulp van One Time Passwords (OTPs, eenmalige wachtwoorden) gegenereerd door Google Authenticator of soortgelijke 2FA apps.
+ Extra verplichte PIN aan einde van tokenExtra cijfers die je moet onthouden, en aan het eind van elk gegenereerd eenmalig wachtwoord moet toevoegen.Authentificatie instellingen
- Te controleren OTP:
+ Te controleren code:
+ OTP + PIN
+ De verificatiecode bestaat uit 6 cijfers die worden afgebeeld door de Authenticator-app (bekend als OTP), gevolgd door 3 of meer cijfers van de verplichte PIN-code.Reset AuthentificatieReset Authentificatie-sleutelWeet je zeker dat je de Autentificatie-sleutel wilt resetten? Met deze actie maak je alle Authentificatie instellingen van verbonden telefoons ongeldig, en je zult ze opnieuw moeten instellen.Er is een nieuwe Authentificatie-sleutel gegenereerd! Gebruik de nieuwe QR-Code voor het instellen van geautoriseerde telefoons.
+ OTP-secret wordt geëxporteerd
+ Weet je zeker dat je het OTP-secret naar het klembord wilt kopiëren?\n\nJe hebt dit alleen nodig als je Authenticator-app problemen heeft met het scannen van QR-codes, als je het handmatig wilt invullen of als je een hardware OTP-token met een speciale app wilt configureren.
+ OTP-secret (in Base32-formaat) is geëxporteerd en gekopieerd naar het klembord. Plak het in de Authenticator-app of de app van de hardware OTP-token!1. Installeer Authenticator app2. Scan code om AndroidAPS OTP codes in te stellen3. Test eenmalig wachtwoord (One Time Password)Reset AuthentificatieInstalleer de Authenticator-app op elke volger telefoon die RFC 6238 TOTP tokens ondersteunt. Populaire gratis apps zijn:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- DEEL deze code met NIEMAND ANDERS!\nGebruik hem alleen om de Authenticator-app in te stellen op telefoons van volgers.Door de Athentificator te resetten, maak je alle Authentificatie-instellingen van reeds verbonden telefoons ongeldig! Je zult ze opnieuw moeten instellen!Bij verbindenBij verbinding verbreken
@@ -1142,8 +1130,51 @@
Kopieer instellingen van NSNS instellingen kopiëren (indien aanwezig)?Klassiek weergave thema
+ Lage resolutie skinKnoppen worden altijd weergegeven aan de onderkant van het schermGroot schermSkin
+ Vergelijk profielenProfiel hulp
+ Basis profiel
+ Huidig profiel
+ Beschikbaar profiel
+ Profieltype
+ Duur: %1$.0f TDD: %2$.0f E
+ Leeftijd: %1$.0f TDD: %2$.0f E %3$d%%
+ Leeftijd: %1$.0f gewicht: %2$.0f kg
+ % van basaal
+ DPV Basis profiel
+ Open Humans
+ Setup van Open Humans voltooien…
+ Dit kan even duren. Zet de telefoon of plugin niet uit.
+ Setup voltooid
+ Je telefoon zal binnenkort data gaan uploaden naar Open Humans.
+ Je telefoon is data aan het uploaden naar Open Humans.
+ Setup mislukt
+ Er is een fout opgetreden. Probeer opnieuw in te loggen. Sorry & bedankt!
+ Dit is een open source tool die je data uploadt naar Open Humans. Wij behouden geen rechten om je gegevens te delen met derden zonder jouw uitdrukkelijke toestemming. De gegevens die het project en de app ontvangen, worden geïdentificeerd aan de hand van een willekeurig gebruikers-ID en worden uitsluitend veilig verzonden naar een Open Humans account met jouw toestemming voor dat proces. Je kunt op elk gewenst moment stoppen met uploaden en je data verwijderen via www.openhumans.org.
+ Ik begrijp het en ga akkoord.
+ Inloggen
+ Uitloggen
+ Weet je zeker dat je uit wilt loggen en wilt stoppen met het doneren van gegevens aan de wetenschap?
+ Projectlid-ID: %s
+ Grootte wachtrij: %d
+ Gebruiksvoorwaarden
+ Niet ingelogd
+ Je moet eerst instemmen met de voorwaarden.
+ Succesvol ingelogd
+ De setup wordt nu op de achtergrond voltooid. Bedankt voor het uploaden van je gegevens.\n\nHoud deze plugin en je telefoon even ingeschakeld om de setup te voltooien.
+ Login voltooien…
+ Doneer je gegevens aan de wetenschap
+ OH
+ Je bent uitgelogd van Open Humans
+ Klik hier om opnieuw in te loggen als dit niet opzettelijk was.
+ Alleen uploaden indien verbonden met WiFi
+ Alleen uploaden tijdens opladen
+ Werkstatus: %s
+ Geüploade gegevens
+ De volgende gegevens worden geüpload naar je Open Humans account: glucosewaarden, bolussen, koolhydraten, careportal-events (met uitzondering van notities), verlengde bolussen, profielwissels, totale dagelijkse doses, tijdelijke basaalstanden, tijdelijke doelen, voorkeuren, app-versie, apparaatmodel en schermafmetingen. Geheime of persoonlijke gegevens zoals je Nightscout-URL of API-secret worden niet geüpload.
+ RileyLink Status:
+ Filter
diff --git a/app/src/main/res/values-no-rNO/exam.xml b/app/src/main/res/values-no-rNO/exam.xml
index 3ea04e700d..daa633824a 100644
--- a/app/src/main/res/values-no-rNO/exam.xml
+++ b/app/src/main/res/values-no-rNO/exam.xml
@@ -1,2 +1,167 @@
-
+
+ Hva er riktig om DIA?
+ Tema: Insulinvarighet (DIA)
+ Minimumsverdien er 3 timer.
+ Minimumsverdien er 5 timer.
+ https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html?#insulin
+ Betydningen er lik DIA verdien angitt i pumpen.
+ Du må bestemme din individuelle verdi (men ikke mindre enn 5 timer).
+ Tema: Hypo Temp Target
+ Hva er hovedgrunnen til å velge en hypo TT?
+ Forhindre at BS går lavt hvis du allerede har en null temp gående.
+ Forhindre at AAPS skal doserer for mye insulin etter en BS stigning forårsaket av hurtigvirkende karbohydrater gitt for å behandle et lavt BS.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/temptarget.html
+ Hvilken profiltype kan brukes og konfigureres offline?
+ Tema: Offline profil
+ NS profil kan brukes, men ikke konfigureres.
+ https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profile
+ Tema: koble fra pumpen
+ Trykk på \"Koble fra pumpen\" slik at AAPS vet at ingen insulin vil bli levert.
+ Trykk \"Pause loop\" så AAPS stopper å loope mens pumpen er frakoblet.
+ Endre ikke på noe i AAPS, koble bare fra pumpen.
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#other-settings
+ Tema: AndroidAPS innstillinger
+ Hva er beste praksis for å ta backup av dine innstillinger?
+ Eksportere dem lokalt fra Vedlikeholds menyen.
+ Lagre den eksporterte filen til en annen plass som epost, Dropbox, Google Drive…
+ Eksporter dem rett etter installeringen av AAPS.
+ Eksporter dem rett etter at du har gjort endringer i dine innstillinger.
+ Eksporter dem etter at du har fullført et nytt læringsmål.
+ Eksporter dem etter at du har avsluttet dine første innstillinger.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/ExportImportSettings.html
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#what-emergency-equipment-is-recommended-to-take-with-me
+ Emne: CGM-målingern med støy
+ Hva bør gjøres hvis CGM data har støy?
+ Ingenting, AAPS vil håndtere det.
+ Deaktiver loop for å unngå overdosering.
+ Bytt CGM sensor.
+ Slå av telefonen.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Smoothing-Blood-Glucose-Data-in-xDrip.html#smoothing-blood-glucose-data
+ Kontroller at CGM appen din jevner ut BS målinger.
+ Tema: Trening
+ Hvordan kan du hjelpe systemet med å håndtere trening?
+ Ved å bruke funksjonen for temp target/mål.
+ Gjør et profilbytte til under 100%.
+ Gjør et profilbytte til over 100%.
+ Stopp loop.
+ Angi et \"aktivitet\" temp mål før du begynner treningen.
+ Å angi et \"aktivitet\" temp mål etter at du har startet treningen fører til dårligere resultater enn om man startet før.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/temptarget.html#active temp-target
+ Tema: Stanset/pauset loop
+ Får jag insulin når loop er stanset/pauset?
+ Ja, basal insulin vil fortsatt bli levert.
+ Nei, levering av insulin er stanset.
+ Tema: Basal, ISF og IK testing
+ Når bør jeg validere basal, ISF og IK verdier?
+ Før jeg begynner å loope.
+ Om du ofte opplever lave BS verdier.
+ Om du ofte opplever høye BS verdier.
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#androidaps-settings
+ Tema: Forutsetninger før oppstart
+ Hva trenger jeg?
+ Validert profil informasjon (basal, IK, ISF, DIA).
+ En datamaskin for å lage en APK.
+ En telefon som støttes.
+ En bil.
+ Nightscout for å klare læringsmålene.
+ En Tidepool konto.
+ En Google konto.
+ En Github konto.
+ Erfaring med Android programmering.
+ En MiniMed 670G pumpe.
+ https://androidaps.readthedocs.io/en/latest/EN/Module/module.html
+ En smartklokke.
+ En CGM som støttes.
+ Tema: Oppdatering av AndroidAPS
+ Hva er sant?
+ Du må ha Git installert.
+ Oppdater så snart den nye versjonen er publisert og du har nok tid til å gjøre det.
+ Du bør bruke de samme signeringsnøklene.
+ Aldri oppdater hvis systemet fungerer bra.
+ Spør en venn om den nye APK filen.
+ https://androidaps.readthedocs.io/en/latest/EN/Installing-AndroidAPS/Update-to-new-version.html#update-to-a-new-version-or-branch
+ Tema: Feilsøking
+ Hvor skal jeg lete etter hjelp?
+ Bli medlem av AndroidAPS Facebook gruppen.
+ Les AndroidAPS dokumentasjonen.
+ Besøk AndroidAPS Gitter rommet.
+ Besøk AndroidAPS Google support
+ Snakk med din diabeteslege.
+ https://androidaps.readthedocs.io/en/latest/EN/Installing-AndroidAPS/Update-to-new-version.html#troubleshooting
+ https://www.facebook.com/groups/AndroidAPSUsers/
+ https://gitter.im/MilosKozak/AndroidAPS
+ Tema: Insulin plugin
+ Hvilke typer insulin kan brukes sammen med insulinprofilen \"Ultra-Rapid-Oref\"?
+ Fiasp®
+ Novorapid®
+ Humalog®
+ Actrapid®
+ https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#insulin
+ Tema: Sensitivitet plugin
+ Hvilken sensitivitetsalgoritme har et konfigurerbart tidsintervall?
+ https://androidaps.readthedocs.io/en/latest/EN/Configuration/Sensitivity-detection-and-COB.html
+ Hvilken sensitivitets plugin må anvendes for å bruke UAM funksjonen?
+ Tema: Feilaktig registrering av karbohydrater
+ Hva skal du gjøre hvis du har gjort en feilaktig registrering av karbohydrater?
+ I Behandlinger, slett den feilaktige registreringen og legg inn karbohydrater på nytt.
+ Legg inn falsk insulin ved å bruke prime/fyll funksjonen
+ Tema: Mat med fett og protein
+ Hva skal du gjøre om maten inneholder store mengder fett og/eller proteiner?
+ Regn om fett og proteiner til karbohydrater og bruk eKarbo funksjonen.
+ Regn om fett og proteiner til karbohydrater og legg det til bolus beregningen.
+ Bruk forlenget bolus til å dekke inntaket av fett og proteiner.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Extended-Carbs.html
+ Tema: Fjernovervåking
+ Hvordan kan du overvåke AAPS for ditt barn på avstand?
+ Ved å bruke Nightscout.
+ Dexcom Follow app hvis du bruker Dexcom appen (bare for BS).
+ Dexcom Follow hvis du bruker xDrip appen.
+ xDrip app kjører i følger-modus.
+ Loop app på iPhone.
+ Spike app på iPhone.
+ https://androidaps.readthedocs.io/en/latest/EN/Children/Children.html
+ Tema: Insulin sensitivitetsfaktor (ISF)
+ Høyere ISF verdier fører til mindre insulintilførsel når AAPS korrigerer for høyt BS.
+ Lavere ISF verdier fører til mindre insulintilførsel når AAPS korrigerer for høyt BS.
+ Endring av ISF verdier har ingen effekt på mengden insulin som tilføres når AAPS korrigerer høyt BS.
+ Du må angi ISF i Innstillinger.
+ Å endre ISF verdien i din profil er tilstrekkelig for å ta i bruk endringen.
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html
+ Tema: Insulin-karbo (IK) forholdet
+ Høyere IK forhold fører til at mindre insulin leveres for en gitt mengde karbohydrater.
+ Lavere IK forhold fører til at mindre insulin leveres for en gitt mengde karbohydrater.
+ Hvis du har 0 COB, vil endring av IK forholdet føre til endring av insulinmengden som trengs for å korrigere ditt BS nivå.
+ IK vil være forskjellig hvis du regner en skive brød som 10g eller 12g.
+ IK betyr: Hvor mange brødenheter som dekkes av 1E insulin.
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-u
+ Tema: Profilbytte
+ Når man angir 90% i profilbytte…
+ Basal vil være 10% høyere.
+ Basal vil være 10% lavere.
+ IK verdien vil være 10% høyere.
+ IK verdien vil være 10% lavere.
+ ISF verdien vil være 10% høyere.
+ ISF verdien vil være 10% lavere.
+ Du vil få omtrent 10% mindre insulin totalt.
+ Mål BS vil bli 10% høyere.
+ Mål BS vil bli 10% lavere.
+ Bare laveste BS grenseverdi vil bli 10% lavere.
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html?highlight=profile%20switch#profile-switch
+ Hvis du våkner 1t tidligere enn normalt, hvordan skal du varsle AAPS om endringen i døgnrytmen din?
+ Gjøre et profilbytte med en tidsforskyvning på 1t
+ Gjøre et profil bytte med en tidsforskyvning på -1t
+ https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html?highlight=profile%20switch#timeshift
+ Gjør et profilbytte med en tidsforskyvning på 60
+ Gjør et profilbytte med en tidsforskyvning på -60
+ https://androidaps.readthedocs.io/en/latest/EN/Module/module.html#good-individual-dosage-algorithm-for-your-diabetes-therapy
+ Tema: Hjelp med basaldoser
+ Hvor finner du hjelp for basaldoser m. m.
+ Ditt diabetesteam
+ Google
+ Facebook
+ Annen medisinering
+ AAPS senker basalen for å øke glukosemengden i blodet. Medisiner av typen SGLT2-hemmere (glifloziner) kan motvirke den forventede økningen i BS og som kan resultere i livsfarlig insulinmangel eller ketoacidose (DKA). \nVanlige merker i markedet: Invokana®, Forxiga®, Jardiance®, Steglatro®, Suglat®, Apleway®, Deberza®, Synjardy®, Vokanamet®, Xigduo®.\n\n
+Jeg lover herved å ALDRI ta slike medisiner samtidig som jeg bruker AAPS, eller jeg kommer til å ta en pause i looping så lenge jeg bruker slik medisin.
+
diff --git a/app/src/main/res/values-no-rNO/insight_alert_codes.xml b/app/src/main/res/values-no-rNO/insight_alert_codes.xml
index 3ea04e700d..39e7860fc9 100644
--- a/app/src/main/res/values-no-rNO/insight_alert_codes.xml
+++ b/app/src/main/res/values-no-rNO/insight_alert_codes.xml
@@ -1,2 +1,29 @@
-
+
+ Påminnelses R1
+ Påminnelse R2
+ Påminnelse R3
+ Påminnelse R4
+ Påminnelse R7
+ Advarsel W31
+ Advarsel W32
+ Advarsel W33
+ Advarsel W34
+ Advarsel W36
+ 8Advarsel W38
+ Advarsel W39
+ Vedlikehold M20
+ Vedlikehold M21
+ Vedlikehold M22
+ Vedlikehold M23
+ Vedlikehold M24
+ Vedlikehold M25
+ Vedlikehold M26
+ Vedlikehold M27
+ Vedlikehold M28
+ Vedlikehold M29
+ Vedlikehold M30
+ Feil E6
+ Feil E10
+ Feil E13
+
diff --git a/app/src/main/res/values-no-rNO/insight_alert_descriptions.xml b/app/src/main/res/values-no-rNO/insight_alert_descriptions.xml
index 3ea04e700d..683042025e 100644
--- a/app/src/main/res/values-no-rNO/insight_alert_descriptions.xml
+++ b/app/src/main/res/values-no-rNO/insight_alert_descriptions.xml
@@ -1,2 +1,24 @@
-
+
+ %1$d%%\nVarighet: %2$s t]]>
+ %1$s E]]>
+ Bytt batteri.
+ Angi tidspunkt/dato.
+ Kontakt Accu-Chek kundestøtte.
+ %1$d%% \nVarighet: %2$s t]]>
+ %1$s E Levert: %2$s E]]>
+ Sett inn ampulle.
+ Bytt ampulle.
+ Bytt batteri.
+ Kontroller pumpestatus.
+ Bytt infusjonssett.
+ Kontakt Accu-Chek kundestøtte.
+ Bytt ampulle.
+ Restart nedlasting av data.
+ Kontroller pumpestatus.
+ Angi batteritype.
+ Angi ampulle type.
+ Bytt batteri og ampulle.
+ Bytt ampulle.
+ Bytt språk.
+
diff --git a/app/src/main/res/values-no-rNO/insight_alert_titles.xml b/app/src/main/res/values-no-rNO/insight_alert_titles.xml
index 3ea04e700d..c9feb15ccb 100644
--- a/app/src/main/res/values-no-rNO/insight_alert_titles.xml
+++ b/app/src/main/res/values-no-rNO/insight_alert_titles.xml
@@ -1,2 +1,29 @@
-
+
+ Tilfør bolus
+ Manglende bolus
+ Alarmklokke
+ Bytt infusjonssett
+ Midlertidig basaldose fullført
+ Lavt ampulleinnhold
+ Batteri lavt
+ Ugyldig klokkeslett/dato
+ Slutt på garanti
+ Midlertidig basaldose avbrutt
+ Bolus avbrutt
+ Lånetidsadvarsel
+ Ampulle ikke satt inn
+ Ampulle tom
+ Batteri tomt
+ Automatisk av - pumpe stoppet
+ Tilstopping
+ Lånetid over - drift stoppes
+ Bytte av ampulle ikke fullført
+ Nedlasting av data mislyktes
+ Tidsavbrudd for pausemodus
+ Batteritype ikke angitt
+ Ampulletype ikke angitt
+ Mekanisk feil
+ Tilbakespolingsfeil
+ Språkfeil
+
diff --git a/app/src/main/res/values-no-rNO/insight_exceptions.xml b/app/src/main/res/values-no-rNO/insight_exceptions.xml
index 3ea04e700d..461bcf6c7c 100644
--- a/app/src/main/res/values-no-rNO/insight_exceptions.xml
+++ b/app/src/main/res/values-no-rNO/insight_exceptions.xml
@@ -1,2 +1,14 @@
-
+
+ Tilkobling mislyktes
+ Mistet forbindelsen
+ Sammenkobling avvist
+ Mislykket opprettelse av socket tilkobling
+ Tidsavbrudd
+ Maksimalt antall bolusdoser som allerede går
+ Ingen aktiv midlertidig basaldose å kansellere
+ Ingen aktiv midlertidig basaldose å endre
+ Ingen slik bolus til å avbryte
+ Pumpe allerede i den tilstanden
+ Kjør modus ikke tillatt
+
diff --git a/app/src/main/res/values-no-rNO/objectives.xml b/app/src/main/res/values-no-rNO/objectives.xml
index 3ea04e700d..997dd4ed75 100644
--- a/app/src/main/res/values-no-rNO/objectives.xml
+++ b/app/src/main/res/values-no-rNO/objectives.xml
@@ -1,2 +1,68 @@
-
+
+ Start
+ Kontroller
+ %1$d. Læringsmål
+ Læringsmål %1$d ikke startet
+ Læringsmål %1$d er ikke ferdig
+ Stiller inn utseende og overvåking for analyser av basaler og forholdstall
+ Kontroller at BS er tilgjengelig i Nightscout og at insulindata fra pumpen lastes opp
+ Starter med åpen loop
+ Kjør i \"Åpen Loop\" modus i noen dager og aktiver flere temp basaler. Konfigurer og aktiver flere midlertidige og default temp BS mål (f.eks. for Aktivitet eller Hypo behandling)
+ Forstå din åpen loop, inkludert den temp basal anbefalingen
+ Ut ifra hva du har erfart og lært, avgjør hva din max basal skal være og still den inn i både pumpen og AAPS innstillinger
+ Begynn å bruk lukket loop med aktivert funksjon for stopping av insulin ved lavt BS
+ Aktiver closed loop med max IOB = 0 i noen dager uten for mange episoder hvor systemet stopper insulintilførsel på grunn av lavt BS
+ Finjustering av lukket loop med gradvis økende maks IOB over 0 og redusering av BS målverdi
+ Kjør i noen dager og opplev minst en natt uten lavt BS alarmer før du begynner å redusere målverdi for BS
+ Juster om nødvendig basal og forholdstall, og deretter aktiverer du autosens
+ 1 uke vellykket looping på dagtid hvor alle måltider (KH) angis
+ Aktiver ekstra funksjoner for bruk på dagtid, slik som avansert måltidsassistent (AMA)
+ Aktiver ekstra funksjoner for bruk på dagtid, slik som SMB (Super Micro Bolus)
+ Aktiver Automatisering
+ Du må lese wiki og øke din maxIOB for å få SMB til å fungere. Et godt utgangspunkt er maxIOB = gjennomsnittlig måltidsbolus + 3*max daglig basal
+ Les dokumentasjonen på hvordan Automatisering virker. Lag din første enkle regel. I stedet for å utføre en behandling, få AAPS AAPS til å bare vise en melding. Kun når du er sikker på at Automatisering virker riktig kan du erstatte meldingsvarselet med en behandlingskommando. (https://androidaps.readthedocs.io/en/latest/EN/Usage/Automation.html)
+ BS tilgjengelig i NS
+ Pumpe status tilgjengelig i NS
+ Manuell kommando
+ Utført: %1$s
+ Lær hvordan du kontrollerer AndroidAPS
+ Utfør forskjellige handlinger i AndroidAPS
+ Angi profil 90% for 10 min (langt-trykk på profilnavn i Oversikt)
+ Simuler dusjing. Frakoble pumpen i 1t (langt trykk på Åpen Loop)
+ ... og koble til igjen på samme måte
+ Opprett egendefinerte midlertidige BS mål med 10 min varighet (langt-trykk på gjeldende mål)
+ I Konfigurasjonsverktøyet aktiverer du Hendelser plugin, og gjør det synlig og viser innholdet fra menyen i øverste linje
+ Vis innholdet i Loop plugin
+ Test skaleringsfunksjonen ved et langt trykk på BS grafen
+ Angi
+ Hvis du har minst 3 måneder erfaring med andre lukkede loop systemer kan du kanskje kvalifisere for en kode som lar deg hoppe over Læringsmålene. Se https://androidaps.readthedocs.io/en/latest/EN/Usage/Objectives.html#skip-objectives for mer detaljer.
+ Kode akseptert
+ Kode ugyldig
+ Bevis kunnskapen din
+ Studer og besvare spørsmålene riktig
+ Besvarelser deaktivert til: %1$s
+ Feil svar!
+ Neste uferdig
+ Be om kode: %1$s
+ (kontroller alle riktige svar)
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#what-to-do-when-taking-a-shower-or-bath
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#config-builder
+ https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen
+ Ikke koblet til Internett
+ Feil ved henting av tid
+ Læringmålets krav er ikke oppfylt
+
+ %1$d dag
+ %1$d dager
+
+
+ %1$d time
+ %1$d timer
+
+
+ %1$d minutt
+ %1$d minutter
+
+
diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml
index 1ce4989b86..4d2fa0617a 100644
--- a/app/src/main/res/values-no-rNO/strings.xml
+++ b/app/src/main/res/values-no-rNO/strings.xml
@@ -4,5 +4,1180 @@
+ Sikkerhetsbegrensninger for behandlinger
+ Maks tillat bolus [U]
+ Maks tillat karbo [g]
+ Innstillinger
+ Oppdater behandlinger fra NS
+ Nullstill databasene
+ Vil du virkelig nullstille databasene?
+ Avslutt
+ Bruk alltid absolutte verdier for basal
+ Start telefonen på nytt eller restart AndroidAPS fra systeminnstillingene \nellers vil ikke AndroidAPS ha aktivert loggføring (viktig for å spore og kontrollere at algoritmene fungerer riktig)!
+ Det ser ikke ut som mobilen støtter registrering av apper som unntas fra batterioptimalisering - du kan oppleve ytelsesproblemer.
+ Knapper for rask tilgang til ofte brukte funksjoner
+ Brukt for innstilling av aktive plugin
+ Opplæringsprogram
+ Viser forhåndsinnstillinger for mat som er definert i Nightscout
+ Innstillinger for Humalog og NovoRapid / NovoLog insulin
+ Innstillinger for Fiasp
+ Insulin innstillinger for Lyumjev
+ Lar deg stille inn tidspunktet for toppen av insulinvirkningen. Bør bare benyttes av erfarne brukere
+ Aktiver eller deaktiver hendelsen som trigger loop.
+ Synkroniserer dine data med Nightscout
+ Slik algoritmen var definert i 2017
+ Siste utgave av algoritmen for avanserte brukere
+ Viser loopens nåværende tilstand og knapper for de vanligste funksjonene
+ Viser en konstant melding med en kort oppsummering av hva loop gjør
+ Definer en profil som er tilgjengelig offline.
+ Bruker profiler som du har definert i Nightscout
+ Tilkobling mot Accu-Chek Combo pumper krever at ruffy er installert
+ Integrasjon mot de som kun bruker insulinpenner i sin diabetesbehandling
+ Integrasjon mot pumper som ikke støttes av AndroidAPS (åpen loop)
+ Sensitiviteten beregnes på samme måte som i Oref0, men du kan angi hvor mye av historikken som skal tas med i beregningen. Minimum opptak av karbohydrater beregnes ut fra maks karbohydratopptak angitt i dine innstillinger.
+ Sensitivitet beregnes fra 8t og 24t historiske dat (velger alltid det resultatet som gir høyest insulinsensitivitet. Karbohydrater som ikke er absorbert blir avsluttet etter tiden som er angitt i innstillinger. Plugin beregner også UAM.
+ Sensitivitet beregnes som en vektet gjennomsnittsverdi av avvikene. Ferske avvik har høyere vekting. Minimum opptak av karbohydrater beregnes ut fra maks opptakstid for karbohydrater angitt i dine innstillinger. Denne algoritmen er den raskeste for å justere endringer i sensitivitet.
+ Motta BS verdier fra den modifiserte Eversense appen.
+ Motta BS verdier fra Glimp.
+ Motta BS verdier fra 600SeriesAndroidUploader.
+ Last ned BS verdier fra Nightscout
+ Motta BS verdier fra xDrip.
+ Lagre data om alle behandlinger som er utført
+ Monitorer og kontroller AndroidAPS med din WearOS klokke.
+ Vis informasjon om loop på din xDrip+ urskive.
+ Fjernstyr AndroidAPS med SMS kommandoer.
+ Insulin:
+ Karbo:
+ IOB:
+ IOB:
+ Total IOB:
+ Total IOB aktivitet:
+ Varighet:
+ Ratio:
+ Ins:
+ IOB:
+ Total IOB:
+ BS
+ TT
+ Karbo
+ Korr
+ Bolus IOB
+ Utfør nå
+ VIRTUELL PUMPE
+ OK
+ Siste beregning
+ Angi verdier
+ Glukosestatus
+ Nåværende temp
+ IOB data
+ Profil
+ Måltidsdata
+ Resultat
+ Resultat: %1$s %2$s
+ Ingen BS data tilgjengelig
+ Forespørsel
+ Glukose
+ Delta
+ Delta:
+ Konfigurasjonsverktøy
+ Oversikt
+ NS profil
+ Behandlinger
+ Virtuell pumpe
+ Careportal
+ Pumpe
+ Hvilken pumpe ønsker du å bruke sammen med AndroidAPS?
+ Behandlinger
+ Hvilken plugin burde brukes til håndtering av behandlinger?
+ Profil
+ Hvilken profil bør AndroidAPS bruke?
+ APS
+ Hvilken APS algoritme skal brukes for administrasjon av behandlinger?
+ Generelt
+ Det er noen generelle plugins som kan være nyttige.
+ Hvilke begrensninger brukes?
+ Begrensninger
+ Loop
+ Loop
+ Bruk dette for å aktivere AndroidAPS loop integrasjon.
+ APS
+ Etter behandling av begrensninger
+ Temp Basal satt av pumpen
+ INGEN APS ER VALGT ELLER HAR LEVERT RESULTAT
+ Sikkerhet
+ Plugin er deaktivert
+ Brudd på begrensninger
+ Mislykket bolus levering
+ Aksepter ny temp basal:
+ Behandling
+ Kalkulator
+ Begrensning benyttet!
+ Bolus:
+ Basal
+ Basal:
+ Endre dine inndata!
+ BS kilde
+ Hvor skal AndroidAPS hente sine data fra?
+ xDrip
+ APS modus
+ Lukket loop
+ Åpen loop
+ Stopp hvis lavt BS
+ Loop er deaktivert
+ Stans loop
+ Aktiver loop
+ Ny anbefaling tilgjengelig
+ Karbo forslag
+ Versjonen av Nightscout støttes ikke
+ LOOP DEAKTIVERT PGA BEGRENSNINGER
+ Basal IOB
+ Bolus begrensning utført
+ Karbohydrat begrensning utført
+ Annet
+ Meter
+ Sensor
+ Karbo tid
+ Varighet
+ Merknader
+ Hendelse tidspunkt
+ Profil
+ Glukosetype
+ Ingen profil innlest fra NS enda
+ Temp basal
+ Forlenget bolus
+ Nightscout versjon:
+ Mangler %1$d g
+ Innstillinger lagret
+ Eksporter innstillinger til
+ Importer innstillinger fra
+ Innstillinger importert
+ Fil ikke funnet
+ Eksporter innstillinger
+ Importer innstillinger
+ Max E/t en Temp Basal kan settes til
+ Denne verdien kalles max basal i OpenAPS sammenheng
+ Max basal IOB som OpenAPS kan levere [U]
+ Denne verdien kalles Max IOB i OpenAPS sammenheng.\nDet er max insulinmengde i [U] APS kan levere.
+ Du må angi et hovedpassord som vil bli brukt til å kryptere dine eksporterte innstillinger.
+ Du må angi et hovedpassord som vil bli brukt for å lese inn og dekryptere innstillinger.
+ Eksport kansellert! Innstillinger ble IKKE lagret!
+ Innlesing avbrutt! Innstillinger ble IKKE lest inn!
+ Kunne ikke importere innstillinger!
+ Gå tilbake til hovedskjermen og prøv på nytt.
+ Gammelt hovedpassord
+ Denne filen ble eksportert og kryptert med et annet passord. Oppgi det gamle passordet for å dekryptere filen.
+ Som et resultat av vellykket import vil ditt nåværende passord bli ERSTATTET med det gamle passordet!
+ Velg fil å importere
+ Vennligst sjekk innstillingene før du importerer:
+ Innstillingene kan ikke importeres!
+ Innstillingene bør ikke importeres!
+ Forklar importproblemer…
+ Detaljer om importproblemer
+ Import
+ Importer uansett (FARLIGT!)
+ Innstillinger ble opprettet med en annen utgave av AAPS (%1$s) mens du har: %2$s.\n\nNoen innstillinger kan mangle eller være ugyldige. Etter å ha importert bør du kontrollere og oppdatere innstillingene dine.
+ Innstillingene ble opprettet på en annen enhet. Det er OK om du importerer fra en eldre/annen telefon, men kontroller at importerte innstillinger er riktig!
+ Du bruker et utgått format fra en gammel versjon av AAPS som ikke er sikkert! Bruk det bare som en siste utvei hvis du ikke har en nyere eksport som benytter JSON formatet.
+ Importerte innstillinger er allerede %1$s dager gamle! Kanskje du har flere oppdaterte innstillinger eller du har valgt feil fil? Husk å eksportere innstillinger regelmessig!
+ Ugyldig dato-tid format!
+ Innstillinger er fra en annen delversjon av appen. Det er OK å importere etter en oppgradering av app, men sjekk at innstillinger fortsatt er korrekte etter importen!
+ Innstillinger er fra en annen hovedversjon av appen. Forskjeller mellom hovedversjoner kan være betydelige og dermed inkompatible innstillinger. Verifiser etter importen at dine innstillinger fortsatt er korrekte!
+ Filformat
+ Opprettet den
+ AAPS versjon
+ Bygge variant
+ Eksporterer enhetens pasientnavn
+ Eksportere enhetsmodell
+ Fil kryptering
+ Gammelt eksportformat
+ Nytt krypteringsformat
+ Nytt feilsøkingsformat (ukryptert)
+ Ukjent eksportformat
+ Filen med innstillinger er manipulert
+ Fil med innstillinger er sikker
+ Bruk er ikke sikker, ukryptert format
+ JSON formatfeil, mangler påkrevd felt (format, innhold, metadata eller sikkerhet)
+ Dekrypteringsfeil, oppgitt passord kan ikke dekryptere filen
+ Filens sjekksum (hash) mangler, kan dermed ikke bekrefte innstillingene!
+ Filen har blitt endret etter eksporten!
+ Dekrypteringsfeil, klarte ikke å tolke innstillingene!
+ Dekrypteringsfeil, det oppgitte passordet er ugyldig eller filen har blitt endret! Det kan hende filen ble eksportert med et annet passord.
+ Mangler krypteringsinformasjon, formatet på innstillinger er ugyldig!
+ Ugyldig eller ikke spesifisert krypteringsalgoritme!
+ eksportert for %1$s siden
+ eksportert den %1$s
+ eksportert for mindre enn time siden
+ i katalogen: %1$s
+ Sluttbrukeravtale
+ MÅ IKKE BENYTTES TIL Å TA MEDISINSKE BESLUTNINGER. DET FINNES INGEN GARANTI FOR PROGRAMMET I DEN UTSTREKNING SOM TILLATES AV GJELDENDE LOV. SÅFREMT IKKE ANNET ER ANGITT SKRIFTLIG LEVERES PROGRAMMET HELT UTEN GARANTIER I NOEN SOM HELST FORM, VERKEN UTTRYKT ELLER INNEFORSTÅTT, INKLUSIV MEN IKKE BEGRENSET TIL SALGBARHET ELLER EGNETHET TIL VISSE FORMÅL. ALL RISIKO KNYTTET TIL KVALITET AV PROGRAMMETS FUNKSJONALITET ER HOS DEG SOM BRUKER. OM PROGRAMMET VISER SEG Å VÆRE DEFEKT, ER DET BRUKEREN SOM MÅ TA ALT ANSVAR FOR KOSTNADER KNYTTET TIL ALL SERVICE, REPERASJON ELLER RETTELSE.
+ JEG FORSTÅR OG GODTAR
+ Lagre
+ Les inn profil på nytt
+ SMS tjeneste
+ Godkjente mobilnumre
+ +XXXXXXXXXX;+YYYYYYYYYY
+ For å levere bolus på %1$.2fE, svar med kode %2$s
+ For å levere måltidsbolus på %1$.2fE, svar med kode %2$s
+ For å sette Temp Target på %1$s, svar med kode %2$s
+ For å avbryte Temp Target, svar med kode %1$s
+ For å deaktivere fjernstyring via SMS meldinger, svar med kode %1$s.\n\nHusk at du vil kunne reaktivere den igjen kun fra AAPS master telefon.
+ Fjernstyring via SMS meldinger er stanset. For å reaktivere, bruk AAPS på master telefonen.
+ For å sende kalibrering %1$.2f, svar med kode %2$s
+ Bolus mislyktes
+ Minimum antall minutter som må forløpe mellom en fjernstyrt bolus og den neste
+ Minimum antall minutter mellom en fjernstyrt bolus og neste
+ For din egen sikkerhet, for å endre denne innstillingen må du legge til minst 2 telefonnumre.
+ Bolus %1$.2f E levert vellykket
+ Skal levere %1$.2f E
+ Bolus %1$.2f E levert vellykket
+ Måltidsbolus %1$.2f E levert vellykket
+ Temp target på %1$s er satt for %2$d minutter
+ Temp target på %1$s for %2$d minutter ble vellykket definert
+ Temp Target ble vellykket avbrutt
+ Tillat fjernstyring via SMS meldinger
+ Bolus stoppet
+ Stopper bolus
+ Loop har blitt deaktivert
+ Loop har blitt aktivert
+ Loop er deaktivert
+ Loop er aktivert
+ %1$.2f begrenset til %2$.2f
+ Verdien %1$s er utenfor angitt begrensning
+ For å koble til pumpen, svar med kode %1$s
+ Tilkobling til pumpen mislyktes
+ For å koble fra pumpen i %1$d minutter, svar med koden %2$s
+ Pumpe frakoblet
+ Pumpen tilkoblet igjen
+ Fjernstyringskommando er ikke tillatt
+ Fjernstyrings bolus er ikke tilgjengelig. Prøv igjen senere.
+ For å starte basal %1$.2f E/t i %2$d minutter, svar med kode %3$s
+ For å bytte profil til %1$s %2$d%%, svar med kode %3$s
+ For å starte forlenget bolus %1$.2f E i %2$d minutter, svar med kode %3$s
+ For å angi %1$dg kl. %2$s, svar med kode %3$s
+ For å starte basal %1$d%% i %2$d minutter, svar med kode %3$s
+ For å pause loop i %1$d minutter, svar med kode %2$s
+ For å gjenoppta loop, svar med kode %1$s
+ For å aktivere loop, svar med kode %1$s
+ For å deaktivere loop, svar med kode %1$s
+ Vellykket start av temp basal %1$.2fE/t i %2$d minutter
+ Vellykket start av forlenget bolus %1$.2fE i %2$d minutter
+ Vellykket registrering av %1$dg KH
+ Registrering av %1$dg karbohydrater mislyktes
+ Vellykket start av temp basal %1$d%% i %2$d minutter
+ Mislykket start av temp basal
+ Mislykket start av forlenget bolus
+ For å avbryte Temp basal, svar med kode %1$s
+ For å stoppe forlenget bolus, svar med kode %1$s
+ Temp basal avbrutt
+ Forlenget bolus avbrutt
+ Mislykket kansellering av Temp basal
+ Mislykket kansellering av forlenget bolus
+ Ukjent kommando eller feil svar
+ Hurtigveiviser
+ Innstillinger for hurtigveiviser
+ Knappetekst:
+ Karbo:
+ Gyldig:
+ Legg til
+ Rediger
+ Fjern
+ Måltid
+ Korreksjon
+ Handlinger
+ Kun NS opplasting (deaktivert sync)
+ Kun opplast til NS. Påvirker ikke SGV (BS) med mindre en lokal kilde som xDrip er valgt. Påvirker ikke profiler hvis NS profiler benyttes.
+ Pumpen ikke initialisert!
+ Prime/fylling
+ Kontroller at mengden samsvarer med spesifikasjonen for slangesettet ditt!
+ Standardverdier for påfyll/prime
+ Knapp 1
+ Knapp 2
+ Knapp 3
+ Enheter:
+ Enheter
+ DIA
+ Område for visualisering
+ Høy og lav verdi for grafen i Oversikt og smartklokke
+ Lav verdi
+ Høy verdi
+ Klokke
+ Send alle data på nytt
+ Åpne Innstillinger på klokken
+ Basal rate:
+ Basal verdi under minimum. Profilen settes ikke!
+ BS:
+ Siste BS:
+ MDI
+ MM640G
+ Pågående varslinger
+ GAMLE DATA
+ %1$d min siden
+ Lokal profil
+ OpenAPS AMA
+ Kort middelverdi
+ Lang middelverdi
+ Liste med %1$d elementer.\nFaktisk verdi:
+ Autosens data
+ Script feilsøking
+ Bruk Autosens funksjon
+ Oppdater hendelser fra NS
+ Slett behandlinger i fremtiden
+ Spise snart
+ Hypo
+ Aktivitet
+ Fjern registrering
+ ACT
+ KONF
+ LOOP
+ OAPS
+ LP
+ HJEM
+ VPUMP
+ NSPROFIL
+ BEH
+ MÅL
+ WEAR
+ SMS
+ Korte navn i menyfaner
+ Bruk alltid kort gjennomsnittsverdi delta i stedet for enkel delta
+ Nyttig når data fra ufiltrerte kilder som xDrip registrerer mye støy.
+ Profil
+ Standardverdi: 3 Dette er en viktig OpenAPS sikkerhetsbegrensning. Dette begrenser dine basaler til maks 3x av din høyeste basalverdi. Du vil trolig ikke behøve å endre denne verdien, men les og forstå hva som menes med \"3x max daglig; 4x gjeldende\" som sikkerhetsinnstilling.
+ Standardverdi: 4 Dette er en viktig OpenAPS sikkerhetsbegrensning. Dette begrenser dine temp basal til max 4 ganger din nåværende basal dose, uansett hva som er maks basal i pumpen. Dette er for å unngå at man setter farlige høye maks basal doser uten at man har forstått algoritmene. Når du taket i denne begrensningen bør du i stedet fokusere på å endre andre innstillinger.
+ Standardverdi: 1.2\nDetta er en multiplikatorbegrensning for autosens (og snart autotune) som begrenser at autosens ikke kan øke med mer enn 20%%, som dermed begrenser hvor mye autosens kan justere opp dine basaler, hvor mye ISK kan reduseres og hvor lavt BS målverdi kan settes.
+ Standardverdi: 0.7\nDette er en multiplikatorbegrensning for autosens sikkerhet. Den begrenser autosens til å redusere basalverdier, og øke isulinssensitivitet (ISF) og BS mål med ikke mer enn enn 30%.
+ Autosens justerer også BS målverdier
+ Standard verdi: sann\nGir autosens tillatelse til å justere BS mål, i tillegg til ISF og basaler.
+ Standard verdi: 2\nBolus snooze er aktivt etter at du har gitt en måltidsbolus slik at loop ikke skal forsøke å sette lav-temp når du nettopp har spist. I dette eksempelet brukesg standardverdi på 2, så med en 3 timers DIA vil bolus snooze begrensning gradvis forsvinne etter 1.5 timer (3DIA / 2). Bolus snooze brukes ikke hvis SMB er aktivert.
+ Standardverdi er: 3.0 (AMA) eller 8.0 (SMB). Dette er grunninnstillingen for KH opptak per 5 minutt. Den påvirker hvor raskt COB skal reduseres, og benyttes i beregning av fremtidig BS kurve når BS enten synker eller øker mer enn forventet. Standardverdi er 3mg/dl/5 min.
+ Advarsel!\nNormalt vil du ikke trenge å endre verdiene under. Vennligst TRYKK HER og LES teksten for å være sikker på at du FORSTÅR konsekvensene før du gjør endringer.
+ Ugyldig SMS mobilnummer
+ Kalibrering
+ xDrip+ ikke installert
+ Kalibrering er sendt til xDrip
+ Kalibrering sendt. Vær oppmerksom på at xDrip må være konfigurert til å ta imot kalibreringer.
+ xDrip tar ikke imot kalibreringer
+ Pumpen er pauset
+ Utfører
+ Virtuelle pumpe innstillinger
+ Last opp status til Nightscout
+ NSClient
+ NSCI
+ URL:
+ Autoscroll
+ Omstart
+ NSClient
+ Nightscout URL
+ Oppgi din Nightscout URL
+ Nightscout API secret
+ Nightscout API secret
+ Oppgi NS API secret (min 12 tegn)
+ Lever nå
+ Tøm kø
+ Vis kø
+ Kø:
+ Status:
+ Pauset
+ Tøm logg
+ NSCLIENT har ingen skriverettighet. Feil API secret?
+ Klokke innstillinger
+ Vis detaljert IOB
+ Vis IOB med bolus och basal IOB på klokke
+ mislykket - sjekk telefonen
+ n/a
+ Pasient type
+ Barn
+ Tenåring
+ Voksen
+ Insulin resistent voksen
+ Graviditet
+ Velg pasientens type for oppsett av sikkerhetsgrenser
+ Pasientens navn
+ Angi pasientnavn eller kallenavn for å kunne skille mellom flere oppsett
+ Bruker
+ Glimp
+ %1$s behøver å omgå batterispare funksjonene for å fungere tilfredsstillende
+ Loop pauset
+ Pauset (%1$d m)
+ Pause loop
+ Pause loop i 1t
+ Pause loop i 2t
+ Pause loop i 3t
+ Pause loop i 10t
+ Pause loop i %1$d min
+ Koble fra pumpen i 15 min
+ Koble fra pumpen i 30 min
+ Koble fra pumpen i 1t
+ Koble fra pumpen i 2t
+ Koble fra pumpen i 3t
+ Gjenoppta
+ Tilkoble pumpen
+ Feil varighet
+ Loop er pauset
+ Loop gjenopptatt
+ 15 min trend
+ COB
+ Superbolus
+ Logg app start til NS
+ Avslutter appen for at innstillinger skal tas i bruk.
+ Hvilken type insulin bruker du?
+ Novorapid, Novolog, Humalog
+ Fiasp
+ INS
+ Aktiver superbolus i veiviser
+ Aktiver superbolus funksjonen i wizard. Ikke aktiver denne før du vet hvordan den fungerer. DEN KAN LEDE TIL EN OVERDOSERING AV INSULIN HVIS DEN BRUKES BLINDT!
+ Vis statusindikatorer på hjem skjermen
+ OBS: alder slangesett [h]
+ Advarsel: alder slangesett [h]
+ OBS: alder insulin [h]
+ Advarsel: alder insulin [h]
+ OBS: alder CGM [h]
+ Advarsel: alder CGM [h]
+ Nivå for når batterivarsel skal gis [%]
+ Nivå for når kritisk batteriadvarsel skal gis [%]
+ OBS: alder batteri [h]
+ Advarsel: alder batteri [h]
+ OBS: nivå insulinreservoar [U]
+ Advarsel: nivå insulinreservoar [U]
+ OBS: batterivarsel [%]
+ Advarsel: lavt batterinivå [%]
+ PROGN
+ IOB
+ COB
+ BAS
+ DEV
+ AKT
+ ABS
+ DEVSLOPE
+ Om
+ Mangler SMS tillatelse
+ Mangler app tillatelse til telefon
+ xDrip Status (klokke)
+ xDrip Statuslinje (klokke)
+ xds
+ Vis BGI
+ Legg til BGI i statuslinje
+ Ingen opplast til NS
+ Alle data som sendes til NS blir slettet. Selv om AAPS er tilknyttet NS, gjøres det ingen endring i NS
+ Avbryt forlenget bolus
+ Gjør profilbytte
+ Sensor
+ Kanyle
+ Insulin
+ Pumpe batteri
+ alder:
+ nivå:
+ Alarm valg
+ Opprett varsler fra NS alarmer
+ Opprett varsler fra NS meldinger
+ Ingen data advarsel [min]
+ Kritisk mangel på data advarsel [min]
+ Intervall for autosens [h]
+ Antall timer med historiske data for beregning av sensitivitet (absorpsjonstid for KH er ekskludert)
+ Pumpe
+ OpenAPS
+ Opplaster
+ Sensitivitets deteksjon
+ Hvilken sensitivitetsalgoritme skal benyttes?
+ SENS
+ Sensitivitet Oref1
+ Sensitivitet AAPS
+ Absorpsjon innstillinger
+ Maks absorpsjonstid for måltid [h]
+ Tid i timer hvor det forventes at alle karbohydrater fra måltid vil være absorbert
+ OAPS
+ UPLD
+ BAS
+ Hold skjermen påslått
+ Forhindre Android å slå av skjermen. Mobil vil bruke mye batteri hvis den ikke plugges til strømledning.
+ Hvis du slår på Autosense funksjonen må du huske å angi alle spiste karbohydrater. Ellers vil KH avvik gi feil i sensitivitetsberegningen !!
+ Sensitivitet vektet middelverdi
+ OK
+ Avbryt
+ Ikke alle profiler ble lastet!
+ Verdier ikke lagret!
+ Aktiver sending til andre apper (som xDrip). Ikke aktiver dette hvis du har mer enn en AAPS eller NSClient installert!
+ Aktiver lokale sendinger.
+ Varighet [min]
+ OpenAPS SMB
+ Aktiver UAM
+ Aktiver SMB
+ Bruk Super Mikro Solen i stedet for temp basal for raskere resultat
+ Oppdaget uannonsert måltid (UAM)
+ IOB kurvens topp tid
+ Topp tid [min]
+ Free-Peak Oref
+ Rapid-Acting Oref
+ Ultra-Rapid Oref
+ Lyumjev
+ DIA på %1$f for kort - bruker %2$f i stedet!
+ Aktiver profil
+ UGYLDIG
+ Prosent
+ Tidsforskyving
+ Standard temp mål
+ spise snart varighet
+ spise snart målverdi
+ aktivitet varighet
+ aktivitet målverdi
+ hypo varighet
+ hypo målverdi
+ gjenbruk
+ Kontroller fra klokke
+ Sett temp målverdi og angi behandlinger fra klokken.
+ Mat
+ g
+ ]]>
+ kJ
+ En
+ Pr
+ Fett
+ ]]>
+ Kommandoen utføres akkurat nå
+ Pumpe utilgjengelig
+ Mangler BS målinger
+ Bruk systemvarslinger for alarmer og varslinger
+ Øk volumet gradvis for alarmer og varsler
+ Lokale varsler
+ Varsel hvis ingen BS data mottas
+ Varsel hvis pumpen er utilgjengelig
+ Pumpen er ikke tilgjengelig etter [min]
+ Varsel hvis karbohydrater må tilføres
+ Kritisk alarm
+ INFO
+ Eversense App (patched)
+ Last opp BS data til NS
+ BS opplast innstillinger
+ Vis detaljer om delta
+ Vis delta med én ekstra desimal
+ Minste antall minutter mellom hver SMB
+ Maks antall minutter med basal som kan bli SMB
+ UAM SMB maks minutter
+ Maks antall minutter basal som kan bli SMB ved UAM
+ Minimumsgrense for KH forslag
+ Minimum mengde karbohydrater i gram for å vise advarsel. Behov under denne grenseverdien vil ikke vises som et varsel.
+ Send BS data til xDrip+
+ I xDrip+ velg 640G/Eversens som datakilde
+ NSClient BS
+ BS beregning
+ Bolus IOB beregning
+ Basal IOB beregning
+ Trend beregning
+ Superbolus beregning
+ Ja
+ Nei
+ Bare positive
+ Bare negative
+ COB beregning
+ Temp target beregning
+ Loop er aktivert
+ APS valgt
+ NSClient har skrive rettigheter
+ Lukket loop aktivert
+ Maks IOB er angitt riktig
+ BS tilgjengelig fra valgt kilde
+ Programmerer bolus i pumpen
+ Oppdater
+ Status
+ Aktivitet
+ Ingen tilkobling i %1$d min
+ %1$d%% (%2$d min igjen)
+ Initialiserer
+ Pauset på grunn av en feil
+ Pauset av bruker
+ Kjører
+ Avbryter TBR
+ Setter TBR (%1$d%% / %2$d min)
+ Gir bolus (%1$.1f E)
+ Oppdaterer
+ Forespurt operasjon støttes ikke av pumpen
+ Usikker bruk: Kombinasjons eller forlenget bolus er aktiv. Loop modus er satt til å slå av basal ved lavt BS i 6 timer. Bare vanlige boluser kan gis i denne perioden
+ Usikker bruk: pumpen bruker en annen profil enn den første (standardprogram). Loop er deaktivert. Velg den første profilen i pumpen og oppdater.
+ En bolus med samme verdi har blitt forespurt i løpet av de to siste minutter. Dette er ikke tillatt for å unngå feilaktige dobbelt boluser og feil i beregninger.
+ Nå
+ Leser pumpehistorikk
+ Setter basal profil
+ Lavt nivå i insulinampull
+ Pumpebatteriet er lavt
+ Pumpen viser feil E%1$d: %2$s
+ Lav
+ Tom
+ Normal
+ Pumpens tid må oppdateres
+ Varsel om kansellering av temp basal er bekreftet
+ Ingen kontakt med pumpen. Ingen bolus er levert
+ Bolus avbrutt. Det virker som ingen bolus er levert. For å være sikker, sjekk pumpen for å unngå levering av dobbel bolus og gjør evt et nytt forsøk. For å unngå feil vil systemet aldri prøve å levere ny bolus.
+ Bare %1$.2f E av bolusdosen på %2$.2f E ble levert på grunn av en feil. Sjekk pumpen for å kontrollere dette og iverksett nødvendige tiltak.
+ Levering av bolusdose og kontroll av pumpens historikk feilet. Vennligst sjekk pumpen. Hvis en bolus ble levert vil den automatisk bli lagt til ved neste tilkobling til pumpen.
+ Ikke nok insulin til bolus i ampullen
+ Forlenget bolus feilet
+ Sight
+ Sett nøytrale temp basaler
+ Hvis aktivert så vil den stoppe en temp basal rett før hver hele time for å stoppe noen pumpers varsler/vibreringer på hver hele time.
+ Aktiverer alltid SMB
+ Aktiver alltid SMB uavhengig av boluser. Bare mulig med en bra filtrert BS kilde som f.eks. Dexcom G5/G6
+ Aktiver SMB etter karbohydrater
+ Aktiver SMB i 6t etter karbohydrat inntak, selv med 0 IOB. Bare mulig med en bra filtrert BS kilde som f. eks. Dexcom G5/G6
+ Aktiver SMB med COB
+ Aktiver SMB når COB er aktiv.
+ Aktiver SMB med temp målverdi
+ Aktiver SMB når temp målverdi er aktiv (spise snart, trening)
+ Aktiver SMB ved høye temp målverdier
+ Aktiver SMB når det er aktive temp målverdier (trening, over 100 mg/dl eller 5,5 mmol/l)
+ Insulin
+ Karbo
+ Knapper
+ Sender en kalibrering til xDrip+ eller åpner en G5 kalibreringsdialog
+ Åpner xDrip+, tilbake knappen returnerer til AAPS
+ Antall karbohydrater som skal legges til når knappen trykkes
+ Mengde insulin som skal legges til når knappen trykkes inn
+ Kunne ikke starte CGM-programmet. Kontroller at det er installert.
+ CGM
+ Ignorer 5m
+ Ignorer 15m
+ Ignorer 30m
+ beh
+ Historikk leser
+ Varsle på SMB
+ Vis SMB på klokken som en standard bolus.
+ Lag meldinger ved feil
+ Opprett varslinger hvis det er nødvendig med karbohydrater
+ Opprett varslinger i Nightscout ved feil eller meldinger (også synlig i Careportal under Behandlinger)
+ Opprett Nighjtscout meldinger ved behov for karbohydrater
+ Vis blodsukker prognoser på klokken.
+ Prognoser
+ Data valg
+ Innlesing av fabrikkinstillinger
+ Tillat automatisk rapportering av appkrasher og bruksdata til utviklerne via fabrioc.io tjenesten.
+ Vennligst oppdater din Dexcom app til en versjon som støttes
+ Dexcom appen er ikke installert.
+ Start Trening TT
+ Start Spise snart TT
+ TT
+ Ikke gi bolus, bare loggfør
+ Kategori
+ Underkategori
+ Bolus vil bare bli loggført (ikke levert av pumpe)
+ Hente manglende BS data fra NS
+ SMB satt med pumpe
+ Aktivitet
+ Sensitivitet
+ Avvik
+ Aktive KH (COB)
+ Aktivt insulin (IOB)
+ Basaler
+ Ingen handling valgt. Ingenting endres
+ Start Hypo TT
+ Du kjører dev-versjonen. Lukket loop ikke aktivert.
+ Engineering Mode aktivert
+ Leser basalprofil
+ Pumpe historikken har blitt endret siden bolus kalkuleringen ble utført. Bolus har ikke blitt levert. Vennligst rekalkuler om bolus fortsatt er nødvendig.
+ Bolus har blitt levert, men det oppsto en feil ved loggføring i behandlinger. Dette kan oppstå hvis to små bolus på samme størrelse blir levert i løpet av to minutter. Vennligst sjekk pumpe historikken og behandlinger logg, og bruk Careportal for å legge til de manglende behandlingene. Pass på at du ikke legger til to identiske behandlinger på samme minutt.
+ Avviser høy temp target siden kalkuleringen ikke tok hensyn til nylige endringer i pumpe historikken
+ Oppdaterer pumpestatus
+ Basal dosen i pumpen har blitt endret og vil i løpet av kort tid bli oppdatert
+ Basal raten i pumpen er endret, men feilet i å lese ny verdi
+ Sjekker for endringer i historikken
+ Flere boluser levert i samme minutt og med samme insulinmengde ble importert. Bare en av doseringene ble lagt til i behandlinger. Vennligst sjekk pumpen og legg til manuelt ekstra bolus doseringer i Careportal. Ikke legg til flere boluser i samme minutt.
+ \n\ndokumentasjon:\nhttps://androidaps.readthedocs.io\n\nfacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsers
+ Den siste bolus er eldre enn 24t eller er i fremtiden. Vennligst sjekk at datoen i pumpen er korrekt.
+ Tid/dato for levert bolus i pumpen er trolig feil, og IOB beregningen blir da feil. Vennligst sjekk pumpens tid/dato.
+ Profil bytte mangler. Utfør et profil bytte og trykk på \"Aktiver profil\" i din lokale profil.
+ Antall boluser
+ Antall temp basaler
+ Pumpen støtter ikke temp basaler
+ Ingen gyldige basal rater ble lest fra pumpen
+ Lukket Loop deaktivert i innstillinger
+ Autosens deaktivert i innstillinger
+ SMB deaktivert i innstillinger
+ UAM deaktivert i innstillinger
+ UAM deaktivert fordi den trenger Oref1 sensitivitetsplugin
+ maks basal multiplikator
+ maks daglig basal multiplikator
+ En bolus ble gitt i løpet av de siste 3 minuttene, dropper SMB
+ Basal justert korrekt
+ Begrenser forlenget bolus til %1$.1f E på grunn av %2$s
+ Begrenser maks IOB til %1$.1f E på grunn av %2$s
+ Begrenser karbohydrater til %1$d g på grunn av %2$s
+ Begrenser IOB til %1$.1f E på grunn av %2$s
+ maks verdi i innstillingene
+ hard begrensning
+ usikker bruk
+ Feil i lesing av status
+ Logg bytte av slangesett
+ Logg bytte av insulinampull
+ SMB Alltid På og SMB Etter Karbohydrater er deaktivert fordi BS kilden ikke støtter avansert filtrering
+ SMB ikke tillatt i åpen loop
+ Mat
+ tilbakestill
+ Maks total IOB OpenAPS ikke kan overstige [U]
+ Denne verdien kalles Maks IOB av OpenAPS\nOpenAPS vil ikke gi mere insulin hvis mengden insulin ombord (IOB) overstiger denne verdien
+ Pumpen stoppet
+ Pumpen startet
+ Pumpen pauset
+ Maks absorpsjonstid for måltid [h]
+ Etter denne tiden forventes det at måltidet er absorbert. Eventuelle gjenværende karbo vil tas ut av beregninger.
+ Tid
+ Vis merknadsfelt i dialogvindu for Behandlinger
+ Neste
+ Forrige
+ Installasjonsguide
+ Avslutt
+ Første økning hurtigknapp for insulin
+ Andre økning hurtigknapp for insulin
+ Tredje økning hurtigknapp for insulin
+ Første økning hurtigknapp for karbohydrater
+ Andre økning hurtigknapp for karbohydrater
+ Tredje økning hurtigknapp for karbohydrater
+ CGM
+ Bare kun WiFi tilkoblinger
+ WiFi nettverksnavn
+ Bare under lading
+ Tilkoblingsinnstillinger
+ Tillatte nettverksnavn SSID (separert med semikolon)
+ Tillat tilkobling i roaming
+ Maks autosens ratio
+ Minimum autosens ratio
+ Bolus snooze DIA divisor
+ Multiplikator for max daglig basal
+ Multiplikator får gjeldende basal
+ n/a
+ Virtuell pumpetype
+ Pumpedefinisjon
+ Bolus: Step=%1$s\nForlenget bolus: [Step=%2$s, Varighet=%3$smin-%4$sh]\nBasal: Step=%5$s\nTBR: %6$s (av %7$s), Varighet=%8$smin-%9$sh\n%10$s
+ Auto tilbakefyll BS
+ Veiviser innstillinger
+ Beregninger inkludert i resultatet fra veiviseren:
+ Visningsinnstillinger
+ Generelle innstillinger
+ Aktiver NSClient
+ Velkommen til oppsettveiviseren. Den vil lede deg gjennom installasjonsprosessen\n
+ Les status
+ Endringer må gjøres i NS
+ Hopp over oppsettsveiviser
+ Trykk på knappen under for å tillate at AndroidAPS foreslår/gjør basal endringer
+ Sensitivitets plugin brukes til å oppdage insulinsensitivitet og COB beregninger. For mer info, se:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSClient håndterer tilkobling til Nightscout. Du kan hoppe over denne delen nå, men du vil ikke kunne bestå læringsmålene før den er satt opp.
+ Husk: nye insulinprofiler krever en DIA på minst 5t. DIA 5-6t på ny profil er lik DIA 3t på gamle insulinprofiler.
+ Vennligst velg kilde for din profil. Hvis pasienten er et barn anbefales det å bruke NS profil. Hvis ingen følger deg på Nightscout anbefales det å bruke en Lokal Profil. Husk at du her kun velger hvor profilen din ligger lagret. For å bruke den må du velge Profilbytte
+ Velg en av de tilgjengelige algoritmene. De er sortert fra eldst til nyest. De nyeste algoritmene er vanligvis mer kraftfull og aggressiv. Hvis du er en ny looper kan det være fornuftig å starte med AMA og ikke den siste. Ikke glem å lese OpenAPS dokumentasjonen og konfigurer algoritmen før den brukes.
+ Venter på RileyLink tilkobling...\n
+ Merk: Du kan fortsette oppsettet når pumpen er initialisert.\n
+ Start første læringsmål
+ Tillatelse
+ Spør om tillatelse
+ App trenger tillatelse til å bruke Varslinger for å vise meldinger
+ App trenger tilgang til Posisjon for å søke etter Bluetooth og Wifi enheter
+ App trenger tilgang til Lagring for lagre logg filer og eksportere innstillinger
+ Forespørsel
+ Avslutt
+ Åpne meny
+ Lukk meny
+ Plugin innstillinger
+ Fullført, godt gjort!
+ Enda Ikke fullført
+ Tid brukt
+ Poctech
+ Motta BS verdier fra Poctech app
+ Motta BS verdier fra Tomato app (MiaoMiao enhet)
+ Høy temp target øker sensitiviteten
+ = 100]]>
+ Lav temp target reduserer sensitiviteten
+
+ Resistens reduserer BS målverdi
+ Hvis resistens oppdages vil det redusere BS målverdi
+ Sensitivitet øker BS målverdi
+ Når systemet oppdager økt insulinsensitivitet, vil BS målverdi økes
+ Ugyldig oppsett av pumpen. Les dokumentasjonen og sjekk at Quick Info menyen heter QUICK INFO ved hjelp av 360 programvaren.
+ Tilpasset
+ Basis AndroidAPS startet
+ Lagrede innstillinger funnet
+ Varsel: Hvis du aktiverer og kobler til en pumpe, så vil AndroidAPS kopiere basal innstillinger fra din profil over til pumpen og overskrive verdiene som er lagret der. Sjekk at du har riktige basal verdier i AndroidAPS. Hvis du ikke er sikker eller ikke ønsker å overskrive basal verdiene i pumpen, trykk avbryt og koble til pumpen senere.
+ Behandlingsdata er ufullstendige
+ Vedlikeholds innstillinger
+ E-post mottaker
+ Krypter eksporterte innstillinger
+ Antall logger du vil sende
+ Vedlikehold
+ VEDL
+ Flere funksjoner for vedlikehold (f.eks. loggsending, loggsletting).
+ Send logger via e-post
+ Slett logger
+ En behandling (insulin: %1$.2f, karbohydrater: %2$d, tid: %3$s) kunne ikke legges til Behandlinger. Vennligst kontroller og manuelt legg til en registrering der det er aktuelt.
+ eKarbo: %1$d g (%2$d t), forsinkelse: %3$d m
+ Ingen data tilgjengelig for autosens
+ Logginnstillinger
+ Gjenopprett standardinnstillinger
+ NSClient feil. Vurder omstart av NS og NSClient.
+ Versjon %1$s er tilgjengelig
+ Tidsforskyvning
+ Foretrukket APS modus
+ Total
+ Kalkyle
+ Send dagens loggfiler til utviklere og med dette tidspunktet. Uventet situasjon.
+ Minste endrings forespørsel [%]
+ I åpen Loop modus vil AAPS be om en endring hvis forandringen er større enn denne verdien i %. Standard verdi er 20%
+ Søker etter enheter…
+ Sammenkobling fullført
+ Stemmer de viste kodene overens mellom denne enheten og din pumpe?
+ Sammenkobling av Insight
+ Accu-Chek Insight
+ %1$.2f E / %2$.2f E levert
+ %1$s: %2$s
+ Slange byttet
+ Pumpens tid oppdatert
+ Bekreft
+ Demp lyd
+ Pumpe varsling
+ Logg kanyle bytte
+ Logg reservoar bytte
+ Logg slangesett bytte
+ Logg batteri bytte
+ Logg endring i driftsmodus
+ Logg varslinger
+ Aktiver emulering av TBR
+ Bruk forlenget bolus i stedet for temp basaler for å omgå 250%% grensen
+ Slå av vibrasjoner på manuell bolus
+ For bolus og forlenget bolus (bare tilgjengelig med Insight firmware 3.x)
+ Slå av vibrasjoner ved automatisk bolus
+ For SMB og temp basal med TBR emulering (bare tilgjengelig med Insight firmware 3.x)
+ Utsett frakobling [s]
+ Serienummer
+ Programvare versjon
+ UI prosessor programvare versjon
+ PC prosessor programvare versjon
+ MD tel prosessor programvare versjon
+ Sikkerhetsprosessor programvare versjon
+ BT infoside versjon
+ Bluetooth adresse
+ System ID vedlegg
+ Produksjonsdato
+ Slett sammenkobling
+ Tilkoblingsinformasjon
+ Start pumpe
+ Stopp pumpe
+ Driftsmodus
+ Status
+ TDD Bolus
+ TDD Basal
+ TDD Total
+ Gjenoppretter
+ Ikke sammenkoblet
+ Siste tilkobling
+ Startet
+ Stoppet
+ %1$d%% i %2$d / %3$d min
+ Forlenget bolus
+ Kombinasjonsbolus
+ %1$.2f / %2$.2f E i %3$d min
+ Aktiver varsel når slutt på temp basal\n(pumpeinnstilling)
+ Slå av varsel når slutt på temp basal\n(pumpeinnstilling)
+ Oppdater
+ Integrasjon for Accu-Chek Insight pumper
+ Ikke innsatt
+ Siste tilkobling: %1$d min siden
+ TBR: %1$d%% i %2$d / %3$d min
+ Forlenget: %1$.2f / %2$.2f E i %3$d min
+ Kombinasjon: %1$.2f / %2$.2f E i %3$d min
+ TDD: %1$.2f
+ Ampull: %1$.2f E
+ Batt.: %1$d%%
+ Maks pause mellom tilkoblingsforsøk [s]
+ Min pause mellom tilkoblingsforsøk [s]
+ Tilkoblingsforsøk
+ En timeout oppstod i paringsprosessen - restart Bluetooth
+ Søn
+ Lør
+ Fre
+ Tors
+ Ons
+ Tirs
+ Man
+ Brukerdefinerte automeringer
+ Angi et navn på oppgaven.
+ Oppgi minst en trigger.
+ Oppgi minst en aksjon.
+ Allerede aktivert
+ Allerede avslått
+ Allerede pauset
+ Gjenoppta loop
+ Ikke pauset
+ Start temp target
+ Avbryt temp target
+ er mindre enn
+ er lik eller mindre enn
+ er lik som
+ er lik eller større enn
+ er større enn
+ er ikke tilgjengelig
+ BS data er ikke tilgjengelig
+ BS %1$s %2$.0f %3$s
+ BS %1$s %2$.1f %3$s
+ Profil prosent %1$s %2$d
+ IOB %1$s %2$.1f
+ Og
+ Eller
+ Eksklusiv eller
+ Kl %1$s
+ Bruk nettverkslokasjon
+ Bruk GPS posisjon
+ Bruk passiv lokalisering
+ Posisjonstjeneste
+ Auto
+ Automering
+ == ∑ %1$s E
+ Logg sensor endring til NS
+ Opprett hendelse \"Sensor bytte\" i NS automatisk ved start av sensoren
+ Tomato (MiaoMiao)
+ Tomato
+ Ditt Tidepool brukernavn, normalt din e-postadresse
+ Brukernavn for innlogging
+ Ditt passord for Tidepool
+ Passord
+ Test Tidepool innlogging
+ Hvis aktivert, vil opplastinger gå til https://int-app.tidepool.org i stedet for vanlig https://app.tidepool.org/
+ Bruk integrasjon (test) servere
+ Tidepool
+ TDP
+ Laster opp data til Tidepool
+ Last opp CGM data
+ Last opp behandlinger (insulin, karbohydrater)
+ Last opp temp basaler
+ Last opp profilbytter, temp targets
+ Last opp BS tester
+ Sommer/vintertid inntreffer innen 24t
+ Sommer/vintertid inntreffer innen 3t - lukket loop er midlertidig deaktivert
+ intern lagringsbegrensning
+ Frigjør minst %1$d MB fra internminnet! Loop deaktivert!
+ Feil format
+ Temp basal varighet må oppgis i antall %1$d minutter og større enn 0.
+ Feil kode. Kommandoen avbrutt.
+ Ikke konfigurert
+ Profilbytte opprettet
+ Gjentakende tidspunkt
+ Hver
+ Aldri
+ Betingelse:
+ Handling:
+ IOB [U]:
+ Glukose [%1$s]:
+ SLETT
+ ADD
+ KOPIER
+ Legg til ny
+ Versjonskontroll
+ Verifisering av signatur
+ Vi har oppdaget at du kjører en ugyldig versjon. Loop deaktivert!
+ gammel versjon
+ veldig gammel versjon
+ Ny versjon tilgjengelig i minst %1$d dager! Systemet vil bytte til \"stopp innen lavt (LGS)\" etter %2$d dager og loop vil deaktiveres etter %3$d dager
+ 2t
+ Dexcom App (patchet)
+ DXCM
+ Motta BS verdier fra den patchede Dexcom appen.
+ Varsling
+ Varsel: %1$s
+ Meld:
+ Profil prosent
+ Prosent [%]:
+ Start profil %1$d%% i %2$d min
+ Start profil %1$d%%
+ finnes
+ finnes ikke
+ Temp target %1$s
+ Bluetooth tilkobling til enheten %1$s %2$s
+ Tilkobling til Bluetooth enhet
+ WiFi SSID %1$s %2$s
+ Autosens %1$s %2$s %%
+ Autosens %
+ %3$s %1$s %2$s
+ BS forskjell
+ BS forskjell [%1$s]
+ Gjeldende plassering
+ Plassering
+ Lat:
+ Long:
+ Dist [m]:
+ Navn:
+ %1$s %2$s
+ Når
+ Når du er innenfor området
+ Når du er utenfor området
+ Når du går inn i området som heter
+ Når du forlater området som heter
+ Siste bolus
+ Siste bolus for %1$s %2$s min siden
+ COB
+ COB %1$s %2$.0f
+ Oppgavenavn
+ REDIGER
+ Velg en handling
+ Velg en trigger type
+ Triggere:
+ FJERN
+ Forutsetninger:
+ Endre profil til
+ Endre profil til %1$s
+ Siste tilkobling til pumpen
+ Siste tilkobling til pumpen [minutters siden]
+ Siste tilkobling til pumpen %1$s %2$s min siden
+ Send SMS: %1$s
+ Send SMS til alle numre
+ Send SMS med tekst
+ COB vs IOB
+ Bolus begrensning brukt: %1$.2f E til %2$.2f E
+ !!!!! Advarsel: Treg KH absorpsjon oppdaget: %2$d%% av tiden. Dobbeltsjekk din beregning. COB can være misvisende og du risikerer å få for mye insulin !!!!!]]>
+ Doser denne delen av bolus wizard resultat [%]
+ Bolus veiviser utfører beregninger, men bare denne del av beregnet insulin leveres. Nyttig ved bruk av SMB algoritmen.
+ Laster...
+ Utsett
+ Tidsintervall
+ Tid er mellom %1$s og %2$s
+ Mellom
+ Øker maks basaldose fordi innstillingen er lavere enn din maks basal i profilen
+ Ugyldig innhold i meldingen
+ %1$s ISF: %2$.1f
+ %1$.0fg IC: %2$.1f
+ %1$.1fg IC: %2$.1f
+ %1$d%%
+ Bolus wizard
+ min
+ Profilnavn:
+ Valgt:
+ Enheter
+ Ønsker du å bytte profil og forkaste endringer i gjeldende profil?
+ Sletting ferdig
+ Sletting startet
+ Ønsker du å omstarte læringsmålet? Du vil miste fullførte trinn.
+ Velg enheter som du vil vise verdier i
+ Last opp lokale profilendringer til NS
+ DIA
+ IC
+ ISF
+ MÅL
+ Klon
+ Lagre eller nullstill gjeldende endringer først
+ Slette gjeldende profil?
+ Opprette ny lokal profil fra denne profilen?
+ Profilnavnet inneholder prikker.\nDette støttes ikke av NS.\nProfilen er ikke lastet opp til NS.
+ Nedre verdi for målområdet (kun visning)
+ Øvre verdi for målområdet (kun visning)
+ Endre rekkefølge
+ Alder:
+ Vekt:
+ ID:
+ Lagre
+ Mest vanlig profil:
+ Merk: Kun data synlig på denne skjermen vil bli anonymt lastet opp. ID er tilordnet denne installasjonen av AndroidAPS. Du kan sende inn data igjen hvis hovedprofilen din blir endret, men la den kjøre i minst en uke for å se effekten av resultatet i tidsperioden. Din hjelp blir verdsatt.
+ Ugyldig alder
+ Ugyldig vekt
+ Ugyldig % oppføring
+ %1$s: Lav: %2$02d%% Mål: %3$02d%% Høy: %4$02d%%]]>
+ Gjennomsnitt
+ TIR
+ Overvåking av aktivitet
+ Vil du tilbakestille aktivitets statistikk?
+ Statistikk
+ Tilfeldig BS
+ Generer tilfeldige BS data (kun demo formål)
+ BS
+ Verktøy
+ Vis beregning
+ Automasjons hendelse
+ Allerede angitt
+ Slett køen? All data i køen vil gå tapt!
+ Bruk av forlenget bolus funksjon vil deaktivere lukket loop i perioden med forlenget bolus. Vil du virkelig dette?
+ Lukket loop deaktivert på grunn av forlenget bolus
+ \"Telefonkontroll \"
+ Diagram meny
+ SMB forespurt
+ SMB utført
+ Temp basal endring forespurt
+ Temp basal utført
+ Insight pumpe varsler
+ fra Authenticator appen for: %1$s etterfulgt av PIN
+ Aktiver Authenticator
+ Godkjenn kommandoer ved å bruke engangs passord generert av Google Authenticator eller tilsvarende 2 factor autentiseringsapper (2FA).
+ PIN kode som legges til på slutten av token
+ Ytterligere sifre som MÅ memoreres og legges til på slutten av hvert generert engangspassord
+ Oppsett for 2 faktor autentisering
+ Kode som skal kontrolleres:
+ OTP + PIN
+ Bekreftelseskoden består av 6 sifre som vises av Authenticator appen (kjent som OTP) etterfulgt av 3 eller flere siffer for obligatorisk PIN-kode.
+ Tilbakestill Authenticators
+ Tilbakestill Authenticator nøkkel
+ Er du sikker på at du vil tilbakestille Authenticator nøkkel? Dette vil gjøre alle lagrede Authenticators ugyldige, og du må sette dem opp på nytt igjen.
+ Ny Authenticator nøkkel ble generert! Vennligst bruk oppdatert QR kode til å aktivere autentiserere.
+ Eksporterer OTP hemmelig kode
+ Er du sikker på at du vil kopiere OTP hemmelig kode til utklippstavlen?\n\nDu trenger bare det hvis din Authenticator app har problemer med skanning av QRCode og du ønsker å legge den inn manuelt, eller du ønsker å konfigurere maskinvare OTP-kode ved hjelp av dedikert app.
+ OTP hemmelig kode (i base32-format) er eksportert og kopiert til utklippstavlen. Lim den inn i Authenticator app eller hardware OTP system!
+ 1. Installer Authenticator
+ 2. Skann kode for å sette opp AndroidAPS OTP koder
+ 3. Test engangspassord
+ Tilbakestill Authenticators
+ I hver følger telefon installerer du en Authenticator-app som støtter RFC 6238 TOTP token. Populære gratis apper er:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
+ Ved å tilbakestille authenticator vil du gjøre alle lagrede autentiseringer ugyldige. Du må sette alle opp på nytt igjen!
+ Ved tilkobling
+ Ved frakobling
+ Prognoser
+ Avvikskurve
+ Autentisering feilet
+ Absolutt insulinmengde
+ Hovedpassordet brukes for å beskytte backup og tilpasse enkelte sikkerhetsinnstillinger i appen. Husk passordet eller lagre det på et trygt sted.
+ Nåværende hovedpassord
+ Statuslys
+ Kopier innstillingene fra NS
+ Kopiere NS innstillinger (hvis de eksisterer)?
+ Opprinnelig visningstema
+ Tema for lav oppløsning
+ Knapper vises alltid på bunnen av skjermen
+ Stor skjerm
+ Tema
+ Sammenlign profiler
+ Profilhjelper
+ Standard profil
+ Gjeldende profil
+ Tilgjengelige profiler
+ Profiltype
+ Alder: %1$.0f TDD: %2$.0f E
+ Alder: %1$.0f TDD: %2$.0f E %3$d%%
+ Alder: %1$.0f Vekt: %2$.0f kg
+ % av basal
+ DPV standardprofil
+ Open Humans
+ Avslutter oppsett av Open Humans…
+ Dette kan ta litt tid. Ikke slå av telefonen eller avbryt prosessen.
+ Oppsett ferdig
+ Telefonen vil laste opp data til Open Humans snart.
+ Telefonen laster opp data til Open Humans nå.
+ Installasjonen mislyktes
+ Det oppstod en feil. Prøv å logge inn igjen for å fortsette. Beklager & Takk!
+ Dette er et verktøy med åpen kildekode som vil kopiere data til Open Humans. Vi har ingen rettigheter til å dele dine data med tredjeparter uten din eksplisitte godkjenning. Alle data som app og prosjektet mottar vil ha en vilkårlig ID som bare vil bli oversendt Open Humans kontoen med din godkjennelse. Du kan avslutte opplasting og slette opplastede data når som helst via www.openhumans.org.
+ Jeg forstår og godkjenner.
+ Innlogging
+ Utlogging
+ Vil du virkelig logge ut og slutte å donere dine data til vitenskapen?
+ Prosjektmedlems ID: %s
+ Kø størrelse: %d
+ Vilkår for bruk
+ Ikke logget inn
+ Du må først godta vilkårene for bruk.
+ Innlogging vellykket
+ Oppsettet vil bli fullført i bakgrunnen nå. Takk for at du laster opp dine data.\n\nSørg for at AndroidAPS og telefonen er slått på i en kort periode for å fullføre oppsettet.
+ Fullfører innlogging…
+ Doner dine data til vitenskapen
+ OH
+ Du har blitt logget ut fra Open Humans
+ Klikk her for å logge inn igjen hvis dette ikke var hensikten.
+ Last opp kun dersom du er koblet til WiFi
+ Last opp kun ved mobillading
+ Fremdrift: %s
+ Opplastede data
+ Følgende data vil bli lastet opp til din Open Humans konto: glukoseverdier, boluser, karbohydrater, careportalhendelser (bortsett fra merknader), forlengede boluser, profilbytter, totale daglige doser, temp basaler, endringer i BS mål, innstillinger, app versjon, mobilmerke og skjermstørrelser. Hemmelig eller privat informasjon som din Nightscout URL eller API secret vil ikke bli lastet opp.
+ RileyLink status:
+ Filter
+ Klarte ikke å opprette lokal profil. Profilen er ikke gyldig.
+ Avslutte app?
diff --git a/app/src/main/res/values-pl-rPL/exam.xml b/app/src/main/res/values-pl-rPL/exam.xml
index b346bd076c..e469577bda 100644
--- a/app/src/main/res/values-pl-rPL/exam.xml
+++ b/app/src/main/res/values-pl-rPL/exam.xml
@@ -17,7 +17,6 @@
Profil NS może być używany, ale nie jest skonfigurowany.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileTemat: Odłączanie od pompy
- Co należy zrobić przy rozłączeniu pompy?Naciśnij \"WYłącz pompę\" aby AAPS wiedział, że insulina nie jest dostarczana.Naciśnij \"Wstrzymaj pętlę\"aby AAPS zatrzymał pętlę, gdy pompa jest odłączona.Nie zmieniaj niczego w AAPS, po prostu odłącz pompę.
@@ -134,8 +133,8 @@
Wyższe wartości ICprowadzą do mniejszej ilości insuliny dostarczonej do podanej ilości węglowodanów.Niższe wartości IC prowadzą do mniejszej ilości insuliny podanej do wprowadzonej ilości węglowodanów.Załóżmy, że masz 0 COB. Zmiana IC doprowadzi do podania innej ilości insuliny w celu skorygowania twojej wartości BG.
- IC będzie inny, jeśli policzysz jednostkę chleba jako 10 g lub 12 g.
- Znaczenie IC to: Ile jednostek chleba jest pokrytych 1U insuliny.
+ IC będzie inny, jeśli policzysz jednostkę chlebową (wymiennik węglowodanów) jako 10g lub 12g.
+ Znaczenie IC to: Ile jednostek chlebowych (wymienników węglowodanowych) jest pokrytych 1U insuliny.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uTemat: Przełączanie profili Jeśli podasz 90% podczas zmiany profilu…
diff --git a/app/src/main/res/values-pl-rPL/objectives.xml b/app/src/main/res/values-pl-rPL/objectives.xml
index d2daad672f..55915b70dd 100644
--- a/app/src/main/res/values-pl-rPL/objectives.xml
+++ b/app/src/main/res/values-pl-rPL/objectives.xml
@@ -1,6 +1,5 @@
- WsteczStartZweryfikuj%1$d. Zadanie
diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml
index ca0c5919f3..d7ef0e99e5 100644
--- a/app/src/main/res/values-pl-rPL/strings.xml
+++ b/app/src/main/res/values-pl-rPL/strings.xml
@@ -21,17 +21,16 @@
Wyświetla dane posiłków zdefiniowanych w NightscoutProfil insulinowy dla Humalog i Novorapid / NovoLogProfil insulinowy dla Fiasp
+ Profil insulinowy dla LyumjevPozwala na określenie czasu wartości szczytowej działania insuliny i powinno być używane tylko przez zaawansowanych użytkownikówWłącz lub wyłącz działanie pętli.Synchronizuje twoje dane z Nightscout
- Stan algorytmu w 2016Stan algorytmu w 2017Najnowszy algorytm dla zaawansowanych użytkownikówWyświetla bieżący stan twojej pętli i przyciski dla większości typowych działańWyświetla bieżące powiadomienia z krótkim omówieniem działania pętliZdefiniuj profil, który jest dostępny offline.Użycie profilu, który zdefiniowałeś w Nightscout
- Zdefiniuj profil z tylko jednym blokiem czasowym.Integracja z pompą Accu-Chek Combo, wymaga zainstalowania sterownika ruffyIntegracja pompy dla pacjentów podających insulinę w formie wielu zastrzyków dziennieIntegracja z pompami, które nie posiadają jeszcze żadnego sterownika (Open Loop)
@@ -83,13 +82,12 @@
KonfiguracjaPrzeglądProfil Nightscout
- Prosty profil
- Leczenie
+ TerapiaPompa wirtualnaPortalOpiekiPompaKtórą pompę chcesz wykorzystać do AndroidAPS?
- Leczenie
+ TerapiaKtóra wtyczka powinna być używana do obsługi leczenia?ProfilKtóry profil będzie używany w AndroidAPS?
@@ -105,15 +103,13 @@
APSPo ograniczeniachBaza tymczasowa ustawiona przez pompę
- Ostatnie działanieNIE WYBRANO APS LUB NIE UZYSKANO WYNIKUZabezpieczeniaWtyczka jest wyłączonaNaruszenie ograniczeńBłąd podania bolusa
- Wartość bazy [%]Akceptuj nową bazę tymczasową:
- Leczenie
+ TerapiaKalkulatorOgraniczenie nałożone!Bolus:
@@ -140,22 +136,17 @@
InneMiernikSensor
- Węglow.
- InsulinaCzas węglow.
- PodziałCzas trwania
- Procent
- CałkowityNotatkiCzas zdarzeniaProfil
- Wprowadzone przezTyp glukozyNie załadowano profilu z NSBazaTymczasowaBolus PrzedłużonyWersja Nightscout:
+ Brakuje %1$d gUstawienia wyeksportowaneEksportuj ustawienia doImportuj ustawienia z
@@ -171,6 +162,11 @@
Zostaniesz poproszony o hasło główne, które jest potrzebne do odszyfrowania zaimportowanych preferencji.Eksportowanie anulowane! Ustawienia NIE zostały wyeksportowane!Import anulowany! Ustawienia NIE zostały zaimportowane!
+ Nie można zaimportować ustawień!
+ Wróć do ekranu głównego i spróbuj ponownie.
+ Stare hasło główne
+ Ten plik zaszyfrowano innym hasłem głównym. Podaj te stare hasło główne którego używałeś do eksportu, aby odszyfrować plik.
+ W efekcie udanego importu bieżące hasło główne ZOSTANIE ZASTĄPIONE starym hasłem głównym z importowanych ustawień!Wybierz plik do zaimportowaniaProszę sprawdzić ustawienia przed importem:Ustawienia nie mogą być zaimportowane!
@@ -208,7 +204,6 @@
Błąd deszyfrowania, podane hasło jest niepoprawne lub plik ustawień został zmodyfikowany! Może się zdarzyć, że zaimportowany plik został wyeksportowany z innym hasłem głównym.Brak konfiguracji szyfrowania, format ustawień jest nieprawidłowy!Nieobsługiwany lub nieokreślony algorytm szyfrowania!
- wyeksportowano dzisiajwyeksportowano %1$s temuwyeksportowano w dniu %1$swyeksportowano mniej niż godzinę temu
@@ -232,14 +227,14 @@
Minimalna liczba minut która musi upłynąć pomiędzy jednym a drugim zdalnie podawanym bolusemIle co najmniej minut musi upłynąć pomiędzy jednym a drugim bolusemDla twojego bezpieczeństwa, aby zmienić to ustawienie musisz dodać co najmniej 2 numery telefonów.
+ Bolus %1$.2f U podany prawidłowo
+ Zamierzam podać %1$.2f U
+ Bolus %1$.2f U podany prawidłowo
+ Pomyślnie podano %1$.2f U bolusa posiłkowegoCel %1$s na %2$d minutPomyślnie ustawiono cel %1$s na %2$d minutyPomyślnie anulowano cel tymczasowyZezwalaj na komendy zdalne via SMS
- Ustawienia profilu DanaR
- DIA [h]
- Czas aktywności insuliny
- WgrywanieBolus zatrzymanyZatrzymuję bolusPętla (Loop) została wyłączona
@@ -250,12 +245,14 @@
Wartość %1$s jest poza dopuszczalną granicąAby podłączyć pompę odpowiedz kodem %1$sPołączenie z pompą nie powiodło się
- Aby odłączyć pompę na %1d minut odpowiedz kodem %2$s
+ Aby odłączyć pompę na %1$d minut odpowiedz kodem %2$sPompa odłączonaPompa ponownie podłączonaZdalne komendy nie są dozwoloneBolus zdalny niedostępny. Spróbuj ponownie później.
+ Aby rozpocząć bazę %1$.2f U/h przez %2$d min. odpowiedz kodem %3$sAby przełączyć profil na %1$s %2$d%% odpowiedz kodem %3$s
+ Aby rozpocząć bolus przedłużony %1$.2f U przez %2$d min. odpowiedz kodem %3$sAby wprowadzić %1$dg o %2$s odeślij w SMS kod %3$sAby rozpocząć bolus przedłużony %1$d%% przez %2$d min. odpowiedz kodem %3$sAby wstrzymać pętle na %1$d minut odpowiedz kodem %2$s
@@ -264,6 +261,7 @@
Aby wyłączyć pętlę odpowiedz kodem %1$sTymczasowa baza %1$.2fU/h przez %2$d min rozpoczętaBolus przedłużony %1$.2fU na %2$d min. rozpoczęty pomyślnie
+ Pomyślnie wprowadzono %1$d g węglowodanówPróba wprowadzenia %1$dg węglowodanów nie powiodła sięTymczasowa baza %1$d%% przez %2$d min. pomyślnie rozpoczętaRozpoczęcie tymczasowej bazy nie powiodło się
@@ -291,7 +289,6 @@
Pompa nie zainicjowana!Rozpocznij/WypełnijProszę upewnij się, że ilość wypełnienia odpowiada ilości właściwej dla twojego wkłucia!
- InneRozpocznij/Wypełnij standardowe ilości insulinyPrzycisk 1Przycisk 2
@@ -299,7 +296,6 @@
Jednostki:JednostkiDIA
- Zakres docelowy:Zakres do wizualizacji (na wykresie)Oznaczenia wysokiego i niskiego cukru na wykresie w oknie przegląd i na smartwatch\'uZnacznik NISKI
@@ -333,7 +329,6 @@
ACTCONFLOOP
- SPOAPSLPHOME
@@ -358,7 +353,6 @@
UWAGA!\nZwykle nie trzeba zmieniać tych wartości. Proszę NACIŚNIJ TUTAJ i PRZECZYTAJ tekst i upewnij się, że ROZUMIESZ go przed zmianą którejś z tych wartości.Nieprawidłowy numer telefonu SMSKalibracja
- Wysłać kalibrację %1$.1f do xDrip?xDrip+ nie zainstalowanyKalibracja przesłana do xDripKalibracja wysłana. Odbiór musi być dozwolony w xDrip.
@@ -391,12 +385,13 @@
Rozłóż IOB na bolus i IOB bazy na zegarkunie udało się - proszę sprawdzić telefonn/a
- Wiek pacjenta
+ Typ pacjentaDzieckoNastolatekOsoba dorosła
- Osoba dorosła insulino odporna
- Proszę wybierz wiek pacjenta w celu ustawienia wartości limitów bezpieczeństwa
+ Osoba dorosła insulinooporna
+ Ciąża
+ Wybierz typ pacjenta, aby ustawić limity bezpieczeństwaNazwa pacjentaProszę podać nazwę pacjenta lub pseudonim w celu rozróżnienia pomiędzy różnymi konfiguracjamiUżytkownik
@@ -404,7 +399,6 @@
%1$s potrzebuję wyłączenia z optymalizacji baterii, w celu zapewnienia poprawnego działaniaPętla wstrzymanaWstrzymana (%1$d m)
- Superbolus (%1$d m)Wstrzymaj pętleWstrzymaj pętlę na 1hWstrzymaj pętlę na 2h
@@ -427,7 +421,6 @@
Wyślij start app do NSZamykanie aplikacji w celu wprowadzenia ustawień.Jakiego typu insuliny używasz?
- Szybko działająca InsulinaNovorapid, Novolog, HumalogFiaspINS
@@ -440,6 +433,8 @@
Krytyczny czas insuliny [h]Ostrzeżenie o czasie sensora CGM [h]Krytyczny czas sensora CGM [h]
+ Próg ostrzeżenia o poziomie baterii sensora [%]
+ Próg ostrzeżenia o krytycznym poziomie baterii sensora [%]Ostrzeżenie o czasie baterii [h]Krytyczny czas baterii [h]Próg ostrzeżenia o poziomie zbiornika [U]
@@ -466,11 +461,13 @@
Wszystkie dane wysyłane do NS są odrzucane. AAPS jest podłączony do NS, ale nie dokonuje
żadnych zmian w NSAnuluj bolus przedłużony
- Czas sensora
- Czas wkłucia
- Czas insulinyZmień profil
- Czas baterii pompy
+ Sensor
+ Kaniula
+ Insulina
+ Bateria pompy
+ wiek:
+ poziom:Opcje alarmuUtwórz powiadomienia z alarmów NSUtwórz powiadomienia z komunikatów NS
@@ -484,20 +481,14 @@
Detekcja wrażliwości (sensitivity)Który algorytm wrażliwości powinien być używany?SENS
- Wrażliwość Oref0Wrażliwość Oref1Wrażliwość AAPSUstawienia wchłanianiaMaks. czas wchłaniania posiłku [h]Oczekiwany czas w godzinach, w którym wszystkie węglowodany zostają wchłonięte
- SAGE
- IAGE
- CAGE
- PBAGEOAPSUPLDBAS
- EXTUtrzymuj ekran włączonyNie pozwól, aby system Android wyłączał ekran. Zwiększy to zużycie energii, gdy zasilanie sieciowe jest wyłączone.Przy włączonej funkcji Autosens pamiętaj, żeby wprowadzać wszystkie węglowodany. W innym wypadku odchylenia węglowodanów będą błędnie identyfikowane jako zmiany wrażliwości !!
@@ -508,10 +499,6 @@
Wartości nie są przechowywane!Włącz rozgłaszanie do innych aplikacji (takich jak xDrip). Nie należy włączać, jeśli zainstalowana jest więcej niż jedna instancja AAPS lub NSClient!Włącz transmisję lokalnie.
- AKTYWNOŚĆ & REAKCJA
- WĘGLOW. & BOLUS
- CGM & OPENAPS
- POMPACzas trwania [min]OpenAPS SMBWłącz UAM
@@ -523,6 +510,7 @@
Swobodny-Pik OrefSzybko-Działający OrefUltra-Szybki Oref
+ LyumjevDIA %1$f zbyt krótki - przyjmuję %2$f w zamian!Aktywuj profilNIEPRAWIDŁOWY
@@ -550,6 +538,7 @@
Pompa nieosiągalnaPominięte odczyty BGUżyj powiadomień systemowych dla alertów i powiadomień
+ Stopniowo zwiększaj głośność ostrzeżeń i powiadomieńAlarmy lokalneAlarm, jeśli nie są odbierane odczyty BGAlarm, gdy pompa jest nieosiągalna
@@ -563,7 +552,6 @@
Pokaż szczegółowe deltaPokaż deltę z jednym więcej miejscem dziesiętnymJak często SMB zostanie podane w min.
- SMB max. minutMaks. ilość minut dawki bazowej do ograniczenia SMBMaksymalna liczba minut UAM SMBMaks. ilość minut dawki bazowej do ograniczenia SMB dla UAM
@@ -617,7 +605,6 @@
PustyWłaściwyPotrzebna aktualizacja zegara pompy
- OstrzeżenieTBR ANULOWANY ostrzeżenie zostało potwierdzonePompa nie została odnaleziona. Nie podano bolusaPodanie bolusa nie powiodło się. Wygląda na to, że bolus nie został dostarczony. Aby upewnić się, sprawdź pompę, aby uniknąć podwójnego bolusa, a następnie ponownie podaj bolus. Aby uniknąć błędów, bolusy nie są automatycznie ponawiane.
@@ -626,7 +613,6 @@
Za mało insuliny na bolus pozostało w zbiornikuBłąd dostarczania bolusa przedłużonegoSight
- temuUstawiaj neutralne bazy tymczasoweJeśli ta opcja jest włączona, anuluje tymczasową wartość bazową przed końcem każdej godziny. Może to pomóc wyciszyć alarmy/wibracje związane z TBR występujące co godzinę w niektórych pompach.Włącz SMB (Super Mikro Bolusy) zawsze
@@ -638,8 +624,9 @@
Włącz SMB z tymczasowym poziomem docelowym (TT)Włącz SMB gdy tymczasowy poziom docelowy (TT) jest aktywny (TT WkrótcePosiłek, TT ćwiczenia)Włącz SMB z wysokim tymczasowym poziomem docelowym
+ Włącz SMB, gdy aktywowano wysoki cel tymczasowy (Ćwiczenia, powyżej 100 mg/dl lub 5, 5 mmol/l)Insulina
- Węglowod.
+ WęglowodanyPrzyciskiWysyła kalibrację do xDrip+ lub otwartego okna kalibracji G5Otwiera xDrip+, przycisk \"cofnij\" przywraca do AAPS
@@ -671,6 +658,7 @@
Nie podawaj bolusa, tylko zapisz rekordKategoriaPodkategoria
+ Bolus zostanie jedynie odnotowany (nie będzie podany przez pompę)Automatycznie wypełnij brakujące BG z NSSMB ustawiony przez pompęAktywność
@@ -683,7 +671,6 @@
Rozpocznij TT HipoUruchomiona jest wersja dev. Zamknięta pętla jest wyłączona.Tryb Inżynierski włączony
- Tryb inżynierski nie włączony i nie pracuje wersja \"kandydat do wydania\" (RC)Wczytuje profil bazowyHistoria pompy zmieniła się po wykonaniu obliczenia bolusa. Bolus nie został dostarczony. Proszę, przelicz ponownie, jeśli wciąż potrzebujesz bolusa.Bolus został pomyślnie dostarczony, ale dodanie wpisu leczenia nie powiodło się. Może się to zdarzyć, jeśli w ciągu ostatnich dwóch minut podano dwa małe bolusy o tej samej wielkości. Sprawdź historię pompy i leczenie i użyj PortaluOpieki, aby dodać brakujące wpisy. Make sure not to add any entries for the exact same minute and same amount.
@@ -693,7 +680,6 @@
Dawka podstawowa zmieniła się na pompie, ale jej odczyt nie powiódł sięSprawdzanie zmian w historiiWielokrotne bolusy o tej samej wielkości w tej samej minucie zostały właśnie zaimportowane. Do leczenia można dodać tylko jeden taki rekord. Sprawdź pompę i ręcznie dodaj zapis bolusa za pomocą zakładki PortalOpieki. Upewnij się, że tworzysz bolus z czasem, którego nie używa żaden inny bolus.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)Ostatni bolus jest starszy niż 24 godziny lub jest w przyszłości. Sprawdź, czy data na pompie jest ustawiona prawidłowo.Czas/data dostarczonego bolusa na pompie wydaje się błędna, IOB jest prawdopodobnie niepoprawny. Sprawdź czas/datę pompy.Brakuje ZmianyProfilu. Proszę wykonać ZmianęProfilu lub nacisnąć \"Aktywuj Profil\" w ProfiluLokalnym
@@ -724,7 +710,6 @@
SMB nie dozwolone w trybie otwartej pętliPosiłekponowne uruchomienie
- Odłączony (%1$d m)Maksymalna, całkowita IOB, której OpenAPS nie może przekroczyć [U]Ta wartość jest nazywana Max IOB w OpenAPS\nOpenAPS nie poda więcej insuliny jeżeli obecna IOB jest większa niż ta wartośćPompa zatrzymana
@@ -738,7 +723,6 @@
PoprzedniKreator konfiguracjiZAKOŃCZ
- Wybierz swój językPierwszy stopień przyrostu insulinyDrugi stopień przyrostu insulinyTrzeci stopień przyrostu insuliny
@@ -768,27 +752,25 @@
Ustawienia ogólneWłącz NSClientWitaj w kreatorze konfiguracji. Poprowadzi Cię on przez proces instalacji\n
- Ustawienia pompyOdczyt stanuZmiany muszą być dokonane w NSPomiń Kreatora konfiguracjiNaciśnij przycisk poniżej, by umożliwić AndroidAPS wprowadzenie zmian insuliny bazowej
- Skonfiguruj wtyczkę APS
- Skonfiguruj wtyczkę wrażliwościWtyczka wrażliwości używana jest w celu określenia wrażliwości i kalkulacji COB. Więcej informacji na:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient obsługuje połączenia z Nightscout. Można teraz pominąć tę część, ale nie będziesz mógł wykonać Zadań (programu do nauki), dopóki nie dokończysz tej konfiguracji.Pamiętaj: nowe profile insuliny wymagają ustawienia DIA (czas działania insuliny) powyżej 5h. DIA między 5-6h na nowym profilu odpowiada 3h DIA na starych profilach insuliny.
- Skonfiguruj źródło BGProszę wybrać źródło profilu. Jeśli pacjent jest dzieckiem, należy skorzystać z profilu Nightscout. Jeśli nikt nie obserwuje twojej terapii przez Nightscout, prawdopodobnie wolisz profil Lokalny. Przypomnienie - wybierasz tylko źródło profilu. Musisz go później aktywować za pomocą \"Przełącznika profilu\"Wybierz jeden z dostępnych algorytmów. Ułożone są one od najstarszych do najnowszych. Nowszy algorytm jest zazwyczaj bardziej wydajny i agresywny. Jeśli jesteś nowym użytkownikiem, lepiej zacznij od zaawansowanego asystenta posiłku AMA, a nie od najnowszego algorytmu. Zapoznaj się koniecznie z dokumentacją OpenAPS przed wybraniem odpowiedniego algorytmu i jego konfiguracją.
+ Oczekiwanie na połączenie RileyLink…\n
+ Uwaga: Możesz kontynuować konfigurację po zainicjowaniu pompy.\nRozpocznij swoje pierwsze ZadanieUprawnieniaZapytaj o uprawnieniaAplikacja wymaga uprawnienia systemowego okna dla powiadomieńAplikacja wymaga dostępu do lokalizacji dla zarządzania bluetoothem i identyfikacją Wi-Fi
+ Aplikacja wymaga zgody na zapis do pamięci, aby móc przechować pliki logów i eksportować ustawieniaŻądanie
- Skonfiguruj wtyczkę insulinyWyjścieOtwórz menuZamknij menu
@@ -828,7 +810,6 @@
Ustawienia logówPrzywróć ustawienia domyślneUsterka NSClient. Spróbuj zrestartować NS i NSClient.
- ASWersja %1$s dostępnaPrzesunięcie czasuPreferowany tryb APS
@@ -842,6 +823,7 @@
Czy kody wyświetlone na tym urządzeniu i na twojej pompie pasują?Parowanie InsightAccu-Chek Insight
+ podano %1$.2f U / %2$.2f U%1$s: %2$sDren zmienionyCzas pompy uaktualniony
@@ -899,6 +881,7 @@
Przedłużony: %1$.2f / %2$.2f U na %3$d minMultiwave (zwykły + przedłużony): %1$.2f / %2$.2f U for %3$d minTDD: %1$.2f
+ Zbiornik: %1$.2f UBat.: %1$d%%Max. czas odzyskiwania [s]Min. czas odzyskiwania [s]
@@ -968,6 +951,7 @@
limit wielkości pamięci wewnętrznejZwolnij co najmniej %1$d MB z pamięci wewnętrznej! Pętla zatrzymana!Błędny format
+ Czas trwania TBR musi być wielokrotnością %1$d minut i większy niż 0.Zły kod. Polecenie anulowano.Nie skonfigurowanoZmiana profilu wykonana
@@ -1041,6 +1025,8 @@
Wyślij SMS: %1$sWyślij SMS do wszystkich numerówWyślij SMS z tekstem
+ COB vs IOB
+ Zastosowano ograniczenie bolusa: %1$.2f U do %2$.2f U!!!!! Wykryto powolne wchłanianie węglowodanów: %2$d%% czasu. Sprawdź ponownie swoje obliczenia. COB mogły być przeszacowane przez co mogło być podane zbyt dużo insuliny !!!!!]]>Dostarcz tą część dawki insuliny z wyniku kalkulatora bolusa [%]Kreator bolusa wykonuje obliczenia, ale tylko ta część obliczonej dawki insuliny jest dostarczana. Pomocne z algorytmem SMB.
@@ -1061,12 +1047,9 @@
Wybrany:JednostkiCzy chcesz przełączyć profil i porzucić zmiany wprowadzone w bieżącym profilu?
- Włącz
- WyłączWyczyść skończoneWyczyść rozpoczęteCzy chcesz zresetować czas rozpoczęcia zadania? Możesz utracić postępy.
- Nie wybrano pompyWybierz jednostki, w których chcesz wyświetlać wartościPrześlij zmiany w profilu lokalnym do NSDIA
@@ -1087,9 +1070,9 @@
WyślijNajczęściej używany profil:Uwaga: Tylko dane widoczne na tym ekranie zostaną anonimowo przesłane. Tej instalacji AndroidAPS przypisano ID. Możesz przesłać dane ponownie jeśli twój główny profil ulegnie zmianie, ale pozwól mu działać przez co najmniej tydzień aby zobaczyć jego wpływ na wartość czasu w zakresie. Dziękujemy za wsparcie i pomoc.
- AnkietaNieprawidłowy wpis wiekuNieprawidłowy wpis wagi
+ Nieprawidłowa wartość procentowa%1$s: Od: %2$02d%% Cel: %3$02d%% Do: %4$02d%%]]>ŚrednioTIR
@@ -1106,31 +1089,35 @@
Wyczyścić kolejkę? Wszystkie dane w kolejce zostaną utracone!Użycie funkcji Extended bolus spowoduje zatrzymanie trybu pętli zamkniętej na czas działania przedłużonego bolusa. Czy na pewno tego chcesz?Zamknięta pętla wyłączona, ponieważ działa Extended Bolus (bolus przedłużony)
- EB\"SprawdzanieTelefonu(em)\"Menu wykresu
- ASŻądany czas SMBCzas wykonywania SMBŻądany czas bazy tymczasowejCzas wykonywania bazy tymczasowejAlarmy pompy Insight
+ z aplikacji Authenticator dla: %1$s, z doklejonym PIN-emWłącz uwierzytelnianieUwierzytelnianie komend za pomocą haseł jednorazowych generowanych przez aplikację Google Authenticator lub podobnych aplikacji 2FA.
+ Dodatkowy obowiązkowy PIN na końcu tokenuDodatkowe cyfry, które powinny być zapamiętywane i przyklejone na końcu każdego wygenerowanego hasła jednorazowegoUstawienia uwierzytelnienia
- OTP do sprawdzenia:
+ Kod do sprawdzenia:
+ OTP + PIN
+ Kod weryfikacyjny składa się z 6 cyfr wyświetlanych przez aplikację uwierzytelniającą (tzw. OTP) po których następują co najmniej 3 cyfry obowiązkowego PIN-u.Resetuj uwierzytelnianieResetuj klucz uwierzytelnianiaCzy na pewno zresetować klucz uwierzytelniający? Spowoduje to, że wszystkie aktualnie skonfigurowane uwierzytelniania będą niepoprawne i konieczne będzie ponowne ich skonfigurowanie.Nowy klucz uwierzytelniający został wygenerowany! Proszę użyć zaktualizowanego kodu QRCode do potwierdzenia uwierzytelniania.
+ Eksportowanie sekretu OTP
+ Czy na pewno chcesz skopiować klucz tajny OTP do schowka?\n\nMożesz tego potrzebować jeśli Twoja aplikacja uwierzytelniająca (authenticator) ma problemy ze skanowaniem kodu QR, chcesz wprowadzić klucz ręcznie lub chcesz skonfigurować sprzętowy token OTP za pomocą dedykowanej aplikacji.
+ Klucz tajny OTP (w formacie Base32) został wyeksportowany i skopiowany do schowka. Wklej go przy ręcznym dodawaniu konta w aplikacji authenticator lub użyj w aplikacji konfigurującej tokeny sprzętowe!1. Zainstaluj uwierzytelnianie2. Zeskanuj kod, aby skonfigurować kody OTP AndroidAPS3. Sprawdź hasło jednorazoweResetuj uwierzytelnianieNa każdym telefonie śledzącym zainstalować aplikację uwierzytelniania obsługującą tokeny TOTP RFC 6238 Popularne darmowe aplikacje:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- NIE UDOSTĘPNIAJ tego kodu online!\nUżyj go tylko do konfiguracji aplikacji uwierzytelniania na telefonach śledzących.Resetowanie uwierzytelniania powoduje, że wszystkie już ustawione uwierzytelnienia stają się niepoprawne (przestają działać). Trzeba będzie je jeszcze raz skonfigurować!Przy połączeniuPrzy rozłączeniu
@@ -1144,6 +1131,7 @@
Kopiowanie ustawień z NSCzy skopiować ustawienia NS (jeśli istnieją)?Motyw oryginalny
+ Mały ekranPrzyciski są zawsze wyświetlane na dole ekranuDuży ekranMotyw
@@ -1154,5 +1142,39 @@
Dostępny profilTyp profiluWiek: %1$.0f TDD: %2$.0f U
+ Wiek: %1$.0f TDD: %2$.0f U %3$d%%Wiek: %1$.0f Waga: %2$.0f kg
+ % bazy
+ Domyślny profil DPV
+ Open Humans
+ Kończenie konfiguracji Open Humans…
+ To może chwilę potrwać. Nie wyłączaj telefonu ani tej wtyczki.
+ Konfiguracja zakończona
+ Twój telefon wkrótce prześle dane do Open Humans.
+ Twój telefon przesyła teraz dane do Open Humans.
+ Konfiguracja nie powiodła się
+ Wystąpił błąd. Spróbuj zalogować się ponownie, aby kontynuować. Przepraszamy & dziękujemy!
+ To jest narzędzie open source, które skopiuje Twoje dane do projektu Open Humans. Nie zachowujemy żadnych praw do dzielenia się Twoimi danymi z osobami trzecimi bez Twojej wyraźnej zgody. Dane, które otrzymują projekt i aplikacja są identyfikowane za pomocą losowego identyfikatora użytkownika i będą bezpiecznie przesyłane na konto Open Humans za Twoją zgodą dla tego procesu. Możesz zatrzymać przesyłanie i usunąć swoje już przesłane dane w dowolnym momencie za pośrednictwem strony www.openhumans.org.
+ Rozumiem i zgadzam się.
+ Zaloguj się
+ Wyloguj się
+ Czy na pewno chcesz się wylogować i zaprzestać przekazywania danych na rzecz nauki?
+ Identyfikator członka projektu: %s
+ Rozmiar kolejki: %d
+ Warunki użytkowania
+ Nie zalogowano
+ Najpierw musisz zaakceptować warunki użytkowania.
+ Pomyślnie zalogowano
+ Konfiguracja zostanie teraz zakończona w tle. Dziękujemy za przesłanie swoich danych.\n\nProszę nie wyłączaj telefonu ani tej wtyczki jeszcze przez chwilę, aby umożliwić dokończenie się konfiguracji.
+ Kończenie logowania…
+ Przekaż swoje dane na rzecz nauki
+ OH
+ Zostałeś wylogowany z Open Humans
+ Kliknij tutaj, aby zalogować się ponownie, jeśli wylogowanie nie było celowe.
+ Prześlij tylko jeśli połączono poprzez WiFi
+ Prześlij tylko gdy telefon jest ładowany
+ Stan procesu: %s
+ Przesłane dane
+ Następujące dane zostaną przesłane na konto Open Humans: wartości Glikemii, bolusy, węglowodany, zdarzenia z portalu opieki (z wyjątkiem notatek), rozszerzone bolusy, przełączenia profilu, całkowite dawki dobowe, bazy tymczasowe, cele tymczasowe, preferencje, wersja aplikacji, model urządzenia i wymiary ekranu. Dane niejawne lub prywatne, takie jak adres URL strony Nightscout lub klucz autoryzacji API, nie zostaną przesłane.
+ Stan RileyLink:
diff --git a/app/src/main/res/values-pt-rBR/exam.xml b/app/src/main/res/values-pt-rBR/exam.xml
index cd256141c4..38ca9b9e4b 100644
--- a/app/src/main/res/values-pt-rBR/exam.xml
+++ b/app/src/main/res/values-pt-rBR/exam.xml
@@ -17,7 +17,6 @@
Perfil NS pode ser usado, mas não configurado.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileTópico: Desconectando-se da bomba
- O que deve ser feito ao desligar a bomba?Clique em \'Desligar bomba\' para que o AAPS saiba que nenhuma insulina será entregue.Clique em \'Suspender loop\' para que AAPS pare o looping enquanto a bomba estiver desconectada.Não altere nada no AAPS, apenas desconecte a bomba.
@@ -134,8 +133,6 @@
Proporções IC mais altos levam a menos insulina entregue para uma dada quantidade de carboidratos.Proporções IC mais baixos levam a menos insulina entregue para uma dada quantidade de carboidratos.Se tiver 0 COB, alterar a proporção IC irá levar a uma quantidade diferente de insulina para corrigir um determinado valor da glicemia.
- O IC será diferente se você contar a unidade de pão como 10g ou 12g.
- O significado do IC é: Quantos pães são cobertas por 1U de insulina.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uTópico: Alternando Perfil Ao especificar 90% na mudança de perfil…
diff --git a/app/src/main/res/values-pt-rBR/objectives.xml b/app/src/main/res/values-pt-rBR/objectives.xml
index 2f75aa94e4..222f87c460 100644
--- a/app/src/main/res/values-pt-rBR/objectives.xml
+++ b/app/src/main/res/values-pt-rBR/objectives.xml
@@ -1,6 +1,5 @@
- VoltarIniciarVerificar%1$d. Objetivo
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 9e7baf1bad..046bc6af79 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -24,14 +24,12 @@
Permite que você defina o pico da atividade de insulina, deve ser usado apenas por usuários avançadosAtive ou desative a implementação ativando o loop.Sincroniza seus dados com o Nightscout
- Estado do algoritmo em 2016Estado do algoritmo em 2017Algoritmo mais recente para usuários avançadosExibe o estado atual do seu loop e botões para ações mais comunsMostra uma notificação em curso com um breve resumo do que o seu loop está a fazerDefina um perfil que está disponível offline.Fornece o perfil definido no Nightscout
- Defina um perfil com apenas um bloco de cada vez.Integração para bombas Accu-Chek Combo, requer ter o ruffy instaladoIntegração para as pessoas que fazem múltiplas injeções diárias para a sua terapia de diabetesIntegração para as bombas que não têm qualquer driver ainda (Open Loop)
@@ -83,7 +81,6 @@
ConfiguradorVisão geralPerfil NS
- Perfil simplesTratamentosBomba virtualCareportal
@@ -105,13 +102,11 @@
APSDepois das restrições processadasBasal temporária definida pela bomba
- Ultima execuçãoSEM APS SELECIONADO OU RESULTADO FORNECIDOSegurançaPlugin está desativadoViolação das restriçõesErro na entrega do bolus
- Valor da Basal [%]Aceitar nova basal temporária:TratamentoCalculadora
@@ -140,17 +135,11 @@
OutroMedidorSensor
- Carboidratos
- InsulinaHora do Carbo
- DividirDuração
- Porcentagem
- AbsolutoNotasHora do EventoPerfil
- Introduzido porTipo de glicoseNenhum perfil carregado de NS aindaBasal Temporária
@@ -206,7 +195,6 @@
Erro de desencriptação, a senha é inválida ou configurações de arquivo foram modificadas! Pode acontecer que o arquivo importado foi exportado com uma senha mestre diferente.Configuração de encriptação ausente, formato de configurações é inválido!Algoritmo de encriptação não suportado ou não especificado!
- exportado hojeexportado %1$s atrásexportado há menos de uma horaCondições de Utilização
@@ -232,10 +220,6 @@
Alvo %1$s para %2$d minutos definido com sucessoAlvo Temp cancelado com êxitoPermitir comandos remotos via SMS
- Definições perfil DanaR
- DIA [h]
- Duração da Insulina Ativa
- EnviandoBolus paradoParando o bolusLoop foi desativado
@@ -281,7 +265,6 @@
Bomba não inicializada!Purgar/PreencherPor favor certifique-se que o valor corresponde ao especificado para o seu conjunto de infusão!
- OutroPurgar/Preencher os valores padrõesBotão 1Botão 2
@@ -289,7 +272,6 @@
Unidades:UnidadesDIA
- Intervalo Alvo:Intervalo para visualizaçãoMarca alta e baixa para as cartas em Visão geral e SmartwatchMarca Baixo
@@ -323,7 +305,6 @@
ACTCONFLOOP
- PSOAPSPLInício
@@ -348,7 +329,6 @@
Atenção!\n Normalmente não é necessário modificar os valores abaixo. Por favor PRESSIONE AQUI e LEIA o texto para garantir que ENTENDE as consequenciais antes de alterar algum destes valores.SMS número de telefone inválidoCalibração
- Enviar calibração %1$.1f para o xDrip?xDrip+ não está instaladoCalibração enviada para o xDripCalibração enviada. Recepção têm de estar activada no xDrip.
@@ -381,12 +361,10 @@
Dividir IOB entre IOB de bolus e de basal na face do relógionão foi bem sucedido - por favor, verifique o telefonen/a
- Idade do PacienteCriançaAdolescenteAdultoAdulto resistente insulina
- Por favor seleccione a idade do diabético para definir os limites de segurançaNome do PacientePor favor, forneça nome do paciente ou apelido para diferenciar entre várias configuraçõesUsuário
@@ -394,7 +372,6 @@
%1$s necessita de autorizar a não optimização da bateria para assegurar a performance necessáriaLoop suspensoSuspendido (%1$d m)
- Superbólus (%1$d m)Suspender loopSuspender loop por 1hSuspender loop por 2h
@@ -417,7 +394,6 @@
Registar inicio da app no NSA sair da aplicação para aplicar as configurações.Qual o tipo de insulina que está a utilizar?
- Insulina de ação rapidaNovorapid, Novolog, HumalogFiaspINS
@@ -442,11 +418,7 @@
Sem envio para NSTodos os dados enviados para NS são descartados. AAPS está conectado ao NS, mas não é feita nenhuma alteração no NSCancelar Bólus Estendido
- Idade do sensor
- Idade da Canula
- Idade de InsulinaFazer Mudança De Perfil
- Idade bateria bombaOpções AlarmeTempo limite para dados obsoletos [min]Tempo limite para Urgência por dados obsoletos [min]
@@ -458,20 +430,14 @@
Detecção sensibilidadeQue algoritmo de sensibilidade deve ser usado?SENS
- Sensibilidade Oref0Sensibilidade Oref1Sensibilidade AAPSConfigurações de absorçãoTempo máx. absorção refeição [h]Tempo em horas, espectável para que todos os hidratos de carbono da refeição sejam absorvidos
- SAGE
- IAGE
- CAGE
- PBAGEOAPSUPLDBAS
- ESTManter a tela ligadaImpedir Android de desligar o ecrã. Isto irá consumir muita bateria quando não ligado ao carregador.Ao ativar a função Autosense lembre-se de introduzir todos os carboidratos (carbs) que comeu. Caso contra contrário os desvios de carbs serão erroneamente identificados como uma variação da sensibilidade!!
@@ -482,10 +448,6 @@
Valores não guardados!Ative as transmissões para outros apps (como xDrip). Não ative se você tiver mais de uma instância de AAPS ou NSClient instalada!Ativar partilha local.
- ATIVIDADE & FEEDBACK
- CARBOS & BOLUS
- CGM & OPENAPS
- BOMBADuração [min]SMB OpenAPSAtivar UAM
@@ -536,7 +498,6 @@
Mostrar Delta detalhoMostrar delta com mais um ponto decimalCom que frequência em min os SMBs serão dados
- SMB máx. minutosLimite de minutos de basal para SMBUAM SMB máx minutosMax minutos de basal para limitar SMB para UAM
@@ -588,7 +549,6 @@
VazioNormalNecesário actualizar relógio da bomba
- AvisoBasal Temporária CANCELADA. O aviso foi confirmadoNão foi possivel establecer comunicação com a bomba. Nenhum bolus foi administrado.Administração de bolus falhou. Nenhum bolus parece ter sido administrado. Para confirmar, por favor verifique a bomba de forma a evitar uma dupla administração de bolus e programe novamente o bolus. De forma a evitar qualquer problema, os bolus não são reprogramados de forma automatica.
@@ -597,7 +557,6 @@
Não há insulina suficiente no reservatório para bolusErro na entrega Bólus EstendidoVisão
- atrásSMB sempre activadoSMB sempre activo independentemente dos bolus. Possível apenas quando o medidor tive um bom filtro de dados como o G5Ativar SMB após carbos
@@ -649,7 +608,6 @@
Começar TT HipoA correr a versão dev. O Loop fechado está desabilitado.Modo engenheiro activado
- Modo de engenharia não habilitado e não no na versão mestraLendo perfil basalO histórico da bomba foi alterado após o cálculo do bolo ter sido realizado. O bolus não foi injectado. Por favor, verifique se bolus ainda é necessário.O bolus foi injectado, mas não foi possível adicionar ao histórico. Isto é possível se dois bolus do mesmo valor baixo foram administrados nos últimos dois minutos. Por favor verifique o histórico da bomba e use o Careportal para adicionar os dados em falta caso necessário. Cuidado para não adicionar dados com o mesmo valor no mesmo minuto.
@@ -659,7 +617,6 @@
Rácio da basal foi alterado na bomba, mas a leitura falhouVerificando alterações de históricoBólus múltiplos, com a mesma quantidade e no mesmo minuto acabaram de ser importados. Apenas um registo pôde ser adicionado aos tratamentos. Por favor confirma na bomba e adicione o registo de bólus manualmente, utilizando o separador do Careportal. Tenha em atenção que deve criar um bólus com um tempo em que nã oexistem outros registos de bólus.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)O último bólus tem mais de 24 horas ou está no futuro. Por favor verifique se a data está definida correctamente na bomba.Hora/data da entrega do bólus na bomba parece errado, IOB aparentemente está incorrecto. Verifique hora/data na bomba.TrocaPerfil em falta. Por favor faça uma troca de perfil ou pressione \"Ativar Perfil\" em PerfilLocal.
@@ -690,7 +647,6 @@
SMB não permitido no modo open loopAlimentosrepor
- Desligado (%1$d m)Máximo total IOS OpenAPS não pode superar [U]Este valor é chamado de Max IOB em contexto de OpenAPS\nOpenAPS não adicionará mais insulina se o IOB atual for maior que este valorBomba parada
@@ -704,7 +660,6 @@
AnteriorAssistente de ConfiguraçãoTERMINAR
- Selecione o seu IdiomaPrimeiro incremento insulinaSegundo incremento insulinaTerceiro incremento insulina
@@ -734,18 +689,14 @@
Configurações geraisAtivar NSClienteBem-vindo ao assistente de configuração. Vai guiá-lo(a) através do processo de instalação\n
- Configurações da bombaLer estadoAlterações devem ser feitas no NSSaltar assistente de configuraçãoPressione o botão abaixo para ativar o AndroidAPS para sugerir/fazer alterações basais
- Configurar plugin APS
- Configurar plugin SensibilidadePlugin de Sensibilidade é usado para detecção de sensibilidade e cálculos COB. Para mais info visite:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSCliente gere a ligação ao Nightscout. Pode saltar esta parte mas não será possível passar os objetivos até que o configure.Lembre-se: novos perfis de insulina requerem diâmetro de pelo menos 5h. DIA 5–6h no novo perfil é igual ao diâmetro 3h nos antigos perfis de insulina.
- Configure a fonte das glicemiasPor favor selecione 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 ativar executando \"Troca Perfil\"Seleccione um dos algoritmos disponíveis. Eles são classificados do mais antigo para o mais recente. Algoritmo mais recente é geralmente mais forte e mais agressivo. Assim, se você é novo looper, poderá provavelmente começar com AMA e não com a versão mais recente. Não se esqueça de ler a documentação de OpenAPS e configurá-lo antes de usar.Iniciar primeiro objetivo
@@ -753,7 +704,6 @@
Pedir permissãoAplicação precisa de permissão de janela do sistema para notificaçõesPedido
- Configurar plugin InsulinaSairAbrir a navegaçãoFechar a navegação
@@ -793,7 +743,6 @@
Definições de registoRepor definições por defeitoErro de funcionamento do NSCliente. Pondere reiniciar o NS e NSCliente.
- ASDisponível %1$s disponívelFuso horárioModo APS preferido
@@ -1018,12 +967,9 @@
Seleccionado:UnidadesDeseja mudar de perfil e descartar as alterações feitas no perfil atual?
- Ligado
- DesligadoLimpeza terminadoLimpeza iniciadoDeseja reiniciar o objetivo? Pode perder seu progresso.
- Nenhuma bomba seleccionadaSeleccione as unidades em que deseja exibir os valoresCarregar as alterações do perfil local para NSDIA
@@ -1040,7 +986,6 @@
EnviarPerfil mais comum:Nota: Apenas os dados visíveis neste ecrã serão enviados anonimamente. O ID é atribuído a esta instalação do AndroidAPS. Você pode enviar dados novamente se o perfil principal for alterado, mas deixá-lo rodar pelo menos uma semana para tornar o resultado visível no intervalo de tempo. Sua ajuda é apreciada.
- QuestionárioEntrada de idade inválidaEntrada de peso inválida%1$s: Hipo: %2$02d%% Dentro: %3$02d%% Hiper: %4$02d%%]]>
@@ -1058,10 +1003,8 @@
Limpar fila? Todos os dados na fila serão perdidos!O uso do Bólus Estendido irá parar o modo Closed Loop no tempo do bólus estendido. Quer realmente isso?Closed Loop desabilitado por causa da execução do Bólus Estendido
- BE\"VerificadorTelefone\"Menu do Gráfico
- ASHora de solicitação SMBHora de execução do SMBHora de solicitação Basal Temp
@@ -1072,7 +1015,6 @@
Autenticar comandos usando Uma-Password-Única que sejam geradas pelo Google Authenticator ou app 2FA similar.Dígitos adicionais que devem ser memorizados e colados no final de cada Uma-Password-Única que seja geradaConfiguração do Autenticador
- OTP para verificar:Repor AutenticadoresRepor Chave AutenticadorTem certeza de redefinir chave Authenticador? Ele tornará todos os Authenticators configurados atualmente como inválidos, e precisará de os configurar novamente.
@@ -1082,7 +1024,6 @@
3. Teste Uma-Password-ÚnicaRepor AutenticadoresInstalar 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
- NÃO PARTILHE este código online!\nUse-o apenas para a instalação da app Autenticador nos telefones seguidores.Ao repor o autenticador, torna inválidos todos os autenticadores já provisionados. Precisará de os configurar novamente!Ao ligarAo desligar
diff --git a/app/src/main/res/values-pt-rPT/exam.xml b/app/src/main/res/values-pt-rPT/exam.xml
index 4ce02a40a9..52d761bb72 100644
--- a/app/src/main/res/values-pt-rPT/exam.xml
+++ b/app/src/main/res/values-pt-rPT/exam.xml
@@ -17,7 +17,6 @@
Perfil NS pode ser usado, mas não configurado.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileTópico: Desligar a Bomba
- O que deve ser feito ao desligar a bomba?Clique em \'Desligar bomba\' para que o AAPS saiba que nenhuma insulina está a ser administrada.Clique em \'Suspender loop\' para que AAPS pare o looping enquanto a bomba estiver desconectada.Não altere nada no AAPS, apenas desconecte a bomba.
@@ -134,8 +133,6 @@
Rácios IC mais altos levam a menos insulina administrada para uma dada quantidade de hidratos.Rácios IC mais baixos levam a menos insulina administrada para uma dada quantidade de hidratos.Se tiver 0 COB, alterar o rácio IC irá levar a uma quantidade diferente de insulina para corrigir um determinado valor da Glic.
- IC será diferente se contar a unidade de pão como 10g ou 12g.
- O significado do IC é: Quantas unidades de pão são cobertas por 1U de insulina.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uTópico: Mudança De Perfil Ao especificar 90% na mudança de perfil…
diff --git a/app/src/main/res/values-pt-rPT/objectives.xml b/app/src/main/res/values-pt-rPT/objectives.xml
index 40678732c6..9df94fcb0e 100644
--- a/app/src/main/res/values-pt-rPT/objectives.xml
+++ b/app/src/main/res/values-pt-rPT/objectives.xml
@@ -1,6 +1,5 @@
- VoltarIniciarVerificar%1$d. Objectivo
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index cfd783789c..8807e098b1 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -21,17 +21,16 @@
Exibe as predefinições de comida definidas no NightscoutPredefinição de Insulina Humalog e NovoRapid / NovoLogPredefinição de Insulina Fiasp
+ Predefinição para Insulina LyumjevPermite definir o pico de atividade da insulina e deve ser usado somente por usuários avançadosActivar ou desactivar a aplicação que desencadeia o loop.Sincroniza os seus dados com o Nightscout
- Estado do algoritmo em 2016Estado do algoritmo em 2017Algoritmo mais recente para usuários avançadosExibe o estado actual do loop e botões para acções mais comunsMostra uma notificação em curso com um breve resumo do que o seu loop está a fazerDefina um perfil que está disponível offline.Fornece o perfil definido no Nightscout
- Definir um perfil com apenas um bloco de tempo.Integração para bombas Accu-Chek Combo, requer ter o ruffy instaladoIntegração para as pessoas que fazem múltiplas injeções diárias para a sua terapia de diabetesIntegração para as bombas que não têm qualquer driver ainda (Open Loop)
@@ -83,7 +82,6 @@
ConfiguradorVisão geralPerfil NS
- Perfil simplesTratamentosBomba virtualCareportal
@@ -105,13 +103,11 @@
APSDepois das restrições processadasBasal temporária definida pela bomba
- Ultima execuçãoNÃO EXISTE NENHUM APS SELECIONADO OU RESULTADO FORNECIDOSegurançaPlugin está desativadoViolação das restriçõesErro na administração do bólus
- Valor da Basal [%]Aceitar nova basal temporária:TratamentoCalculadora
@@ -140,17 +136,11 @@
OutroMedidorSensor
- Hidratos
- InsulinaTempo Hidratos
- DividirDuração
- Percentagem
- AbsolutoNotasHora do EventoPerfil
- Inserido porTipo de glicoseSem perfil carregado do NSBasalTemp
@@ -214,7 +204,6 @@
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 Mestra diferente.Configuração de encriptação ausente, formato de configurações é inválido!Algoritmo de encriptação não suportado ou não especificado!
- exportado hojeexportado há %1$sexportado às %1$sexportado há menos de uma hora
@@ -246,10 +235,6 @@
Alvo %1$s para %2$d minutos definido com sucessoAlvo Temp cancelado com êxitoPermitir comandos remotos via SMS
- Definições perfil DanaR
- DIA [h]
- Duração da Insulina Activa
- A enviarO bolus parouA parar o bolusLoop foi desactivado
@@ -260,7 +245,6 @@
O valor %1$s está fora dos limites permitidosPara ligar a bomba responda com o código %1$sLigação à bomba falhou
- Para desligar a bomba por %1d minutos responda com o código %2$sBomba desligadaBomba ligada novamenteO comando remoto não é permitido
@@ -304,7 +288,6 @@
Bomba não inicializada!Purgar/PreencherPor favor certifique-se que o valor corresponde ao especificado para o seu conjunto de infusão!
- OutroValores Padrão Purgar/Preencher InsulinaBotão 1Botão 2
@@ -312,7 +295,6 @@
Unidades:UnidadesDIA
- Intervalo Alvo:Intervalo para visualizaçãoMarca Alto e Baixo para os gráficos em Sumário e SmartwatchMarca Baixo
@@ -346,7 +328,6 @@
ACÇCONFLOOP
- PSOAPSPLInício
@@ -371,7 +352,6 @@
Atenção!\n Normalmente não é necessário modificar os valores abaixo. Por favor PRESSIONE AQUI e LEIA o texto para garantir que ENTENDE as consequenciais antes de alterar algum destes valores.SMS número de telefone inválidoCalibração
- Enviar calibração %1$.1f para o xDrip?xDrip+ não está instaladoCalibração enviada para o xDripCalibração enviada. Recepção têm de estar activada no xDrip.
@@ -404,12 +384,10 @@
Dividir IOB entre IOB de bolus e de basal na face do relógiosem efeito - por favor verifique no telemóveln/d
- Idade do PacienteCriançaAdolescenteAdultoAdulto resistente insulina
- Por favor seleccione a idade do diabético para definir os limites de segurançaNome do PacientePor favor, forneça nome do paciente ou alcunha para diferenciar entre várias configuraçõesUtilizador
@@ -417,7 +395,6 @@
%1$s necessita de autorizar a não optimização da bateria para assegurar a performance necessáriaLoop suspensoSuspendido (%1$d m)
- Superbólus (%1$d m)Suspender loopSuspender loop por 1hSuspender loop por 2h
@@ -440,7 +417,6 @@
Registar inicio da app no NSA sair da aplicação para aplicar as configurações.Qual o tipo de insulina que está a utilizar?
- Insulina de ação rapidaNovorapid, Novolog, HumalogFiaspINS
@@ -478,11 +454,7 @@
Sem envio para NSTodos os dados enviados para NS são descartados. AAPS está conectado ao NS, mas não é feita nenhuma alteração no NSCancelar Bólus Prolongado
- Idade Sensor
- Idade Canula
- Idade InsulinaFazer Mudança De Perfil
- Idade bateria bombaOpções AlarmeCriar notificações dos alarmes NSCriar notificações a partir dos anúncios NS
@@ -496,20 +468,14 @@
Detecção sensibilidadeQue algoritmo de sensibilidade deve ser usado?SENS
- Sensibilidade Oref0Sensibilidade Oref1Sensibilidade AAPSConfigurações de absorçãoTempo máx. absorção refeição [h]Tempo em horas, espectável para que todos os hidratos de carbono da refeição sejam absorvidos
- SAGE
- IAGE
- CAGE
- PBAGEOAPSUPLDBAS
- PROLManter ecrã ligadoImpedir Android de desligar o ecrã. Isto irá consumir muita bateria quando não ligado ao carregador.Ao activar a função Autosense lembre-se de introduzir todos os hidratos de carbono (carbs) que comeu. Caso contra contrário os desvios de hidratos serão erroneamente identificados como uma variação da sensibilidade !!
@@ -520,10 +486,6 @@
Valores não guardados!Activar transmissões para outras aplicações (como xDrip). Não habilite se tiver mais de uma instância de AAPS ou ClienteNS instalado!Activar partilha local.
- ACTIVIDADE & FEEDBACK
- HIDRATOS & BÓLUS
- CGM & OPENAPS
- BOMBADuração [min]OpenAPS SMBActivar UAM
@@ -535,6 +497,7 @@
Oref Pico-LivreOref Acção RápidaUltra-Rapid Oref
+ LyumjevDuração de Acção da Insulina (DIA) de %1$f demasiado curto - corrigido para %2$f!Activar perfilINVÁLIDO
@@ -576,7 +539,6 @@
Mostrar Delta detalhoMostrar delta com mais um ponto decimalCom que frequência em min os SMBs serão dados
- SMB máx. minutosLimite de minutos de basal para SMBUAM SMB máx minutosMax minutos de basal para limitar SMB para UAM
@@ -630,7 +592,6 @@
VazioNormalNecesário actualizar relógio da bomba
- AvisoBasal Temporária CANCELADA. O aviso foi confirmadoNão foi possível estabelecer comunicação com a bomba. Nenhum bólus foi administradoAdministração de bólus falhou. Nenhum bólus parece ter sido administrado. Para confirmar, por favor verifique a bomba de forma a evitar uma dupla administração de bólus e programe novamente o bólus. De forma a evitar qualquer problema, os bólus não são reprogramados de forma automática.
@@ -639,7 +600,6 @@
Não há insulina suficiente no reservatório para bolusErro na administração Bólus ProlongadoVisão
- atrásDefinir basais temporárias neutrasSe 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.SMB sempre activado
@@ -698,7 +658,6 @@
Começar TT HipoA correr a versão dev. O Loop fechado está desabilitado.Modo engenheiro activado
- Modo de engenharia não habilitado e não no na versão mestraA ler perfil basalO histórico da bomba foi alterado após o cálculo do bolo ter sido realizado. O bólus não foi administrado. Por favor, verifique se bólus ainda é necessário.O bólus foi administrado, mas não foi possível adicionar ao histórico. Isto é possível se dois bólus do mesmo valor baixo foram administrados nos últimos dois minutos. Por favor verifique o histórico da bomba e use o Careportal para adicionar os dados em falta caso necessário. Cuidado para não adicionar dados com o mesmo valor no mesmo minuto.
@@ -708,7 +667,6 @@
Rácio da basal foi alterado na bomba, mas a leitura falhouA verificar se há alterações de históricoBólus múltiplos, com a mesma quantidade e no mesmo minuto acabaram de ser importados. Apenas um registo pôde ser adicionado aos tratamentos. Por favor confirma na bomba e adicione o registo de bólus manualmente, utilizando o separador do Careportal. Tenha em atenção que deve criar um bólus com um tempo em que nã oexistem outros registos de bólus.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)O último bólus tem mais de 24 horas ou está no futuro. Por favor verifique se a data está definida correctamente na bomba.Hora/data da administração do bólus na bomba parece errado, IOB aparentemente está incorrecto. Verifique hora/data na bomba.TrocaPerfil em falta. Por favor faça uma troca de perfil ou pressione \"Activar Perfil\" em PerfilLocal.
@@ -739,7 +697,6 @@
SMB não permitido no modo open loopAlimentosrepor
- Desligado (%1$d m)Máximo total IOB OpenAPS não pode superar [U]Este valor é chamado de Max IOB em contexto de OpenAPS\nOpenAPS não adicionará mais insulina se o IOB atual for maior que este valorBomba parada
@@ -753,7 +710,6 @@
AnteriorAssistente de ConfiguraçãoTERMINAR
- Selecione o seu IdiomaPrimeiro incremento insulinaSegundo incremento insulinaTerceiro incremento insulina
@@ -783,18 +739,14 @@
Configurações GeraisActivar ClienteNSBem-vindo ao assistente de configuração. Vai guiá-lo(a) através do processo de instalação\n
- Configurações da bombaLer estadoAlterações devem ser feitas no NSSaltar assistente de configuraçãoPressione o botão abaixo para activar o AndroidAPS para sugerir/fazer alterações basais
- Configurar plugin APS
- Configurar plugin SensibilidadePlugin de Sensibilidade é usado para detecção de sensibilidade e cálculos COB. Para mais info visite:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBClienteNS gere a ligação ao Nightscout. Pode saltar esta parte mas não será possível passar os objectivos até que o configure.Lembre-se: novos perfis de insulina requerem diâmetro de pelo menos 5h. DIA 5–6h no novo perfil é igual ao diâmetro 3h nos antigos perfis de insulina.
- Configure a fonte das glicemiasPor favor seleccione a fonte do perfil. Se o paciente é uma criança deverá utilizar perfil NS. Se ninguém o está a seguir no Nightscout provavelmente preferirá um perfil Local. Lembre-se que apenas está a escolher a fonte de perfil. Para o utilizar terá que o activar executando \"Troca Perfil\"Seleccione um dos algoritmos disponíveis. Eles são classificados do mais antigo para o mais recente. Algoritmo mais recente é geralmente mais forte e mais agressivo. Assim, se você é novo looper, poderá provavelmente começar com AMA e não com a versão mais recente. Não se esqueça de ler a documentação de OpenAPS e configurá-lo antes de usar.Iniciar primeiro objectivo
@@ -804,7 +756,6 @@
Aplicação necessita de permissão de localização para pesquisa Bluetooth e identificação Wi-FiAplicação precisa da permissão de armazenamento para poder armazenar ficheiros de registo e exportar configuraçõesPedido
- Configurar plugin InsulinaSairAbrir a navegaçãoFechar a navegação
@@ -844,7 +795,6 @@
Definições de registoRepor definições por defeitoErro de funcionamento do ClienteNS. Pondere reiniciar o NS e ClienteNS.
- ASDisponível %1$s disponívelFuso horárioModo APS preferido
@@ -1081,12 +1031,9 @@
Seleccionado:UnidadesDeseja mudar de perfil e descartar as alterações feitas no perfil actual?
- Ligado
- DesligadoLimpar terminadoLimpar iniciadoDeseja reiniciar o objectivo? Pode perder seu progresso.
- Nenhuma bomba seleccionadaSeleccione as unidades em que deseja exibir os valoresCarregar as alterações do perfil local para NSDIA
@@ -1107,7 +1054,6 @@
EnviarPerfil mais comum:Nota: Apenas os dados visíveis neste ecrã serão enviados anonimamente. O ID é atribuído a esta instalação do AndroidAPS. Você pode enviar dados novamente se o perfil principal for alterado, mas deixá-lo rodar pelo menos uma semana para tornar o resultado visível no intervalo de tempo. Sua ajuda é apreciada.
- QuestionárioEntrada de idade inválidaEntrada de peso inválidaEntrada % inválida
@@ -1127,10 +1073,8 @@
Limpar fila? Todos os dados na fila serão perdidos!O uso do Bólus Prolongado irá parar o modo Closed Loop no tempo do bólus prolongado. Quer realmente isso?Closed Loop desabilitado por causa da execução do Bólus Prolongado
- BP\"VerificadorTelefone\"Menu do Gráfico
- ASHora de solicitação SMBHora de execução do SMBHora de solicitação Basal Temp
@@ -1141,7 +1085,7 @@
Autenticar comandos usando Uma-Senha-Única que sejam geradas pelo Google Authenticator ou app 2FA similar.Dígitos adicionais que devem ser memorizados e colados no final de cada Uma-Senha-Única que seja geradaConfiguração do Autenticador
- OTP para verificar:
+ Código para verificar:Repor AutenticadoresRepor Chave AutenticadorTem certeza de redefinir chave Authenticador? Ele tornará todos os Authenticators configurados actualmente como inválidos, e precisará de os configurar novamente.
@@ -1151,7 +1095,6 @@
3. Testar Uma-Senha-ÚnicaRepor AutenticadoresInstalar 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
- NÃO PARTILHE este código online!\nUse-o apenas para a instalação da app Autenticador nos telefones seguidores.Ao repor o autenticador, torna inválidos todos os autenticadores já provisionados. Precisará de os configurar novamente!Ao ligarAo desligar
diff --git a/app/src/main/res/values-ro-rRO/exam.xml b/app/src/main/res/values-ro-rRO/exam.xml
index be73b91f50..8f025859de 100644
--- a/app/src/main/res/values-ro-rRO/exam.xml
+++ b/app/src/main/res/values-ro-rRO/exam.xml
@@ -17,7 +17,6 @@
Profilul NS poate fi folosit, dar nu modificat.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileSubiect: Deconectarae de la pompă
- Ce trebuie să faceți atunci când deconectați pompa?Apăsați ‘Deconectează pompa’ astfel încât AAPS să știe că nu se va putea livra insulină.Apăsați ‘Suspendă bucla’ astfel încât AAPS să dezactiveze bucla atâta timp cât pompa este deconectată.Nu modificați nimic în AAPS, doar deconectați pompa.
@@ -134,8 +133,6 @@
Valorile IC mai mari determină o cantitate mai mică de insulină livrată pentru o cantitate dată de carbohidrați.Valorile IC mai mici determină o cantitate mai mică de insulină livrată pentru o cantitate dată de carbohidrați.Dacă aveți 0 CoB (carbohidrați activi), schimbarea IC va determina modificarea cantității de insulină livrată pentru a corecta glicemia.
- Valoarea IC va fi diferita dacă considerați 1BE (unitate de pâine) ca 10g sau 12g glucide.
- IC înseamnă: Câte unități de pâine sunt acoperite de 1 unitate de insulină.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uSubiect: Schimbarea de profil Atunci când se specifică 90% la schimbarea de profil…
diff --git a/app/src/main/res/values-ro-rRO/objectives.xml b/app/src/main/res/values-ro-rRO/objectives.xml
index 80b2837283..e19139fd5c 100644
--- a/app/src/main/res/values-ro-rRO/objectives.xml
+++ b/app/src/main/res/values-ro-rRO/objectives.xml
@@ -1,6 +1,5 @@
- ÎnapoiStartVerificăObiectiv %1$d
diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml
index 32d86bbdc3..7d66cee3c7 100644
--- a/app/src/main/res/values-ro-rRO/strings.xml
+++ b/app/src/main/res/values-ro-rRO/strings.xml
@@ -21,17 +21,16 @@
Afişează mâncărurile predefinite în NightscoutSetări prestabilite pentru insulinele Humalog sau NovoRapid / NovoLogSetări prestabilite pentru Fiasp
+ Setări prestabilite pentru LyumjevVă permite definirea vârfului activităţii insulinei şi ar trebui folosit doar de către utilizatorii avansaţiActivare sau dezactivare a implementării declanşatoare pentru buclă.Sincronizare a datelor cu Nightscout
- Starea algoritmului în 2016Starea algoritmului în 2017Cel mai recent algoritm destinat utilizatorilor avansaţiAfişează starea curentă a buclei şi butoanele pentru cele mai folosite acţiuniAfişează o notificare activă cu o scurtă descriere referitoare la starea bucleiDefinire profil care să fie valabil offline.Foloseşte profilul predefinit deja în Nightscout
- Definește un profil cu un singur bloc de timp.Integrare cu pompele Accu-Chek, necesită aplicația RuffyIntegrare cu pompă virtuală, pentru persoanele ce folosesc terapia cu penIntegrare cu pompele ce nu au încă un driver software disponibil (Buclă Deschisă)
@@ -83,7 +82,6 @@
ConfiguratorPrivire de ansambluProfil NS
- Profil simpluTratamentePompă virtualăCareportal
@@ -105,13 +103,11 @@
APSConstrângeri după procesareBazală Temporală programată în pompă
- Ultima acțiune executatăNU AȚI SELECTAT APS SAU NU EXISTĂ REZULTAT GENERATSiguranțăModul inactivÎncălcare a unei limiteEroare la livrarea bolusului
- Valoare bazală [%]Acceptă noua bazală temporară:TratamentCalculator
@@ -140,17 +136,11 @@
AltulGlucometruSenzor
- Carbohidrați
- InsulinăOra carbohidrați
- ÎmparteDurată
- Procent
- AbsolutNoteOra evenimentuluiProfil
- Introdus deTip glicemieNu am încărcat încă un profil din NSBazală temporară
@@ -214,7 +204,6 @@
Eroare la decriptare, parola furnizată este invalidă sau fişierul de setări a fost modificat! Se poate întâmpla ca fişierul importat să fi fost exportat cu o parolă master diferită.Lipseşte configuraţia de criptare, formatul setărilor este invalid!Algoritm de criptare nesuportat sau nespecificat!
- exportat aziexportat cu %1$s în urmăexportat în data de %1$sexportat acum mai puțin de o ora
@@ -246,10 +235,6 @@
Tinta %1$s pentru %2$d minute este setata cu succesTinta temporara anulata cu succesPermite comenzi de la distanță, prin SMS
- Setări de profil DanaR
- DIA [h]
- Durata de Acțiune a Insulinei (DIA)
- Se trimiteBolus opritSe oprește bolusulBucla a fost dezactivată
@@ -260,7 +245,6 @@
Valoarea %1$s este mai mare decât limita stabilităPentru a conecta pompa raspundeti cu codul %1$sConectarea cu pompa a esuat
- Pentru a deconecta pompa timp de %1d minute, raspundeti cu: %2$sPompă deconectatăPompă reconectatăComanda de la distanță nu este permisă
@@ -304,7 +288,6 @@
Pompa nu este inițializată!Pregătire/umplereAsigurați-vă că aveți cantitatea specificată de instrucțiunile setului de infuzie!
- AlteUmplere/Amorsare folosind cantitățile standard de insulinăButon 1Buton 2
@@ -312,7 +295,6 @@
Unități:UnitățiDIA
- Intervalul țintă:Intervalul pentru vizualizareValoarea maximă și minimă pentru graficele din vizualizare și pentru smartwatchPragul HIPO
@@ -346,7 +328,6 @@
ACTCONFBUCL
- SPOAPSLPACASĂ
@@ -371,7 +352,6 @@
Atenție!\nÎn mod normal nu este nevoie să modificați valorile de mai jos. Vă rog să APĂSAȚI AICI și să CITIȚI textul și să vă asigurați că l-ați ÎNȚELES înainte de a schimba valorile.Număr de telefon SMS invalidCalibrare
- Trimite calibrarea %1$.1f către xDrip?xDrip+ nu este instalat.Calibrare trimisă către xDripCalibrare trimisă. Recepționarea trebuie să fie activată și în xDrip.
@@ -404,12 +384,10 @@
Separă IOB în bolus și IOB bazal pe ceasfără succes - verificați telefonulindisponibil
- Vârsta pacientuluiCopilAdolescentAdultAdult rezistent la insulină
- Vă rog să selectați vârsta pacientului în vederea stabilirii valorilor maxime admise de siguranțăNumele pacientuluiVă rugăm să furnizați numele sau porecla pacientului pentru a diferenția între configurăriUtilizator
@@ -417,7 +395,6 @@
%1$s necesită excluderea din lista de optimizare a bateriei pentru o funcționare corespunzătoareBuclă suspendatăSuspendat (%1$d min)
- Superbolus (%1$d min)Pune pauză bucleiSuspendă bucla pentru 1hSuspendă bucla pentru 2h
@@ -440,7 +417,6 @@
Înregistrează pornirea aplicației în NSSe iese din aplicație în vederea aplicării setărilor.Ce tip de insulină folosiți?
- Insulină rapidăNovorapid, Novolog, HumalogFiaspINS
@@ -478,11 +454,7 @@
Fără trimitere către NSToate trimiterile de date către NS sunt oprite. AAPS este conectat la NS dar nu se fac schimbări în NSRenunță la bolusul extins
- Vechime senzor
- Vechime canulă
- Vechime insulinăSchimbă profilul
- Vechime baterie pompăOpțiuni alarmareCreare notificări din alarmele NSCreare notificări din anunţurile NS
@@ -496,20 +468,14 @@
Detectare sensibilitateCe algoritm de detecție a sensibilității doriți să folosiți?SENS
- Sensibilitate Oref0Sensibilitate Oref1Sensibilitate AAPSSetări absorbțieTimp maxim absorbție masă [o]Timp în ore la care se presupune că toți carbohidrații sunt absorbiți
- VS
- VI
- VC
- BATOAPSUPLDBZL
- EXTMenține ecranul aprinsNu permite telefonului să stingă ecranul. Când este activă, această opțiune consumă foarte multă baterie atunci când telefonul nu este la încărcat.Trebuie introduși toți carbo la pornirea Autosens. În caz contrar, acțiunea carbo va fi percepută ca schimbare a sensibilității!
@@ -520,10 +486,6 @@
Nu s-au salvat valorile!Activează mesajele pentru alte aplicații (cum ar fi xDrip). Nu activați dacă aveți mai mult de o instanță de AAPS sau NSClient instalată!Permite anunțuri locale.
- ACTIVITATE ȘI VERIFICĂRI
- CARBO ȘI BOLUS
- CGM ȘI OPENAPS
- POMPĂDurată [min]OpenAPS SMBActivează UAM
@@ -535,6 +497,7 @@
Oref Vârf-LiberOref Insulină-RapidăOref Insulină-UltraRapidă
+ LyumjevDIA din %1$f prea scurtă - se folosește %2$f în schimb!Activează profilINVALID
@@ -576,7 +539,6 @@
Arată variație detaliatăArată variație cu încă o zecimalăCât de des se vor administra SMB în min
- SMB maxim minuteMax minute de bazală la care să se limiteze SMBUAM SMB maxim minuteDurata maxima (în minute) a bazalei pentru a limita SMB în cazul UAM
@@ -630,7 +592,6 @@
GolNormalCeasul pompei trebuie ajustat
- AtențieAlerta RBT ANULATĂ a fost confirmatăPompa nu poate fi contactată. Nu s-a livrat niciun bolusLivrare eșuată. Se pare că nu a fost livrat bolusul. Pentru siguranță, verificați în pompă pentru a evita bolusarea dublă. Pentru evitarea greșelilor, bolusurile nu sunt retrimise automat.
@@ -639,7 +600,6 @@
Nu este suficientă insulină în rezervorEroare de livrare a bolusului extinsObiectiv
- în trecutSetați bazale temporare neutreDacă este activată, va anula o bazală temporară înainte de sfârșitul fiecărei ore. Aceasta metoda poate ajuta la oprirea vibrațiilor/bipurilor orare pe anumite pompe.Activează SMB întotdeauna
@@ -698,7 +658,6 @@
Start TT hipoSe folosește versiunea dev. Bucla închisă este dezactivată.Mod inginer activat
- Modul inginer nu este activat și nu este în versiunea lansatăSe citește profilul bazalIstoricul pompei s-a schimbat după calcularea bolusului. Bolusul nu a fost livrat. Recalculați dacă mai este necesar un bolus.Bolus livrat, dar nu s-a reușit înregistrarea evenimentului. Aceasta se poate întâmpla când două bolusuri mici de aceeași valoare sunt livrate în mai puțin de două minute. Verificați istoricul pompei și înregistrările tratamentelor și folosiți Careportal pentru adăugarea intrărilor lipsă. Asigurați-vă că nu adăugați intrări duble.
@@ -708,7 +667,6 @@
Rata bazală schimbată în pompă, dar nu s-a putut actualizaSe verifică schimbările în istoricMai multe bolusuri de aceeași valoare au fost importate. Doar o singură înregistrare va fi adăugată în tratamente. Verifcați manual în pompă și adăugați înregistrările folosind Careportal. Asigurați-vă că veți crea un bolus care nu se suprapune peste altul în timp.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)Ultimul bolus este mai vechi de 24 ore sau este în viitor. Verificați ca data să fie configurată corect în pompă.Ora/data bolusului livrat de pompă pare eronat, IOB este probabil incorect. Verificați ora/data pompei.Lipsă SchimbareProfil. Efectuați o schimbare de profil sau apăsați \"Activare profil\" în ProfilulLocal.
@@ -739,7 +697,6 @@
SMB nu este permis în mod buclă deschisăMâncareresetare
- Deconectat (%1$d min)Maximul total IOB peste care OpenAPS nu poate trece [U]Această valoare este denumită Max IOB în contextul OpenAPS,\nOpenAPS nu va adăuga mai multă insulină dacă IOB este mai mare ca această valoarePompă oprită
@@ -753,7 +710,6 @@
AnteriorAsistent de configurareTERMINARE
- Alegeți limbaPrimul increment de insulinăAl doilea increment de insulinăAl treilea increment de insulină
@@ -783,20 +739,18 @@
Setări generaleActivează NSClientAți pornit asistentul pentru setări. Acesta vă va ajuta pentru configurarea setărilor\n
- Setări pompăCitire stareSchimbările trebuie făcute în NSIgnoră asistentul pentru setăriApăsați butonul pentru a permite AndroidAPS să sugereze/facă schimbări ale bazalei
- Configurați plugin APS
- Configurați pluginul pentru SensibilitatePluginul Sensibilitate este folosit pentru estimarea sensibilității și calcularea COB. Pentru mai multe info vizitați:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient se ocupă de conectarea la Nightscout. Puteți sări peste această parte, dar nu se vor îndeplini anumite obiective dacă faceți acest lucru.Reamintire: noile profiluri necesită o durată de acțiune a insulinei (DIA) de cel puțin 5 ore. DIA de 5-6 ore în profilurile noi sunt echivalente cu DIA 3 ore din profilele vechi.
- Configurați sursa glicemiilorSelectați sursa sau profilul. Dacă pacientul este copil, ar fi bine să alegeți un profil NS. Dacă nu aveți profil NS, puteți alege profil local. De aici alegeți doar sursa profilului; pentru a utiliza acest profil, trebuie să îl activați prin executarea unei \"Schimbări de profil\"Alegeți unul dintre algoritmii disponibili. Algoritmii sunt aranjați de la cel mai vechi spre cel mai nou. Algoritmii mai noi sunt, de obicei, mai puternici și mai agresivi. De aceeea, dacă sunteți la început, ar fi indicat să porniți cu AMA și nu cu cel mai nou. Este important să parcurgeți documentația OpenAPS și să îl configurați corect înainte de a folosi aplicația.
+ Se așteaptă conexiunea la RileyLink…\n
+ Notă: Puteți continua configurarea imediat ce pompa a fost inițializată.\nÎncepeți primul obiectivPermisiuneSolicitați permisiunea
@@ -804,7 +758,6 @@
Aplicația are nevoie sa acceseze locația pentru scanare Bluetooth și identificare WiFiAplicația are nevoie de permisiunea de a accesa unitatea de stocare pentru a scrie fișierele registru și pentru a exporta setărileCerință
- Configurați plugin insulinăIeșireAfișare navigațieÎnchidere navigație
@@ -844,7 +797,6 @@
Setări loguriResetare la setările impliciteFuncționare incorectă a NSClient. Aveți în vedere un restart al NS și al NSClient.
- ASVersiunea %1$s este disponibilăDiferență de fus orarModul APS preferat
@@ -986,6 +938,7 @@
restricție de stocare internăEliberați cel puțin %1$d MB din spațiunl de stocare al telefonlui! Buclă dezactivată!Format greșit
+ Durata RBT trebuie să fie un multiplu de %1$d minute și mai mare de 0.Cod greșit. Comandă anulată.Nu este configuratSchimbare de profil creată
@@ -1081,12 +1034,9 @@
Selectat:UnitățiDoriți să schimbați profilul și să renunțați la modificările făcute profilului curent?
- Pornit
- OpritȘterge starea \"Terminat\"Șterge starea \"Început\"Doriți să reîncepeți obiectivul? Vă puteți pierde progresul.
- Nicio pompă selectatăSelectați unitățile în care doriți să afișați valorileTransmiteți modificările profilului local către NSDIA
@@ -1107,7 +1057,6 @@
TrimitețiCel mai frecvent profil:Notă: Doar datele vizibile pe acest ecran vor fi încărcate în mod anonim. ID-ul este alocat acestei instalări de AndroidAPS. Puteți trimite date din nou dacă profilul dumneavoastră principal se modifică, dar lăsați-l să ruleze cel puțin o săptămână pentru ca rezultatul să fie vizibil în interval de timp. Ajutorul dvs. este binevenit.
- SondajValoare vârstă invalidăValoare greutate invalidăIntrare % invalidă
@@ -1127,10 +1076,8 @@
Ștergeți coada? Toate datele din coadă vor fi pierdute!Utilizarea unui bolus extins va opri modul buclă închisă pe timpul livrării bolusului extins. Sigur doriți acest lucru?Bucla închisă dezactivată din cauza livrării bolusului extins
- BE\"Verificator de telefon\"Meniu diagramă
- ASTimp solicitare SMBTimp de execuţie SMBTimp solicitare bazală temporară
@@ -1146,7 +1093,6 @@
Cod de verificat:OTP + cod PINCodul de verificare constă din 6 cifre afişate de către aplicaţia Authentificator (cunoscută ca OTP), urmat de 3 sau mai multe cifre de PIN obligatoriu.
- Parola unică pentru verificare:Resetați AuthenticatoriResetați cheia pentru AuthenticatorSunteți sigur că vreți sa resetați cheia pentru Authenticator? Acest lucru va invalida toți Authenticatorii configurați și va trebui să ii setați din nou.
@@ -1156,7 +1102,6 @@
3. Testați o parolă unicăResetați AuthenticatoriPe fiecare telefon urmăritor instalați o aplicație de tip Authenticator care suporta tokens RFC 6238 TOTP. Asemenea aplicații gratuite populare sunt:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- NU DISTRIBUIȚI acest cod online!\nUtilizaţi-l doar pentru a seta aplicația Authenticator pe telefoanele urmăritoare.Prin resetarea autentificatorului invalidați toți autentificatorii existenți. Va trebui să îi configurați din nou!La conectareLa deconectare
diff --git a/app/src/main/res/values-ru-rRU/exam.xml b/app/src/main/res/values-ru-rRU/exam.xml
index 732da76770..a1f46576c1 100644
--- a/app/src/main/res/values-ru-rRU/exam.xml
+++ b/app/src/main/res/values-ru-rRU/exam.xml
@@ -17,7 +17,6 @@
Профилем NS можно пользоваться, но не настраивать.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileТема: Отключение от помпы
- Что следует делать при отсоединении помпы?Нажать «Отключить помпу», чтобы AAPS знал, что инсулин не подается.Нажать \'Приостановить цикл\', чтобы AAPS перестал выполнять цикл, когда помпа отсоединена.Ничего не менять в AAPS, просто отключить помпу.
@@ -136,7 +135,7 @@ Context | Edit ContextБолее высокие коэффициенты инсулин-углеводы IC приводят к уменьшению инсулина на данное количество углеводов.Более низкие коэффициенты инсулин-углеводы IC приводят к уменьшению инсулина на данное количество углеводов.Если у вас 0 активных углеводов COB, изменение соотношения инсулин-углеводы IC приведет к иному количеству инсулина на коррекцию данной ГК.
- Соотношение инсулин-углеводы изменится если принимать ХЕ за 10 или 12г.
+ Соотношение инсулин-углеводы IC изменится если принимать ХЕ за 10 или 12г.Смысл соотношения инсулин-углеводы IC таков: сколько хлебных единиц покрываются одной ед. инсулина.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uТема: Переключение Профиля
diff --git a/app/src/main/res/values-ru-rRU/objectives.xml b/app/src/main/res/values-ru-rRU/objectives.xml
index bc0e840894..f5dc95c7e7 100644
--- a/app/src/main/res/values-ru-rRU/objectives.xml
+++ b/app/src/main/res/values-ru-rRU/objectives.xml
@@ -1,6 +1,5 @@
- НазадСтартПодтвердить%1$d. Цель
diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml
index f4c19ab565..bcf06efcd9 100644
--- a/app/src/main/res/values-ru-rRU/strings.xml
+++ b/app/src/main/res/values-ru-rRU/strings.xml
@@ -13,7 +13,7 @@
Вы действительно хотите обнулить базы данных?ВыходВсегда пользуйтесь абсолютными величинами для базала
- Пожалуйста перезагрузите телефон или перезапустите AndroidAPS из системных настроек \иначе AndroidAPS не будет вести лог (важно для отслеживания и проверки алгоритмов)!
+ Пожалуйста перезагрузите телефон или перезапустите AndroidAPS из системных настроек, иначе AndroidAPS не будет вести лог (важно для отслеживания и проверки алгоритмов)!Это устройство не поддерживает меню оптимизации батареи - могут быть проблемы с производительностью.Кнопки быстрого доступа к некоторым распространенным настройкамПрименяется для настройки активных плагинов
@@ -21,19 +21,18 @@
Показывает предварительные настройки приема пищи из NightscoutПредустановки для Humalog и Novorapid / NovologПредустановки для Fiasp
+ Параметры LyumjevПозволяет самостоятельно задавать пик активности инсулина - только для опытных пользователейАктивировать или деактивировать запуск цикла.Синхронизирует данные с Nightscout
- Состояние алгоритма в 2016 годуСостояние алгоритма в 2017 годуСамый новый алгоритм для опытных пользователейОтображает текущее состояние цикла и часто используемые кнопкиПоказывает текущие уведомления и краткий обзор событий циклаОпределите профиль, доступный в автономном режиме.Содержит профиль, заданный в Nightscout
- Определите профиль только в одном блоке времени.
- Интеграция с помпой Accu-Chek Combo, требует наличия установленного алгоритма
- Интеграция с помпой для тех, кто делает многочисленные подколки для компенсации диабета
+ Интеграция с помпой Accu-Chek Combo, требует наличия утилиты Ruffy
+ Интеграция с помпой для тех, кто для компенсации диабета пользуется инъекциями шприц-ручекИнтеграция с помпами, еще не имеющими драйвера (незамкнутый цикл)Чувствительность вычисляется аналогично алгоритму oref0, но можно включить период прошлого. Минимальное усвоение углеводов вычисляется на основе макс усвоения из настроек.Чувствительность рассчитывается на основе данных за прошедшие 8 часов и (неусвоенные) углеводы не учитываются после времени указанного в настройках. Плагин также вычисляет UAM.
@@ -55,7 +54,7 @@
Общая активность IOB:длит:соотношение:
- инс:
+ инсулин:IOB: активный инсулинобщий IOBгликемия
@@ -83,7 +82,6 @@
КонфигураторНачалопрофиль NS
- простой профильТерапияВиртуальная помпаПортал лечения / назначений
@@ -105,13 +103,11 @@
Система ИПЖпосле наложенных ограниченийВременный базал определяется помпой
- Последнее предпринятоеAPS не выбрана или не выдала результатбезопасностьмодуль не активенограничение нарушеноОшибка подачи болюса
- Величина базала [%]принять новый врем базал:болюскалькулятор
@@ -140,21 +136,15 @@
другоеглюкометрсенсор
- углеводы
- инсулинПодождать до еды
- разбивкаДлительность действия
- процент
- абсолютзаметкиВремя событияпрофиль
- кем введенотип глюкозыпрофиль еще не загружен из NSВремБазал
- расширенный болюс
+ Пролонгированный болюсверсия Nightscout:Не хватает %1$d гнастройки экспортированы
@@ -214,7 +204,6 @@
Ошибка расшифровки, указан недопустимый пароль или файл параметров изменен! Возможно, импортированный файл был экспортирован с использованием другого главного пароля.Отсутствует конфигурация шифрования, формат параметров недопустим!Неподдерживаемый или не прописанный алгоритм шифрования!
- экспортировано сегодняэкспортировано %1$s назадэкспортировано в %1$sэкспортировано менее часа назад
@@ -246,10 +235,6 @@
Цель %1$s на %2$d минут установлена успешноВременная цель успешно отмененаразрешить команды через смс
- настройки профиля DanaR
- время действия инсулина (ч.):
- Продолжительность активности инсулина
- передача данныхБолюс остановленОстановка болюсазцикл был деактивирован
@@ -257,10 +242,10 @@
зцикл не работаетзцикл работает%1$.2f ограничено до %2$.2f
- Величина %1$s недопустима
+ Значение %1$s недопустимоЧтобы подсоединить помпу ответьте кодом %1$sОшибка подключения к помпе
- Для разъединения с помпой на %1d мин ответьте кодом %2$s
+ Для разъединения с помпой на %1$d мин ответьте кодом %2$sПомпа отключенаСвязь с помпой возобновленаудаленная команда не разрешена
@@ -300,11 +285,10 @@
коррекциядействиятолько передача в NS (синхронизация отсутствует)
- только передача в NS. работает в SGV только если выбран местный источник вроде xdrip. не работает в профилях при действующем профиле NS
+ только передача в NS. Не работает в SGV пока не выбран местный источник вроде xdrip. Не работает в Профилях при действующем профиле NS.помпа не инициализированапрайм/заполнениеубедитесь что количество соответствует характеристикам вашей инфузионной системы
- другоеЗаполнить стандартное количество инсулинакнопка 1кнопка 2
@@ -312,7 +296,6 @@
Единицы:ЕдиницыВремя действия инсулина DIA
- целевой диапазондиапазон для визуализацииНижняя и верхняя граница диаграммы в отчетах и Smartwatchотметка НИЗКИЙ
@@ -346,7 +329,6 @@
ДЕЙСТВКОНФЗЦ
- ППOAPSЛПНАЧАЛО
@@ -358,7 +340,7 @@
SMSсокращенные имена табулвсегда используйте укороченное среднее приращение вместо простого
- полезно когда данные из нефильтруемых источников вроде Xdrip зашумляются
+ Полезно когда данные из нефильтрованных источников вроде xDrip+ начинают \"шуметь\".профильзначение по умолчанию:3 Это ключевой ограничитель безопасности OpenAPS. Он ограничивает величину вашего базала максимум до 3x максимума. Вам вероятно не понадобится менять эту величину но вам следует понимать, что она входит в формулу дуэта \"максимум 3x ежедневное; 4x текущее\"значение по умолчанию: 4 . Это вторая половина обеспечения безопасности OpenAPS из дуэта \"максимум 3x ежедневное; 4x текущее\" Означает что ваша база независимо от установок помпы не может быть выше чем это число умноженное на текущее значение базала. Ограничение для того, чтобы предотвратить вторжение в опасную зону из-за высокого уровня установленных значений базы без понимания алгоритма работы приложения. Большинству людей никогда не потребуется изменять это значение, скорее всего нужно поменять другие настройки если вы чувствуете, что вам мешает это ограничение.
@@ -371,10 +353,9 @@
Внимание! Обычно нет необходимости изменять приведенные ниже величины. Нажмите ЗДЕСЬ, ПРОЧТИТЕ и убедитесь что вы ПОНИМАЕТЕ изложенное прежде чем менять какую-либо из этих величинневерный номер телефона для смскалибровка
- Отправить калибровку %1$.1f на xDrip?xdrip+ не установленкалибровка передается на xdrip
- калибровка отправлена. в xdrip должен быть активирован прием
+ Калибровка отправлена. Активируйте прием в xDrip+.xdrip не получает калибровокРабота помпы остановленавыполнение
@@ -404,12 +385,13 @@
разбивка IOB на болюсный и базальный IOB на циферблате смарт-часовнеудача - проверьте телефонн/д
- Возраст пациента
+ Тип пациентаребенокподростоквзрослыйИнсулинорезистентный взрослый
- выберите возраст пациента для определения ограничителей безопасности
+ Беременность
+ Пожалуйста, выберите тип пациента для установки лимитов безопасностиИмя пациентаУкажите имя или псевдоним пациента, чтобы распознавать разные настройкиПользователь
@@ -417,7 +399,6 @@
%1$s необходимо включить в белый список оптимизации батареи для корректной работыЗЦ остановленОстановлен на(%1$d m)
- Суперболюс(%1$d m)Приостановить циклприостановить цикл на 1 часприостановить цикл на 2 часа
@@ -440,7 +421,6 @@
начать работу с NSвыход из приложения для применения настроекКакой тип инсулина вы используете?
- быстродействующий инсулинNovorapid, Novolog, HumalogFiaspИНС
@@ -453,6 +433,8 @@
Критический порог предупреждения о времени, отработанном инсулином [h]Порог предупреждения о времени, отработанном сенсором [h]Критический порог предупреждения о времени, отработанном сенсором [h]
+ Порог предупреждения о разрядке батареи [%]
+ Порог предупреждения о критическом уровне разрядки батареи [%]Порог предупреждения о разрядке батареи [h]Порог предупреждения о критическом уровне разрядки батареи [h]Порог уровня наполненности резервуара для оповещения [ед.]
@@ -478,11 +460,13 @@
данные не передаются в NSданные передаваемые в NS не доходят. AAPS соединяется с NS но изменения туда не вносятсяОтмена удлиненного болюса
- сенсор пропаботал
- Катетер помпы проработал
- Инсулин проработалПереключить профиль
- Батарея помпы работает
+ Сенсор
+ Канюля
+ Инсулин
+ Батарея помпы
+ Возраст:
+ Уровень:опции оповещенияСоздать уведомления из оповещений NSСоздать уведомления из оповещений NS
@@ -496,20 +480,14 @@
определение чувствительностиКакой алгоритм чувствительности следует использовать?ЧУВСТВ
- Чувствительность Oref0Чувствительность Oref1Чувствительность AAPSНастройки усваиваемостиМаксимальное время усваимости пищи [h] (час)Ожидаемое время усваивания всех углеводов пищи в часах
- ВОЗРСенс
- ВозрИнс
- ВозрКан
- ВозрБатOAPSЗАГРУЗ
- БАЗ
- УДЛИНН
+ БАЗАЛНе отключать экранНе давать системе Android отключать экран. Это увеличит потребление энергии при отключенной сети питания.Активируя Autosense не забывайте вводить все съеденные углеводы. Иначе отклонения в углеводах будут неверно определены как изменение чувствительности !!
@@ -520,10 +498,6 @@
Данные не сохранены!Включить трансляцию для других приложений (например, xDrip). Не включайте, если установлено несколько экземпляров приложений AAPS или NSClient!Активировать локальную передачу
- АКТИВНОСТЬ
- УГЛЕВОДЫ ; БОЛЮС
- МОНИТОРИНГ; OPENAPS
- ПОМПАДлительность (мин)Супер микро болюс OpenAPSВключить непредвиденный прием пищи UAM
@@ -535,6 +509,7 @@
Свободный от пиков OrefБыстро действующий OrefСверхбыстрый Oref
+ LyumjevЗначение длительности работы инс %1$f слишком мало - применено %2$f!АКТИВИРОВАТЬ ПРОФИЛЬНЕВЕРНО
@@ -558,7 +533,7 @@
БелкиЖиры]]>
- Команда сейчас выполняется
+ Команда выполняетсяПомпа недоступнаПропущенные данные СКИспользовать системные уведомления для предупреждений и уведомлений
@@ -576,7 +551,6 @@
Показать подробно дельтуПоказать дельту еще с одним десятичным знакомКак часто SMB будут подаваться в минутах
- Максимум минут микроболюса SMBВерхний лимит минут базала на SMBМаксимум минут микроболюса SMB для непредвиденного приема пищи UAMМаксимум минут базала ограничивающего микроболюсы SMB на непредвиденный прием пищи UAM
@@ -630,7 +604,6 @@
ПустоНормальныйНеобходимо обновить часы помпы
- ВниманиеПредупреждение об отмене скорости временного базала было подтвержденоНе удалось подключиться к помпе. Болюс не поданПодача болюса не состоялась. Чтобы удостовериться, проверьте помпу во избежание двойного болюса и повторите подачу. Для защиты от ложных срабатываний болюсы не повторяются автоматически.
@@ -639,7 +612,6 @@
В резервуаре недостаточно инсулина для болюсаПодача пролонгированного болюса не состояласьПоле обзора
- тому назадУстановить нейтральные временные базалыЕсли эта опция включена, то она отменяет временный базал до конца каждого часа. Такой метод помогает прекратить почасовую вибрацию некоторых помп.Всегда включать супер микро болюс SMB
@@ -698,7 +670,6 @@
Начать временную цель ТТ ГипоРаботает версия разработчика. Замкнутый цикл отключен.Режим отладки включен
- Режим отладки не задействован и отсутствует на ветке релизаЧтение базального профиляИстория событий помпы изменилась с момента вычисления болюса. Болюс не подан. Пожалуйста пересчитайте потребность в болюсе.Болюс подан успешно, но запись о назначении не сделана. Это может быть вызвано тем, что за последние две минуты назначено два болюса одного объема. Пожалуйста проверьте историю событий помпы и записи о назначениях и добавьте пропущенные записи из Портала назначений. Не добавляйте записи с одним и тем же временем и одинаковым объемом.
@@ -708,9 +679,9 @@
Скорость базала на помпе изменилась, но учесть ее не удалосьПроверка изменений в истории событий помпыТолько что импортировано несколько болюсов с одинаковым количеством инсулина в течение одной минуты. В лог лечения может быть добавлена только одна запись. Пожалуйста проверьте помпу и вручную введите запись о болюсе через вкладку портала назначений. Убедитесь, что данному времени соответствует только одна запись о болюсе.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de) \n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ \n\nДокументация:\nhttps://androidaps.readthedocs.io\n\nFacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsersНовый болюс старше 24 часов или запись относится к будущему. Пожалуйста убедитесь что дата на помпе установлена правильно.
- Время/дата поданного болюса неверны. Вероятно, кол-во активного инсулина IOB также неверно. Пожалуйста, проверьте время/дату помпы.
+ Время/дата поданного болюса неверны. Вероятно, кол-во активного инсулина IOB также неверно. Проверьте время/дату помпы.Профиль не переключен. Пожалуйста переключите профиль или нажмите \"активировать профиль\" в LocalProfile.Отсчет болюсаОтсчет временного базала TBR
@@ -739,7 +710,6 @@
В режиме незамкнутого цикла open loop супер микро болюс SMB не допускаетсяЕдасброс
- Разъединен (%1$d м)Предел суммарного активного инсулина IOB для OpenAPS [U]Эта величина называется Max IOB в OpenAPS context\nOpenAPS не будет добавлять инсулин если текущий активный инсулин ее превыситПомпа остановлена
@@ -753,14 +723,13 @@
НазадМастер настройкиГОТОВО
- Выберите Ваш языкПервый шаг увеличения инсулинаВторой шаг увеличения инсулинаТретий шаг увеличения инсулинаПервый шаг увеличения углеводовВторой шаг увеличения углеводовТретий шаг увеличения углеводов
- Мониторинг СК
+ Мониторинг ГКИспользовать только WiFi соединениеWiFi SSIDТолько при зарядке
@@ -775,7 +744,7 @@
н/дТип виртуальной помпыОпределение помпы
- Болюс: Шаг =%1$s\nПродленный Болюс: [Шаг =%2$s, Длительность =%3$sмин -%4$sh] \nБазал: Шаг =%5$s\ nTBR: %6$s (на %7$s), Длительность =%8$sмин -%9$sh\n%10$s
+ Болюс: Шаг =%1$s\n Пролонгированный Болюс: [Шаг =%2$s, Продолжительность =%3$sмин -%4$sh] \nБазал: Шаг =%5$s\n ВБС: %6$s (на %7$s), Продолжительность =%8$sмин -%9$sh\n%10$sАвтозаполнение пропущенных данных СКПараметры мастера настройки смарт-часов wearРасчеты, включены в результат мастера настройки смарт-часов wear:
@@ -783,22 +752,20 @@
Общие настройки wearВключить клиент NSClientДобро пожаловать в мастер установки
- Настройки помпыСтатус \'чтение\'Изменения должны быть сделано в NightscoutПропустить Мастер установкиНажмите на кнопку ниже, чтобы AndroidAPS мог предложить/внести изменения в базал
- Настроить плагин APS
- Настроить плагин чувствительности SensitivityПлагин чувствительности Sensitivity применяется для определения чувствительности к инсулину и вычисления активных углеводов COB. Дополнительная информация:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
Context | Edit ContextNSClient обрабатывает подключения к Nightscout. Вы можете пропустить этот этап сейчас, но не преодолеете все Цели пока не настроите его.Напоминание: новые профили инсулина требуют как минимум 5 часов длительности действия DIA. 5-6 часовая DIA эквивалентна трехчасовой на старых профилях.
- Настройте источник СКПожалуйста выберите источник профиля. Если пациент ребенок пользуйтесь профилем Nightscout. Если никто не отслеживает ваш СК на NS, вы вероятно предпочтете Локальный профиль. Напоминание - вы всего лишь выбираете профиль. Активируйте его \"Переключателем профиля\"Выберите один из доступных алгоритмов. Они расположены от самых старых к самым новым. Более новый алгоритм обычно мощнее и агрессивнее. Если вы новый пользователь возможно вам лучше начать с помощника болюса AMA а не с новейшего алгоритма. Читайте документацию OpenAPS и определите свою конфигурацию.
+ Ожидание соединения RileyLink\n
+ Примечание: После инициализации помпы вы можете продолжить установку\nНачните первую ЦельПрава доступаЗапросить права доступа
@@ -806,7 +773,6 @@ Context | Edit ContextПриложению требуется разрешение на доступ к местоположению для сканирования BT и идентификации WiFiПриложение требует разрешения на доступ к записи в память, чтобы хранить файлы журналов и настройки экспортаЗапрос
- Настроить плагин инсулинаВыходПоказать панель навигацииCкрыть панель навигации
@@ -846,7 +812,6 @@ Context | Edit ContextНастройки журналаВосстановить значения по умолчаниюНекорректная работа NSClient. Возможно следует перезапустить NS и NSClient.
- АвточувствДоступна версия %1$sСмещение по времениПредпочитаемый режим APS
@@ -914,7 +879,7 @@ Context | Edit ContextИнтеграция с помпой Accu-Chek InsightНе вставленоНедавнее соединение: %1$d мин. назад
- Суммарная скорость базала: %1$d%% за %2$d / %3$d мин
+ Врем базал (TBR): %1$d%% на %2$d / %3$d минПролонгированный: %1$.2f / %2$.2f U за %3$d минПролонгированный: %1$.2f / %2$.2f U за %3$d минСуммарный инсулин TDD: %1$.2f
@@ -988,6 +953,7 @@ Context | Edit Contextограничение по объему карты памятиОсвободите по крайней мере %1$d MB из внутренней памяти! Цикл остановлен!Неверный формат
+ Длительность временного базала TBR должна быть кратной %1$d минутам и больше 0.Неверный код. Команда отменена.Не сконфигурированоПереключатель профиля создан
@@ -1083,12 +1049,9 @@ Context | Edit ContextВыбрано:ЕдиницыХотите переключить профиль и сбросить изменения, внесенные в текущий профиль?
- Вкл.
- Выкл.Очистить завершенныеОчистить начатыеХотите сбросить начатую цель? Можете потерять уже достигнутое.
- Помпа не выбранаВыберите единицы, в которых вы хотите отображать значенияПеренести изменения локального профиля в NSВремя действия инсулина DIA
@@ -1109,7 +1072,6 @@ Context | Edit Context
ОтправитьНаиболее часто применяемый профиль:Примечание: Данные, видимые на этом экране, будут загружены анонимно. Для этой установки AndroidAPS назначен идентификатор. Вы можете снова передать данные, если ваш основной профиль будет изменен, но пусть он работает по крайней мере в течение недели, чтобы результат был виден в динамике. Ваша помощь ценна.
- ОпросНекорректное значение возрастНекорректное значение весНекорректный ввод %
@@ -1129,10 +1091,8 @@ Context | Edit Context
Очистить очередь? Все данные в очереди будут потеряны!Функция Пролонгированный Болюс остановит режим замкнутого цикла на время действия пролонгированного болюса. Подтверждаете выбор?Замкнутый цикл отключен из-за работы Пролонгированного Болюса
- ПБ\"PhoneChecker\"Меню графика
- АвточувствВремя запроса микроболюса SMBВремя выполнения микроболюса SMBВремя запроса временной базальной скорости
@@ -1148,17 +1108,18 @@ Context | Edit Context
Код для проверки:OTP + ПИН-кодПроверочный код состоит из 6 цифр, отображаемых приложением Authenticator (известным как OTP), за которым следует 3 или более цифр обязательного PIN-кода.
- OTP для проверки:Сбросить аутентификаторыСбросить ключ идентификацииВы действительно хотите сбросить ключ аутентификации? Все сконфигурированные в настоящее время ключи станут недопустимы, и придется их настроить заново.Создан новый ключ аутентификации! Для идентификации используйте обновленный QRCode.
+ Экспорт секретного кода OTP
+ Вы действительно хотите скопировать пароль OTP в буфер обмена?\n\nЭто может потребоваться только в том случае, если у вашего приложения идентификации проблемы при сканировании QR кода, вы хотите ввести его вручную или настроить аппаратный маркер OTP с помощью специального приложения.
+ Секретный одноразовый код OTP (в формате Base32) экспортирован и скопирован в буфер обмена. Вставьте его в систему идентификации или аппаратный маркер OTP!1. Установить Аутентификатор2. Код сканирования для настройки кодов OTP AndroidAPS3. Одноразовый ПарольСбросить аутентификаторыВ каждом отслеживающем телефоне установите приложение Authenticator, поддерживающее маркеры TOTP RFC 6238. Популярные бесплатные приложения: \n Authy\n Google Authenticator\n LastPass Authenticator\n FreeOTP Authenticator
- Не переправляйте этот код через интернет!\nИспользуйте его только для настройки приложения Authenticator на отслеживающих телефонах.После сброса аутентификатора вы делаете все созданные идентификаторы недействительными. Вам нужно будет снова создать их!При подключенииПри отключении
@@ -1172,6 +1133,7 @@ Context | Edit Context
Копировать параметры из NSКопировать настройки NS (если есть)?Исходная тема оформления
+ Скин для низкого разрешенияКнопки всегда отображаются в нижней части экранаБольшой дисплейТема оформления
@@ -1216,4 +1178,7 @@ Context | Edit Context
Рабочее состояние: %sЗагруженные данныеНа ваш аккаунт Open Humans будут загружены следующие данные: значения ГК, события careportal (за исключением примечаний), пролонгированные болюсы, переключения профиля, суммарные суточные дозы, временные базалы, временные цели, настройки, версии приложения, модель устройства и размеры экрана. Секретная или конфиденциальная информация, такая как адрес вашего сайта Nightscout или API secret, не будет загружена.
+ Статус RileyLink:
+ Фильтр
+ Не закрывать приложение?
diff --git a/app/src/main/res/values-sk-rSK/exam.xml b/app/src/main/res/values-sk-rSK/exam.xml
index 07c257c64c..22b72fa1aa 100644
--- a/app/src/main/res/values-sk-rSK/exam.xml
+++ b/app/src/main/res/values-sk-rSK/exam.xml
@@ -17,7 +17,6 @@
NS profil môže byť použitý, ale nenakonfigurovaný.https://androidaps.readthedocs.io/en/latest/CROWDIN/cs/Configuration/Config-Builder.html#profileTéma: Odpojenie od pumpy
- Čo je potrebné urobiť, pri odpojení pumpy?Kliknite na \"Odpojiť pumpu\", aby AAPS vedelo, že nie je podávaný žiadny inzulín.Kliknite na tlačítko \"Pozastaviť uzavretý okruh\", aby AAPS zastavil uzavretý okruh na dobu, kým je pumpa odpojená.Nemeňte nič v AAPS, iba odpojte pumpu.
diff --git a/app/src/main/res/values-sk-rSK/objectives.xml b/app/src/main/res/values-sk-rSK/objectives.xml
index b76ff17397..8fdfc7d19c 100644
--- a/app/src/main/res/values-sk-rSK/objectives.xml
+++ b/app/src/main/res/values-sk-rSK/objectives.xml
@@ -1,6 +1,5 @@
- NaspäťZačiatokOverenie%1$d. Cieľ
diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml
index d655dbe451..43fdb1f9d1 100644
--- a/app/src/main/res/values-sk-rSK/strings.xml
+++ b/app/src/main/res/values-sk-rSK/strings.xml
@@ -21,17 +21,16 @@
Zobrazenie prednastavených jedál, definovaných v NightscoutePredvoľba pre inzulín Humalog a NovorapidPredvoľba pre inzulín Fiasp
+ Predvoľba pre inzulín LyumjevUmožňuje definovať vrchol účinnosti inzulínu a malo by byť používané iba pokročilými užívateľmiAktivuje alebo deaktivuje spustenie uzavretého okruhu.Synchronizuje vaše dáta s NS
- Stav algoritmu v roku 2016Stav algoritmu v roku 2017Najnovší algoritmus pre pokročilých užívateľovZobrazenie aktuálneho stavu vašeho uzavretého okruhu a tlačidlá k najpoužívanejším ovládacím prvkomZobrazuje priebežné oznámenia v Androide s krátkym prehľadom, čo práve uzavretý okruh robíDefinujte profil, ktorý je dostupný offline.Použitie profilu, ktorý je definovaný v Nightscoute
- Definuj profil s iba jedným časovým pásmom.Ovládač pumpy pre Accu-Check Combo, vyžaduje nainštalovanú aplikáciu RuffyOvládač pumpy pre užívateľov používajúcich k liečbe diabetu inzulínové peráOvládač pumpy pre užívateľov bez podporovanej pumpy (Otvorený okruh)
@@ -83,7 +82,6 @@
KonfiguráciaPrehľadNS Profil
- Jednoduchý profilOšetreniaVirtuálna pumpaStarostlivosť
@@ -105,13 +103,11 @@
APSPo spracovaní obmedzeníBazál nastavený pumpou
- Naposledy podanéNEVYBRANÉ ŽIADNE APS, ALEBO NEVRÁTILO VÝSLEDOKBezpečnosťModul je deaktivovanýMimo povolený rozsahChyba podania bolusu
- Hodnota bazálu [%]Povoliť nový dočasný bazál:BolusKalkulačka
@@ -140,17 +136,11 @@
InéGlukomerSenzor
- Sacharidy
- InzulínČas jedla
- RozdelenieTrvanie
- Percentá
- AbsolútnePoznámkyČas udalostiProfil
- ZadalZadanie glykémieZatiaľ nebol načítaný žiadny profil z NSDočasný bazál
@@ -214,7 +204,6 @@
Chyba dešifrovania, zadané heslo je neplatné, alebo bol súbor nastavení zmenený! Môže sa stať, že importovaný súbor bol exportovaný s iným hlavným heslom.Chýba konfigurácia šifrovania, formát nastavení je neplatný!Nepodporovaný alebo neurčený šifrovací algoritmus!
- exportované dnesexportované pred %1$sexportované v %1$sexportované pred menej ako hodinou
@@ -246,10 +235,6 @@
Cieľ %1$s na %2$d minút bol úspešne nastavenýDočasný cieľ úspešne zrušenýPovoliť príkazy na diaľku cez SMS
- DanaR nastavenie profilu
- DIA [h]
- Celková doba pôsobenia inzulínu
- NahrávanieBolus zastavenýZastavenie bolusuUzavretý okruh bol deaktivovaný
@@ -260,7 +245,7 @@
Hodnota %1$s je mimo prednastavený rozsahAk chcete pripojiť pumpu, odpovedzte pomocou SMS s kódom %1$sPripojenie k pumpe zlyhalo
- Ak chcete odpojiť pumpu na %1d minút, odpovedzte pomocou SMS s kódom %2$s
+ Ak chcete odpojiť pumpu na %1$d minút, odpovedzte pomocou SMS s kódom %2$sPumpa odpojenáPumpa bola znovu pripojenáPríkazy na diaľku nie sú povolené
@@ -304,7 +289,6 @@
Pumpa nie je inicializovaná!Plnenie/doplňovanieProsím uistite sa, že hodnota zodpovedá špecifikácií Vášho setu!
- InéŠtandardné množstvo inzulínu pre Plnenie/DoplňovanieTlačidlo 1Tlačidlo 2
@@ -312,7 +296,6 @@
Jednotky:JednotkyDIA
- Cieľový rozsah:Rozsah pre zobrazenieZnačka vysokej a nízkej hodnoty v prehľade a na hodinkách WearDolná značka
@@ -346,7 +329,6 @@
AKCIAKONFOKRUH
- JPROOAPSLPRFPREH
@@ -371,7 +353,6 @@
Pozor!\nZa normálnych okolností tieto hodnoty nemusíte meniť. Kliknete TU, PREČÍTAJTE si informácie a UISTITE sa, že im rozumiete skôr, ako ich začnete meniť.Chybné telefónne čísloKalibrácia
- Poslať kalibráciu %1$.1f do xDripu?xDrip+ nie je nainštalovanýKalibrácia odoslaná do xDripuKalibrácia odoslaná. Príjem kalibrácií musí byť v xDripe povolený.
@@ -404,12 +385,13 @@
Rozpísať IOB na hodinkách do bolusového a bazálnehoNeúspešné - skontrolujte telefónnie je k dispozícii
- Vek pacienta
+ Typ pacientaDieťaDospievajúciDospelýDospelý s nízkou citlivosťou
- Vyberte vek pacienta pre nastavenie bezpečnostných limitov
+ Tehotenstvo
+ Prosím vyberte typ pacienta pre nastavenie bezpečnostných limitovMeno pacientaZadajte meno pacienta, alebo prezývku pre rozlíšenie medzi viacerými nastaveniamiPoužívateľ
@@ -417,7 +399,6 @@
%1$s potrebuje vypnúť optimalizáciu batérie pre optimálny výkonUzavretý okruh pozastavenýPozastavený (%1$d min)
- Superbolus (%1$d m)Pozastaviť uzavretý okruhPozastaviť uzavretý okruh na 1 hPozastaviť uzavretý okruh na 2 h
@@ -440,7 +421,6 @@
Zaznamenávať spustenie aplikácie do NSZatváram aplikáciu, aby sa aplikovali nové nastavenia.Aký druh inzulínu používate?
- Rýchlo pôsobiaci inzulínNovorapid, HumalogFiaspINZ
@@ -453,6 +433,8 @@
Prah kritického veku inzulínu [h]Prah upozornenia na vek senzora [h]Prah kritického veku senzora [h]
+ Prah upozornenia na úroveň batérie senzora [%]
+ Prah kritickej úrovne batérie senzora [%]Prah upozornenia na úroveň batérie [h]Prah kritickej úrovne batérie [h]Prah upozornenia na úroveň hladiny zásobníka [JI]
@@ -478,11 +460,13 @@
Zakázať nahrávanie do NSVšetky dáta odoslané do NS, budú zahodené. AAPS je pripojený k NS, ale nerobí v ňom žiadne zmenyZrušiť predĺžený bolus
- Vek senzora
- Vek kanyly
- Vek inzulínuVykonajte zmenu profilu
- Vek batérie v pumpe
+ Senzor
+ Kanyla
+ Inzulín
+ Batéria do pumpy
+ vek:
+ úroveň:Nastavenie alarmovVytvoriť oznámenia z alarmov NSVytvoriť oznámenia z upozornení NS
@@ -496,20 +480,14 @@
Detekcia citlivostiAký druh algoritmu pre detekciu citlivosti má byť použitý?SENZ
- Senzitivita Oref0Senzitivita Oref1Senzitivita AAPSNastavenie vstrebávania sacharidovMax. doba vstrebávania sacharidov [h]Čas v hodinách, počas ktorého predpokladáme, že všetky sacharidy budú vstrebané
- SENZ
- INZ
- KAN
- BATOAPSUPLDBAZ
- EXTNechať obrazovku zapnutúZabrániť Androidu, aby zhasínal obrazovku. Bez pripojenia nabíjačky vybije veľmi rýchlo batériu!Pri zapnutej automatickej detekcii citlivosti, nezabudnite vkladať všetky prijaté sacharidy. V opačnom prípade, budú odchýlky mylne vyhodnocované, ako zmena citlivosti !!
@@ -520,10 +498,6 @@
Hodnoty nie sú uložené!Povoliť vysielanie do iných aplikácií (napr. xDrip). Nepovoľujte, pokiaľ máte nainštalovanú viac ako jednu AAPS, alebo NSClient inštanciu!Povoliť lokálne vysielanie.
- AKTIVITA & SPÄTNÁ VÄZBA
- SACHARIDY & BOLUSY
- CGM & OPENAPS
- PUMPATrvanie [min]OpenAPS SMBPovoliť UAM
@@ -535,6 +509,7 @@
Voliteľný vrchol - OrefRýchlo pôsobiaci - OrefUltra rýchly - Oref
+ LyumjevDIA %1$f je príliš krátke - AAPS namiesto toho použilo %2$f !Aktivovať profilNEPLATNÝ
@@ -576,7 +551,6 @@
Zobrazovať detailné zmenyZobrazovať rozdiel s jedným desatinným miestom naviacAko často budú SMB podávané (v minutách)
- SMB max. minútMaximálny počet minút bazálu, ku ktorým se limituje SMBUAM SMB max. minútMaximální počet minút bazálu, ku ktorým sa limituje SMB pre UAM
@@ -630,7 +604,6 @@
PrázdnyNormálnyJe vyžadovaná aktualizácia času v pumpe
- UpozornenieUpozornenie o ukončenom dočasnom bazále bolo potvrdené.Pumpa nedostupná. Bolus nebol podanýPodávanie inzulínu zlyhalo. Zdá sa, že nebol podaný žiadny bolus. Aby ste si boli istí, skontrolujte pumpu a prípadne pošlite bolus znovu. Aby sa zabránilo nechcenému dvojitému bolusu, podanie bolusu nie je automaticky opakované.
@@ -639,7 +612,6 @@
Nedostatok inzulínu v zásobníku pre takýto bolusChyba pri podávaní predĺženého bolusuSight
- predNastaviť neutrálny dočasný bazálAk 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.Vždy povoliť SMB
@@ -698,7 +670,6 @@
Spustiť doč. cieľ HypoBežiaca vývojárska verzia. Uzavretý okruh je zakázaný.Vývojársky mód povolený
- Vývojársky mód nie je povolený a nebeží vydaná verziaNačítavam bazálny profilHistória v pumpe sa zmenila po spočítaní bolusu. Bolus nebol podaný. Prosím spočítajte ho znovu, pokiaľ je stále potrebný.Bolus úspešne podaný, ale zápis se nepodaril. To sa môže stať, pokiaľ sú podané bolusy rovnakej veľkosti v priebehu 2 minút. Skontrolujte históriu pumpy a zadajte chýbajúce položky do ošetrení. Uistite sa, že nezadávate rovnakú veľkosť v rámci 1 minúty.
@@ -708,7 +679,7 @@
Bazál na pumpe bol zmenený, ale jeho načítanie zlyhaloKontrolujem zmeny v históriiBoli načítané bolusy rovnakej veľkosti v priebehu jednej minúty. Do ošetrení je možné pridať iba jeden. Skontrolujte pumpu a pridajte bolus do ošetrení ručne tak, aby čas nekolidoval.
- \nhttp://www.androidaps.org\n\nfacebook: \nhttp://facebook.androidaps.org
+ \n\ndokumentácia:\nhttps://androidaps.readthedocs.io\n\nfacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsersPosledný bolus je starší ako 24h, alebo je v budúcnosti. Skontrolujte čas v pumpe.Dátum/čas podaného bolusu se zdá byť nesprávny. IOB bude pravdepodobne chybné. Skontrolujte čas v pumpe.Prepnutie profilu chýba. Vykonajte prepnutie profilu, alebo ho aktivujte na záložke lokálneho profilu.
@@ -739,7 +710,6 @@
SBM nie sú povolené pri otvorenom okruhuJedloResetovať
- Odpojené (%1$d m)Maximálne celkové IOB, ktoré OpenAPS nemôže prekročiť [JI]Táto hodnota je v kontexte OpenAPS nazývaná Max IOB.\nOpenAPS nikdy nepridá inzulín, pokiaľ je súčasné IOB väčšie, ako táto hodnotaPumpa zastavená
@@ -753,7 +723,6 @@
SpäťSprievodca nastavenímDokončiť
- Vyberte jazykPrvý prídavok inzulínuDruhý prídavok inzulínuTretí prídavok inzulínu
@@ -783,20 +752,18 @@
Všeobecné nastaveniaPovoliť NSClientVitajte v sprievodcovi nastavení. Prevedie Vás procesom nastavenia programu\n
- Nastavenie pumpyNačítať stavZmeny musia byť urobené v NSPreskočiť sprievodcuStlačte tlačidlo nižšie, pre povolenie, aby mohlo AndroidAPS navrhovať, alebo robiť zmeny bazálu
- Nastavenie APS
- Nastavenie citlivostiModul citlivosť slúži k detekcii zmien v citlivosti a k počítaniu COB. Viac informácií tu:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient slúži na spojenie s Nightscoutom. Nastavenia môžete teraz preskočiť, ale nebudete schopný dokončiť ciele, pokiaľ neurobíte nastavenia.Prosím, zapamätajte si: Nové inzulínové profily vyžadujú DIA minimálne 5h. DIA 5-6 hodín zodpovedá zhruba nastaveniam 3h na starších typoch profilu.
- Konfigurácia zdroja glykémiíVyberte zdroj profilov. Pokiaľ ide o dieťa, využijete pravdepodobne NS profil. Pokiaľ Vás nikto cez NS nesleduje, budete pravdepodobne preferovať lokálny profil. Uvedomte si, že nastavujete iba zdroj profilov. Na to aby se naozaj profil začal používať, je potrebné vykonať aktiváciu profilu použitím funkcie \"Prepnutie profilu\"Vyberte jeden z algoritmov. Sú zoradené od najstaršieho po najnovší. Novší je obvykle lepší a agresívnejší, ale vyžaduje presnejšie nastavenie. Preto pokiaľ s uzavretým okruhom začínate, mali by ste najskôr vybrať jen AMA a nie ten posledný. Nezabudnite si prečítať dokumentáciu k OpenAPS a prejsť nastavenia, kým ho začnete používať.
+ Čakám na pripojenie RileyLink…\n
+ Poznámka: Po inicializácii pumpy môžete pokračovať v nastavení.\nSpusťte prvý cieľPovolenieVyžiadať si povolenie
@@ -804,7 +771,6 @@
Aplikácia vyžaduje oprávnenie polohy, pre vyhľadávanie BT a identifikáciu WiFiAby bolo možné nahrávať logy a exportovať nastavenia, je nutné pre aplikáciu povoliť oprávnenie prístupu k úložiskuPožiadavka
- Nastavenie inzulínového moduluKoniecOtvoriť MenuZavrieť Menu
@@ -844,7 +810,6 @@
Nastavenie logovaniaObnoviť predvolenéChyba NSClienta. Zvážte reštart NS a NSClienta.
- ASVerzia %1$s je k dispozíciiČasový posunPreferovaný režim APS
@@ -986,6 +951,7 @@
obmedzenie interného úložiskaUvoľnite aspoň %1$d MB z interného úložiska! Uzavretý okruh zakázaný!Chybný formát
+ Trvanie dočasného bazálu musí byť násobkom %1$d minút a musí byť väčšie ako 0.Nesprávný kód. Príkaz zrušený.Nie je nakonfigurovanéPrepnutie profilu vytvorené
@@ -1081,12 +1047,9 @@
Vybrané:JednotkyChcete prepnúť profil a zahodiť zmeny vykonané v aktuálnom profile?
- ZAP
- VYPVymazanie dokončenéVymazanie začatéChcete resetovať začiatok cieľa? Môžete prísť o svoj pokrok.
- Nie je vybraná žiadna pumpaVyberte jednotky, v ktorých chcete zobraziť hodnotyOdoslať zmeny lokálneho profilu do NSDoba pôsobenia inzulínu
@@ -1107,7 +1070,6 @@
OdoslaťNajčastejšie používaný profil:Poznámka: Len údaje zobrazené na tejto obrazovke budú odosielané anonymne. ID je pridelené na túto inštaláciu AndroidAPS. Údaje môžete odoslať znova, ak sa váš hlavný profil zmení, ale nechajte ho bežať aspoň týždeň, aby bol výsledok času v rozsahu viditeľný. Vaša pomoc je vítaná.
- PrieskumNeplatný záznam vekuNeplatný záznam váhyNeplatný vstup %
@@ -1127,10 +1089,8 @@
Vymazať frontu? Všetky dáta vo fronte budú stratené!Použitie funkcie rozloženého bolusu zastaví uzavretý okruh na dobu trvania rozloženého bolusu. Naozaj to chcete?Uzavretý okruh je zastavený kvôli prebiehajúcemu rozloženému bolusu
- EBPhoneCheckerGrafové menu
- ASČas požiadavky SMBČas aplikácie SMBČas požiadavky dočasného bazálu
@@ -1146,17 +1106,18 @@
Kód pre kontrolu:OTP + PINOverovací kód sa skladá zo 6 číslic zobrazených aplikáciou Authenticator (známej ako OTP) nasledované 3, alebo viacerými číslicami povinného kódu PIN.
- OTP pre kontrolu:Resetovať autentifikátoryResetovať autentifikačný kľúčSte si istý, že chcete obnoviť autentifikačný kľúč? Vyresetujete tým všetky aktuálne nakonfigurované autentikátory a budete ich musieť znovu nastaviť.Bol vygenerovaný nový autentifikačný kľúč! Prosím, použite aktualizovaný QR kód pre nastavenie autentifikátorov.
+ Export OTP tajného kľúča
+ Ste si istý, že chcete skopírovať tajný OTP kľúč do schránky?\n\nPravdepodobne to budete potrebovať iba v prípade, keď bude mať vaša overovacia aplikácia problém so skenováním QR kódu, chcete ho zadať ručne, alebo chcete nakonfigurovať hardwarový OTP token pomocou špeciálnej aplikácie.
+ Tajné OTP heslo (vo formáte Base32) bolo vyexportované a skopírované do schránky. Vložte ho do autentikátora, alebo programátora OTP hardwaru!1. Nainštalujte Autentifikátor2. Naskenujte kód pre nastavenie AndroidAPS OTP kódov3. Odtestujte jednorázové hesloResetovať autentifikátoryNa každom sledovacom telefóne nainštalujte Autentifikátor, ktorý podporuje tokeny TOTP RFC 6238. Najobľúbenejšie bezplatné aplikácie sú:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- NEZDIEĽAJTE tento kód on-line!\nPoužiť iba na nastavenie Autentifikátora na sledujúcich telefónoch.Resetovaním autentifikátora budú všetky už poskytnuté autentifikátory neplatné. Budete ich musieť znovu nastaviť!Pri pripojeníPri odpojení
@@ -1170,6 +1131,7 @@
Kopírovať nastavenia z NSSkopírovať nastavenia NS (ak existujú)?Pôvodný vzhľad
+ Vzhľad pre nízke rozlišenieTlačidlá sú vždy zobrazené v spodnej časti obrazovkyVeľký displejVzhľad
@@ -1213,4 +1175,9 @@
Odoslať iba pri nabíjaníStav procesu: %sOdoslané údaje
+ Následujúce dáta budú nahraté do vašeho účtu Open Humans: hodnoty glykémie, bolusy, sacharidy, udalosti starostlivosti (okrem poznámok), rozložené bolusy, prepnutia profilov, celkové denné dávky, dočasné bazály, nastavenia, verzia aplikácie, model zariadenia a rozmery obrazovky. Tajné, alebo súkromné informácie, ako je URL, alebo API heslo vašeho Nightscoutu, nahraté nebudú.
+ Stav RileyLinku:
+ Filter
+ Nie je možné vytvoriť lokálny profil. Profil je neplatný.
+ Nepotláčať moju aplikáciu?
diff --git a/app/src/main/res/values-sv-rSE/exam.xml b/app/src/main/res/values-sv-rSE/exam.xml
index 10e769312a..6b6d3447a9 100644
--- a/app/src/main/res/values-sv-rSE/exam.xml
+++ b/app/src/main/res/values-sv-rSE/exam.xml
@@ -17,7 +17,6 @@
NS-profil kan användas, men inte konfigureras.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profileÄmne: Koppla från pumpen
- Vad bör göras innan du kopplar bort pumpen?Klicka på \"Koppla loss pump\" så att AAPS vet att inget insulin levereras.Klicka på \"pausa loopen\" så att AAPS slutar att loopa medan pumpen inte är ansluten.Ändra inte på någonting i AAPS, koppla bara bort pumpen.
@@ -134,8 +133,8 @@
Högre IC-kvot leder till mindre insulin som levereras för en given mängd kolhydrater.Lägre IC-kvot leder till mindre insulin som levereras för en given mängd kolhydrater.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å.
- IC kommer att vara annorlunda om du räknar en skiva bröd som 10g eller 12g.
- IC-betydelsen är: Hur många skivor bröd omfattas av 1U insulin.
+ IC kommer att vara annorlunda om du räknar brödenheter (utbytesenhet) som 10g eller 12g.
+ IC betyder: Hur många brödenheter (utbytesenheter) som omfattas av 1U insulin.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uÄmne: Profilbyte När du anger 90% i profilbytet…
diff --git a/app/src/main/res/values-sv-rSE/objectives.xml b/app/src/main/res/values-sv-rSE/objectives.xml
index 6f53a9be76..e1f3c3b0cc 100644
--- a/app/src/main/res/values-sv-rSE/objectives.xml
+++ b/app/src/main/res/values-sv-rSE/objectives.xml
@@ -1,6 +1,5 @@
- TillbakaStartaKontrollera%1$d. Målet
diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml
index bbb31a8e13..0032d48b31 100644
--- a/app/src/main/res/values-sv-rSE/strings.xml
+++ b/app/src/main/res/values-sv-rSE/strings.xml
@@ -21,17 +21,16 @@
Visar förutbestämda inställningar för mat i NightscoutInsulininställning för vanliga direktverkande insuliner som Humalog, Lispro, Apidra och Novorapid/NovologInsulininställning för ultrasnabba insuliner, t ex Fiasp
+ Insulininställning för LyumjevLåter dig ställa in tidpunkten för toppen på insulinets aktivitet. Bör bara användas av avancerade användareAktivera eller inaktivera implementationen som kör loopen.Synkroniserar dina data med Nightscout
- Så som algoritmen var definierad år 2016Så som algoritmen var definierad år 2017Den senaste algoritmen för avancerade användareVisar loopens nuvarande tillstånd och knappar för de vanligaste funktionernaVisar en konstant avisering med en kort sammanfattning av vad din loop görDefiniera en profil som är tillgänglig offline.Använder profiler från Nightscout
- Definiera en insulinprofil som bara har ett enda tidsblock.Pumpintegration för Accu-Chek Combo. Kräver att Ruffy är installeratIntegration för de som endast använder insulinpennorIntegration för pumpar som ännu inte stöds av AndroidAPS (Open loop)
@@ -84,7 +83,6 @@ Eversense-appen.
KonfigurationsverktygÖversiktNS-profil
- Enkel profilBehandlingarVirtuell pumpCareportal
@@ -106,13 +104,11 @@ Eversense-appen.
APSEfter begränsningarTemp basal satt i pump
- Senaste justeringINGEN APS VALDSäkerhetInsticksprogram inaktiveratBegränsning nåddFel vid bolusleverans
- Basaldos [%]Acceptera ny temp basal:BehandlingKalkylator
@@ -141,17 +137,11 @@ Eversense-appen.
AnnatMätareSensor
- KH
- InsulinKH-tid
- DeladDuration
- Procent
- AbsolutAnteckningNärProfil
- Loggat avGlukostypIngen profil laddad från Nightscout ännuTemp basal
@@ -215,7 +205,6 @@ Eversense-appen.
Dekrypteringsfel. Det angivna lösenordet är ogiltigt eller så har inställningsfilen ändrats. Filen verkar ha exporterats med ett annat lösenord.Krypteringskonfigurationen saknas. Inställningsformatet är ogiltigt!Ej stödd eller ej angiven krypteringsalgoritm!
- exporterat idagexporterades för %1$s sedanexporterades %1$sexporterades för mindre än timme sedan
@@ -247,10 +236,6 @@ Eversense-appen.
Temporärt mål på %1$s är satt i %2$d minuterTemporärt mål avbrutetTillåt fjärrstyrning via SMS
- Dana R profilinställningar
- DIA [tim]
- Insulinets verkningstid
- Laddar uppBolus avbrutenAvbryter bolusLoop inaktiverad.
@@ -261,7 +246,7 @@ Eversense-appen.
Värdet %1$s är utanför hård begränsningFör att ansluta pumpen, svara med kod %1$sAnslutning till pump misslyckades
- För att koppla från pumpen i %1d minuter, svara med kod %2$s
+ För att koppla från pumpen i %1$d minuter, svara med kod %2$sPump frånkoppladPump återanslutenOtillåtet fjärrkommando
@@ -305,7 +290,6 @@ Eversense-appen.
Pump inte initieradFörfyllningFörsäkra dig om att mängden motsvarar det som är specificerat för just ditt infusionsset.
- ÖvrigtStandardvärden för påfyllning/förfyllning Knapp 1Knapp 2
@@ -313,7 +297,6 @@ Eversense-appen.
Enheter:EnheterDuration
- Målområde:Gränsvärden för visualiseringHögt och lågt värde för grafen i Översikt och i klockanLÅG-markering
@@ -347,7 +330,6 @@ Eversense-appen.
ActKonfLoop
- EPOAPSLPHem
@@ -372,7 +354,6 @@ Eversense-appen.
Viktigt!\nNormalt behöver du inte ändra dessa värden. Vg KLICKA HÄR och LÄS texten och försäkra dig om att du FÖRSTÅTT innan du ändrar dessa värden.Ogiltigt telefonnummer för SMSKalibrering
- Skicka kalibrering %1$.1f till xDrip?xDrip+ inte installeratKalibrering skickad till xDripKalibrering skickad. Observera att xDrip måste vara inställd att ta emot kalibreringar.
@@ -405,12 +386,13 @@ Eversense-appen.
Visa IOB med bolus och basal på klockamisslyckat - kontrollera telefonen-
- Personens ålder
+ PatienttypBarnTonåringVuxenInsulinresistent vuxen
- Vg ange personens ålder för inställningar av gränser
+ Gravid
+ Välj en patienttyp för att ställa in säkerhetsgränserPatientens namnVänligen ange patientens namn eller smeknamn för att kunna skilja mellan flera uppsättningar av inställningarDitt namn
@@ -418,7 +400,6 @@ Eversense-appen.
%1$s behöver kunna kringgå batterisparfunktionerna för att fungera korrektLoop pausadPausad (%1$d min)
- Superbolus (%1$d min)Pausa loopPausa loop i 1 timmePausa loop i 2 timmar
@@ -441,7 +422,6 @@ Eversense-appen.
Rapportera appstart till NightscoutAvslutar appen för att inställningarna ska läsas in.Vilken typ av insulin använder du?
- Snabbverkande InsulinNovorapid, Novolog, Humalog, ApidraFiaspINS
@@ -454,6 +434,8 @@ Eversense-appen.
Insulinålder - akut varning: [h]Sensorålder - varning: [h]Sensorålder - akut varning: [h]
+ Varningsnivå sensorbatteri [%]
+ Kritisk nivå sensorbatteri [%]Batteriålder - varning: [h]Batteriålder - akut varning: [h]Varningsnivå för reservoar [U]
@@ -479,11 +461,13 @@ Eversense-appen.
Ingen uppladdning till NightscoutIngen data sänds till Nightscout. AndroidAPS ansluter till Nightscout men inga ändringar görs i NightscoutStoppa förlängd bolus
- Sensorålder
- Kanylålder
- InsulinålderGenomför profilbyte
- Pumpbatteri ålder
+ Sensor
+ Kanyl
+ Insulin
+ Pumpbatteri
+ ålder:
+ nivå:LarminställningarSkapa aviseringar från NS-larmSkapa aviseringar från NS-meddelanden
@@ -497,20 +481,14 @@ Eversense-appen.
KänslighetsavkänningVilken algoritm vill du använda för känslighetsavkänning?SENS
- Oref0Oref1AAPSAbsorptionsinställningarMax absorptionstid för en måltid [tim]Tid i timmar när alla kolhydrater förväntas vara absorberade
- SAGE
- IAGE
- CAGE
- BAGEAPSUpld battBAS
- EXTHåll skärmen igångFörhindrar att skärmen stängs av. Förbrukar mer batteri.Genom att slå på Autosens funktionen, kom ihåg att skriva in alla KH. Annars kommer programmet göra fel i beräkningar av känslighet (ISF)!!
@@ -521,10 +499,6 @@ Eversense-appen.
Alla värden sparades inte!Aktivera sändning till andra appar (som xDrip). Aktivera inte detta om du har fler än en förekomst av AAPS eller NSClient installerad.Aktivera lokala broadcasts
- TRÄNING & BG-MÅL
- KOLHYDRATER & BOLUS
- CGM & LOGGNING
- PUMPDuration [min]OpenAPS SMBAktivera UAM
@@ -536,6 +510,7 @@ Eversense-appen.
Free-Peak OrefRapid-Acting OrefUltra-Rapid Oref
+ Lyumjev%1$f tim DIA är för kort. Använder %2$f istället!Aktivera profilOGILTIG
@@ -577,7 +552,6 @@ Eversense-appen.
Visa detaljerad deltaVisa delta med en extra decimalMinsta antal minuter mellan SMB
- SMB max minuterMax antal minuter som kan bli SMBUAM SMB max minuterMax antal minuter basal som kan bli SMB vid UAM
@@ -631,7 +605,6 @@ Eversense-appen.
TomNormalPumpens klocka behöver ställas om
- VarningVarningen om avbruten temp basal bekräftadPumpen kunde inte nås. Bolus ej levererad.Bolus avbruten. Det verkar som om ingen bolus levererades. För att vara säker, vänligen kontrollera pumpen för att undvika dubbel bolus och prova sedan vid behov igen. För att förhindra fel orsakade av mjukvaran, försöker inte mjukvaran igen automatiskt.
@@ -640,7 +613,6 @@ Eversense-appen.
Inte tillräckligt med insulin i reservoaren för att ge bolusFörlängd bolus misslyckadSight
- sedanSätt neutrala temp basalerOm 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.Använd alltid SMB
@@ -699,7 +671,6 @@ Eversense-appen.
Starta \"Hypo\"Du kör nu dev-versionen. Closed Loop inaktiverat.Engineering Mode aktiverat
- Engineering Mode inte aktiverat och appen körs inte som releaseLäser basalprofilPumphistoriken ändrad efter att boluskalkylen gjordes. Bolusen har inte levererats. Vänligen gör en ny kalkyl vid behov.Bolusen levererad, men det gick inte att lägga till den i loggen. Detta kan hända om två små bolusar ges inom två minuter. Vänligen kontrollera pumpens historik och Careportal och lägg till om det saknas. Se till att inte lägga till två bolusar med samma mängd och samma tid.
@@ -709,7 +680,6 @@ Eversense-appen.
Basalen ändrad i pumpen, men det gick inte att läsa till vadLetar efter förändringar i historikenFlera bolusar med samma mängd insulin importerades just. Endast en kan läggas till i Careportal. Vänligen kontrollera pumpen och gör ändringar i Careportal manuellt vid behov. Observera att man bara kan ha en bolus per klockslag.
- \n\nWeb: http://www.androidaps.org\n\nDocs: http://wiki.androidaps.org\n\nFB: http://facebook.androidaps.orgDen senaste bolusen är äldre än 24 timmar eller i framtiden. Vänligen kontrollera tid och datum i pumpen.Tid/datum för bolusen verkar fel. IOB är troligen missvisande. Vänligen kontrollera tid och datum i pumpen.Profilbyte saknas. Vänligen gör ett profilbyte eller tryck Aktivera profil under Lokal Profil.
@@ -740,7 +710,6 @@ Eversense-appen.
SMB inte tillåtet i Open LoopMatÅterställ
- Frånkopplad (%1$d min)Max IOB som OpenAPS inte kan överstiga [U]Det här värdet kallas Max IOB av OpenAPS. Om denna mängd insulin on board (IOB) nås, kan inte OpenAPS lägga till mer.Pump stoppad
@@ -754,7 +723,6 @@ Eversense-appen.
FöregåendeInstallationsguideAvsluta
- Välj språkFörsta snabbknabben för insulinAndra snabbknabben för insulinTredje snabbknabben för insulin
@@ -784,20 +752,18 @@ Eversense-appen.
Generella inställningarAktivera NSClientVälkommen till installationsguiden! Den kommer att hjälpa dig genom installationsprocessen\n
- PumpinställningarLäs statusÄndringar måste göras i NSHoppa över installationsguidenTryck på knappen nedan för att låta AndroidAPS föreslå/göra basalförändringar
- Konfigurera APS-insticksprogram
- Konfigurera insticksprogram för känslighetInsticksprogrammet för känslighet används för att detektera insulinkänslighet och för att beräkning av aktiva kolhydrater, COB. För mer information, besök:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient hanterar anslutningen till Nightscout. Du kan hoppa över denna del nu, men du kommer inte att kunna passera vissa mål tills du har satt upp det.Kom ihåg: De nya insulinprofilerna kräver en duration (DIA) på minst 5 timmar. En DIA på 5-6 timmar enligt de nya profilerna är ungefär lika med DIA 3 timmar enligt de gamla insulinprofilerna.
- Konfigurera BG-källaVänligen välj källa för profil. Om patienten är ett barn bör du använda NS profil. Om ingen följer dig på Nightscout kommer du förmodligen föredra lokal profil. Kom ihåg att du endast väljer profilkälla här. För att använda den måste du aktivera den genom att köra ”Byt Profil”Välj en av dessa algoritmer. De sorteras från den äldsta till nyaste. Nyare algoritm är oftast mer kraftfull och mer aggressiv. Om du är ny som loopanvändare vill du förmodligen börja med AMA och inte med senaste. Glöm inte att läsa dokumentationen om OpenAPS och konfigurera algoritmen innan användning.
+ Väntar på Riley Link-anslutning...\n
+ Du kan fortsätta installationen först när pumpen har initierats.\nPåbörja ditt första målBehörighetBe om behörighet
@@ -805,7 +771,6 @@ Eversense-appen.
Appen behöver platsåtkomst för bluetooth- och WiFi-identifieringApplikationen behöver lagringsbehörighet för att kunna lagra loggfiler och exportinställningarBegäran
- Konfigurera insticksprogram för insulinAvslutaÖppna menynStäng menyn
@@ -845,7 +810,6 @@ Eversense-appen.
LoggningsinställningarÅterställ standardinställningarFel på NSClient. Överväg att starta om NSClient och Nightscout-webbplatsen.
- ASVersion %1$s tillgängligKH-tidFöredraget APS-läge
@@ -987,6 +951,7 @@ Eversense-appen.
intern lagringsbegränsningFrigör minst %1$d MB från internminnet. Loop inaktiverad!Felaktigt format
+ Durationen måste vara större än 0 och en multipel av %1$d minuter.Fel kod. Kommandot avbrutet.Inte konfigureradSkapade ett profilbyte
@@ -1082,12 +1047,9 @@ Eversense-appen.
Valt:EnheterVill du byta profil och ta bort ändringar som gjorts i den aktuella profilen?
- På
- AvRensa avslutadeRensa påbörjadeVill du starta om målet? Du kan förlora de steg du gjort hittills.
- Ingen pump har valtsVälj enheter du vill visa värden iÖverför lokala profiländringar till NSDIA
@@ -1108,7 +1070,6 @@ Eversense-appen.
SparaDen vanligaste profilen:Observera att endast data som visas på den här skärmen kommer att överföras anonymt. ID tilldelas till den här installationen av AndroidAPS. Du kan lämna in data igen om din huvudprofil ändras men låt den köra minst en vecka för att göra resultatet synligt i tid inom intervallet. Din hjälp är uppskattad.
- EnkätOgiltig inmatning (ålder)Ogiltig inmatning (vikt)Ogiltig %-inmatning
@@ -1128,10 +1089,8 @@ Eversense-appen.
Allt data som inte synkats kommer att kastas bort. Är du säker på att du vill tömma kön?OBS! Om du använder förlängd bolus, kommer du inte längre vara i Closed Loop under den tiden som den förlängda bolusen är igång. Vill du fortsätta?Closed Loop-läget inaktiverat pga att en förlängd bolus är aktiv
- FBTelefonkontrollDiagrammeny
- ASSMB begärdSMB utfördBasalförändring begärd
@@ -1147,17 +1106,18 @@ Eversense-appen.
Kod att kontrollera:OTP + PIN-kodVerifieringskoden består av sex siffror som visas av autentiseringsappen (känd som OTP) följt av 3 eller fler siffror som är en valbar PIN-kod.
- Engångslösenord att kontrollera:Återställ autentiserareÅterställ autentiseringsnyckelÄr du säker på att återställa autentiseringsnyckeln? Det gör alla konfigurerade autentiseringsappar ogiltiga och du kommer behöva ställa in dem igen.Ny autentiseringsnyckel genererades! Använd uppdaterad QR-kod till att aktivera autentiserare.
+ Exporterar OTP-hemlighet
+ Är du säker på att du vill kopiera OTP-hemligheten till Urklipp?\n\nDu behöver bara göra detta om din autentiseringsapp har problem QR-koder så du vill ange den manuellt eller om du vill konfigurera OTP-token med hjälp av en dedikerad app.
+ OTP-hemligheten exporteras och kopieras till klippbordet i Base32-format. Klistra in den i autentiseringsfunktionen eller OTP-brännaren!1. Installera autentiseringsapp2. Scanna koden för att ställa in engångslösenord för AndroidAPS3. Testa engångslösenordÅterställ autentiserarePå varje följartelefon behöver man installera en autentiseringsapp som stöder RFC 6238 TOTP tokens. Populära gratisappar är:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- DELA INTE denna kod online!\nAnvänd den endast för att installera autentiseringsappen på följartelefoner.Genom att återställa autentiseringsfunktionen kommer alla redan driftsatta autentiserare bli ogiltiga. Du kommer behöva sätta upp dem igen!Vid anslutningVid frånkoppling
@@ -1171,6 +1131,7 @@ Eversense-appen.
Kopiera inställningar från NSKopiera NS-inställningar (om det finns)?Ursprungligt tema
+ Lågupplöst temaKnappar visas alltid längst ned på skärmenStor skärmTema
@@ -1215,4 +1176,5 @@ Eversense-appen.
Jobbstatus: %sUppladdad dataFöljande data kommer att överföras till ditt Open Humans-konto: Glukosvärden, careportalhändelser (utom anteckningar), utökade bolusar, profilbyten, totala dagliga doser, temp basaler, temp mål, inställningar, appversion, enhetsmodell och skärmstorlek. Hemlig eller privat information, t. ex. din Nightscout-adress eller API-hemlighet, kommer inte att överföras.
+ Riley Link-status:
diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml
index 0c525f3183..d48328130f 100644
--- a/app/src/main/res/values-tr-rTR/strings.xml
+++ b/app/src/main/res/values-tr-rTR/strings.xml
@@ -23,13 +23,11 @@
İnsülin aktivitesinin zirvesini tanımlamanıza ve sadece ileri düzey kullanıcılar tarafından kullanılmasına izin verirDöngüyü tetikleyen uygulamayı etkinleştirin veya devre dışı bırakın.Nightscout ile verilerinizi senkronize eder
- 2016\'da algoritmanın durumu2017\'da algoritmanın durumuİleri düzey kullanıcılar için en yeni algoritmaEn yaygın eylemler için Döngü ve düğmelerinizin geçerli durumunu görüntülerDöngünün şu anda ne yaptığını hızlıca gözden geçirerek sürekli bir bildirim gösterirNightscout\'ta tanımladığınız profili sağlar
- Sadece bir zaman bloğuyla bir profil tanımlayın.Accu-Chek Combo pompalar için pompa entegrasyonu, ruffy yüklü olması gerektirirDiyabet tedavisi için günde birden fazla enjeksiyon yapan kişiler için pompa entegrasyonuHenüz herhangi bir sürücüye sahip olmayan pompalar için pompa entegrasyonu (Açık Döngü)
@@ -78,7 +76,6 @@
Konfigurasyon oluşturGenel BakışNightscout Profil
- Basit ProfilTedavilerSanal pompaCareportal
@@ -100,7 +97,6 @@
APSİşlenmiş kısıtlamalardan sonraGeçici bazal pompa tarafından ayarla
- Enson gönderilenSEÇİLEN VEYA SAĞLANAN SONUCU APS YOKGüvenlikEklenti devre dışı
@@ -132,16 +128,10 @@
DiğerMetreSensör
- Karbonhidrat
- İnsülinKarb zaman
- BölSüre
- Yüzde
- MutlakNotlarProfil
- Tarafından girilenGlikoz türüHenüz NightSout\'tan profil yüklenmediGeçici Bazal
@@ -169,10 +159,6 @@
Kalibrasyon %1$.2f gönderilecek, kod ile cevap ver %2$sBolus başarısız olduSMS ile uzaktan komutlara izin ver
- DanaR profil ayarları
- DIA [h]
- İnsülin aktivitesinin süresi
- YüklüyorBolus durduBolus durdurmaDöngü devre dışı bırakıldı
@@ -202,11 +188,9 @@
Pompa başlatılmamış!Hazırla/doldurLütfen miktarın infüzyon setinizin özelliklerine uygun olduğundan emin olun!
- DiğerDüğme 1Düğme 2Düğme 3
- Hedef aralığı:Görselleştirme AralığıGenel bakış ve akıllı saat göstergesi için yüksek ve düşük değerlerDÜŞÜK işareti
@@ -238,7 +222,6 @@
ACTKONFDÖNGÜ
- SPOAPSLPHOME
@@ -293,16 +276,13 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Ayrıntılı IOB gösterWatchface üzerinde IOB\'yi bolus ve bazal IOB\'ye ayırınbaşarısız - lütfen telefonu kontrol edin
- Hasta yaşıÇocukErgenYetişkinYetişkin İnsülin direnci
- Güvenlik sınırlarını ayarlamak için lütfen hasta yaşını seçinizGlimpDöngü durdulduAskıya alındı (%1$d m)
- Superbolus (%1$d m)Döngüyü duraklatDöngü 1s\'liğine askıya alındıDöngü 2s\'liğine askıya alındı
@@ -324,7 +304,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Log uygulaması NightScout\'a başlarAyarları uygulamak için uygulamadan çıkılıyor.Hangi tür insülin kullanıyorsunuz?
- Hızlı etkili İnsülinNovorapid, Novolog, HumalogFiaspINS
@@ -343,10 +322,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
NightScout\'a yükleme yokNS\'ye gönderilen tüm veriler düştü. AAPS NS\'ye bağlandı, ancak NS\'de hiçbir değişiklik yapılmadıYayma Bolusu iptal et
- Sensör yaşı
- Kanül yaşı
- İnsülin yaşı
- Pompa pil yaşıAlarm türleriEski veri eşiği [min]Acil durum verileri eşiği [min]
@@ -358,20 +333,14 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Duyarlılık algılamasıHangi duyarlılık algoritması kullanılmalıdır?SENS
- Oref0 duyarlılıkOref1 duyarlılıkAAPS duyarlılıkEmilim ayarlarıBesinin maksimum emilim süresi [h]Tüm karbonhidratların emileceği beklenen saat cinsinden süre
- SAGE
- IAGE
- CAGE
- BATOAPSUPLDBAZ
- EXTEkranı açık tutAndroid\'in ekranı kapatmasını önleyin. Prize takılı değilken çok fazla enerji tüketir.Autosense özelliğini açarsanız tüm yenen karbonhidratları girmeyi unutmayın. Aksi halde, karbonhidrat sapmaları duyarlılık değiştikçe yanlış tanımlanacaktır!!
@@ -381,10 +350,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Tüm profiller yüklenmedi!Değerler saklanmadı!Yerel yayınları etkinleştirin.
- AKTIVITE & GERİBİLDİRİM
- KARBONHİDRATLAR & BOLUS
- CGM & OPENAPS
- PUMPSüre [min]OpenAPS SMBUAM etkinleştir
@@ -480,7 +445,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
BoşNormalPompa saati güncellemesi gerekli
- UyarıUyarı \"TBR İptal\" kabul edildiPompaya ulaşılamadı. Bolus verilmediBolus teslimatı başarısız oldu. Görünüşe göre bolus teslim edilemedi. Emin olmak için, lütfen çift bolustan ve daha sonra tekrar bolustan kaçınmak için pompayı kontrol edin. Yazılımsal hatalardan korunmak için, bolus otomatik olarak tekrar denenmemeli.
@@ -488,7 +452,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Bolusun teslimi ve pompa tarihinin doğrulanması başarısız oldu. Lütfen pompanızı kontrol edin. Bir bolus verildiğinde, sonraki bağlantıdaki tedavilere eklenir.Rezervuarda bolus için yeterli insülin yokYayım bolus gönderme hatası
- önceSMB\'yi her zaman etkinleştirSMB\'yi her zaman bağımsız olarak boluslarla etkinleştirin. G5 gibi verilerin yalnızca filtrelenmesiyle yalnızca KŞ kaynağıyla mümkündürYemeklerden sonra SMB\'yi (Super Micro Bolus) etkinleştir
@@ -534,7 +497,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Hypo TT başlatDev sürümü çalışıyor. Kapalı Döngü devre dışı.Geliştirici modu aktivleşti
- Engineering mode etkin değil ve yayım sürümü değilBazal oranı profili okunuyorBolus hesaplaması yapıldıktan sonra pompa geçmişi değişti. Bolus teslim edilmedi. Bir bolus hala gerekli ise lütfen yeniden hesaplayın.Bolus başarıyla gönderildi, ancak tedavi girişinin eklenmesi başarısız oldu. Son iki dakika içinde aynı boyutta iki küçük bolüs verilirse bu durum meydana gelebilir. Lütfen pompa geçmişini ve tedavi girişlerini kontrol edin ve eksik girişler eklemek için Careportal\'ı kullanın. Aynı dakika ve aynı tutar için herhangi bir giriş eklemediğinizden emin olun.
@@ -544,7 +506,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Bazal oranı pompada değiştirildi, ancak okuma başarısız olduGeçmiş değişiklikleri kontrol ediliyorAynı dakika içinde aynı miktarda birden fazla boluslar eklenildi. Tedavilere sadece bir kayıt eklenebilir. Lütfen pompayı kontrol edin ve Careportal sekmesini kullanarak elle bir bolus kaydı ekleyin. Başka bolus kullanmayan bir zamana sahip bir bolus oluşturduğunuzdan emin olun.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)Son bolus 24 saatten daha eski veya gelecekte. Lütfen pompadaki tarihin doğru ayarlandığını kontrol edin.Teslim edilen bolusun pompadaki zamanı/tarihı yanlış görünüyor, IOB (Insulin On Board) muhtemelen yanlıştır. Lütfen pompa zamanını/tarihini kontrol edin.Profildeğiştir kayıp. Lütfen bir profil değiştir seçin veya YerelPorfil\'de \"Profili Etkinleştir\" düğmesine basın.
@@ -575,7 +536,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Açık Döngü modunda Super Micro Bolus\'a izin verilmiyorYiyeceksıfırla
- Bağlantısı kesildi (%1$d m)OpenAPS tarafından aşılmayacak, maksimum toplam IOB(Aktif İnsülin)[U]Bu değer OpenAPS bağlamında Max IOB (Aktif İnsülin) olarak adlandırılır\nOpenAPS, mevcut IOB bu değerden daha büyükse daha fazla insülin eklemezPompa durduruldu
@@ -589,7 +549,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
ÖncekiKurulum SihirbazıBİTTİ
- Dilinizi seçinBirinci insülin artışıİkinci insülin artışıÜçüncü insülin artışı
@@ -619,24 +578,19 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Genel AyarlarNSClient etkinleştirKurulum sihirbazına hoş geldiniz. Kurulum işleminde size rehberlik edecektir\n
- Pompa AyarlarıDurum okuDeğişiklikler Nightscout\'da yapılmalıdırKurulum sihirbazını atlaAndroidAPS\'ın bazal değişiklikleri önerme/yapmasını sağlamak için aşağıdaki düğmeye basın
- APS eklentisini yapılandır
- Duyarlılık eklentisini yapılandırDuyarlılık eklentisi, duyarlılık tespiti ve COB hesaplaması için kullanılır. Daha fazla bilgi için ziyaret edin:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBLütfen unutmayın: yeni insülin profilleri en az 5 saat DIA gerektirir. Yeni profildeki DIA 5–6 saat, eski insülin profillerinde DIA 3saat\'e eşittir.
- KŞ için kaynak yapılandırLütfen profil kaynağını seçiniz. Hasta bir çocuksa Nightscout profilini kullanmalısınız. Eğer Nightscout\'ta seni takip eden kimse yoksa muhtemelen yerel profili tercih edersiniz. Lütfen sadece profil kaynağını seçtiğinizi unutmayın. Bunu kullanmak için \"Profil değiştir\" i çalıştırarak etkinleştirmelisinizMevcut algoritmalardan birini seçin. En eskiden en yeniye ayrılırlar. Yeni algoritma genellikle daha güçlü ve daha agresiftir. Böylece eğer yeni bir Döngü\'cü iseniz, muhtemelen AMA ile başlayabilirsin, en sonuncusuyla değil. OpenAPS belgelerini okumayı ve kullanmadan önce yapılandırmayı unutmayın.İlk hedefinize başlayınYetkiİzin için sorunuzİstek
- İnsülin eklentisini yapılandırÇıkışNavigasyonu açNavigasyonu kapat
@@ -670,7 +624,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
Günlük ayarlarıVarsayılanlara sıfırlaNSClient arızası. NS ve NSClient yeniden başlatmayı düşünün.
- AS (Autosens)Sürüm %1$s mevcutSaat farkıTercih edilen APS modu
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index ec2b5760b4..bdcd337667 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -23,13 +23,11 @@
允许您定义胰岛素作用的峰值, 并且只应由高级用户使用激活或停用这个工具触发闭环。将数据与 Nightscout 同步
- 算法的状态在2016年算法的状态在2017年最新的适合高级用户的算法显示闭环的当前状态和大多数常用操作的按钮显示持续的通知, 其中简要概述了您的闭环正在做什么提供您在 Nightscout 中已经定义的配置文件
- 仅使用一个时间段定义配置文件。与Accu-Check Combo 胰岛素泵集成,需要安装ruffy软件与用于糖尿病治疗的多次每日注射的泵集成与我们还没有其驱动的泵集成(开环)
@@ -79,7 +77,6 @@
配置生成器首页概览NS 配置文件
- 简单配置文件治疗虚拟泵护理记录
@@ -101,7 +98,6 @@
APS通过约束条件之后通过泵设置临时基础率
- 上次制定APS没有被选择或者提供结果安全性插件已禁用
@@ -133,16 +129,10 @@
其他血糖仪传感器
- 碳水化合物
- 胰岛素碳水化合物时间
- 拆分持续时间
- 百分比
- 绝对备注配置文件
- 输入者是血糖类型尚未从 NS 加载配置文件临时基础
@@ -170,10 +160,6 @@
要发送校准值 %1$.2f 回复如下代码 %2$s大剂量输注失败通过SMS短信允许远程命令
- DanaR 配置文件设置
- DIA [h]
- 胰岛素活性持续时间
- 正在上传···大剂量停止了正在停止大剂量闭环已经被禁用
@@ -215,11 +201,9 @@
泵未初始化!充盈请确保数量和输液器里的药量匹配
- 其他按钮1按钮2按钮3
- 目标范围:可视化范围在智能手表上的图表上的高值和低值标记低值标记
@@ -252,7 +236,6 @@
操作配置闭环
- 本地OpenAPS本地配置文件主页
@@ -276,7 +259,6 @@
注意! \n 正常地您不必在下面更改这些值。请点击这里, 阅读说明, 并确保您了解它之前不要更改任何这些值。无效的SMS手机号码校准
- 确认将校准值 %1$.1f 发送到 xDrip 吗?没有安装xDrip+校准发送到 xDrip校准值发送了,必须在xDrip开启允许通过其他app使用它的校准功能
@@ -308,17 +290,14 @@
显示详细 IOB在手表的表盘上分别显示大剂量IOB和基础IOB未成功-请检查手机
- 病人年龄儿童青少年成人胰岛素抵抗成人
- 请选择患者年龄以设置安全限制Glimp%1$s 需要加入电池优化白名单才能正常运行闭环暂停了暂停了 (%1$d m)
- 超级大剂量 (%1$d m)暂停闭环一个小时暂停闭环2个小时暂停闭环3个小时
@@ -339,7 +318,6 @@
记录app启动事件到NS服务器正在退出应用程序以应用设置。你使用哪种类型的胰岛素?
- 速效胰岛素诺和锐, 门冬, 优泌乐Fiasp超速效INS
@@ -361,10 +339,6 @@
没有上传到NS服务器所有发送到 NS 的数据都将被丢弃。AAPS 已连接到 NS, 但 NS中没有进行任何更改取消扩展大剂量
- 传感器使用时间
- 管路使用时间
- 胰岛素使用时间
- 泵电池使用时间报警选项陈旧数据阈值 [min]紧急陈旧数据阈值 [min]
@@ -376,20 +350,14 @@
灵敏度检测应使用哪一种灵敏度算法?灵敏度
- 灵敏度 Oref0灵敏度 Oref1灵敏度 AAPS食物吸收设置膳食最大吸收时间 [h]预计膳食中所有的碳水化合物被吸收的时间,以小时为单位
- 探头AGE
- 胰岛素AGE
- 管路AGE
- PBAGEOpenAPSUPLD基础率
- EXT保持屏幕常亮阻止 Android 系统关闭手机屏幕。这将非常耗电如果要打开 Autosense功能, 记住输入所有吃的碳水化合物。否则碳水化合物的偏差将被识别为错误的灵敏度变化!!
@@ -399,10 +367,6 @@
配置文件加载不完整值没有被存储启用本地广播。
- 活动 & 反馈
- 碳水化合物 & 大剂量
- CGM & OPENAPS
- 泵持续时间 [min]OpenAPS SMB启用 UAM
@@ -501,7 +465,6 @@
空的正常泵的时间需要更新
- 警告临时基础率取消告警被确认了找不到泵,大剂量输注失败大剂量输注失败,看起来好像没有大剂量被输注。安全起见,请检查泵,避免重复输注大剂量。软件考虑安全因素,不会再自动重试大剂量输注.
@@ -510,7 +473,6 @@
储药器里没有足够的胰岛素可用于大剂量输注了扩展大剂量(方波) 输注错误Sight
- 之前始终启用 SMB启用SMB微型大剂量,总是独立于常规大剂量。 可能只能使用带有良好的数据过滤功能的血糖值来源。例如G5在输入碳水化合物后启用SMB
@@ -559,7 +521,6 @@
开始低的临时目标正在运行开发版本,闭环被禁用了已启用工程模式
- 工程模式没有启用或者在这个版本上不支持正在读取基础率配置文件在大剂量计算之后,泵的历史记录已经发生变化了。大剂量将不会被输注,如果仍然需要大剂量输注请重新计算大剂量输注成功,但添加到治疗记录时失败。如果在最近两分钟内使用相同量的两个小大剂量,就会发生这种情况。请检查泵的历史记录和治疗条目,并使用记录标签添加丢失的条目。确保在同一分钟不要添加重复的条目
@@ -569,7 +530,6 @@
泵上的基础率改变了,但是读取失败检查历史记录变化在同一分钟内使用相同数量的多个大剂量记录被导入的。治疗中只能增加一项记录。请手动检查泵并使用记录标签手动添加一个大剂量记录。确保创建一个和其他大剂量记录时间不重复的大剂量记录.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)最后一次大剂量的输注时间是在24个小时以前或者在未来的时间,请检查泵上的日期设置的的是否正确输注过的大剂量的时间/日期看着好像错了,活性胰岛素可能不准确。请检查泵的时间/日期配置文件切换缺失。请做一次配置文件切换或者在本地配置文件里按“激活配置文件”
@@ -600,7 +560,6 @@
在开环模式下不允许使用SMB-微型大剂量食物重置
- 已断开连接 (%1$d 分)OpenAPS的IOB活性胰岛素总数的最大值不能超过[U]该值在OpenAPS中称为最大 IOB\n如果当前IOB大于此值,则OpenAPS不会输注更多胰岛素泵停止了
@@ -614,7 +573,6 @@
上一个设置向导完成
- 选择你的语言第一胰岛素增量第二胰岛素增量第三胰岛素增量
@@ -644,24 +602,19 @@
常规设置启用 NSClient欢迎使用设置向导。它将指导您完成设置过程 \n
- 泵设置读取状态更改必须在 NS 中完成跳过设置向导按下下面的按钮, 以使 AndroidAPS 建议或者更改基础率
- 配置APS插件
- 配置灵敏度插件灵敏度插件用于灵敏度检测和碳水化合物计算。有关详细信息, 请访问:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB请记住:新的胰岛素分布需要DIA至少5小时。 对于新的配置文件,DIA 5-6小时相当于旧胰岛素配置文件中的DIA 3小时
- 配置血糖值来源请选择配置文件的来源。如果病人是孩子, 你应该使用 NS 配置文件。如果没有人通过 Nightscout关注你, 你可能会更喜欢本地配置文件。请记住, 您只选择配置文件源。要使用它, 您必须通过执行 \"配置文件切换\" 来激活它。从可用算法中选择一个。 他们从最旧到最新排序。 较新的算法通常更强大,更冒险。 因此,如果你是新的闭环使用者,你可能会从AMA算法开始,而不是最新的。 不要忘记在使用之前阅读OpenAPS文档并对其进行配置。开始你的第一个目标权限请求权限请求
- 配置胰岛素插件退出打开导航栏关闭导航栏
@@ -695,7 +648,6 @@
日志设置重置为默认值NSClient故障。 考虑Nightscout和NSClient重启。
- AS版本 %1$s 可用时区偏移首选的APS模式
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 0d8f4134a1..b8fb302f4d 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -35,6 +35,7 @@
@string/it_lang@string/ko_lang@string/lt_lang
+ @string/no_lang@string/pt_lang@string/pt_BR_lang@string/ro_lang
@@ -59,6 +60,7 @@
itkolt
+ noptpt_BRro
@@ -75,12 +77,14 @@
@string/teenage@string/adult@string/resistantadult
+ @string/pregnant@string/key_child@string/key_teenage@string/key_adult@string/key_resistantadult
+ @string/key_pregnant
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 45a362c5de..36b0fb5df8 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -27,12 +27,8 @@
#77dd77
- #40bbaa
-
#779ECB
- #3e3d3d
-
#f4d700#67dfe8#67dfe8
@@ -63,8 +59,6 @@
#ff0400#FFFFFF#303030
- #01017A
- #FFFFFF#2E2E2E
diff --git a/app/src/main/res/values/exam.xml b/app/src/main/res/values/exam.xml
index fb43c28f0b..e3631a1d6d 100644
--- a/app/src/main/res/values/exam.xml
+++ b/app/src/main/res/values/exam.xml
@@ -18,12 +18,10 @@
Topic: Offline ProfileNS Profile can be used, but not configured.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profile
- Reasons for applying "Disconnect pump" in AndroidAPS
- What should be done when disconnecting the pump?
- This is unnecessary as insulin will not be delivered if the pump is physically disconnected.
- It prevents AndroidAPS from accounting for insulin that was not delivered whilst the pump is physically disconnected.
- It will not stop insulin delivery if the pump remains connected.
- It will send AndroidAPS into open loop mode.
+ Topic: Disconnecting from the Pump
+ Click ‘Disconnect pump’ so that AAPS knows that no insulin is being delivered.
+ Click ‘Suspend loop’ so that AAPS stops looping while the pump is disconnected.
+ Don’t change anything in AAPS, just disconnect the pump.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#other-settingsAndroidAPS SettingsAndroidAPS Settings
@@ -169,11 +167,12 @@
Changing the ISF value in your profile is enough to apply the change.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-uhttps://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html
- The Insulin to Carbohydrate (I:C) Ratio
- When COB is zero, raising I:C ratio will lead to more insulin being delivered to correct an above target blood glucose value.
- Lowering the numerical value of the I:C ratio (so that the value of I:C is smaller) will lead to more insulin being delivered for a specific amount of carbs.
- You can use more than one value for I:C ratio in your profile.
- If you change your ISF in your profile you should always change your I:C ratio too.
+ Topic: The IC Ratio
+ Higher IC ratios lead to less insulin delivered for a given amount of carbs.
+ Lower IC ratios lead to less insulin delivered for a given amount of carbs.
+ If you have 0 COB, changing the IC ratio will lead to a different amount of insulin to correct a given BG value.
+ IC will be different if you count bread (exchange) unit as 10g or 12g.
+ IC meaning is: How many bread (exchange) units are covered by 1U of insulin.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-uProfile Switching When specifying a 90% profile switch, which answers are true?
diff --git a/app/src/main/res/values/objectives.xml b/app/src/main/res/values/objectives.xml
index e7ed79a212..0a4fa6c2cf 100644
--- a/app/src/main/res/values/objectives.xml
+++ b/app/src/main/res/values/objectives.xml
@@ -12,7 +12,6 @@
ObjectivespumpStatusIsAvailableInNSObjectivesmanualEnacts
- BackStartVerify%1$d. Objective
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 05014ba225..d1d19014f4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -16,6 +16,7 @@
KoreanLithuanian
+ NorwegianPolishPortuguesePortuguese, Brazilian
@@ -45,17 +46,16 @@
Displays the food presets defined in NightscoutInsulin preset for Humalog and NovoRapid / NovoLogInsulin preset for Fiasp
+ Insulin preset for LyumjevAllows you to define the peak of the insulin activity and should only be used by advanced usersActivate or deactivate the implementation triggering the loop.Synchronizes your data with Nightscout
- State of the algorithm in 2016State of the algorithm in 2017Most recent algorithm for advanced usersDisplays the current state of your loop and buttons for most common actionsShows an ongoing notification with a short overview of what your loop is doingDefine a profile which is available offline.Provides the profile you have defined in Nightscout
- Define a profile with only one time block.Pump integration for Accu-Chek Combo pumps, requires having ruffy installedPump integration for people who do multiple daily injections for their diabetes therapyPump integration for pumps which don\'t have any driver yet (Open Loop)
@@ -109,7 +109,6 @@
Config BuilderOverviewNS Profile
- Simple profileTreatmentsVirtual PumpCareportal
@@ -134,13 +133,11 @@
APSAfter processed constraintsTemp basal set by pump
- Last enactedNO APS SELECTED OR PROVIDED RESULTSafetyPlugin is disabledConstraints violationBolus delivery error
- Basal value [%]Accept new temp basal:TreatmentCalculator
@@ -172,17 +169,11 @@
OtherMeterSensor
- Carbs
- InsulinCarb time
- SplitDuration
- Percent
- AbsoluteNotesEvent timeProfile
- Entered ByGlucose typeNo profile loaded from NS yetTempBasal
@@ -256,7 +247,6 @@
Missing encryption configuration, settings format is invalid!Unsupported or not specified encryption algorithm!
- exported todayexported %1$s agoexported at %1$sexported less than hour ago
@@ -290,10 +280,6 @@
Target %1$s for %2$d minutes set successfullyTemp Target canceled successfullyAllow remote commands via SMS
- DanaR profile settings
- DIA [h]
- Duration of Insulin Activity
- UploadingBolus stoppedStopping bolusLoop has been disabled
@@ -304,7 +290,7 @@
Value %1$s is out of hard limitsTo connect pump reply with code %1$sConnection to pump failed
- To disconnect pump for %1d minutes reply with code %2$s
+ To disconnect pump for %1$d minutes reply with code %2$sPump disconnectedPump reconnectedRemote command is not allowed
@@ -349,7 +335,6 @@
Pump not initialized!Prime/FillPlease make sure the amount matches the specification of your infusion set!
- OtherFill/Prime standard insulin amountsButton 1Button 2
@@ -357,7 +342,6 @@
Units:UnitsDIA
- Target range:Range for VisualizationHigh and low mark for the charts in Overview and SmartwatchLOW mark
@@ -391,7 +375,6 @@
ACTCONFLOOP
- SPOAPSLPHOME
@@ -404,7 +387,6 @@
Shorten tab titlesAlways use short average delta instead of simple deltaUseful when data from unfiltered sources like xDrip gets noisy.
- key_advancedsettingsProfileDefault value: 3 This is a key OpenAPS safety cap. What this does is limit your basals to be 3x (in this people) your biggest basal rate. You likely will not need to change this, but you should be aware that’s what is discussed about “3x max daily; 4x current” for safety caps.Default value: 4 This is the other half of the key OpenAPS safety caps, and the other half of “3x max daily; 4x current” of the safety caps. This means your basal, regardless of max basal set on your pump, cannot be any higher than this number times the current level of your basal. This is to prevent people from getting into dangerous territory by setting excessively high max basals before understanding how the algorithm works. Again, the default is 4x; most people will never need to adjust this and are instead more likely to need to adjust other settings if they feel like they are “running into” this safety cap.
@@ -423,7 +405,6 @@
http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.htmlInvalid SMS phone numberCalibration
- Send calibration %1$.1f to xDrip?xDrip+ not installedCalibration sent to xDripCalibration sent. Receiving must be enabled in xDrip.
@@ -462,17 +443,19 @@
n/asmscommunicator_allowednumberssmscommunicator_remotecommandsallowed
- Patient age
+ Patient typeChildTeenageAdultInsulin resistant adult
+ Pregnancyagechildteenageadultresistantadult
- Please select patient age to setup safety limits
+ pregnant
+ Please select patient type to setup safety limitsPatient namePlease provide patient name or nickname to differentiate among multiple setupsUser
@@ -482,7 +465,6 @@
%1$s needs battery optimalization whitelisting for proper performanceLoop suspendedSuspended (%1$d m)
- Superbolus (%1$d m)Suspend loopSuspend loop for 1hSuspend loop for 2h
@@ -505,7 +487,6 @@
Log app start to NSExiting application to apply settings.Which type of insulin are you using?
- Fast Acting InsulinNovorapid, Novolog, HumalogFiaspINS
@@ -526,6 +507,10 @@
Threshold warning sensor age [h]statuslights_sage_criticalThreshold critical sensor age [h]
+ statuslights_sbat_warning
+ Threshold warning sensor battery level [%]
+ statuslights_sbat_critical
+ Threshold critical sensor battery level [%]statuslights_bage_warningThreshold warning battery age [h]statuslights_bage_critical
@@ -559,11 +544,13 @@
ns_upload_onlyns_nouploadCancel Extended Bolus
- Sensor age
- Canula age
- Insulin ageDo Profile Switch
- Pump battery age
+ Sensor
+ Canula
+ Insulin
+ Pump battery
+ age:
+ level:Alarm optionsns_announcementsns_alarms
@@ -583,7 +570,6 @@
Sensitivity detectionWhich sensitivity algorithm should be used?SENS
- Sensitivity Oref0Sensitivity Oref1Sensitivity AAPSAbsorption settings
@@ -591,14 +577,9 @@
Meal max absorption time [h]Time in hours where is expected all carbs from meal will be absorbedrangetodisplay
- SAGE
- IAGE
- CAGE
- PBAGEOAPSUPLDBAS
- EXTKeep screen onPrevent Android to turn screen off. It will consume lot of energy when not plugged to power outlet.By turning on Autosense feature remember to enter all eated carbs. Otherwise carbs deviations will be identified wrong as sensitivity change !!
@@ -611,10 +592,6 @@
COMBOEnable broadcasts to other apps (like xDrip). Do not enable if you have more than one instance of AAPS or NSClient installed!Enable local Broadcasts.
- ACTIVITY & FEEDBACK
- CARBS & BOLUS
- CGM & OPENAPS
- PUMPDuration [min]OpenAPS SMBuse_smb
@@ -630,6 +607,7 @@
Free-Peak OrefRapid-Acting OrefUltra-Rapid Oref
+ LyumjevDIA of %1$f too short - using %2$f instead!Activate profileINVALID
@@ -679,7 +657,6 @@
Show delta with one more decimal placesmbintervalHow frequently SMBs will be given in min
- SMB max minutesMax minutes of basal to limit SMB toUAM SMB max minutesMax minutes of basal to limit SMB to for UAM
@@ -736,7 +713,6 @@
EmptyNormalPump clock update needed
- WarningTBR CANCELLED warning was confirmedThe pump could not be reached. No bolus was givenBolus delivery failed. It appears no bolus was delivered. To be sure, please check the pump to avoid a double bolus and then bolus again. To guard against bugs, boluses are not automatically retried.
@@ -745,7 +721,6 @@
Not enough insulin for bolus left in reservoirExtended bolus delivery errorSight
- agoenableSMB_alwaysenableSMB_with_COBenableSMB_with_temptarget
@@ -826,7 +801,6 @@
Running dev version. Closed loop is disabled.fromNSAreCommingFakedExtendedBolusesEngineering mode enabled
- Engineering mode not enabled and not on release branchReading basal profileThe pump history has changed after the bolus calculation was performed. The bolus was not delivered. Please recalculate if a bolus is still needed.Bolus successfully delivered, but adding the treatment entry failed. This can happen if two small boluses of the same size are administered within the last two minutes. Please check the pump history and treatment entries and use the Careportal to add missing entries. Make sure not to add any entries for the exact same minute and same amount.
@@ -836,7 +810,7 @@
Basal rate changed on pump, but reading it failedChecking for history changesMultiple boluses with the same amount within the same minute were just imported. Only one record could be added to treatments. Please check the pump and manually add a bolus record using the Careportal tab. Make sure to create a bolus with a time no other bolus uses.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ \n\ndocumentation:\nhttps://androidaps.readthedocs.io\n\nfacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsersThe last bolus is older than 24 hours or is in the future. Please check the date on the pump is set correctly.Time/date of the delivered bolus on pump seems wrong, IOB is likely incorrect. Please check pump time/date.ProfileSwitch missing. Please do a profile switch or press \"Activate Profile\" in the LocalProfile.
@@ -875,7 +849,6 @@
FoodIobCobCalculatorreset
- Disconnected (%1$d m)openapsmb_max_iobMaximum total IOB OpenAPS can\'t go over [U]This value is called Max IOB in OpenAPS context\nOpenAPS will not add more insulin if current IOB is greater than this value
@@ -892,7 +865,6 @@
PrevSetup WizardFINISH
- Select your languageFirst insulin incrementSecond insulin incrementThird insulin increment
@@ -917,7 +889,7 @@
Max daily safety multiplierCurrent basal safety multipliern/a
- virtualpump_type
+ virtualpump_uploadstatusVirtual Pump TypePump DefinitionBolus: Step=%1$s\nExtended Bolus: [Step=%2$s, Duration=%3$smin-%4$sh]\nBasal: Step=%5$s\nTBR: %6$s (by %7$s), Duration=%8$smin-%9$sh\n%10$s
@@ -934,21 +906,19 @@
General SettingsEnable NSClientWelcome to setup wizard. It will guide you through the setup process\n
- Pump setupRead statusChanges must be done in NSSkip setup wizardPress the button below to enable AndroidAPS to suggest/make basal changes
- Configure APS pluginstartupwizard_processed
- Configure Sensitivity pluginSensitivity plugin is used for sensitivity detection and COB calculation. For more info visit:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient handles connection to Nightscout. You can skip this part now but you will not be able to pass objectives until you set it up.Please remember: new insulin profiles require DIA at least 5h. DIA 5–6h on new profile is equal to DIA 3h on old insulin profiles.
- Configure BG sourcePlease select source of profile. If patient is a child you should use NS profile. If there is nobody following you on Nightscout you will probably prefer Local profile. Please remember that you are only selecting the profile source. To use it you must activate it by executing \"Profile switch\"Select one from availables algorithms. They are sorted from oldest to newest. Newer algorithm is usually more powerful and more aggressive. Thus if you are new looper you may probably start with AMA and not with latest one. Do not forget to read the OpenAPS documentation and configure it before use.
+ Waiting for RileyLink connection…\n
+ Note: You can continue setup once the pump has been initialized.\nStart your first objectivePermissionAsk for permission
@@ -956,7 +926,6 @@
Application needs location permission for BT scan and WiFi identificationApplication needs storage permission to be able store log files and export settingsRequest
- Configure Insulin pluginExitOpen navigationClose navigation
@@ -1006,7 +975,6 @@
Log settingsReset to defaultsNSClient malfunction. Consider NS and NSClient restart.
- ASVersion %1$s availableTime offsetaps_mode
@@ -1172,6 +1140,7 @@
internal storage constraintFree at least %1$d MB from internal storage! Loop disabled!Wrong format
+ TBR duration must be a multiple of %1$d minutes and greater than 0.Wrong code. Command cancelled.Not configuredProfile switch created
@@ -1280,12 +1249,9 @@
UnitsDo you want to switch profile and discard changes made to current profile?wizard_calculation_visible
- On
- OffClear finishedClear startedDo you want reset objective start? You may lose your progress.
- No pump selectedSelect units you want to display values inUpload local profile changes to NSwear_detailediob
@@ -1309,7 +1275,6 @@
SubmitMost common profile:Note: Only data visible on this screen will be anonymously uploaded. ID is assigned to this installation of AndroidAPS. You can submit data again if your main profile get changed but let it running at least for a week to make result visible in time in range. Your help is appreciated.
- SurveyInvalid age entryInvalid weight entryInvalid % entry
@@ -1336,10 +1301,8 @@
^\\d{6}Use of Extended bolus feature will stop closed loop mode for the time of running extended bolus. Do you really want it?Closed loop disabled because of running Extended bolus
- EB\"PhoneChecker\"Chart menu
- ASData BroadcasterSMB request timeSMB execution time
@@ -1365,19 +1328,21 @@
Code to check:OTP + PINThe verification code consist of 6 digits displayed by Authenticator app (known as OTP) followed by 3 or more digits of mandatory PIN.
- OTP to check:Reset AuthenticatorsReset Authenticator KeyAre you sure to reset Authenticator key? It will render all currently configured Authenticators invalid, and you will need to set them up again.New Authenticator Key was generated! Please use updated QRCode to provision authenticators.
+ Exporting OTP secret
+ Are you sure you want to copy OTP secret to clipboard?\n\nYou may only need that if your authenticator app have issues scanning QRCode, you want to enter it manually or you want to configure hardware OTP token using dedicated app.
+ OTP secret (in Base32 format) exported and copied into clipboard. Paste it into authenticator or hardware OTP burner!
+
1. Install Authenticator2. Scan code to setup AndroidAPS OTP codes3. Test One-Time-PasswordReset AuthenticatorsOn each follower phone install Authenticator app that support RFC 6238 TOTP tokens. Popular free apps are:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
- DO NOT SHARE this code online!\nUse it only to setup Authenticator App on follower phones.By reseting authenticator you make all already provisioned authenticators invalid. You will need to set up them again!On connectOn disconnect
@@ -1394,6 +1359,7 @@
Copy NS settings (if exists)?statuslights_overview_advancedOriginal skin
+ Low Resolution skinButtons are always displayed on bottom of screenLarge displayskin
@@ -1441,4 +1407,9 @@
Worker State: %sUploaded DataThe following data will be uploaded to your Open Humans account: Glucose values, boluses, carbs, careportal events (except notes), extended boluses, profile switches, total daily doses, temporary basals, temp targets, preferences, application version, device model and screen dimensions. Secret or private information such as your Nightscout URL or API secret will not be uploaded.
+ RileyLink status:
+ Filter
+ Unable to create local profile. Profile is invalid.
+ Don\'t kill my app?
+
diff --git a/app/src/main/res/xml/pref_absorption_oref0.xml b/app/src/main/res/xml/pref_absorption_oref0.xml
deleted file mode 100644
index dd6d452ba4..0000000000
--- a/app/src/main/res/xml/pref_absorption_oref0.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/xml/pref_nsclientinternal.xml b/app/src/main/res/xml/pref_nsclientinternal.xml
index 4c724eadb4..8c64284d52 100644
--- a/app/src/main/res/xml/pref_nsclientinternal.xml
+++ b/app/src/main/res/xml/pref_nsclientinternal.xml
@@ -148,7 +148,7 @@
diff --git a/app/src/main/res/xml/pref_openapssmb.xml b/app/src/main/res/xml/pref_openapssmb.xml
index 9123bb66d3..388c523df9 100644
--- a/app/src/main/res/xml/pref_openapssmb.xml
+++ b/app/src/main/res/xml/pref_openapssmb.xml
@@ -83,7 +83,7 @@
android:singleLine="true"
android:title="@string/smbinterval_summary"
validate:maxNumber="10"
- validate:minNumber="3"
+ validate:minNumber="1"
validate:testType="numericRange" />
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/pref_virtualpump.xml b/app/src/main/res/xml/pref_virtualpump.xml
index deb92bccfd..5e60fe4cb8 100644
--- a/app/src/main/res/xml/pref_virtualpump.xml
+++ b/app/src/main/res/xml/pref_virtualpump.xml
@@ -15,7 +15,7 @@
diff --git a/app/src/test/java/info/nightscout/androidaps/data/ProfileTest.kt b/app/src/test/java/info/nightscout/androidaps/data/ProfileTest.kt
index a0776e8365..358f417425 100644
--- a/app/src/test/java/info/nightscout/androidaps/data/ProfileTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/data/ProfileTest.kt
@@ -40,7 +40,7 @@ class ProfileTest : TestBaseWithProfile() {
@Before
fun prepare() {
- `when`(activePluginProvider.getActivePump()).thenReturn(virtualPumpPlugin)
+ `when`(activePluginProvider.activePump).thenReturn(virtualPumpPlugin)
`when`(virtualPumpPlugin.pumpDescription).thenReturn(pumpDescription)
`when`(resourceHelper.gs(R.string.profile_per_unit)).thenReturn("/U")
`when`(resourceHelper.gs(R.string.profile_carbs_per_unit)).thenReturn("g/U")
diff --git a/app/src/test/java/info/nightscout/androidaps/data/QuickWizardTest.kt b/app/src/test/java/info/nightscout/androidaps/data/QuickWizardTest.kt
index f79cfd7c43..6504df440f 100644
--- a/app/src/test/java/info/nightscout/androidaps/data/QuickWizardTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/data/QuickWizardTest.kt
@@ -2,6 +2,7 @@ package info.nightscout.androidaps.data
import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.R
import info.nightscout.androidaps.TestBase
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
import info.nightscout.androidaps.interfaces.ProfileFunction
@@ -56,7 +57,7 @@ class QuickWizardTest : TestBase() {
fun mock() {
PowerMockito.mockStatic(Profile::class.java)
PowerMockito.`when`(Profile::class.java, "secondsFromMidnight").thenReturn(0)
- `when`(sp.getString("QuickWizard", "[]")).thenReturn("[]")
+ `when`(sp.getString(R.string.key_quickwizard, "[]")).thenReturn("[]")
quickWizard = QuickWizard(sp, injector)
}
diff --git a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.kt b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.kt
index cd3aed84e4..29c6f48229 100644
--- a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.kt
@@ -123,7 +123,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
openAPSSMBPlugin = OpenAPSSMBPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsPlugin, iobCobCalculatorPlugin, hardLimits, profiler, fabricPrivacy, sp)
openAPSAMAPlugin = OpenAPSAMAPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsPlugin, iobCobCalculatorPlugin, hardLimits, profiler, fabricPrivacy)
safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, buildHelper, treatmentsPlugin, Config())
- val constraintsPluginsList = ArrayList()
+ val constraintsPluginsList = ArrayList()
constraintsPluginsList.add(safetyPlugin)
constraintsPluginsList.add(objectivesPlugin)
constraintsPluginsList.add(comboPlugin)
diff --git a/app/src/test/java/info/nightscout/androidaps/interfaces/PluginDescriptionTest.kt b/app/src/test/java/info/nightscout/androidaps/interfaces/PluginDescriptionTest.kt
index c611c6205a..471b890cf1 100644
--- a/app/src/test/java/info/nightscout/androidaps/interfaces/PluginDescriptionTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/interfaces/PluginDescriptionTest.kt
@@ -39,6 +39,11 @@ class PluginDescriptionTest {
Assert.assertEquals(false, pluginDescription.showInList)
}
+ @Test fun pluginIcon() {
+ val pluginDescription = PluginDescription().pluginIcon(10)
+ Assert.assertEquals(10, pluginDescription.pluginIcon.toLong())
+ }
+
@Test fun pluginName() {
val pluginDescription = PluginDescription().pluginName(10)
Assert.assertEquals(10, pluginDescription.pluginName.toLong())
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/aps/loop/LoopPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/aps/loop/LoopPluginTest.kt
index 7d35e2f1b2..09729850e0 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/aps/loop/LoopPluginTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/aps/loop/LoopPluginTest.kt
@@ -4,6 +4,7 @@ import android.content.Context
import dagger.Lazy
import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.Config
import info.nightscout.androidaps.R
import info.nightscout.androidaps.TestBase
import info.nightscout.androidaps.interfaces.ActivePluginProvider
@@ -60,8 +61,8 @@ class LoopPluginTest : TestBase() {
@Before fun prepareMock() {
hardLimits = HardLimits(aapsLogger, rxBus, sp, resourceHelper, context, nsUpload)
- loopPlugin = LoopPlugin(injector, aapsLogger, rxBus, sp, constraintChecker, resourceHelper, profileFunction, context, commandQueue, activePlugin, treatmentsPlugin, virtualPumpPlugin, actionStringHandler, iobCobCalculatorPlugin, receiverStatusStore, fabricPrivacy, nsUpload, hardLimits)
- `when`(activePlugin.getActivePump()).thenReturn(virtualPumpPlugin)
+ loopPlugin = LoopPlugin(injector, aapsLogger, rxBus, sp, Config(), constraintChecker, resourceHelper, profileFunction, context, commandQueue, activePlugin, treatmentsPlugin, virtualPumpPlugin, actionStringHandler, iobCobCalculatorPlugin, receiverStatusStore, fabricPrivacy, nsUpload, hardLimits)
+ `when`(activePlugin.activePump).thenReturn(virtualPumpPlugin)
}
@Test
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionStartTempTargetTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionStartTempTargetTest.kt
index 0bf99824ec..b3e06b29e8 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionStartTempTargetTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionStartTempTargetTest.kt
@@ -41,7 +41,7 @@ class ActionStartTempTargetTest : ActionsTestBase() {
}
@Test fun iconTest() {
- Assert.assertEquals(R.drawable.ic_cp_cgm_target, sut.icon())
+ Assert.assertEquals(R.drawable.ic_temptarget_high, sut.icon())
}
@Test fun doActionTest() {
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPluginTest.kt
index e0d6a5b8ef..42d353f2cf 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPluginTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPluginTest.kt
@@ -23,6 +23,7 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.CobInfo
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin
+import info.nightscout.androidaps.plugins.pump.common.defs.PumpType
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
import info.nightscout.androidaps.plugins.treatments.TreatmentService
import info.nightscout.androidaps.queue.Callback
@@ -37,6 +38,8 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers
+import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.`when`
@@ -160,6 +163,7 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
`when`(virtualPumpPlugin.shortStatus(ArgumentMatchers.anyBoolean())).thenReturn("Virtual Pump")
`when`(virtualPumpPlugin.isSuspended).thenReturn(false)
`when`(virtualPumpPlugin.pumpDescription).thenReturn(PumpDescription())
+ `when`(virtualPumpPlugin.model()).thenReturn(PumpType.GenericAAPS);
`when`(treatmentsPlugin.lastCalculationTreatments).thenReturn(IobTotal(0))
`when`(treatmentsPlugin.lastCalculationTempBasals).thenReturn(IobTotal(0))
@@ -186,6 +190,7 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
`when`(resourceHelper.gs(R.string.smscommunicator_loopisdisabled)).thenReturn("Loop is disabled")
`when`(resourceHelper.gs(R.string.smscommunicator_loopisenabled)).thenReturn("Loop is enabled")
`when`(resourceHelper.gs(R.string.wrongformat)).thenReturn("Wrong format")
+ `when`(resourceHelper.gs(eq(R.string.wrongTbrDuration), any())).thenAnswer({ i: InvocationOnMock -> "TBR duration must be a multiple of " + i.getArguments()[1] + " minutes and greater than 0."})
`when`(resourceHelper.gs(R.string.smscommunicator_loophasbeendisabled)).thenReturn("Loop has been disabled")
`when`(resourceHelper.gs(R.string.smscommunicator_loophasbeenenabled)).thenReturn("Loop has been enabled")
`when`(resourceHelper.gs(R.string.smscommunicator_tempbasalcanceled)).thenReturn("Temp basal canceled")
@@ -777,19 +782,26 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
sms = Sms("1234", "BASAL 10% 0")
smsCommunicatorPlugin.processSms(sms)
Assert.assertEquals("BASAL 10% 0", smsCommunicatorPlugin.messages[0].text)
- Assert.assertEquals("Wrong format", smsCommunicatorPlugin.messages[1].text)
- `when`(constraintChecker.applyBasalPercentConstraints(anyObject(), anyObject())).thenReturn(Constraint(20))
+ Assert.assertEquals("TBR duration must be a multiple of 30 minutes and greater than 0.", smsCommunicatorPlugin.messages[1].text)
//BASAL 20% 20
smsCommunicatorPlugin.messages = ArrayList()
sms = Sms("1234", "BASAL 20% 20")
smsCommunicatorPlugin.processSms(sms)
Assert.assertEquals("BASAL 20% 20", smsCommunicatorPlugin.messages[0].text)
- Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To start basal 20% for 20 min reply with code"))
+ Assert.assertEquals("TBR duration must be a multiple of 30 minutes and greater than 0.", smsCommunicatorPlugin.messages[1].text)
+ `when`(constraintChecker.applyBasalPercentConstraints(anyObject(), anyObject())).thenReturn(Constraint(20))
+
+ //BASAL 20% 30
+ smsCommunicatorPlugin.messages = ArrayList()
+ sms = Sms("1234", "BASAL 20% 30")
+ smsCommunicatorPlugin.processSms(sms)
+ Assert.assertEquals("BASAL 20% 30", smsCommunicatorPlugin.messages[0].text)
+ Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To start basal 20% for 30 min reply with code"))
passCode = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
smsCommunicatorPlugin.processSms(Sms("1234", passCode))
Assert.assertEquals(passCode, smsCommunicatorPlugin.messages[2].text)
- Assert.assertEquals("Temp basal 20% for 20 min started successfully\nVirtual Pump", smsCommunicatorPlugin.messages[3].text)
+ Assert.assertEquals("Temp basal 20% for 30 min started successfully\nVirtual Pump", smsCommunicatorPlugin.messages[3].text)
//BASAL a
smsCommunicatorPlugin.messages = ArrayList()
@@ -803,7 +815,7 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
sms = Sms("1234", "BASAL 1 0")
smsCommunicatorPlugin.processSms(sms)
Assert.assertEquals("BASAL 1 0", smsCommunicatorPlugin.messages[0].text)
- Assert.assertEquals("Wrong format", smsCommunicatorPlugin.messages[1].text)
+ Assert.assertEquals("TBR duration must be a multiple of 30 minutes and greater than 0.", smsCommunicatorPlugin.messages[1].text)
`when`(constraintChecker.applyBasalConstraints(anyObject(), anyObject())).thenReturn(Constraint(1.0))
//BASAL 1 20
@@ -811,11 +823,19 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
sms = Sms("1234", "BASAL 1 20")
smsCommunicatorPlugin.processSms(sms)
Assert.assertEquals("BASAL 1 20", smsCommunicatorPlugin.messages[0].text)
- Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To start basal 1.00U/h for 20 min reply with code"))
+ Assert.assertEquals("TBR duration must be a multiple of 30 minutes and greater than 0.", smsCommunicatorPlugin.messages[1].text)
+ `when`(constraintChecker.applyBasalConstraints(anyObject(), anyObject())).thenReturn(Constraint(1.0))
+
+ //BASAL 1 30
+ smsCommunicatorPlugin.messages = ArrayList()
+ sms = Sms("1234", "BASAL 1 30")
+ smsCommunicatorPlugin.processSms(sms)
+ Assert.assertEquals("BASAL 1 30", smsCommunicatorPlugin.messages[0].text)
+ Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To start basal 1.00U/h for 30 min reply with code"))
passCode = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
smsCommunicatorPlugin.processSms(Sms("1234", passCode))
Assert.assertEquals(passCode, smsCommunicatorPlugin.messages[2].text)
- Assert.assertEquals("Temp basal 1.00U/h for 20 min started successfully\nVirtual Pump", smsCommunicatorPlugin.messages[3].text)
+ Assert.assertEquals("Temp basal 1.00U/h for 30 min started successfully\nVirtual Pump", smsCommunicatorPlugin.messages[3].text)
}
@Test fun processExtendedTest() {
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPluginTest.kt
new file mode 100644
index 0000000000..6bfea57ff9
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPluginTest.kt
@@ -0,0 +1,65 @@
+package info.nightscout.androidaps.plugins.insulin
+
+import dagger.android.AndroidInjector
+import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.R
+import info.nightscout.androidaps.interfaces.InsulinInterface
+import info.nightscout.androidaps.logging.AAPSLogger
+import info.nightscout.androidaps.plugins.bus.RxBusWrapper
+import info.nightscout.androidaps.interfaces.ProfileFunction
+import info.nightscout.androidaps.utils.resources.ResourceHelper
+import org.junit.Assert.assertEquals
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mock
+import org.mockito.Mockito.`when`
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+class InsulinLyumjevPluginTest {
+
+ @get:Rule
+ val mockitoRule: MockitoRule = MockitoJUnit.rule()
+
+ private lateinit var sut: InsulinLyumjevPlugin
+
+ @Mock lateinit var resourceHelper: ResourceHelper
+ @Mock lateinit var rxBus: RxBusWrapper
+ @Mock lateinit var profileFunction: ProfileFunction
+ @Mock lateinit var aapsLogger: AAPSLogger
+
+ private var injector: HasAndroidInjector = HasAndroidInjector {
+ AndroidInjector {
+ }
+ }
+
+ @Before
+ fun setup() {
+ sut = InsulinLyumjevPlugin(injector, resourceHelper, profileFunction, rxBus, aapsLogger)
+ }
+
+ @Test
+ fun `simple peak test`() {
+ assertEquals(45, sut.peak)
+ }
+
+ @Test
+ fun getIdTest() {
+ assertEquals(InsulinInterface.InsulinType.OREF_LYUMJEV, sut.id)
+ }
+
+ @Test
+ fun commentStandardTextTest() {
+ `when`(resourceHelper.gs(eq(R.string.lyumjev))).thenReturn("Lyumjev")
+ assertEquals("Lyumjev", sut.commentStandardText())
+ }
+
+ @Test
+ fun getFriendlyNameTest() {
+ `when`(resourceHelper.gs(eq(R.string.lyumjev))).thenReturn("Lyumjev")
+ assertEquals("Lyumjev", sut.friendlyName)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePluginTest.kt
index 646681c1dd..6558ed80be 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePluginTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePluginTest.kt
@@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.insulin
import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.data.Iob
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.logging.AAPSLogger
@@ -9,8 +10,10 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.plugins.insulin.InsulinOrefBasePlugin.Companion.MIN_DIA
import info.nightscout.androidaps.db.Treatment
+import info.nightscout.androidaps.interfaces.InsulinInterface
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.androidaps.utils.resources.ResourceHelper
+import org.json.JSONObject
import org.junit.Assert
import org.junit.Before
import org.junit.Rule
@@ -46,8 +49,10 @@ class InsulinOrefBasePluginTest {
get() = testPeak
override fun commentStandardText(): String = ""
- override fun getId(): Int = 0
- override fun getFriendlyName(): String = ""
+ override val id get(): InsulinInterface.InsulinType = InsulinInterface.InsulinType.UNKNOWN
+ override val friendlyName get(): String = ""
+ override fun configuration(): JSONObject = JSONObject()
+ override fun applyConfiguration(configuration: JSONObject) {}
}
@get:Rule
@@ -104,22 +109,22 @@ class InsulinOrefBasePluginTest {
// check directly after bolus
treatment.date = time
treatment.insulin = 10.0
- Assert.assertEquals(10.0, sut.iobCalcForTreatment(treatment, time).iobContrib, 0.1)
+ Assert.assertEquals(10.0, sut.iobCalcForTreatment(treatment, time, Constants.defaultDIA).iobContrib, 0.1)
// check after 1 hour
treatment.date = time - 1 * 60 * 60 * 1000 // 1 hour
treatment.insulin = 10.0
- Assert.assertEquals(3.92, sut.iobCalcForTreatment(treatment, time).iobContrib, 0.1)
+ Assert.assertEquals(3.92, sut.iobCalcForTreatment(treatment, time, Constants.defaultDIA).iobContrib, 0.1)
// check after 2 hour
treatment.date = time - 2 * 60 * 60 * 1000 // 1 hour
treatment.insulin = 10.0
- Assert.assertEquals(0.77, sut.iobCalcForTreatment(treatment, time).iobContrib, 0.1)
+ Assert.assertEquals(0.77, sut.iobCalcForTreatment(treatment, time, Constants.defaultDIA).iobContrib, 0.1)
// check after 3 hour
treatment.date = time - 3 * 60 * 60 * 1000 // 1 hour
treatment.insulin = 10.0
- Assert.assertEquals(0.10, sut.iobCalcForTreatment(treatment, time).iobContrib, 0.1)
+ Assert.assertEquals(0.10, sut.iobCalcForTreatment(treatment, time, Constants.defaultDIA).iobContrib, 0.1)
// check after dia
treatment.date = time - 4 * 60 * 60 * 1000
treatment.insulin = 10.0
- Assert.assertEquals(0.0, sut.iobCalcForTreatment(treatment, time).iobContrib, 0.1)
+ Assert.assertEquals(0.0, sut.iobCalcForTreatment(treatment, time, Constants.defaultDIA).iobContrib, 0.1)
}
}
\ No newline at end of file
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPluginTest.kt
index 8c65f3339f..a172e98116 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPluginTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPluginTest.kt
@@ -54,7 +54,7 @@ class InsulinOrefFreePeakPluginTest : TestBase() {
@Test
fun getIdTest() {
- assertEquals(InsulinInterface.OREF_FREE_PEAK, sut.id)
+ assertEquals(InsulinInterface.InsulinType.OREF_FREE_PEAK, sut.id)
}
@Test
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPluginTest.kt
index 7f1ec85ae9..e4a1b7a650 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPluginTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPluginTest.kt
@@ -47,7 +47,7 @@ class InsulinOrefRapidActingPluginTest {
@Test
fun getIdTest() {
- assertEquals(InsulinInterface.OREF_RAPID_ACTING, sut.id)
+ assertEquals(InsulinInterface.InsulinType.OREF_RAPID_ACTING, sut.id)
}
@Test
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPluginTest.kt
index 16b5a6dbc3..2690a826aa 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPluginTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPluginTest.kt
@@ -47,7 +47,7 @@ class InsulinOrefUltraRapidActingPluginTest {
@Test
fun getIdTest() {
- assertEquals(InsulinInterface.OREF_ULTRA_RAPID_ACTING, sut.id)
+ assertEquals(InsulinInterface.InsulinType.OREF_ULTRA_RAPID_ACTING, sut.id)
}
@Test
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/sensitivity/AbstractSensitivityPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/sensitivity/AbstractSensitivityPluginTest.kt
index f410b29a94..3c0e5168bb 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/sensitivity/AbstractSensitivityPluginTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/sensitivity/AbstractSensitivityPluginTest.kt
@@ -5,11 +5,13 @@ import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.TestBase
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
import info.nightscout.androidaps.interfaces.PluginDescription
+import info.nightscout.androidaps.interfaces.SensitivityInterface
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
+import org.json.JSONObject
import org.junit.Assert
import org.junit.Test
import org.junit.runner.RunWith
@@ -28,6 +30,13 @@ class AbstractSensitivityPluginTest : TestBase() {
override fun detectSensitivity(plugin: IobCobCalculatorInterface, fromTime: Long, toTime: Long): AutosensResult {
return AutosensResult()
}
+
+ override val id: SensitivityInterface.SensitivityType
+ get() = SensitivityInterface.SensitivityType.UNKNOWN
+
+ override fun configuration(): JSONObject = JSONObject()
+
+ override fun applyConfiguration(configuration: JSONObject) { }
}
@Test
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPluginTest.kt
index a5a6e81bfb..a8e1af60e9 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPluginTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPluginTest.kt
@@ -8,6 +8,7 @@ import info.nightscout.androidaps.TestBaseWithProfile
import info.nightscout.androidaps.db.DatabaseHelper
import info.nightscout.androidaps.db.TemporaryBasal
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
+import info.nightscout.androidaps.plugins.general.nsclient.UploadQueue
import info.nightscout.androidaps.plugins.insulin.InsulinOrefRapidActingPlugin
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
@@ -33,6 +34,7 @@ class TreatmentsPluginTest : TestBaseWithProfile() {
@Mock lateinit var databaseHelper: DatabaseHelper
@Mock lateinit var treatmentService: TreatmentService
@Mock lateinit var nsUpload: NSUpload
+ @Mock lateinit var uploadQueue: UploadQueue
val injector = HasAndroidInjector {
AndroidInjector {
@@ -58,7 +60,7 @@ class TreatmentsPluginTest : TestBaseWithProfile() {
`when`(profileFunction.getProfile(ArgumentMatchers.anyLong())).thenReturn(validProfile)
`when`(activePluginProvider.activeInsulin).thenReturn(insulinOrefRapidActingPlugin)
- sot = TreatmentsPlugin(profileInjector, aapsLogger, rxBus, resourceHelper, context, sp, profileFunction, activePluginProvider, nsUpload, fabricPrivacy, dateUtil)
+ sot = TreatmentsPlugin(profileInjector, aapsLogger, rxBus, resourceHelper, context, sp, profileFunction, activePluginProvider, nsUpload, fabricPrivacy, dateUtil, uploadQueue)
sot.service = treatmentService
}
diff --git a/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.kt b/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.kt
index b375602bfb..505a823937 100644
--- a/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.kt
@@ -11,6 +11,7 @@ import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.interfaces.Constraint
import info.nightscout.androidaps.interfaces.PumpDescription
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
+import info.nightscout.androidaps.queue.commands.CustomCommand
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
import info.nightscout.androidaps.queue.commands.Command
@@ -192,4 +193,92 @@ class CommandQueueTest : TestBaseWithProfile() {
Assert.assertFalse(queued)
Assert.assertEquals(commandQueue.size(), 0)
}
+
+ @Test
+ fun isCustomCommandRunning() {
+ // given
+ Assert.assertEquals(0, commandQueue.size())
+
+ // when
+ val queued1 = commandQueue.customCommand(CustomCommand1(), null)
+ val queued2 = commandQueue.customCommand(CustomCommand2(), null)
+ commandQueue.pickup()
+
+ // then
+ Assert.assertTrue(queued1)
+ Assert.assertTrue(queued2)
+ Assert.assertTrue(commandQueue.isCustomCommandInQueue(CustomCommand1::class.java))
+ Assert.assertTrue(commandQueue.isCustomCommandInQueue(CustomCommand2::class.java))
+ Assert.assertFalse(commandQueue.isCustomCommandInQueue(CustomCommand3::class.java))
+
+ Assert.assertTrue(commandQueue.isCustomCommandRunning(CustomCommand1::class.java))
+ Assert.assertFalse(commandQueue.isCustomCommandRunning(CustomCommand2::class.java))
+ Assert.assertFalse(commandQueue.isCustomCommandRunning(CustomCommand3::class.java))
+
+
+ Assert.assertEquals(1, commandQueue.size())
+ }
+
+ @Test
+ fun isCustomCommandInQueue() {
+ // given
+ Assert.assertEquals(0, commandQueue.size())
+
+ // when
+ val queued1 = commandQueue.customCommand(CustomCommand1(), null)
+ val queued2 = commandQueue.customCommand(CustomCommand2(), null)
+
+ // then
+ Assert.assertTrue(queued1)
+ Assert.assertTrue(queued2)
+ Assert.assertTrue(commandQueue.isCustomCommandInQueue(CustomCommand1::class.java))
+ Assert.assertTrue(commandQueue.isCustomCommandInQueue(CustomCommand2::class.java))
+ Assert.assertFalse(commandQueue.isCustomCommandInQueue(CustomCommand3::class.java))
+ Assert.assertEquals(2, commandQueue.size())
+ }
+
+ @Test
+ fun differentCustomCommandsAllowed() {
+ // given
+ Assert.assertEquals(0, commandQueue.size())
+
+ // when
+ val queued1 = commandQueue.customCommand(CustomCommand1(), null)
+ val queued2 = commandQueue.customCommand(CustomCommand2(), null)
+
+ // then
+ Assert.assertTrue(queued1)
+ Assert.assertTrue(queued2)
+ Assert.assertEquals(2, commandQueue.size())
+ }
+
+ @Test
+ fun sameCustomCommandNotAllowed() {
+ // given
+ Assert.assertEquals(0, commandQueue.size())
+
+ // when
+ val queued1 = commandQueue.customCommand(CustomCommand1(), null)
+ val queued2 = commandQueue.customCommand(CustomCommand1(), null)
+
+ // then
+ Assert.assertTrue(queued1)
+ Assert.assertFalse(queued2)
+ Assert.assertEquals(1, commandQueue.size())
+ }
+
+ private class CustomCommand1 : CustomCommand {
+ override val statusDescription: String
+ get() = "CUSTOM COMMAND 1"
+ }
+
+ private class CustomCommand2 : CustomCommand {
+ override val statusDescription: String
+ get() = "CUSTOM COMMAND 2"
+ }
+
+ private class CustomCommand3 : CustomCommand {
+ override val statusDescription: String
+ get() = "CUSTOM COMMAND 3"
+ }
}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index aeeb75768d..a7ce6acdb8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,27 +2,43 @@
buildscript {
ext {
- kotlin_version = '1.3.72'
- coreVersion = '1.3.0'
+ kotlin_version = '1.4.20'
+ coreVersion = '1.3.2'
rxjava_version = '2.2.19'
rxandroid_version = '2.1.1'
rxkotlin_version = '2.4.0'
room_version = '2.2.5'
lifecycle_version = '2.2.0'
- dagger_version = '2.28.1'
+ dagger_version = '2.29.1'
coroutinesVersion = '1.3.7'
- activityVersion = '1.2.0-alpha06'
- fragmentVersion = '1.3.0-alpha07'
- ormLiteVersion = "4.46"
+ activityVersion = '1.2.0-beta01'
+ fragmentktx_version = '1.3.0-beta01'
+ ormLiteVersion = '4.46'
+ nav_version = '2.3.1'
+ appcompat_verison = '1.2.0'
+ material_version = '1.2.1'
+ constraintlayout_version = '2.0.4'
+ preferencektx_version = '1.1.1'
+ commonslang3_version = '3.11'
+ work_version = '2.4.0'
+
+ junit_version = '4.13.1'
+ powermockVersion = "1.7.3"
+ dexmakerVersion = "1.2"
+ retrofit2Version = '2.9.0'
+ okhttp3Version = '4.9.0'
+
+ androidx_junit = '1.1.2'
+ androidx_rules = '1.3.1-alpha02'
}
repositories {
google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.0.1'
- classpath 'com.google.gms:google-services:4.3.3'
- classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1'
+ classpath 'com.android.tools.build:gradle:4.1.1'
+ classpath 'com.google.gms:google-services:4.3.4'
+ classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -45,6 +61,7 @@ allprojects {
artifact '/[organisation]/[module]/archive/[revision].[ext]'
}
}
+ maven { url 'https://jitpack.io' }
}
//Support @JvmDefault
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
diff --git a/core/build.gradle b/core/build.gradle
index 6c0c4ee32a..e5537cf13b 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -19,7 +19,9 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
-
+ buildFeatures {
+ viewBinding true
+ }
buildTypes {
release {
minifyEnabled false
@@ -39,50 +41,5 @@ android {
}
}
-dependencies {
- implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation "androidx.preference:preference-ktx:1.1.1"
- implementation 'androidx.biometric:biometric:1.0.1'
- implementation "androidx.activity:activity:${activityVersion}"
- implementation "androidx.activity:activity-ktx:${activityVersion}"
- implementation 'com.google.android.material:material:1.1.0'
- implementation "com.google.dagger:dagger-android:$dagger_version"
- implementation "com.google.dagger:dagger-android-support:$dagger_version"
- annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
- annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
- kapt "com.google.dagger:dagger-android-processor:$dagger_version"
- kapt "com.google.dagger:dagger-compiler:$dagger_version"
-
- //Logger
- implementation 'org.slf4j:slf4j-api:1.7.30'
- //Fabric
- implementation 'com.google.firebase:firebase-analytics-ktx:17.4.3'
- implementation 'com.google.firebase:firebase-crashlytics:17.1.0'
-
- //RxBus
- implementation "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
- implementation 'org.apache.commons:commons-lang3:3.10'
-
- //CryptoUtil
- implementation 'com.madgag.spongycastle:core:1.58.0.0'
-
- // Graphview cannot be upgraded
- implementation "com.jjoe64:graphview:4.0.1"
-
- //DateUtil
- implementation 'net.danlew:android.joda:2.10.6'
-
- //db
- implementation "com.j256.ormlite:ormlite-core:${ormLiteVersion}"
- implementation "com.j256.ormlite:ormlite-android:${ormLiteVersion}"
-
- // pumpCommon
- implementation "com.google.code.gson:gson:2.8.6"
-
- testImplementation 'junit:junit:4.13'
- androidTestImplementation 'androidx.test.ext:junit:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
-}
+apply from: 'core_dependencies.gradle'
\ No newline at end of file
diff --git a/core/core_dependencies.gradle b/core/core_dependencies.gradle
new file mode 100644
index 0000000000..d0333440b9
--- /dev/null
+++ b/core/core_dependencies.gradle
@@ -0,0 +1,120 @@
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+ api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
+ api "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
+ api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
+ api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
+ api "androidx.core:core-ktx:$coreVersion"
+ api 'androidx.legacy:legacy-support-v13:1.0.0'
+ api 'androidx.legacy:legacy-support-v4:1.0.0'
+ api "androidx.appcompat:appcompat:$appcompat_verison"
+ api "androidx.preference:preference-ktx:$preferencektx_version"
+ api 'androidx.biometric:biometric:1.0.1'
+ api "androidx.activity:activity-ktx:${activityVersion}"
+ api "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
+ api 'androidx.cardview:cardview:1.0.0'
+ api 'androidx.recyclerview:recyclerview:1.1.0'
+ api 'androidx.gridlayout:gridlayout:1.0.0'
+ api 'androidx.percentlayout:percentlayout:1.0.0'
+ api "com.google.android.material:material:$material_version"
+
+ api "com.google.dagger:dagger-android:$dagger_version"
+ api "com.google.dagger:dagger-android-support:$dagger_version"
+ annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
+ annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
+ kapt "com.google.dagger:dagger-android-processor:$dagger_version"
+ kapt "com.google.dagger:dagger-compiler:$dagger_version"
+
+ //Logger
+ api 'org.slf4j:slf4j-api:1.7.30'
+ api("com.github.tony19:logback-android-classic:1.1.1-6") {
+ exclude group: "com.google.android", module: "android"
+ }
+
+ //Firebase
+ api platform('com.google.firebase:firebase-bom:25.12.0')
+ api "com.google.firebase:firebase-analytics-ktx"
+ api "com.google.firebase:firebase-crashlytics-ktx"
+ api "com.google.firebase:firebase-messaging-ktx"
+ api 'com.google.firebase:firebase-auth-ktx'
+ api 'com.google.firebase:firebase-database-ktx'
+
+ //RxBus
+ api "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
+ api "org.apache.commons:commons-lang3:$commonslang3_version"
+
+ //CryptoUtil
+ api 'com.madgag.spongycastle:core:1.58.0.0'
+
+ // Graphview cannot be upgraded
+ api "com.jjoe64:graphview:4.0.1"
+
+ //DateUtil
+ api 'net.danlew:android.joda:2.10.6'
+
+ //db
+ api "com.j256.ormlite:ormlite-core:${ormLiteVersion}"
+ api "com.j256.ormlite:ormlite-android:${ormLiteVersion}"
+
+ // pumpCommon
+ api "com.google.code.gson:gson:2.8.6"
+
+ // don't kill my app
+ api('dev.doubledot.doki:library:0.0.1@aar') {
+ transitive = true
+ }
+
+ //WorkManager
+ api "androidx.work:work-runtime:$work_version"
+ api "androidx.work:work-runtime-ktx:$work_version"
+ api "androidx.work:work-rxjava2:$work_version"
+ api 'com.google.androidbrowserhelper:androidbrowserhelper:2.0.1'
+ api 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
+
+ // new for tidepool
+ api "com.squareup.okhttp3:okhttp:$okhttp3Version"
+ api "com.squareup.okhttp3:logging-interceptor:$okhttp3Version"
+ api "com.squareup.retrofit2:retrofit:$retrofit2Version"
+ api "com.squareup.retrofit2:adapter-rxjava2:$retrofit2Version"
+ api "com.squareup.retrofit2:converter-gson:$retrofit2Version"
+
+ api "com.joanzapata.iconify:android-iconify-fontawesome:2.2.2"
+ api 'net.danlew:android.joda:2.10.6'
+
+ api "androidx.fragment:fragment-ktx:${fragmentktx_version}"
+ api "androidx.constraintlayout:constraintlayout:$constraintlayout_version"
+ api 'androidx.navigation:navigation-runtime-ktx:2.3.1'
+ api "androidx.navigation:navigation-fragment-ktx:$nav_version"
+ api "androidx.navigation:navigation-ui-ktx:$nav_version"
+
+ api 'com.google.android.gms:play-services-wearable:17.0.0'
+ api 'com.google.android.gms:play-services-location:17.1.0'
+
+ api("com.google.android:flexbox:0.3.0") {
+ exclude group: "com.android.support"
+ }
+ api("io.socket:socket.io-client:1.0.0") {
+ // excluding org.json which is provided by Android
+ exclude group: "org.json", module: "json"
+ }
+
+ api('com.google.guava:guava:30.0-jre') {
+ exclude group: "com.google.code.findbugs", module: "jsr305"
+ }
+ api 'com.google.code.findbugs:jsr305:3.0.2'
+
+ api 'org.mozilla:rhino:1.7.13'
+
+ api 'com.github.DavidProdinger:weekdays-selector:1.1.0'
+
+ api 'com.github.kenglxn.QRGen:android:2.6.0'
+ api 'com.eatthepath:java-otp:0.2.0'
+
+ // Phone checker
+ api 'com.scottyab:rootbeer-lib:0.0.8'
+
+ testImplementation "junit:junit:$junit_version"
+ androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
+ androidTestImplementation "androidx.test:rules:$androidx_rules"
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java b/core/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java
index 905655587f..2065e31b63 100644
--- a/core/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java
+++ b/core/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java
@@ -60,7 +60,7 @@ public class TDDStatsActivity extends NoSplashAppCompatActivity {
@Inject DatabaseHelperInterface databaseHelper;
@Inject FabricPrivacy fabricPrivacy;
- private CompositeDisposable disposable = new CompositeDisposable();
+ private final CompositeDisposable disposable = new CompositeDisposable();
TextView statusView, statsMessage, totalBaseBasal2;
EditText totalBaseBasal;
diff --git a/core/src/main/java/info/nightscout/androidaps/data/Profile.java b/core/src/main/java/info/nightscout/androidaps/data/Profile.java
index f71e53e9b6..490bbcecb0 100644
--- a/core/src/main/java/info/nightscout/androidaps/data/Profile.java
+++ b/core/src/main/java/info/nightscout/androidaps/data/Profile.java
@@ -38,7 +38,7 @@ public class Profile {
@Inject public FabricPrivacy fabricPrivacy;
@Inject public ConfigInterface configInterface;
- private HasAndroidInjector injector;
+ private final HasAndroidInjector injector;
private JSONObject json;
private String units;
@@ -138,7 +138,7 @@ public class Profile {
public String log() {
String ret = "\n";
for (Integer hour = 0; hour < 24; hour++) {
- double value = getBasalTimeFromMidnight((Integer) (hour * 60 * 60));
+ double value = getBasalTimeFromMidnight(hour * 60 * 60);
ret += "NS basal value for " + hour + ":00 is " + value + "\n";
}
ret += "NS units: " + getUnits();
diff --git a/core/src/main/java/info/nightscout/androidaps/data/PumpEnactResult.java b/core/src/main/java/info/nightscout/androidaps/data/PumpEnactResult.java
index 16c3707536..73e0c8c9ab 100644
--- a/core/src/main/java/info/nightscout/androidaps/data/PumpEnactResult.java
+++ b/core/src/main/java/info/nightscout/androidaps/data/PumpEnactResult.java
@@ -170,7 +170,8 @@ public class PumpEnactResult {
ret += " " + resourceHelper.gs(R.string.absolute) + ": " + DecimalFormatter.to2Decimal(absolute) + " U/h";
}
} else {
- ret += " " + resourceHelper.gs(R.string.comment) + ": " + comment;
+ if (!comment.isEmpty())
+ ret += " " + resourceHelper.gs(R.string.comment) + ": " + comment;
}
return ret;
}
diff --git a/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfile.kt b/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfile.kt
index f1a0375d2a..2b80598d6d 100644
--- a/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfile.kt
+++ b/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfile.kt
@@ -46,7 +46,7 @@ class DefaultProfile @Inject constructor(val injector: HasAndroidInjector) {
profile.put("dia", 5.0)
profile.put("carbs_hr", 20) // not used
profile.put("delay", 5.0) // not used
- profile.put("timezone", TimeZone.getDefault().getID())
+ profile.put("timezone", TimeZone.getDefault().id)
profile.put("target_high", JSONArray().put(JSONObject().put("time", "00:00").put("value", Profile.fromMgdlToUnits(108.0, units))))
profile.put("target_low", JSONArray().put(JSONObject().put("time", "00:00").put("value", Profile.fromMgdlToUnits(108.0, units))))
profile.put("units", units)
diff --git a/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileDPV.kt b/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileDPV.kt
index 18195f9f8a..c7eb7959ab 100644
--- a/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileDPV.kt
+++ b/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileDPV.kt
@@ -37,7 +37,7 @@ class DefaultProfileDPV @Inject constructor(val injector: HasAndroidInjector) {
profile.put("dia", 5.0)
profile.put("carbs_hr", 20) // not used
profile.put("delay", 5.0) // not used
- profile.put("timezone", TimeZone.getDefault().getID())
+ profile.put("timezone", TimeZone.getDefault().id)
profile.put("target_high", JSONArray().put(JSONObject().put("time", "00:00").put("value", Profile.fromMgdlToUnits(108.0, units))))
profile.put("target_low", JSONArray().put(JSONObject().put("time", "00:00").put("value", Profile.fromMgdlToUnits(108.0, units))))
profile.put("units", units)
diff --git a/core/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java b/core/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java
index cfee68be27..ccb83b9781 100644
--- a/core/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java
+++ b/core/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java
@@ -63,7 +63,7 @@ public class ExtendedBolus implements Interval, DataPointWithLabelInterface {
public int durationInMinutes = 0; // duration == 0 means end of extended bolus
@DatabaseField
- public int insulinInterfaceID = InsulinInterface.OREF_RAPID_ACTING;
+ public int insulinInterfaceID = InsulinInterface.InsulinType.OREF_RAPID_ACTING.getValue();
@DatabaseField
public double dia = Constants.defaultDIA;
diff --git a/core/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java b/core/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java
index 012016ee03..ee474b0635 100644
--- a/core/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java
+++ b/core/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java
@@ -15,8 +15,8 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
import info.nightscout.androidaps.interfaces.InsulinInterface;
import info.nightscout.androidaps.interfaces.Interval;
-import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.interfaces.ProfileFunction;
+import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.DecimalFormatter;
@@ -381,6 +381,12 @@ public class TemporaryBasal implements Interval, DbObjectBase {
return (remainingMin < 0) ? 0 : Math.round(remainingMin);
}
+ public int getPlannedRemainingMinutesRoundedUp() {
+ float remainingMin = (end() - System.currentTimeMillis()) / 1000f / 60;
+ return (remainingMin < 0) ? 0 : (int) Math.ceil(remainingMin);
+ }
+
+
public double tempBasalConvertedToAbsolute(long time, Profile profile) {
if (isFakeExtended) {
return profile.getBasal(time) + netExtendedRate;
diff --git a/core/src/main/java/info/nightscout/androidaps/db/Treatment.java b/core/src/main/java/info/nightscout/androidaps/db/Treatment.java
index 4aec4f1d56..9f179c168b 100644
--- a/core/src/main/java/info/nightscout/androidaps/db/Treatment.java
+++ b/core/src/main/java/info/nightscout/androidaps/db/Treatment.java
@@ -65,7 +65,7 @@ public class Treatment implements DataPointWithLabelInterface, DbObjectBase {
public boolean isSMB = false;
@DatabaseField
- public int insulinInterfaceID = InsulinInterface.OREF_RAPID_ACTING; // currently unused, will be used in the future
+ public int insulinInterfaceID = InsulinInterface.InsulinType.OREF_RAPID_ACTING.getValue(); // currently unused, will be used in the future
@DatabaseField
public double dia = Constants.defaultDIA; // currently unused, will be used in the future
@DatabaseField
diff --git a/core/src/main/java/info/nightscout/androidaps/dialogs/BolusProgressDialog.kt b/core/src/main/java/info/nightscout/androidaps/dialogs/BolusProgressDialog.kt
index 98e459a5b9..06e99dc20a 100644
--- a/core/src/main/java/info/nightscout/androidaps/dialogs/BolusProgressDialog.kt
+++ b/core/src/main/java/info/nightscout/androidaps/dialogs/BolusProgressDialog.kt
@@ -1,6 +1,5 @@
package info.nightscout.androidaps.dialogs
-import android.app.Activity
import android.os.Bundle
import android.os.SystemClock
import android.view.LayoutInflater
@@ -157,7 +156,6 @@ class BolusProgressDialog : DaggerDialogFragment() {
Thread(Runnable {
SystemClock.sleep(5000)
bolusEnded = true
- val activity: Activity? = activity
activity?.runOnUiThread {
if (running) {
aapsLogger.debug(LTag.UI, "executing")
diff --git a/core/src/main/java/info/nightscout/androidaps/dialogs/ErrorDialog.kt b/core/src/main/java/info/nightscout/androidaps/dialogs/ErrorDialog.kt
index 9d2035b279..aba0f3be62 100644
--- a/core/src/main/java/info/nightscout/androidaps/dialogs/ErrorDialog.kt
+++ b/core/src/main/java/info/nightscout/androidaps/dialogs/ErrorDialog.kt
@@ -1,8 +1,5 @@
package info.nightscout.androidaps.dialogs
-import android.content.Context
-import android.content.Intent
-import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -13,11 +10,13 @@ import dagger.android.support.DaggerDialogFragment
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.logging.AAPSLogger
-import info.nightscout.androidaps.services.AlarmSoundService
+import info.nightscout.androidaps.services.AlarmSoundServiceHelper
import kotlinx.android.synthetic.main.dialog_error.*
import javax.inject.Inject
class ErrorDialog : DaggerDialogFragment() {
+
+ @Inject lateinit var alarmSoundServiceHelper: AlarmSoundServiceHelper
@Inject lateinit var aapsLogger: AAPSLogger
var helperActivity: ErrorHelperActivity? = null
@@ -80,17 +79,10 @@ class ErrorDialog : DaggerDialogFragment() {
}
private fun startAlarm() {
- if (sound != 0) {
- val alarm = Intent(context, AlarmSoundService::class.java)
- alarm.putExtra("soundid", sound)
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- context?.startForegroundService(alarm)
- } else {
- context?.startService(alarm)
- }
- }
+ if (sound != 0)
+ context?.let { context -> alarmSoundServiceHelper.startAlarm(context, sound) }
}
private fun stopAlarm() =
- context?.stopService(Intent(context, AlarmSoundService::class.java))
+ context?.let { context -> alarmSoundServiceHelper.stopService(context) }
}
diff --git a/core/src/main/java/info/nightscout/androidaps/dialogs/ProfileViewerDialog.kt b/core/src/main/java/info/nightscout/androidaps/dialogs/ProfileViewerDialog.kt
index d95a95550b..504fcd28aa 100644
--- a/core/src/main/java/info/nightscout/androidaps/dialogs/ProfileViewerDialog.kt
+++ b/core/src/main/java/info/nightscout/androidaps/dialogs/ProfileViewerDialog.kt
@@ -120,7 +120,7 @@ class ProfileViewerDialog : DaggerDialogFragment() {
profile?.let { profile1 ->
profile2?.let { profile2 ->
profileview_units.text = profileFunction.getUnits()
- profileview_dia.text = HtmlHelper.fromHtml(formatColors("", profile1.dia, profile1.dia, DecimalFormat("0.00"), resourceHelper.gs(R.string.shorthour)))
+ profileview_dia.text = HtmlHelper.fromHtml(formatColors("", profile1.dia, profile2.dia, DecimalFormat("0.00"), resourceHelper.gs(R.string.shorthour)))
val profileNames =profileName!!.split("\n").toTypedArray()
profileview_activeprofile.text = HtmlHelper.fromHtml(formatColors(profileNames[0], profileNames[1]))
profileview_date.text = date
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/ActivePluginProvider.java b/core/src/main/java/info/nightscout/androidaps/interfaces/ActivePluginProvider.java
deleted file mode 100644
index 16bdb6a677..0000000000
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/ActivePluginProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package info.nightscout.androidaps.interfaces;
-
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-
-public interface ActivePluginProvider {
-
- @NotNull BgSourceInterface getActiveBgSource(); // Forced to Dexcom
-
- @NotNull ProfileInterface getActiveProfileInterface(); // Forced to LocalProfile if not changed
-
- @NotNull InsulinInterface getActiveInsulin(); // Forced to RapidActing if not changed
-
- @NotNull APSInterface getActiveAPS(); // Forced to SMB
-
- @NotNull PumpInterface getActivePump(); // Use in places not reachable without active pump. Otherwise IllegalStateException is thrown
-
- @NotNull SensitivityInterface getActiveSensitivity(); // Forced to oref1 if not changed
-
- @NotNull TreatmentsInterface getActiveTreatments(); // Forced to treatments
-
- @NotNull ArrayList getPluginsList();
-
- @NotNull ArrayList getSpecificPluginsVisibleInListByInterface(Class interfaceClass, PluginType type);
-
- @NotNull ArrayList getSpecificPluginsVisibleInList(PluginType type);
-
- @NotNull ArrayList getSpecificPluginsListByInterface(Class interfaceClass);
-
-// @NotNull ArrayList getSpecificPluginsVisibleInList(Class interfaceClass);
-
- void verifySelectionInCategories();
-}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/ActivePluginProvider.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/ActivePluginProvider.kt
new file mode 100644
index 0000000000..ba13cd3888
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/ActivePluginProvider.kt
@@ -0,0 +1,22 @@
+package info.nightscout.androidaps.interfaces
+
+import java.util.*
+
+interface ActivePluginProvider {
+
+ val activeBgSource: BgSourceInterface // Forced to Dexcom
+ val activeProfileInterface: ProfileInterface // Forced to LocalProfile if not changed
+ val activeInsulin: InsulinInterface // Forced to RapidActing if not changed
+ val activeAPS: APSInterface // Forced to SMB
+ val activePump: PumpInterface // Use in places not reachable without active pump. Otherwise IllegalStateException is thrown
+ val activeSensitivity: SensitivityInterface // Forced to oref1 if not changed
+ val activeTreatments: TreatmentsInterface // Forced to treatments
+ val activeOverview: OverviewInterface // Forced to overview
+
+ fun getPluginsList(): ArrayList
+
+ fun getSpecificPluginsVisibleInListByInterface(interfaceClass: Class<*>, type: PluginType): ArrayList
+ fun getSpecificPluginsVisibleInList(type: PluginType): ArrayList
+ fun getSpecificPluginsListByInterface(interfaceClass: Class<*>): ArrayList
+ fun verifySelectionInCategories()
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/BgSourceInterface.java b/core/src/main/java/info/nightscout/androidaps/interfaces/BgSourceInterface.java
index d42ead7950..6a38de63b7 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/BgSourceInterface.java
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/BgSourceInterface.java
@@ -9,4 +9,8 @@ public interface BgSourceInterface {
boolean advancedFilteringSupported();
void handleNewData(Intent intent);
+
+ default int getSensorBatteryLevel() {
+ return -1;
+ }
}
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/CommandQueueProvider.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/CommandQueueProvider.kt
index a5f9bf21df..877dac9809 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/CommandQueueProvider.kt
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/CommandQueueProvider.kt
@@ -3,6 +3,7 @@ package info.nightscout.androidaps.interfaces
import android.text.Spanned
import info.nightscout.androidaps.data.DetailedBolusInfo
import info.nightscout.androidaps.data.Profile
+import info.nightscout.androidaps.queue.commands.CustomCommand
import info.nightscout.androidaps.queue.Callback
import info.nightscout.androidaps.queue.commands.Command
@@ -33,6 +34,9 @@ interface CommandQueueProvider {
fun setUserOptions(callback: Callback?): Boolean
fun loadTDDs(callback: Callback?): Boolean
fun loadEvents(callback: Callback?): Boolean
+ fun customCommand(customCommand: CustomCommand, callback: Callback?): Boolean
+ fun isCustomCommandRunning(customCommandType: Class): Boolean
+ fun isCustomCommandInQueue(customCommandType: Class): Boolean
fun spannedStatus(): Spanned
fun isThisProfileSet(profile: Profile): Boolean
}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/ConfigBuilderInterface.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/ConfigBuilderInterface.kt
index effafb788a..6b248fd7dc 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/ConfigBuilderInterface.kt
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/ConfigBuilderInterface.kt
@@ -2,4 +2,5 @@ package info.nightscout.androidaps.interfaces
interface ConfigBuilderInterface {
fun storeSettings(from: String)
+ fun performPluginSwitch(changedPlugin: PluginBase, enabled: Boolean, type: PluginType)
}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/ConfigExportImportInterface.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/ConfigExportImportInterface.kt
new file mode 100644
index 0000000000..5e4cee973b
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/ConfigExportImportInterface.kt
@@ -0,0 +1,9 @@
+package info.nightscout.androidaps.interfaces
+
+import org.json.JSONObject
+
+interface ConfigExportImportInterface {
+
+ fun configuration(): JSONObject
+ fun applyConfiguration(configuration: JSONObject)
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java b/core/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java
index 461b89beaf..696b3657d6 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java
@@ -14,8 +14,8 @@ public class Constraint> {
private T value;
private T originalValue;
- private List reasons = new ArrayList<>();
- private List mostLimiting = new ArrayList<>();
+ private final List reasons = new ArrayList<>();
+ private final List mostLimiting = new ArrayList<>();
public Constraint(T value) {
this.value = value;
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.java b/core/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.java
deleted file mode 100644
index d5e8ab399d..0000000000
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package info.nightscout.androidaps.interfaces;
-
-import info.nightscout.androidaps.data.Iob;
-import info.nightscout.androidaps.db.Treatment;
-
-/**
- * Created by mike on 17.04.2017.
- */
-
-public interface InsulinInterface {
- // int FASTACTINGINSULIN = 0; // old model no longer available
- // int FASTACTINGINSULINPROLONGED = 1; // old model no longer available
- int OREF_RAPID_ACTING = 2;
- int OREF_ULTRA_RAPID_ACTING = 3;
- int OREF_FREE_PEAK = 4;
-
-
- int getId();
- String getFriendlyName();
- String getComment();
- double getDia();
- Iob iobCalcForTreatment(Treatment treatment, long time, double dia);
-}
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.kt
new file mode 100644
index 0000000000..28a8ee8d0e
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.kt
@@ -0,0 +1,30 @@
+package info.nightscout.androidaps.interfaces
+
+import info.nightscout.androidaps.data.Iob
+import info.nightscout.androidaps.db.Treatment
+import org.json.JSONObject
+
+interface InsulinInterface : ConfigExportImportInterface{
+
+ enum class InsulinType(val value: Int) {
+ UNKNOWN(-1),
+ // int FASTACTINGINSULIN = 0; // old model no longer available
+ // int FASTACTINGINSULINPROLONGED = 1; // old model no longer available
+ OREF_RAPID_ACTING(2),
+ OREF_ULTRA_RAPID_ACTING(3),
+ OREF_FREE_PEAK(4),
+ OREF_LYUMJEV(5);
+
+ companion object {
+ private val map = values().associateBy(InsulinType::value)
+ fun fromInt(type: Int) = map[type]
+ }
+ }
+
+ val id: InsulinType
+ val friendlyName: String
+ val comment: String
+ val dia: Double
+
+ fun iobCalcForTreatment(treatment: Treatment, time: Long, dia: Double): Iob
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/OverviewInterface.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/OverviewInterface.kt
new file mode 100644
index 0000000000..7bc6dfa429
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/OverviewInterface.kt
@@ -0,0 +1,3 @@
+package info.nightscout.androidaps.interfaces
+
+interface OverviewInterface : ConfigExportImportInterface
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.kt
index cf37234a7d..59e8c07c76 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.kt
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.kt
@@ -24,6 +24,9 @@ abstract class PluginBase(
private var state = State.NOT_INITIALIZED
private var fragmentVisible = false
+ open val menuIcon: Int
+ get() = pluginDescription.pluginIcon
+
open val name: String
get() = if (pluginDescription.pluginName == -1) "UNKNOWN" else resourceHelper.gs(pluginDescription.pluginName)
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/PluginDescription.java b/core/src/main/java/info/nightscout/androidaps/interfaces/PluginDescription.java
index 3b753b1743..c45631b93e 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/PluginDescription.java
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/PluginDescription.java
@@ -14,6 +14,7 @@ public class PluginDescription {
public boolean enableByDefault = false;
public boolean visibleByDefault = false;
boolean defaultPlugin = false;
+ int pluginIcon = -1;
public PluginDescription mainType(PluginType mainType) {
this.mainType = mainType;
@@ -45,6 +46,11 @@ public class PluginDescription {
return this;
}
+ public PluginDescription pluginIcon(int pluginIcon) {
+ this.pluginIcon = pluginIcon;
+ return this;
+ }
+
public PluginDescription pluginName(int pluginName) {
this.pluginName = pluginName;
return this;
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/ProfileFunction.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/ProfileFunction.kt
index 64582a62d9..bab94ab5c4 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/ProfileFunction.kt
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/ProfileFunction.kt
@@ -13,5 +13,6 @@ interface ProfileFunction {
fun getProfile(): Profile?
fun getUnits(): String
fun getProfile(time: Long): Profile?
+ fun getProfile(time: Long, activeTreatments: TreatmentsInterface): Profile?
fun prepareProfileSwitch(profileStore: ProfileStore, profileName: String, duration: Int, percentage: Int, timeShift: Int, date: Long): ProfileSwitch
}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/core/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java
index 8308cc34e2..6d895506f7 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java
@@ -1,5 +1,7 @@
package info.nightscout.androidaps.interfaces;
+import androidx.annotation.Nullable;
+
import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
@@ -11,7 +13,9 @@ import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.plugins.common.ManufacturerType;
import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction;
import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType;
+import info.nightscout.androidaps.queue.commands.CustomCommand;
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
+import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.utils.TimeChangeType;
/**
@@ -105,10 +109,32 @@ public interface PumpInterface {
boolean canHandleDST();
+ /**
+ * Provides a list of custom actions to be displayed in the Actions tab.
+ * Plese note that these actions will not be queued upon execution
+ *
+ * @return list of custom actions
+ */
+ @Nullable
List getCustomActions();
+ /**
+ * Executes a custom action. Please note that these actions will not be queued
+ *
+ * @param customActionType action to be executed
+ */
void executeCustomAction(CustomActionType customActionType);
+ /**
+ * Executes a custom queued command
+ * See {@link CommandQueueProvider#customCommand(CustomCommand, Callback)} for queuing a custom command.
+ *
+ * @param customCommand the custom command to be executed
+ * @return PumpEnactResult that represents the command execution result
+ */
+ @Nullable
+ PumpEnactResult executeCustomCommand(CustomCommand customCommand);
+
/**
* This method will be called when time or Timezone changes, and pump driver can then do a specific action (for
* example update clock on pump).
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.java b/core/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.java
deleted file mode 100644
index 04503c5690..0000000000
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package info.nightscout.androidaps.interfaces;
-
-import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult;
-
-/**
- * Created by mike on 24.06.2017.
- */
-
-public interface SensitivityInterface {
-
- double MIN_HOURS = 1;
- double MIN_HOURS_FULL_AUTOSENS = 4;
-
- AutosensResult detectSensitivity(IobCobCalculatorInterface plugin, long fromTime, long toTime);
-
-}
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.kt
new file mode 100644
index 0000000000..7fa096bef4
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.kt
@@ -0,0 +1,27 @@
+package info.nightscout.androidaps.interfaces
+
+import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
+import org.json.JSONObject
+
+interface SensitivityInterface : ConfigExportImportInterface {
+
+ enum class SensitivityType(val value: Int) {
+ UNKNOWN(-1),
+ SENSITIVITY_AAPS(0),
+ SENSITIVITY_WEIGHTED(1),
+ SENSITIVITY_OREF1(2);
+
+ companion object {
+ private val map = values().associateBy(SensitivityType::value)
+ fun fromInt(type: Int) = map[type]
+ }
+ }
+
+ val id: SensitivityType
+ fun detectSensitivity(plugin: IobCobCalculatorInterface, fromTime: Long, toTime: Long): AutosensResult
+
+ companion object {
+ const val MIN_HOURS = 1.0
+ const val MIN_HOURS_FULL_AUTOSENS = 4.0
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java b/core/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java
index 8c8d7f026f..c17fc1119f 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java
@@ -55,6 +55,8 @@ public interface TreatmentsInterface {
NonOverlappingIntervals getTemporaryBasalsFromHistory();
+ void removeTempBasal(TemporaryBasal temporaryBasal);
+
boolean isInHistoryExtendedBoluslInProgress();
ExtendedBolus getExtendedBolusFromHistory(long time);
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/aps/loop/APSResult.java b/core/src/main/java/info/nightscout/androidaps/plugins/aps/loop/APSResult.java
index 1dbe845feb..d02fa4d550 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/aps/loop/APSResult.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/aps/loop/APSResult.java
@@ -192,7 +192,7 @@ public class APSResult {
protected void doClone(APSResult newResult) {
newResult.date = date;
- newResult.reason = reason != null ? new String(reason) : null;
+ newResult.reason = reason != null ? reason : null;
newResult.rate = rate;
newResult.duration = duration;
newResult.tempBasalRequested = tempBasalRequested;
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/aps/loop/DeviceStatus.java b/core/src/main/java/info/nightscout/androidaps/plugins/aps/loop/DeviceStatus.java
index e517ef1681..f883c49da7 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/aps/loop/DeviceStatus.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/aps/loop/DeviceStatus.java
@@ -375,6 +375,7 @@ public class DeviceStatus {
public JSONObject iob = null;
public int uploaderBattery = 0;
public String created_at = null;
+ public JSONObject configuration = null;
public DeviceStatus(AAPSLogger aapsLogger) {
this.aapsLogger = aapsLogger;
@@ -393,6 +394,7 @@ public class DeviceStatus {
record.put("openaps", openaps);
if (uploaderBattery != 0) record.put("uploaderBattery", uploaderBattery);
if (created_at != null) record.put("created_at", created_at);
+ if (configuration != null) record.put("configuration", configuration);
} catch (JSONException e) {
aapsLogger.error("Unhandled exception", e);
}
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/common/ManufacturerType.java b/core/src/main/java/info/nightscout/androidaps/plugins/common/ManufacturerType.java
index 0f61dd3320..124e96cbc5 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/common/ManufacturerType.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/common/ManufacturerType.java
@@ -12,7 +12,7 @@ public enum ManufacturerType {
- private String description;
+ private final String description;
ManufacturerType(String description) {
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ProfileFunctionImplementation.kt b/core/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ProfileFunctionImplementation.kt
index ed084120f4..6156142755 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ProfileFunctionImplementation.kt
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ProfileFunctionImplementation.kt
@@ -11,6 +11,7 @@ import info.nightscout.androidaps.db.Source
import info.nightscout.androidaps.interfaces.ProfileStore
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.interfaces.ProfileFunction
+import info.nightscout.androidaps.interfaces.TreatmentsInterface
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
@@ -70,8 +71,9 @@ class ProfileFunctionImplementation @Inject constructor(
override fun getProfile(): Profile? =
getProfile(System.currentTimeMillis())
- override fun getProfile(time: Long): Profile? {
- val activeTreatments = activePlugin.activeTreatments
+ override fun getProfile(time: Long): Profile? = getProfile(time, activePlugin.activeTreatments)
+
+ override fun getProfile(time: Long, activeTreatments: TreatmentsInterface): Profile? {
val activeProfile = activePlugin.activeProfileInterface
//log.debug("Profile for: " + new Date(time).toLocaleString() + " : " + getProfileName(time));
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/configBuilder/RunningConfiguration.kt b/core/src/main/java/info/nightscout/androidaps/plugins/configBuilder/RunningConfiguration.kt
new file mode 100644
index 0000000000..3eb4d2ab94
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/configBuilder/RunningConfiguration.kt
@@ -0,0 +1,85 @@
+package info.nightscout.androidaps.plugins.configBuilder
+
+import info.nightscout.androidaps.core.R
+import info.nightscout.androidaps.interfaces.ActivePluginProvider
+import info.nightscout.androidaps.interfaces.ConfigBuilderInterface
+import info.nightscout.androidaps.interfaces.InsulinInterface
+import info.nightscout.androidaps.interfaces.PluginType
+import info.nightscout.androidaps.interfaces.SensitivityInterface
+import info.nightscout.androidaps.logging.AAPSLogger
+import info.nightscout.androidaps.logging.LTag
+import info.nightscout.androidaps.plugins.pump.common.defs.PumpType
+import info.nightscout.androidaps.utils.JsonHelper
+import info.nightscout.androidaps.utils.sharedPreferences.SP
+import org.json.JSONException
+import org.json.JSONObject
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class RunningConfiguration @Inject constructor(
+ private val activePlugin: ActivePluginProvider,
+ private val configBuilder: ConfigBuilderInterface,
+ private val sp: SP,
+ private val aapsLogger: AAPSLogger
+) {
+
+ private var counter = 0
+ private val every = 20 // Send only every 20 devicestatus to save traffic
+
+ // called in AAPS mode only
+ fun configuration(): JSONObject {
+ val json = JSONObject()
+ if (counter++ % every == 0)
+ try {
+ val insulinInterface = activePlugin.activeInsulin
+ val sensitivityInterface = activePlugin.activeSensitivity
+ val pumpInterface = activePlugin.activePump
+ val overviewInterface = activePlugin.activeOverview
+
+ json.put("insulin", insulinInterface.id.value)
+ json.put("insulinConfiguration", insulinInterface.configuration())
+ json.put("sensitivity", sensitivityInterface.id.value)
+ json.put("sensitivityConfiguration", sensitivityInterface.configuration())
+ json.put("overviewConfiguration", overviewInterface.configuration())
+ json.put("pump", pumpInterface.model().description)
+ } catch (e: JSONException) {
+ aapsLogger.error("Unhandled exception", e)
+ }
+ return json
+ }
+
+ // called in NSClient mode only
+ fun apply(configuration: JSONObject) {
+ val insulin = InsulinInterface.InsulinType.fromInt(JsonHelper.safeGetInt(configuration, "insulin", InsulinInterface.InsulinType.UNKNOWN.value))
+ for (p in activePlugin.getSpecificPluginsListByInterface(InsulinInterface::class.java)) {
+ val insulinPlugin = p as InsulinInterface
+ if (insulinPlugin.id == insulin) {
+ if (!p.isEnabled()) {
+ aapsLogger.debug(LTag.CORE, "Changing insulin plugin to ${insulin.name}")
+ configBuilder.performPluginSwitch(p, true, PluginType.INSULIN)
+ }
+ insulinPlugin.applyConfiguration(configuration.getJSONObject("insulinConfiguration"))
+ }
+ }
+
+ val sensitivity = SensitivityInterface.SensitivityType.fromInt(JsonHelper.safeGetInt(configuration, "sensitivity", SensitivityInterface.SensitivityType.UNKNOWN.value))
+ for (p in activePlugin.getSpecificPluginsListByInterface(SensitivityInterface::class.java)) {
+ val sensitivityPlugin = p as SensitivityInterface
+ if (sensitivityPlugin.id == sensitivity) {
+ if (!p.isEnabled()) {
+ aapsLogger.debug(LTag.CORE, "Changing sensitivity plugin to ${sensitivity.name}")
+ configBuilder.performPluginSwitch(p, true, PluginType.SENSITIVITY)
+ }
+ sensitivityPlugin.applyConfiguration(configuration.getJSONObject("sensitivityConfiguration"))
+ }
+ }
+
+ val pumpType = JsonHelper.safeGetString(configuration, "pump", PumpType.GenericAAPS.description)
+ sp.putString(R.string.key_virtualpump_type, pumpType)
+ activePlugin.activePump.pumpDescription.setPumpDescription(PumpType.getByDescription(pumpType))
+
+ if (configuration.has("overviewConfiguration"))
+ activePlugin.activeOverview.applyConfiguration(configuration.getJSONObject("overviewConfiguration"))
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSUpload.java b/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSUpload.java
index 5aab6d18b6..2f7ba95612 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSUpload.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSUpload.java
@@ -42,10 +42,10 @@ import info.nightscout.androidaps.interfaces.ProfileStore;
import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.interfaces.UploadQueueInterface;
import info.nightscout.androidaps.logging.AAPSLogger;
-import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.aps.loop.APSResult;
import info.nightscout.androidaps.plugins.aps.loop.DeviceStatus;
+import info.nightscout.androidaps.plugins.configBuilder.RunningConfiguration;
import info.nightscout.androidaps.receivers.ReceiverStatusStore;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.JsonHelper;
@@ -65,6 +65,7 @@ public class NSUpload {
private final Context context;
private final UploadQueueInterface uploadQueue;
private final DatabaseHelperInterface databaseHelper;
+ private final RunningConfiguration runningConfiguration;
@Inject
public NSUpload(
@@ -74,6 +75,7 @@ public class NSUpload {
SP sp,
Context context,
UploadQueueInterface uploadQueue,
+ RunningConfiguration runningConfiguration,
DatabaseHelperInterface databaseHelper
) {
this.injector = injector;
@@ -82,6 +84,7 @@ public class NSUpload {
this.sp = sp;
this.context = context;
this.uploadQueue = uploadQueue;
+ this.runningConfiguration = runningConfiguration;
this.databaseHelper = databaseHelper;
}
@@ -106,7 +109,7 @@ public class NSUpload {
public void uploadTempBasalStartPercent(TemporaryBasal temporaryBasal, Profile profile) {
try {
- boolean useAbsolute = sp.getBoolean("ns_sync_use_absolute", false);
+ boolean useAbsolute = sp.getBoolean(R.string.key_ns_sync_use_absolute, false);
double absoluteRate = 0;
if (profile != null) {
absoluteRate = profile.getBasal(temporaryBasal.date) * temporaryBasal.percentRate / 100d;
@@ -249,6 +252,9 @@ public class NSUpload {
deviceStatus.uploaderBattery = batteryLevel;
deviceStatus.created_at = DateUtil.toISOString(new Date());
+
+ deviceStatus.configuration = runningConfiguration.configuration();
+
uploadQueue.add(new DbRequest("dbAdd", "devicestatus", deviceStatus.mongoRecord()));
} catch (JSONException e) {
aapsLogger.error("Unhandled exception", e);
@@ -514,9 +520,7 @@ public class NSUpload {
public static boolean isIdValid(String _id) {
if (_id == null)
return false;
- if (_id.length() == 24)
- return true;
- return false;
+ return _id.length() == 24;
}
public void generateCareportalEvent(String eventType, long time, String notes) {
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSMbg.java b/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSMbg.java
index 380f082fd7..139a9fd7e0 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSMbg.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSMbg.java
@@ -8,7 +8,7 @@ import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
public class NSMbg {
- private static Logger log = StacktraceLoggerWrapper.getLogger(LTag.NSCLIENT);
+ private static final Logger log = StacktraceLoggerWrapper.getLogger(LTag.NSCLIENT);
public long date;
public double mbg;
public String json;
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSSgv.java b/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSSgv.java
index 6fce93a3e3..9005d239df 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSSgv.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSSgv.java
@@ -14,9 +14,9 @@ import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
* {"mgdl":105,"mills":1455136282375,"device":"xDrip-BluetoothWixel","direction":"Flat","filtered":98272,"unfiltered":98272,"noise":1,"rssi":100}
*/
public class NSSgv {
- private static Logger log = StacktraceLoggerWrapper.getLogger(LTag.NSCLIENT);
+ private static final Logger log = StacktraceLoggerWrapper.getLogger(LTag.NSCLIENT);
- private JSONObject data;
+ private final JSONObject data;
public NSSgv(JSONObject obj) {
this.data = obj;
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/graphExtensions/PointsWithLabelGraphSeries.java b/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/graphExtensions/PointsWithLabelGraphSeries.java
index edf003e859..db18fc2a5f 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/graphExtensions/PointsWithLabelGraphSeries.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/graphExtensions/PointsWithLabelGraphSeries.java
@@ -250,7 +250,7 @@ public class PointsWithLabelGraphSeries e
Rect bounds = new Rect((int) endX, (int) endY + 3, (int) (xpluslength), (int) endY + 8);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
canvas.drawRect(bounds, mPaint);
- mPaint.setTextSize((float) (scaledTextSize));
+ mPaint.setTextSize(scaledTextSize);
mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL));
mPaint.setFakeBoldText(true);
canvas.drawText(value.getLabel(), endX, endY, mPaint);
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/graphExtensions/Scale.java b/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/graphExtensions/Scale.java
index 21af9d4390..53fa04af6b 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/graphExtensions/Scale.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/graphExtensions/Scale.java
@@ -6,7 +6,7 @@ package info.nightscout.androidaps.plugins.general.overview.graphExtensions;
public class Scale {
private double multiplier;
- private double shift;
+ private final double shift;
public Scale() {
shift = 0;
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/Notification.java b/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/Notification.java
index a7ef33c786..1c81ebbce9 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/Notification.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/Notification.java
@@ -73,6 +73,7 @@ public class Notification {
public static final int CARBS_REQUIRED = 60;
public static final int OMNIPOD_POD_SUSPENDED = 61;
public static final int OMNIPOD_POD_ALERTS_UPDATED = 62;
+ public static final int OMNIPOD_POD_ALERTS = 63;
public static final int IMPORTANCE_HIGH = 2;
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.java b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.java
index 7b353b2e5c..f80f6fc04d 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.java
@@ -52,7 +52,7 @@ import io.reactivex.schedulers.Schedulers;
// When using this class, make sure that your first step is to create mConnection (see MedtronicPumpPlugin)
public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpInterface, ConstraintsInterface {
- private CompositeDisposable disposable = new CompositeDisposable();
+ private final CompositeDisposable disposable = new CompositeDisposable();
protected HasAndroidInjector injector;
protected AAPSLogger aapsLogger;
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/DoseSettings.java b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/DoseSettings.java
index f0cd1dbbf9..b617e5e3ee 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/DoseSettings.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/DoseSettings.java
@@ -6,11 +6,11 @@ package info.nightscout.androidaps.plugins.pump.common.data;
public class DoseSettings {
- private double step;
- private int durationStep;
- private int maxDuration;
- private double minDose;
- private Double maxDose;
+ private final double step;
+ private final int durationStep;
+ private final int maxDuration;
+ private final double minDose;
+ private final Double maxDose;
public DoseSettings(double step, int durationStep, int maxDuration, double minDose, Double maxDose)
{
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpHistoryEntryGroup.java b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpHistoryEntryGroup.java
index d17244615f..70a484d5d6 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpHistoryEntryGroup.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpHistoryEntryGroup.java
@@ -29,7 +29,7 @@ public enum PumpHistoryEntryGroup {
Unknown(R.string.history_group_unknown),
;
- private int resourceId;
+ private final int resourceId;
private String translated;
private static List translatedList;
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpStatusType.java b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpStatusType.java
index bcdeeb59e4..d32d6bb57f 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpStatusType.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpStatusType.java
@@ -9,7 +9,7 @@ public enum PumpStatusType {
Suspended("suspended") //
;
- private String statusString;
+ private final String statusString;
PumpStatusType(String statusString) {
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.java b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.java
index 82912012af..cd0bb9d44c 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.java
@@ -143,7 +143,7 @@ public enum PumpType {
MDI("MDI", ManufacturerType.AndroidAPS, "MDI");
- private String description;
+ private final String description;
private ManufacturerType manufacturer;
private String model;
private double bolusSize;
@@ -160,7 +160,7 @@ public enum PumpType {
private boolean hasCustomUnreachableAlertCheck;
private PumpType parent;
- private static Map mapByDescription;
+ private static final Map mapByDescription;
static {
mapByDescription = new HashMap<>();
@@ -454,7 +454,7 @@ public enum PumpType {
} else {
DoseStepSize specialBolusSize = getBaseBasalSpecialSteps();
- basalStepSize = specialBolusSize.getStepSizeForAmount((double) basalAmount);
+ basalStepSize = specialBolusSize.getStepSizeForAmount(basalAmount);
}
if (basalAmount > getTbrSettings().getMaxDose())
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/ByteUtil.java b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/ByteUtil.java
index 6923b42020..6273ff5203 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/ByteUtil.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/ByteUtil.java
@@ -145,7 +145,7 @@ public class ByteUtil {
public static String showPrintable(byte[] ra) {
- String s = new String();
+ String s = "";
for (int i = 0; i < ra.length; i++) {
char c = (char) ra[i];
if (((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'))) {
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/ProfileUtil.java b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/ProfileUtil.java
index 5f1dd3c6ef..8deef7cd8d 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/ProfileUtil.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/ProfileUtil.java
@@ -24,7 +24,7 @@ public class ProfileUtil {
stringBuilder.append(", ");
}
if (stringBuilder.length() > 3)
- return stringBuilder.toString().substring(0, stringBuilder.length() - 2);
+ return stringBuilder.substring(0, stringBuilder.length() - 2);
else
return stringBuilder.toString();
}
@@ -45,7 +45,7 @@ public class ProfileUtil {
stringBuilder.append(", ");
}
if (stringBuilder.length() > 3)
- return stringBuilder.toString().substring(0, stringBuilder.length() - 2);
+ return stringBuilder.substring(0, stringBuilder.length() - 2);
else
return stringBuilder.toString();
}
diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/StringUtil.java b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/StringUtil.java
index cc9533e669..0f9986dce1 100644
--- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/StringUtil.java
+++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/utils/StringUtil.java
@@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.pump.common.utils;
import org.joda.time.LocalDateTime;
import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
@@ -23,7 +24,7 @@ public class StringUtil {
if (ra == null)
return "null array";
else
- return new String(ra, Charset.forName("UTF-8"));
+ return new String(ra, StandardCharsets.UTF_8);
}
diff --git a/core/src/main/java/info/nightscout/androidaps/queue/commands/Command.kt b/core/src/main/java/info/nightscout/androidaps/queue/commands/Command.kt
index ea6a8b9196..149810ea35 100644
--- a/core/src/main/java/info/nightscout/androidaps/queue/commands/Command.kt
+++ b/core/src/main/java/info/nightscout/androidaps/queue/commands/Command.kt
@@ -31,7 +31,8 @@ abstract class Command(
SET_USER_SETTINGS, // so far only Dana specific,
START_PUMP,
STOP_PUMP,
- INSIGHT_SET_TBR_OVER_ALARM // insight only
+ INSIGHT_SET_TBR_OVER_ALARM, // insight only
+ CUSTOM_COMMAND
}
init {
diff --git a/core/src/main/java/info/nightscout/androidaps/queue/commands/CustomCommand.kt b/core/src/main/java/info/nightscout/androidaps/queue/commands/CustomCommand.kt
new file mode 100644
index 0000000000..d0c5c26d51
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/queue/commands/CustomCommand.kt
@@ -0,0 +1,16 @@
+package info.nightscout.androidaps.queue.commands
+
+import java.io.Serializable
+
+/**
+ * Implement this interface for every custom pump command that you want to be able to queue
+ * See [info.nightscout.androidaps.interfaces.CommandQueueProvider.customCommand] for queuing a custom command.
+ */
+interface CustomCommand : Serializable {
+
+ /**
+ * @return short description of this command to be used in [info.nightscout.androidaps.queue.commands.Command.status]
+ * The description is typically all caps.
+ */
+ val statusDescription: String
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.kt b/core/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.kt
index 6da80cf330..37709081ab 100644
--- a/core/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.kt
+++ b/core/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.kt
@@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent
import android.media.AudioManager
import android.media.MediaPlayer
+import android.os.Binder
import android.os.Handler
import android.os.IBinder
import dagger.android.DaggerService
@@ -18,6 +19,7 @@ import kotlin.math.ln
import kotlin.math.pow
class AlarmSoundService : DaggerService() {
+
@Inject lateinit var aapsLogger: AAPSLogger
@Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var notificationHolder: NotificationHolderInterface
@@ -27,6 +29,7 @@ class AlarmSoundService : DaggerService() {
private var resourceId = R.raw.error
companion object {
+
private const val VOLUME_INCREASE_STEPS = 40 // Total number of steps to increase volume with
private const val VOLUME_INCREASE_INITIAL_SILENT_TIME_MILLIS = 3_000L // Number of milliseconds that the notification should initially be silent
private const val VOLUME_INCREASE_BASE_DELAY_MILLIS = 15_000 // Base delay between volume increments
@@ -41,23 +44,31 @@ class AlarmSoundService : DaggerService() {
}
+ inner class LocalBinder : Binder() {
+
+ fun getService(): AlarmSoundService = this@AlarmSoundService
+ }
+
+ private val binder = LocalBinder()
+ override fun onBind(intent: Intent): IBinder = binder
+
private val increaseVolumeHandler = Handler()
private var currentVolumeLevel = 0
- override fun onBind(intent: Intent): IBinder? = null
-
override fun onCreate() {
super.onCreate()
- aapsLogger.debug(LTag.CORE, "onCreate")
+ aapsLogger.debug(LTag.CORE, "onCreate parent called")
startForeground(notificationHolder.notificationID, notificationHolder.notification)
+ aapsLogger.debug(LTag.CORE, "onCreate End")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+ aapsLogger.debug(LTag.CORE, "onStartCommand")
startForeground(notificationHolder.notificationID, notificationHolder.notification)
+ aapsLogger.debug(LTag.CORE, "onStartCommand Foreground called")
player?.let { if (it.isPlaying) it.stop() }
- aapsLogger.debug(LTag.CORE, "onStartCommand")
if (intent?.hasExtra("soundid") == true) resourceId = intent.getIntExtra("soundid", R.raw.error)
player = MediaPlayer()
try {
@@ -80,24 +91,24 @@ class AlarmSoundService : DaggerService() {
} catch (e: Exception) {
aapsLogger.error("Unhandled exception", e)
}
+ aapsLogger.debug(LTag.CORE, "onStartCommand End")
return START_STICKY
}
override fun onDestroy() {
+ aapsLogger.debug(LTag.CORE, "onDestroy")
increaseVolumeHandler.removeCallbacks(volumeUpdater)
player?.stop()
player?.release()
- aapsLogger.debug(LTag.CORE, "onDestroy")
+ aapsLogger.debug(LTag.CORE, "onDestroy End")
}
- private fun getAudioManager(): AudioManager {
- return getSystemService(Context.AUDIO_SERVICE) as AudioManager
- }
+ private fun getAudioManager() = getSystemService(Context.AUDIO_SERVICE) as AudioManager
// TODO replace with VolumeShaper when min API level >= 26
private val volumeUpdater = object : Runnable {
override fun run() {
- currentVolumeLevel++;
+ currentVolumeLevel++
val volumePercentage = 100.0.coerceAtMost(currentVolumeLevel / VOLUME_INCREASE_STEPS.toDouble() * 100)
val volume = (1 - (ln(1.0.coerceAtLeast(100.0 - volumePercentage)) / ln(100.0))).toFloat()
diff --git a/core/src/main/java/info/nightscout/androidaps/services/AlarmSoundServiceHelper.kt b/core/src/main/java/info/nightscout/androidaps/services/AlarmSoundServiceHelper.kt
new file mode 100644
index 0000000000..243dcb5872
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/services/AlarmSoundServiceHelper.kt
@@ -0,0 +1,78 @@
+package info.nightscout.androidaps.services
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
+import android.os.Build
+import android.os.IBinder
+import info.nightscout.androidaps.interfaces.NotificationHolderInterface
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/*
+ This code replaces following
+ val alarm = Intent(context, AlarmSoundService::class.java)
+ alarm.putExtra("soundid", n.soundId)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) context.startForegroundService(alarm) else context.startService(alarm)
+
+ it fails randomly with error
+ Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{e317f7e u0 info.nightscout.nsclient/info.nightscout.androidaps.services.AlarmSoundService}
+
+ */
+@Singleton
+class AlarmSoundServiceHelper @Inject constructor(
+ private val notificationHolder: NotificationHolderInterface
+) {
+
+ fun startAlarm(context: Context, sound: Int) {
+ val connection = object : ServiceConnection {
+ override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
+ // The binder of the service that returns the instance that is created.
+ val binder: AlarmSoundService.LocalBinder = service as AlarmSoundService.LocalBinder
+
+ val alarmSoundService: AlarmSoundService = binder.getService()
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+ context.startForegroundService(getServiceIntent(context, sound))
+ else
+ context.startService(getServiceIntent(context, sound))
+
+ // This is the key: Without waiting Android Framework to call this method
+ // inside Service.onCreate(), immediately call here to post the notification.
+ alarmSoundService.startForeground(notificationHolder.notificationID, notificationHolder.notification)
+
+ // Release the connection to prevent leaks.
+ context.unbindService(this)
+ }
+
+ override fun onServiceDisconnected(name: ComponentName?) {
+ TODO("Not yet implemented")
+ }
+ }
+
+ try {
+ context.bindService(getServiceIntent(context, sound), connection, Context.BIND_AUTO_CREATE)
+ } catch (ignored: RuntimeException) {
+ // This is probably a broadcast receiver context even though we are calling getApplicationContext().
+ // Just call startForegroundService instead since we cannot bind a service to a
+ // broadcast receiver context. The service also have to call startForeground in
+ // this case.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+ context.startForegroundService(getServiceIntent(context, sound))
+ else
+ context.startService(getServiceIntent(context, sound))
+ }
+ }
+
+ fun stopService(context: Context) {
+ val alarm = Intent(context, AlarmSoundService::class.java)
+ context.stopService(alarm)
+ }
+
+ private fun getServiceIntent(context: Context, sound: Int): Intent {
+ val alarm = Intent(context, AlarmSoundService::class.java)
+ alarm.putExtra("soundid", sound)
+ return alarm
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/CRC.java b/core/src/main/java/info/nightscout/androidaps/utils/CRC.java
index 4c7086de85..fbdf81b2db 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/CRC.java
+++ b/core/src/main/java/info/nightscout/androidaps/utils/CRC.java
@@ -2,7 +2,7 @@ package info.nightscout.androidaps.utils;
public final class CRC {
- private static int[] CRC16_TABLE = new int[]{
+ private static final int[] CRC16_TABLE = new int[]{
0, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad,
0xe1ce, 0xf1ef, 0x1231, 0x210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a,
0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/DateUtil.java b/core/src/main/java/info/nightscout/androidaps/utils/DateUtil.java
index afa469f468..46fac31626 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/DateUtil.java
+++ b/core/src/main/java/info/nightscout/androidaps/utils/DateUtil.java
@@ -53,7 +53,7 @@ public class DateUtil {
/**
* The date format in iso.
*/
- private static String FORMAT_DATE_ISO_OUT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
+ private static final String FORMAT_DATE_ISO_OUT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
/**
* Takes in an ISO date string of the following format:
@@ -222,7 +222,7 @@ public class DateUtil {
public static String minAgoShort(long time) {
int mins = (int) ((time - now()) / 1000 / 60);
- return (mins > 0 ? "+" : "") + Integer.toString(mins);
+ return (mins > 0 ? "+" : "") + mins;
}
public static String hourAgo(long time, ResourceHelper resourceHelper) {
@@ -230,7 +230,7 @@ public class DateUtil {
return resourceHelper.gs(R.string.hoursago, hours);
}
- private static LongSparseArray timeStrings = new LongSparseArray<>();
+ private static final LongSparseArray timeStrings = new LongSparseArray<>();
public String timeStringFromSeconds(int seconds) {
String cached = timeStrings.get(seconds);
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/DecimalFormatter.java b/core/src/main/java/info/nightscout/androidaps/utils/DecimalFormatter.java
index d52f520757..812b8c044f 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/DecimalFormatter.java
+++ b/core/src/main/java/info/nightscout/androidaps/utils/DecimalFormatter.java
@@ -10,10 +10,10 @@ import info.nightscout.androidaps.utils.resources.ResourceHelper;
* Created by mike on 11.07.2016.
*/
public class DecimalFormatter {
- private static DecimalFormat format0dec = new DecimalFormat("0");
- private static DecimalFormat format1dec = new DecimalFormat("0.0");
- private static DecimalFormat format2dec = new DecimalFormat("0.00");
- private static DecimalFormat format3dec = new DecimalFormat("0.000");
+ private static final DecimalFormat format0dec = new DecimalFormat("0");
+ private static final DecimalFormat format1dec = new DecimalFormat("0.0");
+ private static final DecimalFormat format2dec = new DecimalFormat("0.00");
+ private static final DecimalFormat format3dec = new DecimalFormat("0.000");
public static String to0Decimal(double value) {
return format0dec.format(value);
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/FabricPrivacy.kt b/core/src/main/java/info/nightscout/androidaps/utils/FabricPrivacy.kt
index 744c692541..6597f93698 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/FabricPrivacy.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/FabricPrivacy.kt
@@ -3,7 +3,9 @@ package info.nightscout.androidaps.utils
import android.content.Context
import android.os.Bundle
import com.google.firebase.analytics.FirebaseAnalytics
+import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.crashlytics.FirebaseCrashlytics
+import com.google.firebase.ktx.Firebase
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
@@ -18,19 +20,32 @@ import javax.inject.Singleton
*/
@Singleton
class FabricPrivacy @Inject constructor(
- context: Context,
private val aapsLogger: AAPSLogger,
private val sp: SP
) {
- var firebaseAnalytics: FirebaseAnalytics
+ val firebaseAnalytics: FirebaseAnalytics = Firebase.analytics
init {
- firebaseAnalytics = FirebaseAnalytics.getInstance(context)
firebaseAnalytics.setAnalyticsCollectionEnabled(!java.lang.Boolean.getBoolean("disableFirebase") && fabricEnabled())
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!java.lang.Boolean.getBoolean("disableFirebase") && fabricEnabled())
}
+ // Analytics logCustom
+ fun logCustom(name: String, event: Bundle) {
+ try {
+ if (fabricEnabled()) {
+ firebaseAnalytics.logEvent(name, event)
+ } else {
+ aapsLogger.debug(LTag.CORE, "Ignoring recently opted-out event: $event")
+ }
+ } catch (e: NullPointerException) {
+ aapsLogger.debug(LTag.CORE, "Ignoring opted-out non-initialized event: $event")
+ } catch (e: IllegalStateException) {
+ aapsLogger.debug(LTag.CORE, "Ignoring opted-out non-initialized event: $event")
+ }
+ }
+
// Analytics logCustom
fun logCustom(event: Bundle) {
try {
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/HtmlHelper.kt b/core/src/main/java/info/nightscout/androidaps/utils/HtmlHelper.kt
index dd0da3b72f..873c751e2e 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/HtmlHelper.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/HtmlHelper.kt
@@ -1,11 +1,10 @@
package info.nightscout.androidaps.utils
-import android.os.Build
import android.text.Html
import android.text.Spanned
object HtmlHelper {
fun fromHtml(source: String): Spanned {
- return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY)
+ return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/utils/InstanceId.kt b/core/src/main/java/info/nightscout/androidaps/utils/InstanceId.kt
similarity index 100%
rename from app/src/main/java/info/nightscout/androidaps/utils/InstanceId.kt
rename to core/src/main/java/info/nightscout/androidaps/utils/InstanceId.kt
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/ListDiffCallback.kt b/core/src/main/java/info/nightscout/androidaps/utils/ListDiffCallback.kt
new file mode 100644
index 0000000000..d1e6947e74
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/utils/ListDiffCallback.kt
@@ -0,0 +1,65 @@
+package info.nightscout.androidaps.utils
+
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListUpdateCallback
+import androidx.recyclerview.widget.RecyclerView
+
+open class ListDiffCallback(private val newItems: List, private val oldItems: List) : DiffUtil.Callback() {
+
+ override fun getOldListSize(): Int = oldItems.size
+
+ override fun getNewListSize(): Int = newItems.size
+
+ /**
+ * Called by the DiffUtil to decide whether two object represent the same Item.
+ *
+ * For example, if your items have unique ids, this method should check their id equality.
+ *
+ * @param oldItemPosition The position of the item in the old list
+ * @param newItemPosition The position of the item in the new list
+ * @return True if the two items represent the same object or false if they are different.
+ */
+ override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
+ newItems[newItemPosition] == oldItems[oldItemPosition]
+
+ /**
+ * Called by the DiffUtil when it wants to check whether two items have the same data.
+ * DiffUtil uses this information to detect if the contents of an item has changed.
+ *
+ * DiffUtil uses this method to check equality instead of {@link Object#equals(Object)}
+ * so that you can change its behavior depending on your UI.
+ * For example, if you are using DiffUtil with a
+ * {@link RecyclerView.Adapter RecyclerView.Adapter}, you should
+ * return whether the items' visual representations are the same.
+ *
+ * This method is called only if {@link #areItemsTheSame(int, int)} returns
+ * {@code true} for these items.
+ *
+ * @param oldItemPosition The position of the item in the old list
+ * @param newItemPosition The position of the item in the new list which replaces the
+ * oldItem
+ * @return True if the contents of the items are the same or false if they are different.
+ */
+ override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
+ newItems[newItemPosition] == oldItems[oldItemPosition]
+}
+
+class ListUpdateCallbackHelper(val adapter: RecyclerView.Adapter<*>, val insertCallback: (Int) -> Unit) : ListUpdateCallback {
+
+ override fun onChanged(position: Int, count: Int, payload: Any?) {
+ adapter.notifyItemRangeChanged(position, count, payload)
+ }
+
+ override fun onInserted(position: Int, count: Int) {
+ adapter.notifyItemRangeInserted(position, count)
+ insertCallback(position)
+ }
+
+ override fun onMoved(fromPosition: Int, toPosition: Int) {
+ adapter.notifyItemMoved(fromPosition, toPosition)
+ }
+
+ override fun onRemoved(position: Int, count: Int) {
+ adapter.notifyItemRangeRemoved(position, count)
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/AlertDialogHelper.kt b/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/AlertDialogHelper.kt
index 65e78f6543..0553fa7d8c 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/AlertDialogHelper.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/AlertDialogHelper.kt
@@ -25,6 +25,7 @@ object AlertDialogHelper {
val titleLayout = LayoutInflater.from(ContextThemeWrapper(context, themeResId)).inflate(layoutResource, null)
(titleLayout.findViewById(R.id.alertdialog_title) as TextView).text = title
(titleLayout.findViewById(R.id.alertdialog_icon) as ImageView).setImageResource(iconResource)
+ titleLayout.findViewById(R.id.alertdialog_title).isSelected = true
return titleLayout
}
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/OKDialog.kt b/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/OKDialog.kt
index c0fc646258..f0dcb9bfa0 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/OKDialog.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/OKDialog.kt
@@ -1,11 +1,11 @@
package info.nightscout.androidaps.utils.alertDialogs
import android.annotation.SuppressLint
-import android.app.Activity
import android.content.Context
import android.content.DialogInterface
import android.os.SystemClock
import android.text.Spanned
+import androidx.fragment.app.FragmentActivity
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.utils.extensions.runOnUiThread
@@ -33,7 +33,7 @@ object OKDialog {
}
@SuppressLint("InflateParams")
- fun show(activity: Activity, title: String, message: Spanned, runnable: Runnable? = null) {
+ fun show(activity: FragmentActivity, title: String, message: Spanned, runnable: Runnable? = null) {
var okClicked = false
var notEmptytitle = title
if (notEmptytitle.isEmpty()) notEmptytitle = activity.getString(R.string.message)
@@ -55,17 +55,17 @@ object OKDialog {
}
@JvmStatic
- fun showConfirmation(activity: Activity, message: String, ok: Runnable?) {
+ fun showConfirmation(activity: FragmentActivity, message: String, ok: Runnable?) {
showConfirmation(activity, activity.getString(R.string.confirmation), message, ok, null)
}
@JvmStatic
- fun showConfirmation(activity: Activity, message: Spanned, ok: Runnable?) {
+ fun showConfirmation(activity: FragmentActivity, message: Spanned, ok: Runnable?) {
showConfirmation(activity, activity.getString(R.string.confirmation), message, ok, null)
}
@SuppressLint("InflateParams")
- fun showConfirmation(activity: Activity, title: String, message: Spanned, ok: Runnable?, cancel: Runnable? = null) {
+ fun showConfirmation(activity: FragmentActivity, title: String, message: Spanned, ok: Runnable?, cancel: Runnable? = null) {
var okClicked = false
AlertDialogHelper.Builder(activity)
.setMessage(message)
@@ -93,7 +93,7 @@ object OKDialog {
}
@SuppressLint("InflateParams")
- fun showConfirmation(activity: Activity, title: String, message: String, ok: Runnable?, cancel: Runnable? = null) {
+ fun showConfirmation(activity: FragmentActivity, title: String, message: String, ok: Runnable?, cancel: Runnable? = null) {
var okClicked = false
AlertDialogHelper.Builder(activity)
.setMessage(message)
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/extensions/HexByteArrayConversion.kt b/core/src/main/java/info/nightscout/androidaps/utils/extensions/HexByteArrayConversion.kt
index 7492135983..2d685210e7 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/extensions/HexByteArrayConversion.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/extensions/HexByteArrayConversion.kt
@@ -24,8 +24,8 @@ fun String.hexStringToByteArray() : ByteArray {
val lowerCased = this.toLowerCase(Locale.getDefault())
for (i in 0 until length step 2) {
- val firstIndex = HEX_CHARS.indexOf(lowerCased[i]);
- val secondIndex = HEX_CHARS.indexOf(lowerCased[i + 1]);
+ val firstIndex = HEX_CHARS.indexOf(lowerCased[i])
+ val secondIndex = HEX_CHARS.indexOf(lowerCased[i + 1])
val octet = firstIndex.shl(4).or(secondIndex)
result.set(i.shr(1), octet.toByte())
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/extensions/JSONObjectExt.kt b/core/src/main/java/info/nightscout/androidaps/utils/extensions/JSONObjectExt.kt
new file mode 100644
index 0000000000..6ddb1920ed
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/utils/extensions/JSONObjectExt.kt
@@ -0,0 +1,48 @@
+package info.nightscout.androidaps.utils.extensions
+
+import androidx.annotation.StringRes
+import info.nightscout.androidaps.utils.resources.ResourceHelper
+import info.nightscout.androidaps.utils.sharedPreferences.SP
+import org.json.JSONObject
+
+fun JSONObject.putInt(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject =
+ if (sp.contains(key)) put(resourceHelper.gs(key), sp.getInt(key, 0)) else this
+
+fun JSONObject.putLong(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject =
+ if (sp.contains(key)) put(resourceHelper.gs(key), sp.getLong(key, 0)) else this
+
+fun JSONObject.putDouble(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject =
+ if (sp.contains(key)) put(resourceHelper.gs(key), sp.getDouble(key, 0.0)) else this
+
+fun JSONObject.putString(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject =
+ if (sp.contains(key)) put(resourceHelper.gs(key), sp.getString(key, "")) else this
+
+fun JSONObject.putBoolean(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject =
+ if (sp.contains(key)) put(resourceHelper.gs(key), sp.getBoolean(key, false)) else this
+
+fun JSONObject.storeInt(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject {
+ if (has(resourceHelper.gs(key))) sp.putString(key, getInt(resourceHelper.gs(key)).toString())
+ return this
+}
+
+fun JSONObject.storeLong(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject {
+ if (has(resourceHelper.gs(key))) sp.putString(key, getLong(resourceHelper.gs(key)).toString())
+ return this
+}
+
+fun JSONObject.storeDouble(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject {
+ if (has(resourceHelper.gs(key))) sp.putString(key, getDouble(resourceHelper.gs(key)).toString())
+ return this
+}
+
+fun JSONObject.storeString(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject {
+ if (has(resourceHelper.gs(key))) sp.putString(key, getString(resourceHelper.gs(key)).toString())
+ return this
+}
+
+fun JSONObject.storeBoolean(@StringRes key: Int, sp: SP, resourceHelper: ResourceHelper): JSONObject {
+ if (has(resourceHelper.gs(key))) sp.putString(key, getBoolean(resourceHelper.gs(key)).toString())
+ return this
+}
+
+
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/protection/PasswordCheck.kt b/core/src/main/java/info/nightscout/androidaps/utils/protection/PasswordCheck.kt
index efc3f6dfb1..79e270f012 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/protection/PasswordCheck.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/protection/PasswordCheck.kt
@@ -135,9 +135,9 @@ class PasswordCheck @Inject constructor(
passwordExplanation?.let { alertDialogBuilder.setMessage(it) }
passwordWarning?.let {
- val extraWarning: TextView = promptsView.findViewById(R.id.password_prompt_extra_message) as TextView;
- extraWarning.text = context.getString(it);
- extraWarning.visibility = View.VISIBLE;
+ val extraWarning: TextView = promptsView.findViewById(R.id.password_prompt_extra_message) as TextView
+ extraWarning.text = context.getString(it)
+ extraWarning.visibility = View.VISIBLE
}
val userInput = promptsView.findViewById(R.id.password_prompt_pass) as EditText
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/resources/ResourceHelperImplementation.kt b/core/src/main/java/info/nightscout/androidaps/utils/resources/ResourceHelperImplementation.kt
index feef45fb5f..3e2c3bf461 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/resources/ResourceHelperImplementation.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/resources/ResourceHelperImplementation.kt
@@ -44,7 +44,7 @@ class ResourceHelperImplementation @Inject constructor(private val context: Cont
BitmapFactory.decodeResource(context.resources, id)
override fun getDisplayMetrics():DisplayMetrics =
- context.resources.getDisplayMetrics()
+ context.resources.displayMetrics
override fun dpToPx(dp: Int): Int {
val scale = context.resources.displayMetrics.density
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/textValidator/ValidatingEditTextPreference.kt b/core/src/main/java/info/nightscout/androidaps/utils/textValidator/ValidatingEditTextPreference.kt
index b7c244ec54..495b71eeac 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/textValidator/ValidatingEditTextPreference.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/textValidator/ValidatingEditTextPreference.kt
@@ -16,7 +16,7 @@ class ValidatingEditTextPreference(ctx: Context, attrs: AttributeSet, defStyleAt
setOnBindEditTextListener { editText ->
validator = DefaultEditTextValidator(editText, validatorParameters, context)
}
- setOnPreferenceChangeListener { preference, newValue ->
+ setOnPreferenceChangeListener { _, _ ->
validator?.testValidity(false) ?: true
}
}
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/textValidator/validators/MultiPhoneValidator.kt b/core/src/main/java/info/nightscout/androidaps/utils/textValidator/validators/MultiPhoneValidator.kt
index 3baba5240d..a2c6d8f882 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/textValidator/validators/MultiPhoneValidator.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/textValidator/validators/MultiPhoneValidator.kt
@@ -7,9 +7,13 @@ class MultiPhoneValidator(val _customErrorMessage: String?) : Validator(_customE
override fun isValid(editText: EditText): Boolean {
val substrings = editText.text.split(";").toTypedArray()
+ val knownNumbers = HashSet()
for (number in substrings) {
if (!PatternValidator(_customErrorMessage, Patterns.PHONE).isValid(number))
return false
+ if (knownNumbers.contains(number))
+ return false
+ knownNumbers.add(number)
}
return substrings.isNotEmpty()
}
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/ui/DigitsKeyListenerWithComma.java b/core/src/main/java/info/nightscout/androidaps/utils/ui/DigitsKeyListenerWithComma.java
index 6a3189c287..b4e87aa795 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/ui/DigitsKeyListenerWithComma.java
+++ b/core/src/main/java/info/nightscout/androidaps/utils/ui/DigitsKeyListenerWithComma.java
@@ -22,13 +22,13 @@ class DigitsKeyListenerWithComma extends NumberKeyListener {
};
private char[] mAccepted;
- private boolean mSign;
- private boolean mDecimal;
+ private final boolean mSign;
+ private final boolean mDecimal;
private static final int SIGN = 1;
private static final int DECIMAL = 2;
- private static DigitsKeyListenerWithComma[] sInstance = new DigitsKeyListenerWithComma[4];
+ private static final DigitsKeyListenerWithComma[] sInstance = new DigitsKeyListenerWithComma[4];
@Override
protected char[] getAcceptedChars() {
@@ -190,10 +190,6 @@ class DigitsKeyListenerWithComma extends NumberKeyListener {
if (stripped != null) {
return stripped;
- } else if (out != null) {
- return out;
- } else {
- return null;
- }
+ } else return out;
}
}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/ui/MinutesNumberPicker.kt b/core/src/main/java/info/nightscout/androidaps/utils/ui/MinutesNumberPicker.kt
index d00a91104a..45e9d3d694 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/ui/MinutesNumberPicker.kt
+++ b/core/src/main/java/info/nightscout/androidaps/utils/ui/MinutesNumberPicker.kt
@@ -1,17 +1,14 @@
package info.nightscout.androidaps.utils.ui
import android.content.Context
-import android.text.TextWatcher
import android.util.AttributeSet
-import android.util.Log
-import android.view.View.OnFocusChangeListener
import android.widget.Button
import info.nightscout.androidaps.core.R
import java.text.DecimalFormat
class MinutesNumberPicker constructor(context: Context, attrs: AttributeSet? = null) : NumberPicker(context, attrs) {
- fun setParams(initValue: Double, minValue: Double, maxValue: Double, step: Double, allowZero: Boolean, okButton: Button? = null, textWatcher: TextWatcher? = null) {
+ fun setParams(initValue: Double, minValue: Double, maxValue: Double, step: Double, allowZero: Boolean, okButton: Button? = null) {
super.setParams(initValue, minValue, maxValue, step, null, allowZero, okButton)
}
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/ui/NumberPicker.java b/core/src/main/java/info/nightscout/androidaps/utils/ui/NumberPicker.java
index da5bf0ab92..0c77607cb8 100644
--- a/core/src/main/java/info/nightscout/androidaps/utils/ui/NumberPicker.java
+++ b/core/src/main/java/info/nightscout/androidaps/utils/ui/NumberPicker.java
@@ -56,7 +56,7 @@ public class NumberPicker extends LinearLayout implements View.OnKeyListener,
private OnValueChangedListener mOnValueChangedListener;
private class UpdateCounterTask implements Runnable {
- private boolean mInc;
+ private final boolean mInc;
private int repeated = 0;
private int multiplier = 1;
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/ui/SingleClickButton.java b/core/src/main/java/info/nightscout/androidaps/utils/ui/SingleClickButton.java
deleted file mode 100644
index 28638629a2..0000000000
--- a/core/src/main/java/info/nightscout/androidaps/utils/ui/SingleClickButton.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package info.nightscout.androidaps.utils.ui;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.SystemClock;
-import androidx.annotation.Nullable;
-import android.util.AttributeSet;
-import android.view.View;
-
-import org.slf4j.Logger;
-
-import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
-
-/**
- * Created by mike on 22.12.2017.
- */
-
-public class SingleClickButton extends androidx.appcompat.widget.AppCompatButton implements View.OnClickListener {
- private static Logger log = StacktraceLoggerWrapper.getLogger(SingleClickButton.class);
-
- Context context;
- OnClickListener listener = null;
-
- public SingleClickButton(Context context) {
- super(context);
- this.context = context;
- super.setOnClickListener(this);
- }
-
- public SingleClickButton(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.context = context;
- super.setOnClickListener(this);
- }
-
- public SingleClickButton(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- this.context = context;
- super.setOnClickListener(this);
- }
-
- @Override
- public void setOnClickListener(@Nullable OnClickListener l) {
- listener = l;
- }
-
- @Override
- public void onClick(final View v) {
- setEnabled(false);
- new Thread(new Runnable() {
- @Override
- public void run() {
- SystemClock.sleep(3000);
- Activity activity = (Activity) context;
- if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- setEnabled(true);
- log.debug("Button enabled");
- }
- });
- }
- }).start();
- if (listener != null)
- listener.onClick(v);
- }
-}
diff --git a/core/src/main/java/info/nightscout/androidaps/utils/ui/SingleClickButton.kt b/core/src/main/java/info/nightscout/androidaps/utils/ui/SingleClickButton.kt
new file mode 100644
index 0000000000..01a24ef7eb
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/utils/ui/SingleClickButton.kt
@@ -0,0 +1,27 @@
+package info.nightscout.androidaps.utils.ui
+
+import android.content.Context
+import android.util.AttributeSet
+import androidx.appcompat.R
+import androidx.appcompat.widget.AppCompatButton
+import info.nightscout.androidaps.logging.StacktraceLoggerWrapper
+import org.slf4j.Logger
+
+class SingleClickButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.attr.buttonStyle) : AppCompatButton(context, attrs, defStyleAttr) {
+
+ override fun performClick(): Boolean = guardClick { super.performClick() }
+ override fun callOnClick(): Boolean = guardClick { super.callOnClick() }
+
+ private fun guardClick(block: () -> Boolean): Boolean {
+ isEnabled = false
+ postDelayed({ isEnabled = true; log.debug("Button enabled") }, BUTTON_REFRACTION_PERIOD)
+ return block()
+ }
+
+ @Suppress("DEPRECATION")
+ private val log: Logger = StacktraceLoggerWrapper.getLogger(SingleClickButton::class.java)
+
+ companion object {
+ const val BUTTON_REFRACTION_PERIOD = 3000L
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/res/drawable/ic_danars.xml b/core/src/main/res/drawable/ic_danars.xml
new file mode 100644
index 0000000000..efa1c62276
--- /dev/null
+++ b/core/src/main/res/drawable/ic_danars.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/src/main/res/drawable/ic_veo.xml b/core/src/main/res/drawable/ic_veo.xml
new file mode 100644
index 0000000000..3a174015a0
--- /dev/null
+++ b/core/src/main/res/drawable/ic_veo.xml
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/src/main/res/layout/dialog_alert_custom.xml b/core/src/main/res/layout/dialog_alert_custom.xml
index 312be67ac7..c7818b902a 100644
--- a/core/src/main/res/layout/dialog_alert_custom.xml
+++ b/core/src/main/res/layout/dialog_alert_custom.xml
@@ -1,5 +1,4 @@
-
-
@@ -29,8 +28,14 @@
android:layout_centerInParent="true"
android:layout_gravity="center"
android:layout_marginStart="2dp"
- android:layout_marginEnd="50dp"
+ android:layout_marginEnd="40dp"
android:layout_toEndOf="@id/alertdialog_icon"
+ android:ellipsize="marquee"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:scrollHorizontally="true"
+ android:singleLine="true"
android:textAlignment="center"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?dialogTitleColor" />
diff --git a/core/src/main/res/layout/dialog_bolusprogress.xml b/core/src/main/res/layout/dialog_bolusprogress.xml
index d6a2527288..b20b64b8e5 100644
--- a/core/src/main/res/layout/dialog_bolusprogress.xml
+++ b/core/src/main/res/layout/dialog_bolusprogress.xml
@@ -1,4 +1,5 @@
+ app:srcCompat="@drawable/ic_trending_flat_white_48dp" />
+ app:srcCompat="@drawable/ic_error_red_48dp" />
+ app:srcCompat="@drawable/ic_home_profile" />
Изчаква резултат от помпатаSMB
- %dгр допълнителни въглехидрати ще са необходими до %d минути
+ %1$dгр допълнителни въглехидрати ще са необходими до %2$d минутиСтатистикаКомулативна TDD
diff --git a/core/src/main/res/values-cs-rCZ/strings.xml b/core/src/main/res/values-cs-rCZ/strings.xml
index bf30fdf148..32f5fd4a36 100644
--- a/core/src/main/res/values-cs-rCZ/strings.xml
+++ b/core/src/main/res/values-cs-rCZ/strings.xml
@@ -170,7 +170,7 @@
Čekání na výsledekSMB
- Požadováno dalších %d g sacharidů během %d minut
+ Požadováno dalších %1$d g sacharidů během %2$d minutStatistikyKumulativní CDD
diff --git a/core/src/main/res/values-de-rDE/strings.xml b/core/src/main/res/values-de-rDE/strings.xml
index 5883891969..3c0f7e48dd 100644
--- a/core/src/main/res/values-de-rDE/strings.xml
+++ b/core/src/main/res/values-de-rDE/strings.xml
@@ -170,7 +170,7 @@
Auf Pumpenergebnis wartenSMB
- %d g zusätzliche Kohlenhydrate innerhalb von %d Minuten erforderlich
+ %1$d g zusätzliche Kohlenhydrate innerhalb von %2$d Minuten erforderlichStatistikKumulative TDD
diff --git a/core/src/main/res/values-es-rES/strings.xml b/core/src/main/res/values-es-rES/strings.xml
index 050222388b..649e3d0f2a 100644
--- a/core/src/main/res/values-es-rES/strings.xml
+++ b/core/src/main/res/values-es-rES/strings.xml
@@ -170,7 +170,7 @@
Esperando resultadoSMB
- %dg Carbohidratos adicionales necesarios dentro De %d minutos
+ %1$dg Carbohidratos adicionales necesarios dentro de %2$d minutosEstadísticasTDD acumulativa
diff --git a/core/src/main/res/values-fr-rFR/strings.xml b/core/src/main/res/values-fr-rFR/strings.xml
index 05bc714163..d37051c4c9 100644
--- a/core/src/main/res/values-fr-rFR/strings.xml
+++ b/core/src/main/res/values-fr-rFR/strings.xml
@@ -170,7 +170,7 @@
Attente de résultatSMB
- %d g de glucides supplémentaires requis d\'ici %d minutes
+ %1$dg de glucides requis dans %2$d min.StatsDTI cumulé
diff --git a/core/src/main/res/values-it-rIT/strings.xml b/core/src/main/res/values-it-rIT/strings.xml
index 0c9e203fd4..af87258fbc 100644
--- a/core/src/main/res/values-it-rIT/strings.xml
+++ b/core/src/main/res/values-it-rIT/strings.xml
@@ -170,7 +170,7 @@
In attesa del risultatoSMB
- %d g di CHO aggiuntivi richiesti entro %d minuti
+ %1$d g di CHO aggiuntivi richiesti entro %2$d minutiStatisticheTDD cumulativo
diff --git a/core/src/main/res/values-iw-rIL/strings.xml b/core/src/main/res/values-iw-rIL/strings.xml
index b47480e9ec..c79a44770a 100644
--- a/core/src/main/res/values-iw-rIL/strings.xml
+++ b/core/src/main/res/values-iw-rIL/strings.xml
@@ -2,27 +2,216 @@
+ שגיאה
+ לא הוגדר
+ עדכון הפרופיל הבזאלי נכשל
+ הפרופיל הבזאלי עודכן במשאבה
+ קלט לא חוקי
+ שגיאת אספקה של בזאלי זמני
+ עומד להזריק %1$.2f יח\'
+ ממתין למשאבה
+ מתחבר במשך %1$d שניות
+ מזריק כעת %1$.2f יח\'
+ לוחץ יד
+ מתחבר
+ מחובר
+ מנותק
+ מתנתק
+ AndroidAPS הופעל
+ %1$.1f יח\'
+ %1$.2f יח\'
+ %1$+.2f יח\'
+ %1$d גר\'
+ %1$.0f / %2$d יח\'
+ %1$.2f יח\' לשעה
+ %1$.2f שע\'
+ %1$d דק\'
+ המשאבה אינה פנויה
+ שגיאה בחיבור המשאבה
+ הגיעתם למגבלה המותרת
+ משימות
+ סגור
+ נא להמתין…
+ השתק
+ טען מחדש
+ נלחץ עצור
+ עצור
+ פחמימות
+ פרופיל לא חוקי !!!
+ לא הוגדר פרופיל
+ תאריך
+ יחידות
+ DIA
+ IC
+ ISF
+ אינסולין בזאלי
+ ערך מטרה
+ מאתחל...
+ מספר סידורי
+ סוללה
+ התחברות אחרונה
+ בולוס אחרון
+ יחידות יומיות
+ בזאלי בסיסי
+ בזאלי זמני
+ בולוס ממושך
+ מכל
+ היסטוריית המשאבה
+ הצג פרופיל
+ סוג האירוע
+ mg/dL
+ mmol/L
+ הגדרות מתקדמות
+ בלוטות\'
+ BT Watchdog
+ מכבה את הבלוטות\' של הטלפון לשנייה אחת אם לא ניתן לתקשר עם המשאבה. זה עשוי לעזור במס\' דגמי טלפונים שבהם מערכת הבלוטות\' קופאת.
+ מזווג
+ מגביל את הקצב הבזאלי המרבי ל-%1$.2f יח\' לשעה בגלל %2$s
+ מגבלת משאבה
+ מגביל את אחוז הקצב הבזאלי המרבי ל-%1$d%% בגלל %2$s
+ זה חייב להיות ערך חיובי
+ מגביל בולוס ל-%1$.1f יח\' בגלל %2$s
+ משאבה לא אותחלה! לא נקבע פרופיל!
+ אישור
+ הודעה
+ אישור
+ ביטול
+ בטל
+ בלוטות\' באנרגיה נמוכה לא נתמך.
+ בלוטות\' כבוי.
+ המיקום אינו מופעל
+ בכדי שסריקת בלוטות\' תעבוד יש לאפשר את שירות המיקום. AAPS לא עוקב אחר המיקום שלכם וניתן להפסיק את השירות לאחר סיום הזיווג.
+ לפני %1$d דקות
+ לפני %1$.1f שעות
+ ש\'
+ ימים
+ שעות
+ שניה
+ דקה
+ שעה
+ יום
+ שבוע
+ שניות
+ דקות
+ שעות
+ ימים
+ שבועות
+ דק\'
+ י\'
+ סיסמה שגויה
+ הסיסמאות אינן תואמות
+ ערכי הבזאלי לא מותאמים לשעות: %1$s
+ ערכי הבזאלי הוחלפו בהערכים המינימליים שנתמכים: %1$s
+ ערכי הבזאלי הוחלפו בערכים הנתמכים המינימליים: %1$s
+ /יח\'
+ יח\'\שע\'
+ גר\'\יח\'
+ לא נבחר פרופיל
+ * רק ערכים בדידים, טווחים אינם נתמכים עבור ערכי בזאלי ובולוס במשאבה וירטואלית.
+ ביטול בזאלי זמני
+ אפשר לבזאלי זמני לרוץ
+ דרג
+ משך
+ סיבה
+ אין בקשות החלפה
+ פרופיל לא חוקי: %1$s
+ %1$d דק\'
+ %1$s: ∑: %2$.2f יחידות בולוס: %3$.2f יחידות בזאלי: %4$.2f יחידות(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2f יחידות בולוס: %3$.2f יחידות בזאלי: %4$.2f יחידות(%5$.0f%%) פחמ: %6$.0f גרם]]>
+ בדיקת רמת סוכר בדם
+ רמת סוכר ידנית או כיול
+ הודעה
+ הערה
+ שאלה
+ פעילות גופנית
+ החלפת פרפרית
+ חיבור סנסור
+ התחלת סנסור חדש
+ החלפת מחסנית אינסולין
+ החלפת פרופיל
+ בולוס חטיף
+ בולוס ארוחה
+ בולוס תיקון
+ בולוס משולב
+ התחלת בזאלי זמני
+ סיום בזאלי זמני
+ תיקון פחמימות
+ OpenAPS במצב לא מקוון
+ החלפת סוללת משאבה
+ ערך מטרה זמני
+ ביטול ערך מטרה זמני
+ אצבע
+ חיישן
+ ידני
+ לא ידוע
+ החיבור חרג ממגבלת הזמן
+ נקבע
+ תגובה
+ הצלחה
+ אחוז
+ מוחלט
+ אינסולין
+ יחידות
+ ממתין לתוצאות
+ SMB
+ %1$d גר\' פחמימות דרושות ב-%2$d הדקות הקרובות
+ סטטיסטיקה
+ מינון יומי מצטבר (TDD)
+ TDD משוקלל אקספוננציאלי
+ בזאלי
+ בולוס
+ מינון יומי כולל (TDD)
+ יחס
+ # ימים
+ משקל
+ שימוש בבולוס למילוי / פריימינג עשוי לגרום לחוסר דיוק!
+ הנתונים ישנים. לרענון לחצו \"טען מחדש\"
+ סה\"כ בזאלי בסיסי
+ סה\"כ בזאלי בסיסי * 2
+ זיהוי שעה
+ %1$d ש\' %2$d דק\'
+ הפעולה לא נתמכת ע\"י המשאבה ו\או מנהל התקן.
+ הפעולה עוד לא נתמכת על ידי המשאבה.
+ אישור
+ מעולם לא נוצר קשר
+ מתעורר
+ שגיאת תקשורת
+ חריגה ממגבלת הזמן בתקשורת
+ המשאבה לא זמינה
+ קונפיגורציה לא חוקית
+ פעיל
+ ישן
+ בזאלים
+ קונפיגורציות
+ התראות
+ סטטיסטיקה
+ לא ידועים
+ כל
+ בולוסים
+ מילוי
+ התראות
+ גלוקוז
diff --git a/core/src/main/res/values-lt-rLT/strings.xml b/core/src/main/res/values-lt-rLT/strings.xml
index 2d24ad2fc1..8c8a687481 100644
--- a/core/src/main/res/values-lt-rLT/strings.xml
+++ b/core/src/main/res/values-lt-rLT/strings.xml
@@ -170,7 +170,6 @@
Laukiama rezultatoSMB
- Būtina suvartoti %d g papildomų AV per %d minStatistikaBPD viso
diff --git a/core/src/main/res/values-nl-rNL/strings.xml b/core/src/main/res/values-nl-rNL/strings.xml
index 9765833014..73acf29ae2 100644
--- a/core/src/main/res/values-nl-rNL/strings.xml
+++ b/core/src/main/res/values-nl-rNL/strings.xml
@@ -8,15 +8,22 @@
Basaal profiel in pomp bijgewerktOngeldige invoerStoring toedienen tijdelijk basaal
+ %1$.2f E toedienenWacht op pompVerbinding maken gedurende %1$d s
+ %1$.2f E worden toegediendHandshakingVerbining makenVerbondenVerbinding verbrokenVerbinding aan het verbrekenAndroidAPS gestart
+ %1$.1f E
+ %1$.2f E
+ %1$+.2f E
+ %1$d g%1$.0f / %2$d E
+ %1$.2f E/uur%1$.2f u%1$d minutenPomp is bezig
@@ -78,6 +85,8 @@
Locatie is niet ingeschakeldOm Bluetooth discovery met nieuwere apparaten te laten werken moet locatie worden ingeschakeld. AAPS volgt je locatie niet en locatie kan ook weer worden uitgeschakeld nadat het koppelen is gelukt.
+ %1$d m geleden
+ %1$.1f u geledenudagenuren
@@ -94,6 +103,8 @@
md
+ Verkeerd wachtwoord
+ Wachtwoorden komen niet overeenBasaalstanden niet ingesteld in hele uren: %1$sBasale waarde vervangen door minimaal ondersteunde waarde; %1$s
@@ -115,9 +126,13 @@
Ongeldig profiel: %1$s
+ %1$d min
+ %1$s: ∑: %2$.2f E Bol: %3$.2f E Bas: %4$.2f E(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2f E Bol: %3$.2f E Bas: %4$.2f E(%5$.0f%%) Koolh. %6$.0f g]]>BG Controle
+ Handmatige BG of calibratieMededelingNotitieVraag
@@ -155,6 +170,7 @@
Wachtend op resultaatSMB
+ %1$d g extra koolhydraten nodig binnen %2$d minutenStatistiekenCumulatieve TDD
@@ -171,10 +187,31 @@
TBB * 2Tijd detectie
+ %1$du %2$dm
+ Bewerking niet ondersteund door pomp en/of driver.Operatie NU nog niet ondersteund door pomp.
+ OK
+ Nooit verbonden
+ Ontwaken
+ Communicatiefout
+ Time-out op de communicatie
+ Pomp niet beschikbaar
+ Ongeldige configuratie
+ Actief
+ Slapen
+ Basalen
+ Instellingen
+ Meldingen
+ Statistieken
+ Onbekend
+ Alle
+ Bolussen
+ Vullen
+ Alarmen
+ Glucose
diff --git a/core/src/main/res/values-no-rNO/strings.xml b/core/src/main/res/values-no-rNO/strings.xml
index b47480e9ec..c9e12c5a0f 100644
--- a/core/src/main/res/values-no-rNO/strings.xml
+++ b/core/src/main/res/values-no-rNO/strings.xml
@@ -2,27 +2,216 @@
+ Feil
+ Ikke angitt
+ Kunne ikke oppdatere basal profil
+ Basal profil i pumpen er oppdatert
+ Ugyldig inndata
+ Feil ved justering av Temp Basal
+ Kommer til å levere %1$.2f enheter
+ Venter på pumpen
+ Tilkobler i %1$d sek
+ Leverer %1$.2f enheter
+ Tilkobling verifiseres
+ Tilkobler
+ Tilkoblet
+ Frakoblet
+ Frakobler
+ AndroidAPS startet
+ %1$.1f E
+ %1$.2f E
+ %1$+.2f E
+ %1$d g
+ %1$.0f / %2$d E
+ %1$.2f E/t
+ %1$.2f t
+ %1$d min
+ Pumpen er opptatt
+ Tilkoblingsfeil til pumpe
+ Du har nådd din tillatte grense
+ Opplæringsmål
+ Lukk
+ Vennligst vent…
+ Lyd av
+ Last på nytt
+ STOPP trykket
+ Stopp
+ Karbohydrater
+ Ugyldig profil!!!
+ INGEN PROFIL VALGT
+ Dato
+ Enheter
+ DIA
+ IK
+ ISF
+ Basal
+ Målverdi
+ Starter opp...
+ Serienummer
+ Batteri
+ Siste tilkobling
+ Siste bolus
+ Daglige enheter
+ Basis basal dose
+ Temp basal
+ Forlenget bolus
+ Reservoar
+ Pumpe historikk
+ Vis profil
+ Hendelsestype
+ mg/dl
+ mmol/l
+ Avanserte innstillinger
+ Bluetooth
+ BT overvåker
+ Restarter telefonens bluetooth i ett sekund hvis tilkobling til pumpen mislykkes. Dette hjelper på enkelte telefoner hvor bluetooth av og til stopper.
+ Kobler sammen
+ Begrenser maks basal dose til %1$.2f E/t på grunn av %2$s
+ pumpebegrensning
+ Begrenser maks prosent sats til %1$d%% på grunn av %2$s
+ det på være positiv verdi
+ Begrenser bolus til %1$.1f E på grunn av %2$s
+ Pumpen ikke initialisert, ingen profil valgt!
+ Bekreftelse
+ Melding
+ OK
+ Avbryt
+ Avvis
+ Lavenergi Bluetooth BLE er ikke støttet.
+ Bluetooth er ikke aktivert.
+ Stedstjeneste er ikke aktivert
+ Bluetooth søk på nye mobiler virker bare når posisjonstjeneste er aktivert. AAPS lagrer ikke dine posisjonsdata og den kan derfor slås av etter vellykket sammenkobling.
+ %1$d min siden
+ %1$.1f timer siden
+ t
+ dager
+ timer
+ sekund
+ minutt
+ time
+ dag
+ uke
+ sekunder
+ minutter
+ timer
+ dager
+ uker
+ m
+ d
+ Feil passord
+ Passord stemmer ikke overens
+ Basal verdier er ikke angitt på hele timer: %1$s
+ Basal verdi erstattet med laveste tillate verdi: %1$s
+ Basal verdi erstattet med høyeste tillate verdi: %1$s
+ /E
+ E/t
+ g/E
+ Ingen profil valgt
+ * Bare konkrete verdier støttes som granularitet for basal/bolus i virtuell pumpe, ingen verdiområder.
+ Avbryt temp basal
+ Fortsett temp basal
+ Dose
+ Varighet
+ Årsak
+ Ingen endring behøves
+ Ugyldig profil: %1$s
+ %1$d min
+ %1$s: ∑: %2$.2f E Bol: %3$.2f E Bas: %4$.2f E(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2f E Bol: %3$.2f E Bas: %4$.2f E(%5$.0f%%) Karbo: %6$.0f g]]>
+ BS kontroll
+ Manuelt BS eller kalibrering
+ Melding
+ Merknad
+ Spørsmål
+ Trening
+ Bytte av pumpens kanyle
+ Bytte av CGM sensor
+ CGM sensor start
+ Bytte insulinreservoar
+ Profil bytte
+ Mellommåltids bolus
+ Måltids bolus
+ Korreksjons bolus
+ Kombo bolus
+ Temp Basal start
+ Temp basal slutt
+ Karbo korreksjon
+ OpenAPS offline
+ Bytte pumpebatteri
+ Temp mål
+ Avbryt temp mål
+ Finger
+ Sensor
+ Manuell
+ ukjent
+ Tilkoblingen ble tidsavbrutt
+ Utført
+ Kommentar
+ Suksess
+ Prosent
+ Absolutt
+ Insulin
+ E
+ Venter på resultat
+ SMB
+ %1$d g ekstra karbohydrater kreves innen %2$d minutter
+ Statistikk
+ Akkumulert TDD
+ Eksponentielt vektet TDD
+ Basal
+ Bolus
+ TDD
+ Ratio
+ Antall dager
+ Vekt
+ Kan vise feil hvis bolus brukes for priming/fylling!
+ Gamle data. Vennligst trykk \"HENT\"
+ Total grunnbasal
+ TBB * 2
+ Tidsdetektering
+ %1$dt %2$dm
+ Operasjonen støttes ikke av pumpen og/eller driveren.
+ Operasjonen støttes ikke av pumpen ennå.
+ OK
+ Aldri kontaktet
+ Våkner opp
+ Kommunikasjonsfeil
+ Tidsavbrudd kommunikasjon
+ Pumpe utilgjengelig
+ Ugyldig oppsett
+ Aktiv
+ Sover
+ Basaldoser
+ Innstillinger
+ Varsler
+ Statistikk
+ Ukjente
+ Alle
+ Boluser
+ Prime
+ Alarmer
+ Glukose
diff --git a/core/src/main/res/values-pl-rPL/strings.xml b/core/src/main/res/values-pl-rPL/strings.xml
index ab93c2f436..9b738dc373 100644
--- a/core/src/main/res/values-pl-rPL/strings.xml
+++ b/core/src/main/res/values-pl-rPL/strings.xml
@@ -8,15 +8,22 @@
Profil bazowy w pompie uaktualnionyBłędne dane wejścioweBłąd podania bazy tymczasowej
+ Zamierzam podać %1$.2f UCzekam na pomp꣹czenie przez %1$d s
+ Podaję %1$.2f UUściskdłoniŁączęPołączonoRozłączonoRozłączanieAndroidAPS uruchomiony
+ %1$.1f U
+ %1$.2f U
+ %1$+.2f U
+ %1$d g%1$.0f / %2$d U
+ %1$.2f U/h%1$.2f h%1$d min.Pompa jest zajęta
@@ -78,6 +85,8 @@
Lokalizacja nie jest włączonaAby uruchomić odnajdywanie Bluetooth na nowszych urządzeniach, lokalizacja musi być uruchomiona. AAPS nie śledzi twojej lokalizacji więc po udanym parowaniu urządzenia Bluetooth można wyłączyć lokalizację.
+ %1$d min temu
+ %1$.1f godz. temuhdnigodzin
@@ -94,6 +103,8 @@
md
+ Złe hasło
+ Hasła się nie zgadzająWartości bazy nie są ustawione w pełnych godzinach: %1$sWartość bazy zastąpiona minimalną obsługiwaną wartością: %1$s
@@ -115,9 +126,13 @@
Nieprawidłowy profil: %1$s
+ %1$d min
+ %1$s: ∑: %2$.2f U Bol: %3$.2f U Baz: %4$.2f U(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2f U Bol: %3$.2f U Baz: %4$.2f U(%5$.0f%%) Węgl.: %6$.0f g]]>Sprawdź BG
+ Ręczny pomiar cukru lub kalibracjaPowiadomienieNotatkaPytanie
@@ -155,6 +170,7 @@
Oczekiwanie na wynikSMB
+ Zalecane podanie %1$d g węglowodanów w przeciągu %2$d minutStatystykiKumulatywna TDD (dawka dzienna)
@@ -171,10 +187,31 @@
TBB * 2Wykrywanie czasu
+ %1$dh %2$dm
+ Operacja nie jest wspierana przez pompę i/lub sterownik pompy.Operacja nie jest JESZCZE wspierana przez pompę.
+ OK
+ Nigdy nie połączona
+ Wybudzanie
+ Błąd komunikacji
+ Przekroczony limit czasu połączenia
+ Pompa nieosiągalna
+ Nieprawidłowe ustawienia
+ Aktywna
+ Uśpiona
+ Dawki Bazowe
+ Ustawienia
+ Powiadomienia
+ Statystyki
+ Nieznane
+ Wszystko
+ Bolusy
+ Napełnianie
+ Alarmy
+ Glukoza
diff --git a/core/src/main/res/values-pt-rPT/strings.xml b/core/src/main/res/values-pt-rPT/strings.xml
index 23444504a2..39fdfeb07d 100644
--- a/core/src/main/res/values-pt-rPT/strings.xml
+++ b/core/src/main/res/values-pt-rPT/strings.xml
@@ -170,7 +170,6 @@
À espera de resultadoSMB
- %d g Hidratos Adicionais Necessários Dentro de %d MinutosEstatísticasDose diária acumulativa
diff --git a/core/src/main/res/values-ro-rRO/strings.xml b/core/src/main/res/values-ro-rRO/strings.xml
index 3323e07643..47aeb6bf40 100644
--- a/core/src/main/res/values-ro-rRO/strings.xml
+++ b/core/src/main/res/values-ro-rRO/strings.xml
@@ -171,7 +171,6 @@
Se așteaptă rezultatulSMB
- %d g carbohidrați suplimentari necesari în %d minuteStatisticiTDD cumulat
diff --git a/core/src/main/res/values-ru-rRU/strings.xml b/core/src/main/res/values-ru-rRU/strings.xml
index 86e299c539..b297696ba5 100644
--- a/core/src/main/res/values-ru-rRU/strings.xml
+++ b/core/src/main/res/values-ru-rRU/strings.xml
@@ -170,7 +170,7 @@
Ожидание результатаСупер микро болюс SMB
- Необходимо дополнительно %d г углеводов в течение %d минут
+ Необходимо дополнительно %1$d г углеводов в течение %2$d минутСтатистиканакопительные TDD
diff --git a/core/src/main/res/values-sk-rSK/strings.xml b/core/src/main/res/values-sk-rSK/strings.xml
index 9770c113fa..0dcf0162f3 100644
--- a/core/src/main/res/values-sk-rSK/strings.xml
+++ b/core/src/main/res/values-sk-rSK/strings.xml
@@ -170,7 +170,7 @@
Čakanie na výsledokSMB
- %d g dodatočných sacharidov požadovaných v priebehu %d minút
+ %1$d g dodatočných sacharidov požadovaných v priebehu %2$d minútŠtatistikyKumulatívny TDD
diff --git a/core/src/main/res/values-sv-rSE/strings.xml b/core/src/main/res/values-sv-rSE/strings.xml
index 1c03ae8201..f95262eb2a 100644
--- a/core/src/main/res/values-sv-rSE/strings.xml
+++ b/core/src/main/res/values-sv-rSE/strings.xml
@@ -170,7 +170,7 @@
Väntar på resultatSMB
- %dg KH behövs inom %d minuter
+ %1$dg KH behövs inom %2$d minuterStatistikKumulativ TDD
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index 2836b47a52..daca62fb65 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -26,6 +26,9 @@
pump_unreachable_thresholdmissed_bg_readings_thresholdgradually_increase_notification_volume
+ ns_sync_use_absolute
+ virtualpump_type
+ QuickWizardError
@@ -212,7 +215,7 @@
SMB
- %d g Additional Carbs Required Within %d Minutes
+ %1$d g Additional Carbs Required Within %2$d MinutesStats
diff --git a/dana/build.gradle b/dana/build.gradle
index 48f8c44cce..7339a7d833 100644
--- a/dana/build.gradle
+++ b/dana/build.gradle
@@ -1,6 +1,5 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
@@ -19,7 +18,9 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
-
+ buildFeatures {
+ viewBinding true
+ }
buildTypes {
release {
minifyEnabled false
@@ -43,33 +44,13 @@ dependencies {
implementation project(':core')
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation "androidx.core:core-ktx:${coreVersion}"
- implementation "androidx.preference:preference-ktx:1.1.1"
- implementation "androidx.activity:activity-ktx:${activityVersion}"
-
- implementation "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
-
- implementation 'net.danlew:android.joda:2.10.6'
-
- // Graphview cannot be upgraded
- implementation "com.jjoe64:graphview:4.0.1"
-
- implementation "com.joanzapata.iconify:android-iconify-fontawesome:2.2.2"
-
- implementation "com.google.dagger:dagger-android:$dagger_version"
- implementation "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
- testImplementation 'junit:junit:4.13'
- androidTestImplementation 'androidx.test.ext:junit:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ testImplementation "junit:junit:$junit_version"
+ androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
+ androidTestImplementation "androidx.test:rules:$androidx_rules"
}
diff --git a/dana/src/main/java/info/nightscout/androidaps/dana/DanaFragment.kt b/dana/src/main/java/info/nightscout/androidaps/dana/DanaFragment.kt
index ba0c110823..9348a8f864 100644
--- a/dana/src/main/java/info/nightscout/androidaps/dana/DanaFragment.kt
+++ b/dana/src/main/java/info/nightscout/androidaps/dana/DanaFragment.kt
@@ -8,6 +8,7 @@ import android.view.View
import android.view.ViewGroup
import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.activities.TDDStatsActivity
+import info.nightscout.androidaps.dana.databinding.DanarFragmentBinding
import info.nightscout.androidaps.dialogs.ProfileViewerDialog
import info.nightscout.androidaps.events.EventExtendedBolusChange
import info.nightscout.androidaps.events.EventInitializationChanged
@@ -32,7 +33,6 @@ 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 kotlinx.android.synthetic.main.danar_fragment.*
import javax.inject.Inject
class DanaFragment : DaggerFragment() {
@@ -53,6 +53,12 @@ class DanaFragment : DaggerFragment() {
private val loopHandler = Handler()
private lateinit var refreshLoop: Runnable
+ private var _binding: DanarFragmentBinding? = null
+
+ // This property is only valid between onCreateView and
+ // onDestroyView.
+ private val binding get() = _binding!!
+
init {
refreshLoop = Runnable {
activity?.runOnUiThread { updateGUI() }
@@ -61,17 +67,18 @@ class DanaFragment : DaggerFragment() {
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
- savedInstanceState: Bundle?): View? {
- return inflater.inflate(R.layout.danar_fragment, container, false)
+ savedInstanceState: Bundle?): View {
+ _binding = DanarFragmentBinding.inflate(inflater, container, false)
+ return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- dana_pumpstatus.setBackgroundColor(resourceHelper.gc(R.color.colorInitializingBorder))
+ binding.danaPumpstatus.setBackgroundColor(resourceHelper.gc(R.color.colorInitializingBorder))
- danar_history.setOnClickListener { startActivity(Intent(context, info.nightscout.androidaps.dana.activities.DanaHistoryActivity::class.java)) }
- danar_viewprofile.setOnClickListener {
+ binding.history.setOnClickListener { startActivity(Intent(context, info.nightscout.androidaps.dana.activities.DanaHistoryActivity::class.java)) }
+ binding.viewprofile.setOnClickListener {
val profile = danaPump.createConvertedProfile()?.getDefaultProfile()
?: return@setOnClickListener
val profileName = danaPump.createConvertedProfile()?.getDefaultProfileName()
@@ -86,17 +93,17 @@ class DanaFragment : DaggerFragment() {
pvd.arguments = args
pvd.show(childFragmentManager, "ProfileViewDialog")
}
- danar_stats.setOnClickListener { startActivity(Intent(context, TDDStatsActivity::class.java)) }
- danar_user_options.setOnClickListener { startActivity(Intent(context, info.nightscout.androidaps.dana.activities.DanaUserOptionsActivity::class.java)) }
- danar_btconnection.setOnClickListener {
+ binding.stats.setOnClickListener { startActivity(Intent(context, TDDStatsActivity::class.java)) }
+ binding.userOptions.setOnClickListener { startActivity(Intent(context, info.nightscout.androidaps.dana.activities.DanaUserOptionsActivity::class.java)) }
+ binding.btconnection.setOnClickListener {
aapsLogger.debug(LTag.PUMP, "Clicked connect to pump")
danaPump.lastConnection = 0
commandQueue.readStatus("Clicked connect to pump", null)
}
if (activePlugin.activePump.pumpDescription.pumpType == PumpType.DanaRS)
- danar_btconnection.setOnLongClickListener {
+ binding.btconnection.setOnLongClickListener {
activity?.let {
- OKDialog.showConfirmation(it, resourceHelper.gs(R.string.resetpairing), Runnable {
+ OKDialog.showConfirmation(it, resourceHelper.gs(R.string.resetpairing), {
aapsLogger.error("USER ENTRY: Clearing pairing keys !!!")
(activePlugin.activePump as DanaPumpInterface).clearPairing()
})
@@ -136,19 +143,19 @@ class DanaFragment : DaggerFragment() {
when {
it.status == EventPumpStatusChanged.Status.CONNECTING ->
@Suppress("SetTextI18n")
- danar_btconnection?.text = "{fa-bluetooth-b spin} ${it.secondsElapsed}s"
+ binding.btconnection.text = "{fa-bluetooth-b spin} ${it.secondsElapsed}s"
it.status == EventPumpStatusChanged.Status.CONNECTED ->
@Suppress("SetTextI18n")
- danar_btconnection?.text = "{fa-bluetooth}"
+ binding.btconnection.text = "{fa-bluetooth}"
it.status == EventPumpStatusChanged.Status.DISCONNECTED ->
@Suppress("SetTextI18n")
- danar_btconnection?.text = "{fa-bluetooth-b}"
+ binding.btconnection.text = "{fa-bluetooth-b}"
}
if (it.getStatus(resourceHelper) != "") {
- dana_pumpstatus?.text = it.getStatus(resourceHelper)
- dana_pumpstatuslayout?.visibility = View.VISIBLE
+ binding.danaPumpstatus.text = it.getStatus(resourceHelper)
+ binding.danaPumpstatuslayout.visibility = View.VISIBLE
} else {
- dana_pumpstatuslayout?.visibility = View.GONE
+ binding.danaPumpstatuslayout.visibility = View.GONE
}
}, { fabricPrivacy.logException(it) })
updateGUI()
@@ -161,60 +168,64 @@ class DanaFragment : DaggerFragment() {
loopHandler.removeCallbacks(refreshLoop)
}
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+
// GUI functions
@Synchronized
fun updateGUI() {
- if (danar_dailyunits == null) return
val pump = danaPump
val plugin: PumpInterface = activePlugin.activePump
if (pump.lastConnection != 0L) {
val agoMsec = System.currentTimeMillis() - pump.lastConnection
val agoMin = (agoMsec.toDouble() / 60.0 / 1000.0).toInt()
- danar_lastconnection?.text = dateUtil.timeString(pump.lastConnection) + " (" + resourceHelper.gs(R.string.minago, agoMin) + ")"
- warnColors.setColor(danar_lastconnection, agoMin.toDouble(), 16.0, 31.0)
+ binding.lastconnection.text = dateUtil.timeString(pump.lastConnection) + " (" + resourceHelper.gs(R.string.minago, agoMin) + ")"
+ warnColors.setColor(binding.lastconnection, agoMin.toDouble(), 16.0, 31.0)
}
if (pump.lastBolusTime != 0L) {
val agoMsec = System.currentTimeMillis() - pump.lastBolusTime
val agoHours = agoMsec.toDouble() / 60.0 / 60.0 / 1000.0
if (agoHours < 6)
// max 6h back
- danar_lastbolus?.text = dateUtil.timeString(pump.lastBolusTime) + " " + DateUtil.sinceString(pump.lastBolusTime, resourceHelper) + " " + resourceHelper.gs(R.string.formatinsulinunits, pump.lastBolusAmount)
+ binding.lastbolus.text = dateUtil.timeString(pump.lastBolusTime) + " " + DateUtil.sinceString(pump.lastBolusTime, resourceHelper) + " " + resourceHelper.gs(R.string.formatinsulinunits, pump.lastBolusAmount)
else
- danar_lastbolus?.text = ""
+ binding.lastbolus.text = ""
}
- danar_dailyunits?.text = resourceHelper.gs(R.string.reservoirvalue, pump.dailyTotalUnits, pump.maxDailyTotalUnits)
- warnColors.setColor(danar_dailyunits, pump.dailyTotalUnits, pump.maxDailyTotalUnits * 0.75, pump.maxDailyTotalUnits * 0.9)
- danar_basabasalrate?.text = "( " + (pump.activeProfile + 1) + " ) " + resourceHelper.gs(R.string.pump_basebasalrate, plugin.baseBasalRate)
+ binding.dailyunits.text = resourceHelper.gs(R.string.reservoirvalue, pump.dailyTotalUnits, pump.maxDailyTotalUnits)
+ warnColors.setColor(binding.dailyunits, pump.dailyTotalUnits, pump.maxDailyTotalUnits * 0.75, pump.maxDailyTotalUnits * 0.9)
+ binding.basabasalrate.text = "( " + (pump.activeProfile + 1) + " ) " + resourceHelper.gs(R.string.pump_basebasalrate, plugin.baseBasalRate)
// DanaRPlugin, DanaRKoreanPlugin
if (activePlugin.activePump.isFakingTempsByExtendedBoluses == true) {
- danar_tempbasal?.text = activePlugin.activeTreatments.getRealTempBasalFromHistory(System.currentTimeMillis())?.toStringFull()
+ binding.tempbasal.text = activePlugin.activeTreatments.getRealTempBasalFromHistory(System.currentTimeMillis())?.toStringFull()
?: ""
} else {
// v2 plugin
- danar_tempbasal?.text = activePlugin.activeTreatments.getTempBasalFromHistory(System.currentTimeMillis())?.toStringFull()
+ binding.tempbasal.text = activePlugin.activeTreatments.getTempBasalFromHistory(System.currentTimeMillis())?.toStringFull()
?: ""
}
- danar_extendedbolus?.text = activePlugin.activeTreatments.getExtendedBolusFromHistory(System.currentTimeMillis())?.toString()
+ binding.extendedbolus.text = activePlugin.activeTreatments.getExtendedBolusFromHistory(System.currentTimeMillis())?.toString()
?: ""
- danar_reservoir?.text = resourceHelper.gs(R.string.reservoirvalue, pump.reservoirRemainingUnits, 300)
- warnColors.setColorInverse(danar_reservoir, pump.reservoirRemainingUnits, 50.0, 20.0)
- danar_battery?.text = "{fa-battery-" + pump.batteryRemaining / 25 + "}"
- warnColors.setColorInverse(danar_battery, pump.batteryRemaining.toDouble(), 51.0, 26.0)
- danar_iob?.text = resourceHelper.gs(R.string.formatinsulinunits, pump.iob)
- danar_firmware?.text = resourceHelper.gs(R.string.dana_model, pump.modelFriendlyName(), pump.hwModel, pump.protocol, pump.productCode)
- danar_basalstep?.text = pump.basalStep.toString()
- danar_bolusstep?.text = pump.bolusStep.toString()
- danar_serialnumber?.text = pump.serialNumber
+ binding.reservoir.text = resourceHelper.gs(R.string.reservoirvalue, pump.reservoirRemainingUnits, 300)
+ warnColors.setColorInverse(binding.reservoir, pump.reservoirRemainingUnits, 50.0, 20.0)
+ binding.battery.text = "{fa-battery-" + pump.batteryRemaining / 25 + "}"
+ warnColors.setColorInverse(binding.battery, pump.batteryRemaining.toDouble(), 51.0, 26.0)
+ binding.iob.text = resourceHelper.gs(R.string.formatinsulinunits, pump.iob)
+ binding.firmware.text = resourceHelper.gs(R.string.dana_model, pump.modelFriendlyName(), pump.hwModel, pump.protocol, pump.productCode)
+ binding.basalstep.text = pump.basalStep.toString()
+ binding.bolusstep.text = pump.bolusStep.toString()
+ binding.serialNumber.text = pump.serialNumber
val status = commandQueue.spannedStatus()
if (status.toString() == "") {
- danar_queue?.visibility = View.GONE
+ binding.queue.visibility = View.GONE
} else {
- danar_queue?.visibility = View.VISIBLE
- danar_queue?.text = status
+ binding.queue.visibility = View.VISIBLE
+ binding.queue.text = status
}
//hide user options button if not an RS pump or old firmware
// also excludes pump with model 03 because of untested error
- danar_user_options?.visibility = (pump.hwModel != 1 && pump.protocol != 0x00).toVisibility()
+ binding.userOptions.visibility = (pump.hwModel != 1 && pump.protocol != 0x00).toVisibility()
}
}
diff --git a/dana/src/main/java/info/nightscout/androidaps/dana/DanaPump.kt b/dana/src/main/java/info/nightscout/androidaps/dana/DanaPump.kt
index d687d27936..2966a25807 100644
--- a/dana/src/main/java/info/nightscout/androidaps/dana/DanaPump.kt
+++ b/dana/src/main/java/info/nightscout/androidaps/dana/DanaPump.kt
@@ -156,7 +156,7 @@ class DanaPump @Inject constructor(
// DanaRS specific
var rsPassword = ""
- var v3RSPump = false;
+ var v3RSPump = false
// User settings
var timeDisplayType24 = false
diff --git a/dana/src/main/java/info/nightscout/androidaps/dana/activities/DanaHistoryActivity.kt b/dana/src/main/java/info/nightscout/androidaps/dana/activities/DanaHistoryActivity.kt
index 78c2655dec..82cd99c1ab 100644
--- a/dana/src/main/java/info/nightscout/androidaps/dana/activities/DanaHistoryActivity.kt
+++ b/dana/src/main/java/info/nightscout/androidaps/dana/activities/DanaHistoryActivity.kt
@@ -13,8 +13,10 @@ import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
import info.nightscout.androidaps.dana.R
import info.nightscout.androidaps.dana.comm.RecordTypes
+import info.nightscout.androidaps.dana.databinding.DanarHistoryActivityBinding
import info.nightscout.androidaps.data.Profile
import info.nightscout.androidaps.db.DanaRHistoryRecord
+import info.nightscout.androidaps.events.EventDanaRSyncStatus
import info.nightscout.androidaps.events.EventPumpStatusChanged
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.interfaces.CommandQueueProvider
@@ -24,7 +26,6 @@ import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType
-import info.nightscout.androidaps.events.EventDanaRSyncStatus
import info.nightscout.androidaps.queue.Callback
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DecimalFormatter
@@ -33,11 +34,11 @@ import info.nightscout.androidaps.utils.extensions.plusAssign
import info.nightscout.androidaps.utils.resources.ResourceHelper
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
-import kotlinx.android.synthetic.main.danar_historyactivity.*
import java.util.*
import javax.inject.Inject
class DanaHistoryActivity : NoSplashAppCompatActivity() {
+
@Inject lateinit var rxBus: RxBusWrapper
@Inject lateinit var aapsLogger: AAPSLogger
@Inject lateinit var resourceHelper: ResourceHelper
@@ -54,21 +55,24 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
private var historyList: List = ArrayList()
class TypeList internal constructor(var type: Byte, var name: String) {
+
override fun toString(): String = name
}
+ private lateinit var binding: DanarHistoryActivityBinding
+
override fun onResume() {
super.onResume()
disposable += rxBus
.toObservable(EventPumpStatusChanged::class.java)
.observeOn(AndroidSchedulers.mainThread())
- .subscribe({ danar_history_status.text = it.getStatus(resourceHelper) }) { fabricPrivacy.logException(it) }
+ .subscribe({ binding.status.text = it.getStatus(resourceHelper) }) { fabricPrivacy.logException(it) }
disposable += rxBus
.toObservable(EventDanaRSyncStatus::class.java)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
aapsLogger.debug(LTag.PUMP, "EventDanaRSyncStatus: " + it.message)
- danar_history_status.text = it.message
+ binding.status.text = it.message
}) { fabricPrivacy.logException(it) }
}
@@ -79,12 +83,13 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.danar_historyactivity)
+ binding = DanarHistoryActivityBinding.inflate(layoutInflater)
+ setContentView(binding.root)
- danar_history_recyclerview.setHasFixedSize(true)
- danar_history_recyclerview.layoutManager = LinearLayoutManager(this)
- danar_history_recyclerview.adapter = RecyclerViewAdapter(historyList)
- danar_history_status.visibility = View.GONE
+ binding.recyclerview.setHasFixedSize(true)
+ binding.recyclerview.layoutManager = LinearLayoutManager(this)
+ binding.recyclerview.adapter = RecyclerViewAdapter(historyList)
+ binding.status.visibility = View.GONE
val pump = activePlugin.activePump
val isKorean = pump.pumpDescription.pumpType == PumpType.DanaRKorean
@@ -106,26 +111,27 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
typeList.add(TypeList(RecordTypes.RECORD_TYPE_REFILL, resourceHelper.gs(R.string.danar_history_refill)))
typeList.add(TypeList(RecordTypes.RECORD_TYPE_SUSPEND, resourceHelper.gs(R.string.danar_history_syspend)))
}
- danar_history_spinner.adapter = ArrayAdapter(this, R.layout.spinner_centered, typeList)
+ binding.spinner.adapter = ArrayAdapter(this, R.layout.spinner_centered, typeList)
- danar_history_reload.setOnClickListener {
- val selected = danar_history_spinner.selectedItem as TypeList? ?: return@setOnClickListener
+ binding.reload.setOnClickListener {
+ val selected = binding.spinner.selectedItem as TypeList?
+ ?: return@setOnClickListener
runOnUiThread {
- danar_history_reload?.visibility = View.GONE
- danar_history_status?.visibility = View.VISIBLE
+ binding.reload.visibility = View.GONE
+ binding.status.visibility = View.VISIBLE
}
clearCardView()
commandQueue.loadHistory(selected.type, object : Callback() {
override fun run() {
loadDataFromDB(selected.type)
runOnUiThread {
- danar_history_reload?.visibility = View.VISIBLE
- danar_history_status?.visibility = View.GONE
+ binding.reload.visibility = View.VISIBLE
+ binding.status.visibility = View.GONE
}
}
})
}
- danar_history_spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ binding.spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
val selected = typeList[position]
loadDataFromDB(selected.type)
@@ -139,6 +145,7 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
}
inner class RecyclerViewAdapter internal constructor(private var historyList: List) : RecyclerView.Adapter() {
+
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): HistoryViewHolder =
HistoryViewHolder(LayoutInflater.from(viewGroup.context).inflate(R.layout.danar_history_item, viewGroup, false))
@@ -151,7 +158,7 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
holder.duration.text = DecimalFormatter.to0Decimal(record.recordDuration.toDouble())
holder.alarm.text = record.recordAlarm
when (showingType) {
- RecordTypes.RECORD_TYPE_ALARM -> {
+ RecordTypes.RECORD_TYPE_ALARM -> {
holder.time.visibility = View.VISIBLE
holder.value.visibility = View.VISIBLE
holder.stringValue.visibility = View.GONE
@@ -163,7 +170,7 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
holder.alarm.visibility = View.VISIBLE
}
- RecordTypes.RECORD_TYPE_BOLUS -> {
+ RecordTypes.RECORD_TYPE_BOLUS -> {
holder.time.visibility = View.VISIBLE
holder.value.visibility = View.VISIBLE
holder.stringValue.visibility = View.GONE
@@ -175,7 +182,7 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
holder.alarm.visibility = View.GONE
}
- RecordTypes.RECORD_TYPE_DAILY -> {
+ RecordTypes.RECORD_TYPE_DAILY -> {
holder.dailyBasal.text = resourceHelper.gs(R.string.formatinsulinunits, record.recordDailyBasal)
holder.dailyBolus.text = resourceHelper.gs(R.string.formatinsulinunits, record.recordDailyBolus)
holder.dailyTotal.text = resourceHelper.gs(R.string.formatinsulinunits, record.recordDailyBolus + record.recordDailyBasal)
@@ -191,7 +198,7 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
holder.alarm.visibility = View.GONE
}
- RecordTypes.RECORD_TYPE_GLUCOSE -> {
+ RecordTypes.RECORD_TYPE_GLUCOSE -> {
holder.value.text = Profile.toUnitsString(record.recordValue, record.recordValue * Constants.MGDL_TO_MMOLL, profileFunction.getUnits())
holder.time.visibility = View.VISIBLE
holder.value.visibility = View.VISIBLE
@@ -216,7 +223,7 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
holder.alarm.visibility = View.GONE
}
- RecordTypes.RECORD_TYPE_SUSPEND -> {
+ RecordTypes.RECORD_TYPE_SUSPEND -> {
holder.time.visibility = View.VISIBLE
holder.value.visibility = View.GONE
holder.stringValue.visibility = View.VISIBLE
@@ -235,6 +242,7 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
}
inner class HistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+
var time: TextView = itemView.findViewById(R.id.danar_history_time)
var value: TextView = itemView.findViewById(R.id.danar_history_value)
var bolusType: TextView = itemView.findViewById(R.id.danar_history_bolustype)
@@ -249,11 +257,11 @@ class DanaHistoryActivity : NoSplashAppCompatActivity() {
private fun loadDataFromDB(type: Byte) {
historyList = databaseHelper.getDanaRHistoryRecordsByType(type)
- runOnUiThread { danar_history_recyclerview?.swapAdapter(RecyclerViewAdapter(historyList), false) }
+ runOnUiThread { binding.recyclerview.swapAdapter(RecyclerViewAdapter(historyList), false) }
}
private fun clearCardView() {
historyList = ArrayList()
- runOnUiThread { danar_history_recyclerview?.swapAdapter(RecyclerViewAdapter(historyList), false) }
+ runOnUiThread { binding.recyclerview.swapAdapter(RecyclerViewAdapter(historyList), false) }
}
}
\ No newline at end of file
diff --git a/dana/src/main/java/info/nightscout/androidaps/dana/activities/DanaUserOptionsActivity.kt b/dana/src/main/java/info/nightscout/androidaps/dana/activities/DanaUserOptionsActivity.kt
index 03d51edf9b..ba1c16bab6 100644
--- a/dana/src/main/java/info/nightscout/androidaps/dana/activities/DanaUserOptionsActivity.kt
+++ b/dana/src/main/java/info/nightscout/androidaps/dana/activities/DanaUserOptionsActivity.kt
@@ -8,6 +8,7 @@ import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
import info.nightscout.androidaps.dana.DanaPump
import info.nightscout.androidaps.dana.R
+import info.nightscout.androidaps.dana.databinding.DanarUserOptionsActivityBinding
import info.nightscout.androidaps.events.EventInitializationChanged
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.interfaces.CommandQueueProvider
@@ -21,7 +22,6 @@ import info.nightscout.androidaps.utils.extensions.plusAssign
import info.nightscout.androidaps.utils.resources.ResourceHelper
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
-import kotlinx.android.synthetic.main.danar_user_options_activity.*
import java.text.DecimalFormat
import javax.inject.Inject
import kotlin.math.max
@@ -47,6 +47,8 @@ class DanaUserOptionsActivity : NoSplashAppCompatActivity() {
var minBacklight = 1
+ private lateinit var binding: DanarUserOptionsActivityBinding
+
@Synchronized
override fun onResume() {
super.onResume()
@@ -64,9 +66,10 @@ class DanaUserOptionsActivity : NoSplashAppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.danar_user_options_activity)
+ binding = DanarUserOptionsActivityBinding.inflate(layoutInflater)
+ setContentView(binding.root)
- save_user_options.setOnClickListener { onSaveClick() }
+ binding.saveUserOptions.setOnClickListener { onSaveClick() }
minBacklight = if (danaPump.hwModel < 7) 1 else 0 // Dana-i allows zero
@@ -80,28 +83,28 @@ class DanaUserOptionsActivity : NoSplashAppCompatActivity() {
+ "\npumpUnits:" + danaPump.units
+ "\nlowReservoir:" + danaPump.lowReservoirRate)
- danar_screentimeout.setParams(danaPump.lcdOnTimeSec.toDouble(), 5.0, 240.0, 5.0, DecimalFormat("1"), false, save_user_options)
- danar_backlight.setParams(danaPump.backlightOnTimeSec.toDouble(), minBacklight.toDouble(), 60.0, 1.0, DecimalFormat("1"), false, save_user_options)
- danar_shutdown.setParams(danaPump.shutdownHour.toDouble(), 0.0, 24.0, 1.0, DecimalFormat("1"), true, save_user_options)
- danar_lowreservoir.setParams(danaPump.lowReservoirRate.toDouble(), 10.0, 50.0, 10.0, DecimalFormat("10"), false, save_user_options)
+ binding.screentimeout.setParams(danaPump.lcdOnTimeSec.toDouble(), 5.0, 240.0, 5.0, DecimalFormat("1"), false, binding.saveUserOptions)
+ binding.backlight.setParams(danaPump.backlightOnTimeSec.toDouble(), minBacklight.toDouble(), 60.0, 1.0, DecimalFormat("1"), false, binding.saveUserOptions)
+ binding.shutdown.setParams(danaPump.shutdownHour.toDouble(), 0.0, 24.0, 1.0, DecimalFormat("1"), true, binding.saveUserOptions)
+ binding.lowreservoir.setParams(danaPump.lowReservoirRate.toDouble(), 10.0, 50.0, 10.0, DecimalFormat("10"), false, binding.saveUserOptions)
when (danaPump.beepAndAlarm) {
- 0b01 -> danar_pumpalarm_sound.isChecked = true
- 0b10 -> danar_pumpalarm_vibrate.isChecked = true
- 0b11 -> danar_pumpalarm_both.isChecked = true
+ 0b01 -> binding.pumpalarmSound.isChecked = true
+ 0b10 -> binding.pumpalarmVibrate.isChecked = true
+ 0b11 -> binding.pumpalarmBoth.isChecked = true
0b101 -> {
- danar_pumpalarm_sound.isChecked = true
- danar_beep.isChecked = true
+ binding.pumpalarmSound.isChecked = true
+ binding.beep.isChecked = true
}
0b110 -> {
- danar_pumpalarm_vibrate.isChecked = true
- danar_beep.isChecked = true
+ binding.pumpalarmVibrate.isChecked = true
+ binding.beep.isChecked = true
}
0b111 -> {
- danar_pumpalarm_both.isChecked = true
- danar_beep.isChecked = true
+ binding.pumpalarmBoth.isChecked = true
+ binding.beep.isChecked = true
}
}
if (danaPump.lastSettingsRead == 0L && danaPump.hwModel < 0x05) // RS+ doesn't use lastSettingsRead
@@ -112,42 +115,42 @@ class DanaUserOptionsActivity : NoSplashAppCompatActivity() {
fun setData() {
// in DanaRS timeDisplay values are reversed
- danar_timeformat.isChecked = danaPump.timeDisplayType24
- danar_buttonscroll.isChecked = danaPump.buttonScrollOnOff
- danar_beep.isChecked = danaPump.beepAndAlarm > 4
- danar_screentimeout.value = danaPump.lcdOnTimeSec.toDouble()
- danar_backlight.value = danaPump.backlightOnTimeSec.toDouble()
- danar_units.isChecked = danaPump.getUnits() == Constants.MMOL
- danar_shutdown.value = danaPump.shutdownHour.toDouble()
- danar_lowreservoir.value = danaPump.lowReservoirRate.toDouble()
+ binding.timeformat.isChecked = danaPump.timeDisplayType24
+ binding.buttonscroll.isChecked = danaPump.buttonScrollOnOff
+ binding.beep.isChecked = danaPump.beepAndAlarm > 4
+ binding.screentimeout.value = danaPump.lcdOnTimeSec.toDouble()
+ binding.backlight.value = danaPump.backlightOnTimeSec.toDouble()
+ binding.units.isChecked = danaPump.getUnits() == Constants.MMOL
+ binding.shutdown.value = danaPump.shutdownHour.toDouble()
+ binding.lowreservoir.value = danaPump.lowReservoirRate.toDouble()
}
private fun onSaveClick() {
//exit if pump is not DanaRS, DanaR, or DanaR with upgraded firmware
if (!isRS() && !isDanaR() && !isDanaRv2()) return
- danaPump.timeDisplayType24 = danar_timeformat.isChecked
+ danaPump.timeDisplayType24 = binding.timeformat.isChecked
- danaPump.buttonScrollOnOff = danar_buttonscroll.isChecked
+ danaPump.buttonScrollOnOff = binding.buttonscroll.isChecked
danaPump.beepAndAlarm = when {
- danar_pumpalarm_sound.isChecked -> 1
- danar_pumpalarm_vibrate.isChecked -> 2
- danar_pumpalarm_both.isChecked -> 3
- else -> 1
+ binding.pumpalarmSound.isChecked -> 1
+ binding.pumpalarmVibrate.isChecked -> 2
+ binding.pumpalarmBoth.isChecked -> 3
+ else -> 1
}
- if (danar_beep.isChecked) danaPump.beepAndAlarm += 4
+ if (binding.beep.isChecked) danaPump.beepAndAlarm += 4
// step is 5 seconds, 5 to 240
- danaPump.lcdOnTimeSec = min(max(danar_screentimeout.value.toInt() / 5 * 5, 5), 240)
+ danaPump.lcdOnTimeSec = min(max(binding.screentimeout.value.toInt() / 5 * 5, 5), 240)
// 1 to 60
- danaPump.backlightOnTimeSec = min(max(danar_backlight.value.toInt(), minBacklight), 60)
+ danaPump.backlightOnTimeSec = min(max(binding.backlight.value.toInt(), minBacklight), 60)
- danaPump.units = if (danar_units.isChecked) 1 else 0
+ danaPump.units = if (binding.units.isChecked) 1 else 0
- danaPump.shutdownHour = min(danar_shutdown.value.toInt(), 24)
+ danaPump.shutdownHour = min(binding.shutdown.value.toInt(), 24)
// 10 to 50
- danaPump.lowReservoirRate = min(max(danar_lowreservoir.value.toInt() * 10 / 10, 10), 50)
+ danaPump.lowReservoirRate = min(max(binding.lowreservoir.value.toInt() * 10 / 10, 10), 50)
commandQueue.setUserOptions(object : Callback() {
override fun run() {
diff --git a/dana/src/main/res/drawable/ic_dana_rs.xml b/dana/src/main/res/drawable/ic_dana_rs.xml
new file mode 100644
index 0000000000..6043c4e19c
--- /dev/null
+++ b/dana/src/main/res/drawable/ic_dana_rs.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dana/src/main/res/layout/danar_fragment.xml b/dana/src/main/res/layout/danar_fragment.xml
index 3eff537255..cc149b797c 100644
--- a/dana/src/main/res/layout/danar_fragment.xml
+++ b/dana/src/main/res/layout/danar_fragment.xml
@@ -13,7 +13,7 @@
+
+
+ android:layout_above="@id/reload"
+ android:layout_below="@+id/status" />
diff --git a/dana/src/main/res/values/strings.xml b/dana/src/main/res/values/strings.xml
index d086aab28f..c6ec142c94 100644
--- a/dana/src/main/res/values/strings.xml
+++ b/dana/src/main/res/values/strings.xml
@@ -11,6 +11,7 @@
danars_v3_randomsync_key_rs_logcanulachangers_loginsulinchange
+ rs_last_clear_key_requestdanar_bt_namePairing
diff --git a/danar/build.gradle b/danar/build.gradle
index 349db5dbad..cc8e1bce41 100644
--- a/danar/build.gradle
+++ b/danar/build.gradle
@@ -1,6 +1,5 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
@@ -19,7 +18,9 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
-
+ buildFeatures {
+ viewBinding true
+ }
buildTypes {
release {
minifyEnabled false
@@ -45,32 +46,13 @@ dependencies {
implementation project(':dana')
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation "androidx.core:core-ktx:${coreVersion}"
- implementation "androidx.preference:preference-ktx:1.1.1"
- implementation "androidx.activity:activity-ktx:${activityVersion}"
-
- // Graphview cannot be upgraded
- implementation "com.jjoe64:graphview:4.0.1"
-
- implementation 'net.danlew:android.joda:2.10.6'
-
- implementation "com.google.dagger:dagger-android:$dagger_version"
- implementation "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
- //RxBus
- implementation "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
-
- testImplementation 'junit:junit:4.13'
- androidTestImplementation 'androidx.test.ext:junit:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ testImplementation "junit:junit:$junit_version"
+ androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
+ androidTestImplementation "androidx.test:rules:$androidx_rules"
}
diff --git a/danar/src/main/java/info/nightscout/androidaps/danaRKorean/DanaRKoreanPlugin.java b/danar/src/main/java/info/nightscout/androidaps/danaRKorean/DanaRKoreanPlugin.java
index acb5bf5783..9439694815 100644
--- a/danar/src/main/java/info/nightscout/androidaps/danaRKorean/DanaRKoreanPlugin.java
+++ b/danar/src/main/java/info/nightscout/androidaps/danaRKorean/DanaRKoreanPlugin.java
@@ -43,7 +43,7 @@ import io.reactivex.schedulers.Schedulers;
@Singleton
public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
- private CompositeDisposable disposable = new CompositeDisposable();
+ private final CompositeDisposable disposable = new CompositeDisposable();
private final AAPSLogger aapsLogger;
private final Context context;
@@ -111,7 +111,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
super.onStop();
}
- private ServiceConnection mConnection = new ServiceConnection() {
+ private final ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
aapsLogger.debug(LTag.PUMP, "Service is disconnected");
diff --git a/danar/src/main/java/info/nightscout/androidaps/danaRv2/DanaRv2Plugin.java b/danar/src/main/java/info/nightscout/androidaps/danaRv2/DanaRv2Plugin.java
index 3dc9473a18..30da4bd9d8 100644
--- a/danar/src/main/java/info/nightscout/androidaps/danaRv2/DanaRv2Plugin.java
+++ b/danar/src/main/java/info/nightscout/androidaps/danaRv2/DanaRv2Plugin.java
@@ -42,7 +42,7 @@ import io.reactivex.schedulers.Schedulers;
@Singleton
public class DanaRv2Plugin extends AbstractDanaRPlugin {
- private CompositeDisposable disposable = new CompositeDisposable();
+ private final CompositeDisposable disposable = new CompositeDisposable();
private final AAPSLogger aapsLogger;
private final Context context;
@@ -104,7 +104,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
super.onStop();
}
- private ServiceConnection mConnection = new ServiceConnection() {
+ private final ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
aapsLogger.debug(LTag.PUMP, "Service is disconnected");
diff --git a/danar/src/main/java/info/nightscout/androidaps/danar/AbstractDanaRPlugin.java b/danar/src/main/java/info/nightscout/androidaps/danar/AbstractDanaRPlugin.java
index f048c101ff..3b9e98cbe8 100644
--- a/danar/src/main/java/info/nightscout/androidaps/danar/AbstractDanaRPlugin.java
+++ b/danar/src/main/java/info/nightscout/androidaps/danar/AbstractDanaRPlugin.java
@@ -1,6 +1,7 @@
package info.nightscout.androidaps.danar;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import org.json.JSONException;
import org.json.JSONObject;
@@ -9,9 +10,9 @@ import java.util.Date;
import java.util.List;
import dagger.android.HasAndroidInjector;
-import info.nightscout.androidaps.dana.DanaPumpInterface;
import info.nightscout.androidaps.dana.DanaFragment;
import info.nightscout.androidaps.dana.DanaPump;
+import info.nightscout.androidaps.dana.DanaPumpInterface;
import info.nightscout.androidaps.dana.comm.RecordTypes;
import info.nightscout.androidaps.danar.services.AbstractDanaRExecutionService;
import info.nightscout.androidaps.data.Profile;
@@ -37,6 +38,7 @@ import info.nightscout.androidaps.plugins.common.ManufacturerType;
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction;
import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType;
+import info.nightscout.androidaps.queue.commands.CustomCommand;
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
@@ -83,6 +85,7 @@ public abstract class AbstractDanaRPlugin extends PumpPluginBase implements Pump
super(new PluginDescription()
.mainType(PluginType.PUMP)
.fragmentClass(DanaFragment.class.getName())
+ .pluginIcon(R.drawable.ic_dana_rs)
.pluginName(R.string.danarspump)
.shortName(R.string.danarpump_shortname)
.preferencesId(R.xml.pref_danar)
@@ -511,7 +514,10 @@ public abstract class AbstractDanaRPlugin extends PumpPluginBase implements Pump
@Override
public void executeCustomAction(CustomActionType customActionType) {
+ }
+ @Nullable @Override public PumpEnactResult executeCustomCommand(CustomCommand customCommand) {
+ return null;
}
@Override
diff --git a/danar/src/main/java/info/nightscout/androidaps/danar/DanaRPlugin.java b/danar/src/main/java/info/nightscout/androidaps/danar/DanaRPlugin.java
index 8c9c449b17..6e145737cb 100644
--- a/danar/src/main/java/info/nightscout/androidaps/danar/DanaRPlugin.java
+++ b/danar/src/main/java/info/nightscout/androidaps/danar/DanaRPlugin.java
@@ -41,7 +41,7 @@ import io.reactivex.schedulers.Schedulers;
@Singleton
public class DanaRPlugin extends AbstractDanaRPlugin {
- private CompositeDisposable disposable = new CompositeDisposable();
+ private final CompositeDisposable disposable = new CompositeDisposable();
private final AAPSLogger aapsLogger;
private final Context context;
@@ -109,7 +109,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
super.onStop();
}
- private ServiceConnection mConnection = new ServiceConnection() {
+ private final ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
aapsLogger.debug(LTag.PUMP, "Service is disconnected");
diff --git a/danar/src/main/java/info/nightscout/androidaps/danar/SerialIOThread.java b/danar/src/main/java/info/nightscout/androidaps/danar/SerialIOThread.java
index 18ab01053f..8dd466b0bd 100644
--- a/danar/src/main/java/info/nightscout/androidaps/danar/SerialIOThread.java
+++ b/danar/src/main/java/info/nightscout/androidaps/danar/SerialIOThread.java
@@ -18,18 +18,18 @@ import info.nightscout.androidaps.utils.CRC;
* Created by mike on 17.07.2016.
*/
public class SerialIOThread extends Thread {
- private AAPSLogger aapsLogger;
+ private final AAPSLogger aapsLogger;
private InputStream mInputStream = null;
private OutputStream mOutputStream = null;
- private BluetoothSocket mRfCommSocket;
+ private final BluetoothSocket mRfCommSocket;
private boolean mKeepRunning = true;
private byte[] mReadBuff = new byte[0];
private MessageBase processedMessage;
- private MessageHashTableBase hashTable;
- private DanaPump danaPump;
+ private final MessageHashTableBase hashTable;
+ private final DanaPump danaPump;
public SerialIOThread(AAPSLogger aapsLogger, BluetoothSocket rfcommSocket, MessageHashTableBase hashTable, DanaPump danaPump) {
super();
diff --git a/danar/src/main/java/info/nightscout/androidaps/danar/comm/MsgSettingPumpTime.kt b/danar/src/main/java/info/nightscout/androidaps/danar/comm/MsgSettingPumpTime.kt
index d8d216c16e..5e758b0479 100644
--- a/danar/src/main/java/info/nightscout/androidaps/danar/comm/MsgSettingPumpTime.kt
+++ b/danar/src/main/java/info/nightscout/androidaps/danar/comm/MsgSettingPumpTime.kt
@@ -28,6 +28,7 @@ class MsgSettingPumpTime(
}
override fun handleMessageNotReceived() {
+ super.handleMessageNotReceived()
danaPump.resetPumpTime()
}
}
\ No newline at end of file
diff --git a/danar/src/main/java/info/nightscout/androidaps/danar/services/AbstractDanaRExecutionService.java b/danar/src/main/java/info/nightscout/androidaps/danar/services/AbstractDanaRExecutionService.java
index 2fc6d2500f..d5b17e7800 100644
--- a/danar/src/main/java/info/nightscout/androidaps/danar/services/AbstractDanaRExecutionService.java
+++ b/danar/src/main/java/info/nightscout/androidaps/danar/services/AbstractDanaRExecutionService.java
@@ -67,7 +67,7 @@ public abstract class AbstractDanaRExecutionService extends DaggerService {
@Inject DateUtil dateUtil;
@Inject DatabaseHelperInterface databaseHelper;
- private CompositeDisposable disposable = new CompositeDisposable();
+ private final CompositeDisposable disposable = new CompositeDisposable();
protected String mDevName;
diff --git a/danar/src/main/res/xml/pref_danar.xml b/danar/src/main/res/xml/pref_danar.xml
index 64246a6544..27efaac878 100644
--- a/danar/src/main/res/xml/pref_danar.xml
+++ b/danar/src/main/res/xml/pref_danar.xml
@@ -38,23 +38,6 @@
android:key="@string/key_danar_visualizeextendedaspercentage"
android:title="@string/danar_visualizeextendedaspercentage_title" />
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/danar/src/main/res/xml/pref_danarkorean.xml b/danar/src/main/res/xml/pref_danarkorean.xml
index c4de35face..5e46cdae54 100644
--- a/danar/src/main/res/xml/pref_danarkorean.xml
+++ b/danar/src/main/res/xml/pref_danarkorean.xml
@@ -31,22 +31,6 @@
android:key="@string/key_danar_visualizeextendedaspercentage"
android:title="@string/danar_visualizeextendedaspercentage_title" />
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/danar/src/main/res/xml/pref_danarv2.xml b/danar/src/main/res/xml/pref_danarv2.xml
index d31b25f699..d0d36999a5 100644
--- a/danar/src/main/res/xml/pref_danarv2.xml
+++ b/danar/src/main/res/xml/pref_danarv2.xml
@@ -27,22 +27,6 @@
android:key="@string/key_danars_bolusspeed"
android:title="@string/bolusspeed" />
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/danars/build.gradle b/danars/build.gradle
index e27dc5df75..8b407ce390 100644
--- a/danars/build.gradle
+++ b/danars/build.gradle
@@ -1,6 +1,5 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
@@ -19,7 +18,9 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
-
+ buildFeatures {
+ viewBinding true
+ }
buildTypes {
release {
minifyEnabled false
@@ -44,33 +45,16 @@ dependencies {
implementation project(':dana')
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation "androidx.core:core-ktx:${coreVersion}"
- implementation "androidx.preference:preference-ktx:1.1.1"
- implementation "androidx.activity:activity-ktx:${activityVersion}"
+ implementation "androidx.core:core-ktx:$coreVersion"
- // Graphview cannot be upgraded
- implementation "com.jjoe64:graphview:4.0.1"
-
- implementation 'net.danlew:android.joda:2.10.6'
-
- implementation "com.google.dagger:dagger-android:$dagger_version"
- implementation "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
- //RxBus
- implementation "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
-
- testImplementation 'junit:junit:4.13'
- androidTestImplementation 'androidx.test.ext:junit:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ testImplementation "junit:junit:$junit_version"
+ androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
+ androidTestImplementation "androidx.test:rules:$androidx_rules"
}
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt b/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt
index 291f2d3b9b..7d4cf7c21c 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt
@@ -26,6 +26,7 @@ import info.nightscout.androidaps.plugins.common.ManufacturerType
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction
import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType
+import info.nightscout.androidaps.queue.commands.CustomCommand
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification
@@ -62,6 +63,7 @@ class DanaRSPlugin @Inject constructor(
) : PumpPluginBase(PluginDescription()
.mainType(PluginType.PUMP)
.fragmentClass(info.nightscout.androidaps.dana.DanaFragment::class.java.name)
+ .pluginIcon(R.drawable.ic_dana_rs)
.pluginName(R.string.danarspump)
.shortName(R.string.danarspump_shortname)
.preferencesId(R.xml.pref_danars)
@@ -209,7 +211,7 @@ class DanaRSPlugin @Inject constructor(
}
override fun isSuspended(): Boolean {
- return danaPump.pumpSuspended
+ return danaPump.pumpSuspended || danaPump.errorState != DanaPump.ErrorState.NONE
}
override fun isBusy(): Boolean {
@@ -658,6 +660,7 @@ class DanaRSPlugin @Inject constructor(
override fun loadTDDs(): PumpEnactResult = loadHistory(info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_DAILY)
override fun getCustomActions(): List? = null
override fun executeCustomAction(customActionType: CustomActionType) {}
+ override fun executeCustomCommand(customCommand: CustomCommand?): PumpEnactResult? = null
override fun canHandleDST(): Boolean = false
override fun timezoneOrDSTChanged(timeChangeType: TimeChangeType?) {}
override fun clearPairing() {
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/activities/BLEScanActivity.kt b/danars/src/main/java/info/nightscout/androidaps/danars/activities/BLEScanActivity.kt
index f49ee80376..0ed1dbc90a 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/activities/BLEScanActivity.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/activities/BLEScanActivity.kt
@@ -15,11 +15,11 @@ import android.widget.BaseAdapter
import android.widget.TextView
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
import info.nightscout.androidaps.danars.R
+import info.nightscout.androidaps.danars.databinding.DanarsBlescannerActivityBinding
+import info.nightscout.androidaps.danars.events.EventDanaRSDeviceChange
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.pump.common.ble.BlePreCheck
-import info.nightscout.androidaps.danars.events.EventDanaRSDeviceChange
import info.nightscout.androidaps.utils.sharedPreferences.SP
-import kotlinx.android.synthetic.main.danars_blescanner_activity.*
import java.util.*
import java.util.regex.Pattern
import javax.inject.Inject
@@ -34,17 +34,20 @@ class BLEScanActivity : NoSplashAppCompatActivity() {
private val devices = ArrayList()
private var bluetoothLeScanner: BluetoothLeScanner? = null
+ private lateinit var binding: DanarsBlescannerActivityBinding
+
@SuppressLint("SourceLockedOrientationActivity")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.danars_blescanner_activity)
+ binding = DanarsBlescannerActivityBinding.inflate(layoutInflater)
+ setContentView(binding.root)
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
blePreCheck.prerequisitesCheck(this)
listAdapter = ListAdapter()
- danars_blescanner_listview.emptyView = findViewById(R.id.danars_blescanner_nodevice)
- danars_blescanner_listview.adapter = listAdapter
+ binding.blescannerListview.emptyView = binding.blescannerNodevice
+ binding.blescannerListview.adapter = listAdapter
listAdapter?.notifyDataSetChanged()
}
@@ -63,13 +66,17 @@ class BLEScanActivity : NoSplashAppCompatActivity() {
stopScan()
}
- private fun startScan() {
- if (bluetoothLeScanner != null) bluetoothLeScanner!!.startScan(mBleScanCallback)
- }
+ private fun startScan() =
+ try {
+ bluetoothLeScanner?.startScan(mBleScanCallback)
+ } catch (e: IllegalStateException) {
+ } // ignore BT not on
- private fun stopScan() {
- if (bluetoothLeScanner != null) bluetoothLeScanner!!.stopScan(mBleScanCallback)
- }
+ private fun stopScan() =
+ try {
+ bluetoothLeScanner?.stopScan(mBleScanCallback)
+ } catch (e: IllegalStateException) {
+ } // ignore BT not on
private fun addBleDevice(device: BluetoothDevice?) {
if (device == null || device.name == null || device.name == "") {
@@ -90,6 +97,7 @@ class BLEScanActivity : NoSplashAppCompatActivity() {
}
internal inner class ListAdapter : BaseAdapter() {
+
override fun getCount(): Int = devices.size
override fun getItem(i: Int): BluetoothDeviceItem = devices[i]
override fun getItemId(i: Int): Long = 0
@@ -110,7 +118,8 @@ class BLEScanActivity : NoSplashAppCompatActivity() {
return v!!
}
- private inner class ViewHolder internal constructor(v: View) : View.OnClickListener {
+ private inner class ViewHolder(v: View) : View.OnClickListener {
+
private lateinit var item: BluetoothDeviceItem
private val name: TextView = v.findViewById(R.id.ble_name)
private val address: TextView = v.findViewById(R.id.ble_address)
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/activities/EnterPinActivity.kt b/danars/src/main/java/info/nightscout/androidaps/danars/activities/EnterPinActivity.kt
index ac97ce50a3..5efdfbd757 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/activities/EnterPinActivity.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/activities/EnterPinActivity.kt
@@ -3,11 +3,12 @@ package info.nightscout.androidaps.danars.activities
import android.os.Bundle
import android.util.Base64
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
+import info.nightscout.androidaps.danars.DanaRSPlugin
import info.nightscout.androidaps.danars.R
+import info.nightscout.androidaps.danars.databinding.DanarsEnterPinActivityBinding
+import info.nightscout.androidaps.danars.services.BLEComm
import info.nightscout.androidaps.events.EventPumpStatusChanged
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
-import info.nightscout.androidaps.danars.DanaRSPlugin
-import info.nightscout.androidaps.danars.services.BLEComm
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.extensions.hexStringToByteArray
@@ -17,8 +18,6 @@ import info.nightscout.androidaps.utils.textValidator.DefaultEditTextValidator
import info.nightscout.androidaps.utils.textValidator.EditTextValidator
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
-import kotlinx.android.synthetic.main.danars_enter_pin_activity.*
-import kotlinx.android.synthetic.main.okcancel.*
import javax.inject.Inject
import kotlin.experimental.xor
@@ -33,25 +32,28 @@ class EnterPinActivity : NoSplashAppCompatActivity() {
private val disposable = CompositeDisposable()
+ private lateinit var binding: DanarsEnterPinActivityBinding
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.danars_enter_pin_activity)
+ binding = DanarsEnterPinActivityBinding.inflate(layoutInflater)
+ setContentView(binding.root)
- val p1 = DefaultEditTextValidator(rs_v3_pin1, this)
+ val p1 = DefaultEditTextValidator(binding.rsV3Pin1, this)
.setTestErrorString(resourceHelper.gs(R.string.error_mustbe12hexadidits), this)
.setCustomRegexp(resourceHelper.gs(R.string.twelvehexanumber), this)
.setTestType(EditTextValidator.TEST_REGEXP, this)
- val p2 = DefaultEditTextValidator(rs_v3_pin2, this)
+ val p2 = DefaultEditTextValidator(binding.rsV3Pin2, this)
.setTestErrorString(resourceHelper.gs(R.string.error_mustbe8hexadidits), this)
.setCustomRegexp(resourceHelper.gs(R.string.eighthexanumber), this)
.setTestType(EditTextValidator.TEST_REGEXP, this)
- ok.setOnClickListener {
+ binding.okcancel.ok.setOnClickListener {
if (p1.testValidity(false) && p2.testValidity(false)) {
val result = checkPairingCheckSum(
- rs_v3_pin1.text.toString().hexStringToByteArray(),
- rs_v3_pin2.text.toString().substring(0..5).hexStringToByteArray(),
- rs_v3_pin2.text.toString().substring(6..7).hexStringToByteArray())
+ binding.rsV3Pin1.text.toString().hexStringToByteArray(),
+ binding.rsV3Pin2.text.toString().substring(0..5).hexStringToByteArray(),
+ binding.rsV3Pin2.text.toString().substring(6..7).hexStringToByteArray())
if (result) {
bleComm.finishV3Pairing()
finish()
@@ -59,7 +61,7 @@ class EnterPinActivity : NoSplashAppCompatActivity() {
else OKDialog.show(this, resourceHelper.gs(R.string.error), resourceHelper.gs(R.string.invalidinput))
}
}
- cancel.setOnClickListener { finish() }
+ binding.okcancel.cancel.setOnClickListener { finish() }
}
override fun onResume() {
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/activities/PairingHelperActivity.kt b/danars/src/main/java/info/nightscout/androidaps/danars/activities/PairingHelperActivity.kt
index c7f5efc3a5..622229310d 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/activities/PairingHelperActivity.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/activities/PairingHelperActivity.kt
@@ -16,7 +16,7 @@ class PairingHelperActivity : NoSplashAppCompatActivity() {
dialog = PairingProgressDialog()
.setHelperActivity(this)
dialog?.show(supportFragmentManager, "PairingProgress")
- requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
+ requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
override fun onDestroy() {
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet.java b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet.java
index 87ff77d0e6..ff99f0d891 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet.java
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet.java
@@ -38,6 +38,9 @@ public class DanaRS_Packet {
injector.androidInjector().inject(this);
}
+ public boolean success() {
+ return !failed;
+ }
public void setReceived() {
received = true;
}
@@ -74,6 +77,7 @@ public class DanaRS_Packet {
}
public void handleMessageNotReceived() {
+ failed = true;
}
public String getFriendlyName() {
@@ -194,7 +198,7 @@ public class DanaRS_Packet {
@TargetApi(Build.VERSION_CODES.KITKAT)
- public String asciiStringFromBuff(byte[] buff, int offset, int length) {
+ public static String asciiStringFromBuff(byte[] buff, int offset, int length) {
byte[] strbuff = new byte[length];
System.arraycopy(buff, offset, strbuff, 0, length);
return new String(strbuff, StandardCharsets.UTF_8);
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_APS_History_Events.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_APS_History_Events.kt
index 6c351210be..c8c6b94b48 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_APS_History_Events.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_APS_History_Events.kt
@@ -180,8 +180,6 @@ open class DanaRS_Packet_APS_History_Events(
DanaPump.PRIME -> {
aapsLogger.debug(LTag.PUMPCOMM, "[" + id + "] " + "EVENT PRIME (" + recordCode + ") " + dateUtil.dateAndTimeString(datetime) + " (" + datetime + ")" + " Amount: " + param1 / 100.0 + "U")
- if (sp.getBoolean(R.string.key_rs_logcanulachange, true))
- nsUpload.generateCareportalEvent(CareportalEvent.SITECHANGE, datetime, resourceHelper.gs(R.string.danarspump))
status = "PRIME " + dateUtil.timeString(datetime)
}
@@ -203,6 +201,8 @@ open class DanaRS_Packet_APS_History_Events(
DanaPump.PRIMECANNULA -> {
aapsLogger.debug(LTag.PUMPCOMM, "[" + id + "] " + "EVENT PRIMECANNULA(" + recordCode + ") " + dateUtil.dateAndTimeString(datetime) + " (" + datetime + ")" + " Amount: " + param1 / 100.0 + "U")
+ if (sp.getBoolean(R.string.key_rs_logcanulachange, true))
+ nsUpload.generateCareportalEvent(CareportalEvent.SITECHANGE, datetime, resourceHelper.gs(R.string.danarspump))
status = "PRIMECANNULA " + dateUtil.timeString(datetime)
}
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Get_24_CIR_CF_Array.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Get_24_CIR_CF_Array.kt
index 5f8be76b2e..1d9b752cf9 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Get_24_CIR_CF_Array.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Get_24_CIR_CF_Array.kt
@@ -20,8 +20,8 @@ class DanaRS_Packet_Bolus_Get_24_CIR_CF_Array(
override fun handleMessage(data: ByteArray) {
danaPump.units = byteArrayToInt(getBytes(data, DATA_START, 1))
for (i in 0 .. 23) {
- val cf = byteArrayToInt(getBytes(data, DATA_START + 1 + 2 * i, 2)).toDouble()
- val cir = if (danaPump.units == DanaPump.UNITS_MGDL)
+ val cir = byteArrayToInt(getBytes(data, DATA_START + 1 + 2 * i, 2)).toDouble()
+ val cf = if (danaPump.units == DanaPump.UNITS_MGDL)
byteArrayToInt(getBytes(data, DATA_START + 1 + 48 + 2 * i, 2)).toDouble()
else
byteArrayToInt(getBytes(data, DATA_START + 1 + 48 + 2 * i, 2)) / 100.0
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Set_24_CIR_CF_Array.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Set_24_CIR_CF_Array.kt
index 7a0e925ab6..ab0ee772bf 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Set_24_CIR_CF_Array.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Set_24_CIR_CF_Array.kt
@@ -1,11 +1,13 @@
package info.nightscout.androidaps.danars.comm
import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.dana.DanaPump
import info.nightscout.androidaps.danars.encryption.BleEncryption
import info.nightscout.androidaps.data.Profile
import info.nightscout.androidaps.logging.LTag
import javax.inject.Inject
+import kotlin.math.round
class DanaRS_Packet_Bolus_Set_24_CIR_CF_Array(
injector: HasAndroidInjector,
@@ -25,12 +27,15 @@ class DanaRS_Packet_Bolus_Set_24_CIR_CF_Array(
val cfStart = 24 * 2
for (i in 0..23) {
var isf = profile.getIsfMgdlTimeFromMidnight(i * 3600)
- if (danaPump.units == DanaPump.UNITS_MMOL) isf *= 10
- val ic = profile.getIcTimeFromMidnight(i * 3600) * 100
- request[2 * i] = (isf.toInt() and 0xff).toByte()
- request[2 * i] = (isf.toInt() ushr 8 and 0xff).toByte()
- request[cfStart + 2 * i] = (ic.toInt() and 0xff).toByte()
- request[cfStart + 2 * i] = (ic.toInt() ushr 8 and 0xff).toByte()
+ if (danaPump.units == DanaPump.UNITS_MMOL) {
+ isf = Profile.fromMgdlToUnits(isf, Constants.MMOL)
+ isf *= 100
+ }
+ val ic = profile.getIcTimeFromMidnight(i * 3600)
+ request[2 * i] = (round(ic).toInt() and 0xff).toByte()
+ request[2 * i + 1] = (round(ic).toInt() ushr 8 and 0xff).toByte()
+ request[cfStart + 2 * i] = (round(isf).toInt() and 0xff).toByte()
+ request[cfStart + 2 * i + 1] = (round(isf).toInt() ushr 8 and 0xff).toByte()
}
return request
}
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_General_Initial_Screen_Information.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_General_Initial_Screen_Information.kt
index e077e30fe9..8eeb017ebb 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_General_Initial_Screen_Information.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_General_Initial_Screen_Information.kt
@@ -57,8 +57,8 @@ class DanaRS_Packet_General_Initial_Screen_Information(
//protocol 10+
dataIndex += dataSize
dataSize = 1
- danaPump.errorState = info.nightscout.androidaps.dana.DanaPump.ErrorState[byteArrayToInt(getBytes(data, dataIndex, dataSize))]
- ?: info.nightscout.androidaps.dana.DanaPump.ErrorState.NONE
+ danaPump.errorState = DanaPump.ErrorState[byteArrayToInt(getBytes(data, dataIndex, dataSize))]
+ ?: DanaPump.ErrorState.NONE
aapsLogger.debug(LTag.PUMPCOMM, "ErrorState: " + danaPump.errorState.name)
}
aapsLogger.debug(LTag.PUMPCOMM, "Pump suspended: " + danaPump.pumpSuspended)
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Notify_Missed_Bolus_Alarm.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Notify_Missed_Bolus_Alarm.kt
index 8e5fcdfeaf..1fea0135ab 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Notify_Missed_Bolus_Alarm.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Notify_Missed_Bolus_Alarm.kt
@@ -31,8 +31,7 @@ class DanaRS_Packet_Notify_Missed_Bolus_Alarm(
dataIndex += dataSize
dataSize = 1
endMin = byteArrayToInt(getBytes(data, dataIndex, dataSize))
- if (endMin == 1 && endMin == endHour && startHour == endHour && startHour == startMin) failed = true
- else failed = false
+ failed = endMin == 1 && endMin == endHour && startHour == endHour && startHour == startMin
aapsLogger.debug(LTag.PUMPCOMM, "Start hour: $startHour")
aapsLogger.debug(LTag.PUMPCOMM, "Start min: $startMin")
aapsLogger.debug(LTag.PUMPCOMM, "End hour: $endHour")
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_Pump_Time.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_Pump_Time.kt
index 11659879e3..ded5b89540 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_Pump_Time.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_Pump_Time.kt
@@ -31,6 +31,7 @@ class DanaRS_Packet_Option_Get_Pump_Time(
}
override fun handleMessageNotReceived() {
+ super.handleMessageNotReceived()
danaPump.resetPumpTime()
}
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_Pump_UTC_And_TimeZone.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_Pump_UTC_And_TimeZone.kt
index 9f35fcb82c..61040521ea 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_Pump_UTC_And_TimeZone.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_Pump_UTC_And_TimeZone.kt
@@ -32,6 +32,7 @@ class DanaRS_Packet_Option_Get_Pump_UTC_And_TimeZone(
}
override fun handleMessageNotReceived() {
+ super.handleMessageNotReceived()
danaPump.resetPumpTime()
}
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_User_Option.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_User_Option.kt
index f0232854f7..d96da176ec 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_User_Option.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Option_Get_User_Option.kt
@@ -67,7 +67,7 @@ class DanaRS_Packet_Option_Get_User_Option(
dataSize = 1
val selectableLanguage5 = byteArrayToInt(getBytes(data, dataIndex, dataSize))
// Pump's screen on time can't be less than 5
- failed = if (danaPump.lcdOnTimeSec < 5) true else false
+ failed = danaPump.lcdOnTimeSec < 5
aapsLogger.debug(LTag.PUMPCOMM, "timeDisplayType24: " + danaPump.timeDisplayType24)
aapsLogger.debug(LTag.PUMPCOMM, "buttonScrollOnOff: " + danaPump.buttonScrollOnOff)
aapsLogger.debug(LTag.PUMPCOMM, "beepAndAlarm: " + danaPump.beepAndAlarm)
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/dialogs/PairingProgressDialog.java b/danars/src/main/java/info/nightscout/androidaps/danars/dialogs/PairingProgressDialog.java
index 49dc7c8f07..6ce96d2845 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/dialogs/PairingProgressDialog.java
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/dialogs/PairingProgressDialog.java
@@ -1,7 +1,6 @@
package info.nightscout.androidaps.danars.dialogs;
-import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
@@ -10,14 +9,14 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
-import android.widget.Button;
-import android.widget.ProgressBar;
-import android.widget.TextView;
+
+import androidx.fragment.app.FragmentActivity;
import javax.inject.Inject;
import dagger.android.support.DaggerDialogFragment;
import info.nightscout.androidaps.danars.R;
+import info.nightscout.androidaps.danars.databinding.DanarsPairingProgressDialogBinding;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.danars.activities.PairingHelperActivity;
import info.nightscout.androidaps.danars.events.EventDanaRSPairingSuccess;
@@ -33,11 +32,8 @@ public class PairingProgressDialog extends DaggerDialogFragment {
@Inject RxBusWrapper rxBus;
@Inject FabricPrivacy fabricPrivacy;
- private CompositeDisposable disposable = new CompositeDisposable();
+ private final CompositeDisposable disposable = new CompositeDisposable();
- private TextView statusView;
- private ProgressBar progressBar;
- private Button button;
private PairingHelperActivity helperActivity;
private static boolean pairingEnded = false;
@@ -47,6 +43,8 @@ public class PairingProgressDialog extends DaggerDialogFragment {
private static Runnable runnable;
+ private DanarsPairingProgressDialogBinding binding;
+
public PairingProgressDialog() {
super();
// Required empty public constructor
@@ -59,11 +57,11 @@ public class PairingProgressDialog extends DaggerDialogFragment {
runnable = () -> {
for (int i = 0; i < 20; i++) {
if (pairingEnded) {
- Activity activity = getActivity();
+ FragmentActivity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(() -> {
- progressBar.setProgress(100);
- statusView.setText(R.string.danars_pairingok);
+ binding.danarsPairingprogressProgressbar.setProgress(100);
+ binding.danarsPairingprogressStatus.setText(R.string.danars_pairingok);
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
@@ -74,18 +72,18 @@ public class PairingProgressDialog extends DaggerDialogFragment {
dismiss();
return;
}
- progressBar.setProgress(i * 5);
+ binding.danarsPairingprogressProgressbar.setProgress(i * 5);
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
}
- Activity activity = getActivity();
+ FragmentActivity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(() -> {
- progressBar.setProgress(100);
- statusView.setText(R.string.danars_pairingtimedout);
- button.setVisibility(View.VISIBLE);
+ binding.danarsPairingprogressProgressbar.setProgress(100);
+ binding.danarsPairingprogressStatus.setText(R.string.danars_pairingtimedout);
+ binding.ok.setVisibility(View.VISIBLE);
});
}
};
@@ -95,20 +93,16 @@ public class PairingProgressDialog extends DaggerDialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.danars_pairingprogressdialog, container, false);
+ binding = DanarsPairingProgressDialogBinding.inflate(inflater, container, false);
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
setCancelable(false);
getDialog().setCanceledOnTouchOutside(false);
- statusView = view.findViewById(R.id.danars_pairingprogress_status);
- progressBar = view.findViewById(R.id.danars_pairingprogress_progressbar);
- button = view.findViewById(R.id.ok);
+ setViews();
- setViews();
-
- return view;
+ return binding.getRoot();
}
@Override
@@ -138,11 +132,11 @@ public class PairingProgressDialog extends DaggerDialogFragment {
}
private void setViews() {
- progressBar.setMax(100);
- progressBar.setProgress(0);
- statusView.setText(resourceHelper.gs(R.string.danars_waitingforpairing));
- button.setVisibility(View.GONE);
- button.setOnClickListener(v -> dismiss());
+ binding.danarsPairingprogressProgressbar.setMax(100);
+ binding.danarsPairingprogressProgressbar.setProgress(0);
+ binding.danarsPairingprogressStatus.setText(resourceHelper.gs(R.string.danars_waitingforpairing));
+ binding.ok.setVisibility(View.GONE);
+ binding.ok.setOnClickListener(v -> dismiss());
handler.post(runnable);
}
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/encryption/BleEncryption.java b/danars/src/main/java/info/nightscout/androidaps/danars/encryption/BleEncryption.java
index fbb441e223..83e8e3ed3f 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/encryption/BleEncryption.java
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/encryption/BleEncryption.java
@@ -7,7 +7,7 @@ import javax.inject.Singleton;
@Singleton
public class BleEncryption {
- private Context context;
+ private final Context context;
@Inject BleEncryption(Context context) {
this.context = context;
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/services/BLEComm.kt b/danars/src/main/java/info/nightscout/androidaps/danars/services/BLEComm.kt
index be6a4fde0a..1c0c3ab544 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/services/BLEComm.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/services/BLEComm.kt
@@ -6,7 +6,16 @@ import android.content.Intent
import android.os.SystemClock
import android.util.Base64
import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.dana.DanaPump
+import info.nightscout.androidaps.danars.DanaRSPlugin
import info.nightscout.androidaps.danars.R
+import info.nightscout.androidaps.danars.activities.EnterPinActivity
+import info.nightscout.androidaps.danars.activities.PairingHelperActivity
+import info.nightscout.androidaps.danars.comm.DanaRSMessageHashTable
+import info.nightscout.androidaps.danars.comm.DanaRS_Packet
+import info.nightscout.androidaps.danars.comm.DanaRS_Packet_Etc_Keep_Connection
+import info.nightscout.androidaps.danars.encryption.BleEncryption
+import info.nightscout.androidaps.danars.events.EventDanaRSPairingSuccess
import info.nightscout.androidaps.events.EventPumpStatusChanged
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
@@ -15,15 +24,7 @@ import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification
-import info.nightscout.androidaps.dana.DanaPump
-import info.nightscout.androidaps.danars.DanaRSPlugin
-import info.nightscout.androidaps.danars.activities.EnterPinActivity
-import info.nightscout.androidaps.danars.activities.PairingHelperActivity
-import info.nightscout.androidaps.danars.comm.DanaRSMessageHashTable
-import info.nightscout.androidaps.danars.comm.DanaRS_Packet
-import info.nightscout.androidaps.danars.comm.DanaRS_Packet_Etc_Keep_Connection
-import info.nightscout.androidaps.danars.encryption.BleEncryption
-import info.nightscout.androidaps.danars.events.EventDanaRSPairingSuccess
+import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.ToastUtils
import info.nightscout.androidaps.utils.extensions.notify
@@ -133,12 +134,18 @@ class BLEComm @Inject internal constructor(
if (!encryptedDataRead && encryptedCommandSent && v3Encryption) {
// there was no response from pump after started encryption
// assume pairing keys are invalid
- aapsLogger.error("Clearing pairing keys !!!")
- sp.remove(resourceHelper.gs(R.string.key_danars_v3_randompairingkey) + danaRSPlugin.mDeviceName)
- sp.remove(resourceHelper.gs(R.string.key_danars_v3_pairingkey) + danaRSPlugin.mDeviceName)
- sp.remove(resourceHelper.gs(R.string.key_danars_v3_randomsynckey) + danaRSPlugin.mDeviceName)
- ToastUtils.showToastInUiThread(context, R.string.invalidpairing)
- danaRSPlugin.changePump()
+ val lastClearRequest = sp.getLong(R.string.key_rs_last_clear_key_request, 0)
+ if (lastClearRequest != 0L && DateUtil.isOlderThan(lastClearRequest, 5)) {
+ aapsLogger.error("Clearing pairing keys !!!")
+ sp.remove(resourceHelper.gs(R.string.key_danars_v3_randompairingkey) + danaRSPlugin.mDeviceName)
+ sp.remove(resourceHelper.gs(R.string.key_danars_v3_pairingkey) + danaRSPlugin.mDeviceName)
+ sp.remove(resourceHelper.gs(R.string.key_danars_v3_randomsynckey) + danaRSPlugin.mDeviceName)
+ ToastUtils.showToastInUiThread(context, R.string.invalidpairing)
+ danaRSPlugin.changePump()
+ } else if (lastClearRequest == 0L) {
+ aapsLogger.error("Clearing pairing keys postponed")
+ sp.putLong(R.string.key_rs_last_clear_key_request, DateUtil.now())
+ }
}
// cancel previous scheduled disconnection to prevent closing upcoming connection
scheduledDisconnection?.cancel(false)
@@ -320,7 +327,10 @@ class BLEComm @Inject internal constructor(
// decrypt 2nd level after successful connection
val incomingBuffer = if (v3Encryption && isConnected)
- bleEncryption.decryptSecondLevelPacket(receivedData).also { encryptedDataRead = true }
+ bleEncryption.decryptSecondLevelPacket(receivedData).also {
+ encryptedDataRead = true
+ sp.putLong(R.string.key_rs_last_clear_key_request, 0L)
+ }
else receivedData
addToReadBuffer(incomingBuffer)
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/services/DanaRSService.kt b/danars/src/main/java/info/nightscout/androidaps/danars/services/DanaRSService.kt
index d4b14b1c5e..06c6dbd9ab 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/services/DanaRSService.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/services/DanaRSService.kt
@@ -11,6 +11,7 @@ import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.dana.DanaPump
+import info.nightscout.androidaps.dana.comm.RecordTypes
import info.nightscout.androidaps.dana.events.EventDanaRNewStatus
import info.nightscout.androidaps.danars.DanaRSPlugin
import info.nightscout.androidaps.danars.R
@@ -114,7 +115,6 @@ class DanaRSService : DaggerService() {
fun readPumpStatus() {
try {
- val now = System.currentTimeMillis()
val pump = activePlugin.activePump
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.gettingpumpsettings)))
sendMessage(DanaRS_Packet_Etc_Keep_Connection(injector)) // test encryption for v3
@@ -235,12 +235,13 @@ class DanaRSService : DaggerService() {
lastHistoryFetched = if (danaPump.lastEventTimeLoaded != 0L) danaPump.lastEventTimeLoaded - T.mins(1).msecs() else 0
aapsLogger.debug(LTag.PUMPCOMM, "Events loaded")
danaPump.lastConnection = System.currentTimeMillis()
- return PumpEnactResult(injector).success(true)
+ return PumpEnactResult(injector).success(msg.success())
}
fun setUserSettings(): PumpEnactResult {
- sendMessage(DanaRS_Packet_Option_Set_User_Option(injector))
- return PumpEnactResult(injector).success(true)
+ val message = DanaRS_Packet_Option_Set_User_Option(injector)
+ sendMessage(message)
+ return PumpEnactResult(injector).success(message.success())
}
fun bolus(insulin: Double, carbs: Int, carbTime: Long, t: Treatment): Boolean {
@@ -333,12 +334,13 @@ class DanaRSService : DaggerService() {
SystemClock.sleep(500)
}
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.settingtempbasal)))
- sendMessage(DanaRS_Packet_Basal_Set_Temporary_Basal(injector, percent, durationInHours))
+ val msgTBR = DanaRS_Packet_Basal_Set_Temporary_Basal(injector, percent, durationInHours)
+ sendMessage(msgTBR)
SystemClock.sleep(200)
sendMessage(DanaRS_Packet_Basal_Get_Temporary_Basal_State(injector))
loadEvents()
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING))
- return true
+ return msgTBR.success()
}
fun highTempBasal(percent: Int): Boolean {
@@ -348,11 +350,12 @@ class DanaRSService : DaggerService() {
SystemClock.sleep(500)
}
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.settingtempbasal)))
- sendMessage(DanaRS_Packet_APS_Basal_Set_Temporary_Basal(injector, percent))
+ val msgTBR = DanaRS_Packet_APS_Basal_Set_Temporary_Basal(injector, percent)
+ sendMessage(msgTBR)
sendMessage(DanaRS_Packet_Basal_Get_Temporary_Basal_State(injector))
loadEvents()
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING))
- return true
+ return msgTBR.success()
}
fun tempBasalShortDuration(percent: Int, durationInMinutes: Int): Boolean {
@@ -366,42 +369,46 @@ class DanaRSService : DaggerService() {
SystemClock.sleep(500)
}
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.settingtempbasal)))
- sendMessage(DanaRS_Packet_APS_Basal_Set_Temporary_Basal(injector, percent))
+ val msgTBR = DanaRS_Packet_APS_Basal_Set_Temporary_Basal(injector, percent)
+ sendMessage(msgTBR)
sendMessage(DanaRS_Packet_Basal_Get_Temporary_Basal_State(injector))
loadEvents()
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING))
- return true
+ return msgTBR.success()
}
fun tempBasalStop(): Boolean {
if (!isConnected) return false
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.stoppingtempbasal)))
- sendMessage(DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal(injector))
+ val msgCancel = DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal(injector)
+ sendMessage(msgCancel)
sendMessage(DanaRS_Packet_Basal_Get_Temporary_Basal_State(injector))
loadEvents()
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING))
- return true
+ return msgCancel.success()
}
fun extendedBolus(insulin: Double, durationInHalfHours: Int): Boolean {
if (!isConnected) return false
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.settingextendedbolus)))
- sendMessage(DanaRS_Packet_Bolus_Set_Extended_Bolus(injector, insulin, durationInHalfHours))
+ val msgExtended = DanaRS_Packet_Bolus_Set_Extended_Bolus(injector, insulin, durationInHalfHours)
+ sendMessage(msgExtended)
SystemClock.sleep(200)
sendMessage(DanaRS_Packet_Bolus_Get_Extended_Bolus_State(injector))
loadEvents()
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING))
- return true
+ return msgExtended.success()
}
fun extendedBolusStop(): Boolean {
if (!isConnected) return false
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.stoppingextendedbolus)))
- sendMessage(DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel(injector))
+ val msgStop = DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel(injector)
+ sendMessage(msgStop)
sendMessage(DanaRS_Packet_Bolus_Get_Extended_Bolus_State(injector))
loadEvents()
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING))
- return true
+ return msgStop.success()
}
fun updateBasalsInPump(profile: Profile): Boolean {
@@ -412,9 +419,13 @@ class DanaRSService : DaggerService() {
sendMessage(msgSet)
val msgActivate = DanaRS_Packet_Basal_Set_Profile_Number(injector, 0)
sendMessage(msgActivate)
+ if (danaPump.profile24) {
+ val msgProfile = DanaRS_Packet_Bolus_Set_24_CIR_CF_Array(injector, profile)
+ sendMessage(msgProfile)
+ }
readPumpStatus()
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING))
- return true
+ return msgSet.success()
}
fun loadHistory(type: Byte): PumpEnactResult {
@@ -422,15 +433,15 @@ class DanaRSService : DaggerService() {
if (!isConnected) return result
var msg: DanaRS_Packet_History_? = null
when (type) {
- info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_ALARM -> msg = DanaRS_Packet_History_Alarm(injector)
- info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_PRIME -> msg = DanaRS_Packet_History_Prime(injector)
- info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_BASALHOUR -> msg = DanaRS_Packet_History_Basal(injector)
- info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_BOLUS -> msg = DanaRS_Packet_History_Bolus(injector)
- info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_CARBO -> msg = DanaRS_Packet_History_Carbohydrate(injector)
- info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_DAILY -> msg = DanaRS_Packet_History_Daily(injector)
- info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_GLUCOSE -> msg = DanaRS_Packet_History_Blood_Glucose(injector)
- info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_REFILL -> msg = DanaRS_Packet_History_Refill(injector)
- info.nightscout.androidaps.dana.comm.RecordTypes.RECORD_TYPE_SUSPEND -> msg = DanaRS_Packet_History_Suspend(injector)
+ RecordTypes.RECORD_TYPE_ALARM -> msg = DanaRS_Packet_History_Alarm(injector)
+ RecordTypes.RECORD_TYPE_PRIME -> msg = DanaRS_Packet_History_Prime(injector)
+ RecordTypes.RECORD_TYPE_BASALHOUR -> msg = DanaRS_Packet_History_Basal(injector)
+ RecordTypes.RECORD_TYPE_BOLUS -> msg = DanaRS_Packet_History_Bolus(injector)
+ RecordTypes.RECORD_TYPE_CARBO -> msg = DanaRS_Packet_History_Carbohydrate(injector)
+ RecordTypes.RECORD_TYPE_DAILY -> msg = DanaRS_Packet_History_Daily(injector)
+ RecordTypes.RECORD_TYPE_GLUCOSE -> msg = DanaRS_Packet_History_Blood_Glucose(injector)
+ RecordTypes.RECORD_TYPE_REFILL -> msg = DanaRS_Packet_History_Refill(injector)
+ RecordTypes.RECORD_TYPE_SUSPEND -> msg = DanaRS_Packet_History_Suspend(injector)
}
if (msg != null) {
sendMessage(DanaRS_Packet_General_Set_History_Upload_Mode(injector, 1))
@@ -442,8 +453,7 @@ class DanaRSService : DaggerService() {
SystemClock.sleep(200)
sendMessage(DanaRS_Packet_General_Set_History_Upload_Mode(injector, 0))
}
- result.success = true
- result.comment = "OK"
+ result.success = msg?.success() ?: false
return result
}
diff --git a/danars/src/main/res/layout/danars_blescanner_activity.xml b/danars/src/main/res/layout/danars_blescanner_activity.xml
index 9a22d37441..4b1539c7fb 100644
--- a/danars/src/main/res/layout/danars_blescanner_activity.xml
+++ b/danars/src/main/res/layout/danars_blescanner_activity.xml
@@ -1,5 +1,6 @@
+ app:srcCompat="@drawable/ic_bluetooth_white_48dp" />
+ app:srcCompat="@drawable/ic_bluetooth_white_48dp" />
-
+
\ No newline at end of file
diff --git a/danars/src/main/res/layout/danars_pairingprogressdialog.xml b/danars/src/main/res/layout/danars_pairing_progress_dialog.xml
similarity index 95%
rename from danars/src/main/res/layout/danars_pairingprogressdialog.xml
rename to danars/src/main/res/layout/danars_pairing_progress_dialog.xml
index c95374f3cb..5874e9bff8 100644
--- a/danars/src/main/res/layout/danars_pairingprogressdialog.xml
+++ b/danars/src/main/res/layout/danars_pairing_progress_dialog.xml
@@ -1,4 +1,5 @@
+ app:srcCompat="@drawable/ic_bluetooth_white_48dp" />
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/danars/src/main/res/xml/pref_danars.xml b/danars/src/main/res/xml/pref_danars.xml
index 1e35b65ee9..8fc3d691b4 100644
--- a/danars/src/main/res/xml/pref_danars.xml
+++ b/danars/src/main/res/xml/pref_danars.xml
@@ -42,22 +42,6 @@
android:summary="@string/rs_logcanulachange_summary"
android:title="@string/rs_logcanulachange_title" />
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 99c53485da..e53b7051f9 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Tue Jul 28 23:15:57 CEST 2020
+#Tue Oct 20 18:24:46 CEST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
diff --git a/icons/temptarget_flat.svg b/icons/temptarget_flat.svg
new file mode 100644
index 0000000000..791a23cb11
--- /dev/null
+++ b/icons/temptarget_flat.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/icons/temptarget_high.svg b/icons/temptarget_high.svg
new file mode 100644
index 0000000000..283cd4d821
--- /dev/null
+++ b/icons/temptarget_high.svg
@@ -0,0 +1,26 @@
+
+
diff --git a/icons/temptarget_low.svg b/icons/temptarget_low.svg
new file mode 100644
index 0000000000..1a9344c534
--- /dev/null
+++ b/icons/temptarget_low.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/medtronic/build.gradle b/medtronic/build.gradle
index 9551210275..d45bced541 100644
--- a/medtronic/build.gradle
+++ b/medtronic/build.gradle
@@ -44,40 +44,13 @@ dependencies {
implementation project(':rileylink')
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation 'androidx.legacy:legacy-support-v13:1.0.0'
- implementation 'androidx.core:core-ktx:1.2.0'
- implementation "androidx.preference:preference-ktx:1.1.1"
- implementation "androidx.activity:activity-ktx:${activityVersion}"
- implementation 'com.google.android.material:material:1.1.0'
-
- implementation "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
-
- // Graphview cannot be upgraded
- implementation "com.jjoe64:graphview:4.0.1"
-
- implementation "com.joanzapata.iconify:android-iconify-fontawesome:2.2.2"
-
- // medtronic - start
- implementation 'org.apache.commons:commons-lang3:3.10'
- implementation 'net.danlew:android.joda:2.10.6'
- implementation 'org.slf4j:slf4j-api:1.7.30'
- implementation "com.google.code.gson:gson:2.8.6"
- // medtronic - end
-
- implementation "com.google.dagger:dagger-android:$dagger_version"
- implementation "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
- testImplementation 'junit:junit:4.13'
- androidTestImplementation 'androidx.test.ext:junit:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ testImplementation "junit:junit:$junit_version"
+ androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
+ androidTestImplementation "androidx.test:rules:$androidx_rules"
}
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt
index 056581a801..cbea7e46ca 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt
@@ -80,7 +80,7 @@ class MedtronicFragment : DaggerFragment() {
medtronic_pumpstatus.setBackgroundColor(resourceHelper.gc(R.color.colorInitializingBorder))
- medtronic_rl_status.text = resourceHelper.gs(RileyLinkServiceState.NotStarted.getResourceId())
+ medtronic_rl_status.text = resourceHelper.gs(RileyLinkServiceState.NotStarted.resourceId)
medtronic_pump_status.setTextColor(Color.WHITE)
medtronic_pump_status.text = "{fa-bed}"
@@ -172,7 +172,7 @@ class MedtronicFragment : DaggerFragment() {
@Synchronized
private fun setDeviceStatus() {
- val resourceId = rileyLinkServiceData.rileyLinkServiceState.getResourceId()
+ val resourceId = rileyLinkServiceData.rileyLinkServiceState.resourceId
val rileyLinkError = medtronicPumpPlugin.rileyLinkService?.error
medtronic_rl_status.text =
when {
@@ -200,7 +200,7 @@ class MedtronicFragment : DaggerFragment() {
PumpDeviceState.InvalidConfiguration -> medtronic_pump_status.text = " " + resourceHelper.gs(medtronicPumpStatus.pumpDeviceState.resourceId)
PumpDeviceState.Active -> {
- val cmd = medtronicUtil.getCurrentCommand()
+ val cmd = medtronicUtil.currentCommand
if (cmd == null)
medtronic_pump_status.text = " " + resourceHelper.gs(medtronicPumpStatus.pumpDeviceState.resourceId)
else {
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java
index ee58a61b6b..d491ebd1bc 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java
@@ -48,6 +48,7 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.common.ManufacturerType;
import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction;
import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType;
+import info.nightscout.androidaps.queue.commands.CustomCommand;
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
import info.nightscout.androidaps.plugins.pump.common.PumpPluginAbstract;
@@ -113,12 +114,12 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
// variables for handling statuses and history
private boolean firstRun = true;
private boolean isRefresh = false;
- private Map statusRefreshMap = new HashMap<>();
+ private final Map statusRefreshMap = new HashMap<>();
private boolean isInitialized = false;
private PumpHistoryEntry lastPumpHistoryEntry;
public static boolean isBusy = false;
- private List busyTimestamps = new ArrayList<>();
+ private final List busyTimestamps = new ArrayList<>();
private boolean hasTimeDateOrTimeZoneChanged = false;
@@ -145,6 +146,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
super(new PluginDescription() //
.mainType(PluginType.PUMP) //
.fragmentClass(MedtronicFragment.class.getName()) //
+ .pluginIcon(R.drawable.ic_medtronic_veo)
.pluginName(R.string.medtronic_name) //
.shortName(R.string.medtronic_name_short) //
.preferencesId(R.xml.pref_medtronic)
@@ -367,9 +369,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
clearBusyQueue();
- if (busyTimestamps.size() > 0) {
- return true;
- }
+ return busyTimestamps.size() > 0;
}
}
@@ -680,7 +680,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
int hour = basalValue.timeAsSeconds / (60 * 60);
- if (!medtronicUtil.isSame(basalsByHour[hour], basalValueValue)) {
+ if (!MedtronicUtil.isSame(basalsByHour[hour], basalValueValue)) {
invalid = true;
}
@@ -990,10 +990,10 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
if (!enforceNew) {
- if (medtronicUtil.isSame(tbrCurrent.getInsulinRate(), absoluteRate)) {
+ if (MedtronicUtil.isSame(tbrCurrent.getInsulinRate(), absoluteRate)) {
boolean sameRate = true;
- if (medtronicUtil.isSame(0.0d, absoluteRate) && durationInMinutes > 0) {
+ if (MedtronicUtil.isSame(0.0d, absoluteRate) && durationInMinutes > 0) {
// if rate is 0.0 and duration>0 then the rate is not the same
sameRate = false;
}
@@ -1521,13 +1521,13 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
private List customActions = null;
- private CustomAction customActionWakeUpAndTune = new CustomAction(R.string.medtronic_custom_action_wake_and_tune,
+ private final CustomAction customActionWakeUpAndTune = new CustomAction(R.string.medtronic_custom_action_wake_and_tune,
MedtronicCustomActionType.WakeUpAndTune);
- private CustomAction customActionClearBolusBlock = new CustomAction(
+ private final CustomAction customActionClearBolusBlock = new CustomAction(
R.string.medtronic_custom_action_clear_bolus_block, MedtronicCustomActionType.ClearBolusBlock, false);
- private CustomAction customActionResetRLConfig = new CustomAction(
+ private final CustomAction customActionResetRLConfig = new CustomAction(
R.string.medtronic_custom_action_reset_rileylink, MedtronicCustomActionType.ResetRileyLinkConfiguration, true);
@@ -1583,6 +1583,10 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
}
+ @Nullable @Override public PumpEnactResult executeCustomCommand(CustomCommand customCommand) {
+ return null;
+ }
+
@Override
public void timezoneOrDSTChanged(TimeChangeType changeType) {
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java
index 3c1c4b35e1..442d5223db 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java
@@ -13,13 +13,11 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import info.nightscout.androidaps.logging.LTag;
-import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus;
import info.nightscout.androidaps.plugins.pump.common.defs.PumpDeviceState;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkCommunicationException;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RFSpyResponse;
-import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RLMessage;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RadioPacket;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RadioResponse;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RLMessageType;
@@ -56,7 +54,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
* functionality added.
*/
@Singleton
-public class MedtronicCommunicationManager extends RileyLinkCommunicationManager {
+public class MedtronicCommunicationManager extends RileyLinkCommunicationManager {
@Inject MedtronicPumpStatus medtronicPumpStatus;
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
@@ -69,13 +67,14 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
private final long RILEYLINK_TIMEOUT = 15 * 60 * 1000; // 15 min
private String errorMessage;
- private boolean debugSetCommands = false;
+ private final boolean debugSetCommands = false;
private boolean doWakeUpBeforeCommand = true;
// This empty constructor must be kept, otherwise dagger injection might break!
@Inject
- public MedtronicCommunicationManager() {}
+ public MedtronicCommunicationManager() {
+ }
@Inject
public void onInit() {
@@ -85,9 +84,8 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
}
@Override
- public RLMessage createResponseMessage(byte[] payload) {
- PumpMessage pumpMessage = new PumpMessage(aapsLogger, payload);
- return pumpMessage;
+ public PumpMessage createResponseMessage(byte[] payload) {
+ return new PumpMessage(aapsLogger, payload);
}
@Override
@@ -170,7 +168,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
if (radioResponse.isValid()) {
- PumpMessage pumpResponse = (PumpMessage) createResponseMessage(radioResponse.getPayload());
+ PumpMessage pumpResponse = createResponseMessage(radioResponse.getPayload());
if (!pumpResponse.isValid()) {
aapsLogger.warn(LTag.PUMPCOMM, "Response is invalid ! [interrupted={}, timeout={}]", rfSpyResponse.wasInterrupted(),
@@ -279,7 +277,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
for (List frame : frames) {
- byte[] frameData = medtronicUtil.createByteArray(frame);
+ byte[] frameData = MedtronicUtil.createByteArray(frame);
// aapsLogger.debug(LTag.PUMPCOMM,"Frame {} data:\n{}", frameNr, ByteUtil.getCompactString(frameData));
@@ -545,14 +543,15 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
}
- private PumpMessage sendAndListen(RLMessage msg) throws RileyLinkCommunicationException {
+ private PumpMessage sendAndListen(PumpMessage msg) throws RileyLinkCommunicationException {
return sendAndListen(msg, 4000); // 2000
}
// All pump communications go through this function.
- protected PumpMessage sendAndListen(RLMessage msg, int timeout_ms) throws RileyLinkCommunicationException {
- return (PumpMessage) super.sendAndListen(msg, timeout_ms);
+ @Override
+ protected PumpMessage sendAndListen(PumpMessage msg, int timeout_ms) throws RileyLinkCommunicationException {
+ return super.sendAndListen(msg, timeout_ms);
}
@@ -827,7 +826,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
data[i + 1] = (byte) gc.get(Calendar.MINUTE);
data[i + 2] = (byte) gc.get(Calendar.SECOND);
- byte[] yearByte = medtronicUtil.getByteArrayFromUnsignedShort(gc.get(Calendar.YEAR), true);
+ byte[] yearByte = MedtronicUtil.getByteArrayFromUnsignedShort(gc.get(Calendar.YEAR), true);
data[i + 3] = yearByte[0];
data[i + 4] = yearByte[1];
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/cgms/CGMSHistoryEntryType.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/cgms/CGMSHistoryEntryType.java
index ef24ef136d..64161c720a 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/cgms/CGMSHistoryEntryType.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/cgms/CGMSHistoryEntryType.java
@@ -32,7 +32,7 @@ public enum CGMSHistoryEntryType {
Something19(0x13, "19-Something", 1, 0, 0, DateType.PreviousTimeStamp),
GlucoseSensorData(0xFF, "GlucoseSensorData", 1, 0, 0, DateType.PreviousTimeStamp);
- private static Map opCodeMap = new HashMap<>();
+ private static final Map opCodeMap = new HashMap<>();
static {
for (CGMSHistoryEntryType type : values()) {
@@ -41,13 +41,13 @@ public enum CGMSHistoryEntryType {
}
public boolean schemaSet;
- private int opCode;
- private String description;
- private int headLength;
- private int dateLength;
- private int bodyLength;
- private int totalLength;
- private DateType dateType;
+ private final int opCode;
+ private final String description;
+ private final int headLength;
+ private final int dateLength;
+ private final int bodyLength;
+ private final int totalLength;
+ private final DateType dateType;
CGMSHistoryEntryType(int opCode, String name, int head, int date, int body, DateType dateType) {
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/MedtronicPumpHistoryDecoder.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/MedtronicPumpHistoryDecoder.java
index 1d6f9a72cb..1bebd4bfe2 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/MedtronicPumpHistoryDecoder.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/MedtronicPumpHistoryDecoder.java
@@ -515,8 +515,8 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder opCodeMap = new HashMap<>();
+ private static final Map opCodeMap = new HashMap<>();
static {
for (PumpHistoryEntryType type : values()) {
@@ -168,19 +168,19 @@ public enum PumpHistoryEntryType // implements CodeEnum
setSpecialRulesForEntryTypes();
}
- private int opCode;
- private String description;
- private int headLength;
- private int dateLength;
+ private final int opCode;
+ private final String description;
+ private final int headLength;
+ private final int dateLength;
// private MinimedDeviceType deviceType;
- private int bodyLength;
- private int totalLength;
+ private final int bodyLength;
+ private final int totalLength;
// special rules need to be put in list from highest to lowest (e.g.:
// 523andHigher=12, 515andHigher=10 and default (set in cnstr) would be 8)
private List specialRulesHead;
private List specialRulesBody;
private boolean hasSpecialRules = false;
- private PumpHistoryEntryGroup group;
+ private final PumpHistoryEntryGroup group;
PumpHistoryEntryType(int opCode, String name, PumpHistoryEntryGroup group) {
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/PumpHistoryResult.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/PumpHistoryResult.java
index 349ac1bf2a..25dc2e821f 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/PumpHistoryResult.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/history/pump/PumpHistoryResult.java
@@ -18,7 +18,7 @@ public class PumpHistoryResult {
private final AAPSLogger aapsLogger;
private boolean searchFinished = false;
- private PumpHistoryEntry searchEntry = null;
+ private final PumpHistoryEntry searchEntry = null;
private Long searchDate = null;
private SearchType searchType = SearchType.None;
public List unprocessedEntries;
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PacketType.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PacketType.java
index 03b1ad153c..f153dd8cac 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PacketType.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PacketType.java
@@ -25,7 +25,7 @@ public enum PacketType {
}
}
- private byte value;
+ private final byte value;
PacketType(int value) {
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PumpMessage.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PumpMessage.java
index 2d235de20d..8f45d0f546 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PumpMessage.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/message/PumpMessage.java
@@ -144,9 +144,7 @@ public class PumpMessage implements RLMessage {
return false;
if (commandType == null)
return false;
- if (messageBody == null)
- return false;
- return true;
+ return messageBody != null;
}
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUIPostprocessor.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUIPostprocessor.java
index 6d71633bea..51550dc457 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUIPostprocessor.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/ui/MedtronicUIPostprocessor.java
@@ -235,14 +235,14 @@ public class MedtronicUIPostprocessor {
checkValue = settings.get("PCFG_MAX_BOLUS");
- if (!medtronicUtil.isSame(Double.parseDouble(checkValue.value), medtronicPumpStatus.maxBolus)) {
+ if (!MedtronicUtil.isSame(Double.parseDouble(checkValue.value), medtronicPumpStatus.maxBolus)) {
aapsLogger.error("Wrong Max Bolus set on Pump (current={}, required={}).", checkValue.value, medtronicPumpStatus.maxBolus);
medtronicUtil.sendNotification(MedtronicNotificationType.PumpWrongMaxBolusSet, resourceHelper, rxBus, medtronicPumpStatus.maxBolus);
}
checkValue = settings.get("PCFG_MAX_BASAL");
- if (!medtronicUtil.isSame(Double.parseDouble(checkValue.value), medtronicPumpStatus.maxBasal)) {
+ if (!MedtronicUtil.isSame(Double.parseDouble(checkValue.value), medtronicPumpStatus.maxBasal)) {
aapsLogger.error("Wrong Max Basal set on Pump (current={}, required={}).", checkValue.value, medtronicPumpStatus.maxBasal);
medtronicUtil.sendNotification(MedtronicNotificationType.PumpWrongMaxBasalSet, resourceHelper, rxBus, medtronicPumpStatus.maxBasal);
}
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.java
index 5c2489a5ef..00132bb84b 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.java
@@ -82,7 +82,7 @@ public class MedtronicHistoryData {
private final MedtronicPumpHistoryDecoder medtronicPumpHistoryDecoder;
private final DatabaseHelperInterface databaseHelper;
- private List allHistory;
+ private final List allHistory;
private List newHistory = null;
private boolean isInit = false;
@@ -600,7 +600,7 @@ public class MedtronicHistoryData {
TBR("TBR"),
Suspend("Suspend");
- private String description;
+ private final String description;
ProcessHistoryRecord(String desc) {
this.description = desc;
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/RLHistoryItemMedtronic.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/RLHistoryItemMedtronic.java
index b19335964f..b171f5a061 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/RLHistoryItemMedtronic.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/RLHistoryItemMedtronic.java
@@ -9,7 +9,7 @@ import info.nightscout.androidaps.utils.resources.ResourceHelper;
public class RLHistoryItemMedtronic extends RLHistoryItem {
- private MedtronicCommandType medtronicCommandType;
+ private final MedtronicCommandType medtronicCommandType;
public RLHistoryItemMedtronic(MedtronicCommandType medtronicCommandType) {
super(new LocalDateTime(), RLHistoryItemSource.MedtronicCommand, RileyLinkTargetDevice.MedtronicPump);
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicDeviceType.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicDeviceType.java
index f13974999b..6623a6f9d8 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicDeviceType.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicDeviceType.java
@@ -66,7 +66,7 @@ public enum MedtronicDeviceType {
private String pumpModel;
- private boolean isFamily;
+ private final boolean isFamily;
private MedtronicDeviceType[] familyMembers = null;
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicNotificationType.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicNotificationType.java
index c472ad3520..b05fce81fc 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicNotificationType.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicNotificationType.java
@@ -23,8 +23,8 @@ public enum MedtronicNotificationType {
;
private int notificationType;
- private int resourceId;
- private int notificationUrgency;
+ private final int resourceId;
+ private final int notificationUrgency;
MedtronicNotificationType(int resourceId, int notificationUrgency) {
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicStatusRefreshType.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicStatusRefreshType.java
index 09af9f3554..f84f6d3678 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicStatusRefreshType.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/defs/MedtronicStatusRefreshType.java
@@ -13,8 +13,8 @@ public enum MedtronicStatusRefreshType {
PumpTime(60, MedtronicCommandType.GetRealTimeClock) //
;
- private int refreshTime;
- private MedtronicCommandType commandType;
+ private final int refreshTime;
+ private final MedtronicCommandType commandType;
MedtronicStatusRefreshType(int refreshTime, MedtronicCommandType commandType) {
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/dialog/RileyLinkStatusDeviceMedtronic.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/dialog/RileyLinkStatusDeviceMedtronic.java
index 0d21b195df..e4b6c0e13a 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/dialog/RileyLinkStatusDeviceMedtronic.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/dialog/RileyLinkStatusDeviceMedtronic.java
@@ -55,7 +55,7 @@ public class RileyLinkStatusDeviceMedtronic extends DaggerFragment implements Re
public void onStart() {
super.onStart();
- this.listView = (ListView) getActivity().findViewById(R.id.rileylink_history_list);
+ this.listView = getActivity().findViewById(R.id.rileylink_history_list);
listView.setAdapter(adapter);
@@ -77,8 +77,8 @@ public class RileyLinkStatusDeviceMedtronic extends DaggerFragment implements Re
private class RileyLinkCommandListAdapter extends BaseAdapter {
- private List historyItemList;
- private LayoutInflater mInflator;
+ private final List historyItemList;
+ private final LayoutInflater mInflator;
public RileyLinkCommandListAdapter() {
@@ -146,9 +146,9 @@ public class RileyLinkStatusDeviceMedtronic extends DaggerFragment implements Re
if (view == null) {
view = mInflator.inflate(R.layout.rileylink_status_device_item, null);
viewHolder = new RileyLinkStatusDeviceMedtronic.ViewHolder();
- viewHolder.itemTime = (TextView) view.findViewById(R.id.rileylink_history_time);
- viewHolder.itemSource = (TextView) view.findViewById(R.id.rileylink_history_source);
- viewHolder.itemDescription = (TextView) view.findViewById(R.id.rileylink_history_description);
+ viewHolder.itemTime = view.findViewById(R.id.rileylink_history_time);
+ viewHolder.itemSource = view.findViewById(R.id.rileylink_history_source);
+ viewHolder.itemDescription = view.findViewById(R.id.rileylink_history_description);
view.setTag(viewHolder);
} else {
viewHolder = (RileyLinkStatusDeviceMedtronic.ViewHolder) view.getTag();
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.java
index b2bcc6c5d4..0744545ccc 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.java
@@ -42,7 +42,7 @@ public class RileyLinkMedtronicService extends RileyLinkService {
@Inject MedtronicCommunicationManager medtronicCommunicationManager;
private MedtronicUIComm medtronicUIComm;
- private IBinder mBinder = new LocalBinder();
+ private final IBinder mBinder = new LocalBinder();
private boolean serialChanged = false;
private String[] frequencies;
diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/util/MedtronicUtil.java b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/util/MedtronicUtil.java
index 2e17b7808f..3ff79616ec 100644
--- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/util/MedtronicUtil.java
+++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/util/MedtronicUtil.java
@@ -41,13 +41,13 @@ import info.nightscout.androidaps.utils.resources.ResourceHelper;
@Singleton
public class MedtronicUtil {
- private int ENVELOPE_SIZE = 4; // 0xA7 S1 S2 S3 CMD PARAM_COUNT [PARAMS]
- private static boolean lowLevelDebug = true;
+ private final int ENVELOPE_SIZE = 4; // 0xA7 S1 S2 S3 CMD PARAM_COUNT [PARAMS]
+ private static final boolean lowLevelDebug = true;
//private MedtronicDeviceType medtronicPumpModel;
private MedtronicCommandType currentCommand;
private Map settings;
- private int BIG_FRAME_LENGTH = 65;
- private int doneBit = 1 << 7;
+ private final int BIG_FRAME_LENGTH = 65;
+ private final int doneBit = 1 << 7;
private ClockDTO pumpTime;
public Gson gsonInstance = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
@@ -243,7 +243,7 @@ public class MedtronicUtil {
public byte[] buildCommandPayload(RileyLinkServiceData rileyLinkServiceData, MedtronicCommandType commandType, byte[] parameters) {
- return buildCommandPayload(rileyLinkServiceData, (byte) commandType.commandCode, parameters);
+ return buildCommandPayload(rileyLinkServiceData, commandType.commandCode, parameters);
}
diff --git a/medtronic/src/main/res/drawable/ic_medtronic_veo.xml b/medtronic/src/main/res/drawable/ic_medtronic_veo.xml
new file mode 100644
index 0000000000..8aa31beff1
--- /dev/null
+++ b/medtronic/src/main/res/drawable/ic_medtronic_veo.xml
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/medtronic/src/main/res/layout/medtronic_fragment.xml b/medtronic/src/main/res/layout/medtronic_fragment.xml
index b6c52f76cb..83d3b9d683 100644
--- a/medtronic/src/main/res/layout/medtronic_fragment.xml
+++ b/medtronic/src/main/res/layout/medtronic_fragment.xml
@@ -473,6 +473,13 @@
android:layout_marginTop="5dp"
android:background="@color/listdelimiter" />
+
+
diff --git a/medtronic/src/main/res/values-iw-rIL/strings.xml b/medtronic/src/main/res/values-iw-rIL/strings.xml
index e370c4a256..1c95aa82e7 100644
--- a/medtronic/src/main/res/values-iw-rIL/strings.xml
+++ b/medtronic/src/main/res/values-iw-rIL/strings.xml
@@ -1,8 +1,46 @@
+ חיבור משאבת Medtronic, נדרש התקן ריילילינק ודגמי משאבה ספציפיים
+ מספר סידורי של המשאבה
+ סוג המשאבה
+ תדר המשאבה
+ המתנה לפני מתן בולוס (שניות)
+ מקסימום בולוס במשאבה (יח\')
+ מקסימום בזאלי במשאבה (יח\' לשעה)
+ קידוד מדטרוניק
+ ארצות הברית & קנדה (916 MHz)
+ ברחבי העולם (868 Mhz)
+ קידוד תוכנה 4B6b
+ קידוד חומרה 4B6b
+ התעוררות וכוונון
+ ביטול חסימת בולוס
+ איפוס תצורת RileyLink
+ סוג סוללה (תצוגת חשמל)
+ לא נבחר (תצוגה פשוטה)
+ אלקליין (תצוגה מורחבת)
+ ליתיום (תצוגה מורחבת)
+ NiZn (תצוגה מורחבת)
+ NiMH (תצוגה מורחבת)
+ איתור באגים בבולוס או טיפולים
+ שגיאות
+ מס\' סידורי לא הוגדר.
+ מס\' סידורי לא חוקי.
+ סוג המשאבה לא הוגדר.
+ סוג המשאבה לא נתמך.
+ תדר המשאבה לא הוגדר.
+ תדר המשאבה לא חוקי.
+ כתובת ריילילינק לא חוקית.
+ סוג המשאבה מזוהה אך אינו זהה לסוג מוגדר.
+ הגדרת פרופילי הבזאלי/תבניות אינה מאופשרת במשאבה. הפעילו אותם בגוף המשאבה.
+ פרופיל הבזאלי שהוגדר על המשאבה שגוי (חייב להיות סטנדרטי).
+ סוג הבזאלי הזמני שהוגדר במשאבה שגוי (חייב להיות מוחלט).
+ בולוס מרבי המוגדר במשאבה אינו נכון (חייב להיות %1$.2f).
+ בזאלי מרבי המוגדר במשאבה אינו נכון (חייב להיות %1$.2f).
+ הפעולה אינה אפשרית.\n\n יש להגדיר קודם את המשאבה על מנת לבצע פעולה זו.
+ התבקש שינוי זמן העולה על 24 שעות.
@@ -10,8 +48,37 @@
+ היסטוריית משאבת Medtronic
+ ביטלתם את הבולוס אחרי שכבר נקבע במשאבה. מאחר שמשאבות Medtronic אינן תומכות בביטול, תצטרכו לבטלו ידנית. הכניסו את המשאבה למצב השהיה ולאחר מכן צאו ממצב ההשהיה (אם אתם עדיין רוצים לבטל). היישום יאסוף שינויים בעדכון הבא (תוך פחות מ-5 דקות).
+ לא ניתן לקרוא את הבזאלי הזמני הנוכחי.
+ לא ניתן לבטל את הבזאלי הזמני הנוכחי. עוצר את הפעולה.
+ הגדרת הפרופיל נכשלה מאחר שהתבניות העוקבות כוללות מינון בזאלי גבוה מדי: %1$s
+ לא ניתן היה לספק את הבולוס.
+ לא ניתן לספק את הבולוס משום שכמות האינסולין הזמין (%1$.2f) נמוך מהדרוש (%2$.2f).
+ לא היה ניתן להגדיר את הבזאלי הזמני.
+ לא ניתן לבטל את הבזאלי הזמני הנוכחי.
+ לא ניתן להגדיר את הפרופיל הבזאלי.
+ הפרופיל הנוכחי זהה ולכן לא יוגדר מחדש.
+ קבלת היסטוריה-עמוד %1$d (%2$d/16)
+ קבלת היסטוריה-עמוד %1$d
+ קבלת זמן המשאבה
+ קבלת הגדרות
+ קבלת דגם המשאבה
+ קבלת פרופיל בזאלי
+ הגדרת פרופיל בזאלי
+ קבלת בזאלי זמני
+ הגדרת בזאלי זמני
+ הגדרת בולוס
+ המשאבה אינה זמינה
+ אזהרה
+ עכשיו
+ לפני
+ דרוש עדכון שעון המשאבה
+ מופעל
+ כבוי
+ שעון המשאבה עודכן
diff --git a/medtronic/src/main/res/values-nl-rNL/strings.xml b/medtronic/src/main/res/values-nl-rNL/strings.xml
index 91bda05ab4..82d5dd4aed 100644
--- a/medtronic/src/main/res/values-nl-rNL/strings.xml
+++ b/medtronic/src/main/res/values-nl-rNL/strings.xml
@@ -48,6 +48,7 @@
+ Medtronic Pomp GeschiedenisU heeft de Bolus geannuleerd nadat deze werd ingesteld op de Pomp. Aangezien de Medtronic Pump geen ondersteuning biedt voor automatische annulering moet u dit handmatig doen. Zet de Pump daartoe in de Suspend modus en kies vervolgens voor Hervatten (als u nog wilt annuleren). De applicatie zal de wijzigingen oppakken bij de volgende update (in minder dan 5 minuten).Kan huidige TBR niet lezen.
@@ -70,8 +71,14 @@
Instellen Tijdelijke BasaalInstellen BolusPomp niet bereikbaar
+ Waarschuwing
+ Zojuist
+ voorbij
+ Pomp klok moet bijgesteld worden
+ Aan
+ UitPomp tijd bijgewerkt
diff --git a/medtronic/src/main/res/values-no-rNO/strings.xml b/medtronic/src/main/res/values-no-rNO/strings.xml
index e370c4a256..c97199a08f 100644
--- a/medtronic/src/main/res/values-no-rNO/strings.xml
+++ b/medtronic/src/main/res/values-no-rNO/strings.xml
@@ -1,8 +1,46 @@
+ Tilkobling av Medtronic pumpe krever en RileyLink enhet og spesifikk pumpemodell
+ Pumpens serienummer
+ Pumpens modellnummer
+ Pumpens frekvens
+ Forsinkelse før Bolus dose startes (sek)
+ Maks Bolus dose på pumpen (Enheter)
+ Maks Basal på pumpen (Enheter/time)
+ Medtronic koding
+ USA & Canada (916 MHz)
+ Worldwide (868 Mhz)
+ Software 4b6b koding
+ Hardware 4b6b koding
+ Oppstart og enhetssøk
+ Nullstill Bolus blokk
+ Tilbakestill RileyLink oppsett
+ Batteri type (Strømvisning)
+ Ikke valgt (Enkel visning)
+ Alkaline (Utvidet visning)
+ Lithium (Utvidet visning)
+ NiZn (Utvidet visning)
+ NiMH (Utvidet visning)
+ Feilsøking bolus/behandlingsinformasjon
+ Feil
+ Serienummer ikke definert.
+ Serienummer ikke gyldig.
+ Pumpetype ikke definert.
+ Pumpetypen støttes ikke.
+ Pumpefrekvens ikke innstilt.
+ Pumpefrekvensen støttes ikke.
+ RileyLink adressen er ugyldig.
+ Oppdaget pumpetype er forskjellig fra innstilt pumpetype.
+ Basal profil/program innstilling ikke aktivert. Aktiver denne på pumpen.
+ Basalprofil på pumpen er feil (må være STANDARD).
+ Feil TBR valgt på pumpen (må være E/timen).
+ Feil maks bolus valgt på pumpe (må være %1$.2f).
+ Feil maks basal valgt på pumpe (må være %1$.2f).
+ Operasjon ikke mulig.\n\n Du må konfigurere Medtronic pumpen før du kan bruke denne operasjonen.
+ Mer enn 24t tidsendring ble forespurt.
@@ -10,8 +48,37 @@
+ Medtronic pumpe historie
+ Du kansellerte bolus, etter at den var satt på pumpen. Siden Medtronic pumper ikke støtter kansellering må dette gjøres manuelt. STOPP pumpen og velg GJENOPPTA (hvis du fortsatt ønsker å kansellere). Applikasjon vil lese inn endringen på neste pumpeavlesing (innen 5 minutter).
+ Kunne ikke lese gjeldende TBR.
+ Kunne ikke avbryte gjeldende TBR. Stopper operasjonen.
+ Profil sett feilet fordi påfølgende basalverdi i programmet har for høy verdi: %1$s
+ Bolus dose kunne ikke leveres.
+ Bolus kunne ikke leveres fordi tilgjengelig insulinmengde (%1$.2f) er mindre enn nødvendig bolus (%2$.2f).
+ TBR kunne ikke settes.
+ Kunne ikke avbryte gjeldende TBR.
+ Basalprofilen kunne ikke settes.
+ Basalprofilen er den samme, så den blir ikke satt igjen.
+ Henter historikk - side %1$d (%2$d/16)
+ Henter historikk - side %1$d
+ Henter pumpe tid
+ Henter innstillinger
+ Henter pumpe modell
+ Henter basal profil
+ Angi basal profil
+ Henter Temp Basal
+ Angi Temp Basal
+ Angi Bolus
+ Pumpe utilgjengelig
+ Advarsel
+ Nå
+ siden
+ Pumpens tid må oppdateres
+ På
+ Av
+ Pumpens tid ble oppdatert
diff --git a/medtronic/src/main/res/values-pl-rPL/strings.xml b/medtronic/src/main/res/values-pl-rPL/strings.xml
index 045f9fb5df..78804a3f34 100644
--- a/medtronic/src/main/res/values-pl-rPL/strings.xml
+++ b/medtronic/src/main/res/values-pl-rPL/strings.xml
@@ -25,6 +25,7 @@
NiMH (widok rozszerzony)Bolus/Leczenie - debugowanie
+ BłędyNumer seryjny # nie ustawiony.Numer seryjny # nieprawidłowy.Tyo pompy nie ustawiony.
@@ -47,6 +48,7 @@
+ Historia pompy MedtronicAnulowałeś bolus po jego ustawieniu na pompie. Ponieważ pompa Medtronic nie wspiera polecenia anuluj, musisz wprowadzić zmianę ręcznie. Wprowadź pompę w stan zawieszenia, a następnie przywróć jej działanie (jeżeli wciąż chcesz anulować). Aplikacja pobierze zmiany przy następnym uaktualnieniu (poniżej 5 minut).Nie udało się odczytać aktualnej dawki tymczasowej (TBR).
@@ -68,8 +70,15 @@
Pobierz tymczasową dawkę bazowąUstaw tymczasową dawkę bazowąUstaw bolus
+ Pompa nieosiągalna
+ Ostrzeżenie
+ Teraz
+ temu
+ Potrzebna aktualizacja zegara pompy
+ Włącz
+ WyłączCzas pompy uaktualniony
diff --git a/omnipod/build.gradle b/omnipod/build.gradle
index c3b3a84f35..5e2efbf15b 100644
--- a/omnipod/build.gradle
+++ b/omnipod/build.gradle
@@ -3,10 +3,6 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
-ext {
- powermockVersion = "1.7.3"
-}
-
android {
compileSdkVersion 28
@@ -18,13 +14,6 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
-
- // OMNIPOD: for usage in Firebase event during testing phase
- buildConfigField "String", "VERSION", '"2.7-omnipod-0.4.1-SNAPSHOT"'
- // OMNIPOD: Keep track of what commit from the main repository we're on, these fields aren't actually used anywhere
- buildConfigField "String", "DEV_VERSION", '"2.7.0-rc4"'
- buildConfigField "String", "DEV_VERSION_COMMIT", '"7d5dc54656c961660451c4fa4c6ea66bd83a1c46"'
- buildConfigField "String", "DEV_VERSION_COMMIT_DATE", '"21.8.2020"' // 21st of August
}
kotlinOptions {
@@ -52,11 +41,9 @@ android {
allprojects {
repositories {
- jcenter()
flatDir {
dirs 'libs'
}
- maven { url 'https://jitpack.io' }
}
}
@@ -65,46 +52,17 @@ dependencies {
implementation project(':rileylink')
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation 'androidx.legacy:legacy-support-v13:1.0.0'
- implementation 'androidx.core:core-ktx:1.2.0'
- implementation "androidx.preference:preference-ktx:1.1.1"
- implementation "androidx.activity:activity-ktx:${activityVersion}"
- implementation 'com.google.android.material:material:1.1.0'
-
- implementation 'com.google.firebase:firebase-analytics-ktx:17.4.3'
-
- implementation "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
-
- // Graphview cannot be upgraded
- implementation "com.jjoe64:graphview:4.0.1"
-
- implementation "com.joanzapata.iconify:android-iconify-fontawesome:2.2.2"
-
- // Omnipod - start
- implementation 'org.apache.commons:commons-lang3:3.10'
- implementation 'net.danlew:android.joda:2.10.6'
- implementation "com.google.code.gson:gson:2.8.6"
- implementation(name: "com.atech-software.android.library.wizardpager-1.1.4", ext: "aar")
- // Omnipod - end
-
- implementation "com.google.dagger:dagger-android:$dagger_version"
- implementation "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
- testImplementation 'junit:junit:4.13'
+ testImplementation "junit:junit:$junit_version"
testImplementation "org.mockito:mockito-core:2.8.47"
testImplementation "org.powermock:powermock-api-mockito2:$powermockVersion"
testImplementation "org.powermock:powermock-module-junit4:${powermockVersion}"
- androidTestImplementation 'androidx.test.ext:junit:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
-
+ testImplementation 'joda-time:joda-time:2.10.6'
+ androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
+ androidTestImplementation "androidx.test:rules:$androidx_rules"
}
diff --git a/omnipod/libs/com.atech-software.android.library.wizardpager-1.1.4.aar b/omnipod/libs/com.atech-software.android.library.wizardpager-1.1.4.aar
deleted file mode 100644
index af0c6511cf..0000000000
Binary files a/omnipod/libs/com.atech-software.android.library.wizardpager-1.1.4.aar and /dev/null differ
diff --git a/omnipod/src/main/AndroidManifest.xml b/omnipod/src/main/AndroidManifest.xml
index ebf23405da..4c8d3b5305 100644
--- a/omnipod/src/main/AndroidManifest.xml
+++ b/omnipod/src/main/AndroidManifest.xml
@@ -9,8 +9,7 @@
-
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java
index ffdc74eb19..d1c4fda2e7 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java
@@ -4,23 +4,21 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
-import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.SystemClock;
+import android.text.TextUtils;
import androidx.annotation.NonNull;
-import org.jetbrains.annotations.NotNull;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.json.JSONException;
import org.json.JSONObject;
-import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
-import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -35,6 +33,7 @@ import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.ExtendedBolus;
+import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.events.EventAppInitialized;
@@ -44,6 +43,7 @@ import info.nightscout.androidaps.interfaces.ActivePluginProvider;
import info.nightscout.androidaps.interfaces.CommandQueueProvider;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.interfaces.PumpPluginBase;
@@ -53,7 +53,7 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.common.ManufacturerType;
import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction;
import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType;
-import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification;
+import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
import info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair;
@@ -64,27 +64,36 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkPumpDevice;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkPumpInfo;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
-import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ResetRileyLinkConfigurationTask;
-import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTaskExecutor;
import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil;
import info.nightscout.androidaps.plugins.pump.omnipod.data.ActiveBolus;
import info.nightscout.androidaps.plugins.pump.omnipod.data.RLHistoryItemOmnipod;
import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodCommandType;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodCustomActionType;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodStatusRequestType;
import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodStorageKeys;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.service.ExpirationReminderBuilder;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoRecentPulseLog;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertConfiguration;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertSet;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.util.TimeUtil;
+import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodActiveAlertsChanged;
+import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodFaultEventChanged;
import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged;
import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodTbrChanged;
+import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodUncertainTbrRecovered;
import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager;
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandAcknowledgeAlerts;
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandHandleTimeChange;
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandPlayTestBeep;
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandUpdateAlertConfiguration;
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.OmnipodCustomCommand;
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.OmnipodCustomCommandType;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.service.RileyLinkOmnipodService;
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.OmnipodFragment;
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.OmnipodOverviewFragment;
import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil;
import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodAlertUtil;
+import info.nightscout.androidaps.queue.Callback;
+import info.nightscout.androidaps.queue.commands.CustomCommand;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.FabricPrivacy;
@@ -95,6 +104,8 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
+import static info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants.BASAL_STEP_DURATION;
+
/**
* Created by andy on 23.04.18.
*
@@ -104,14 +115,15 @@ import io.reactivex.schedulers.Schedulers;
public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, RileyLinkPumpDevice {
private static final long RILEY_LINK_CONNECT_TIMEOUT_MILLIS = 3 * 60 * 1000L; // 3 minutes
private static final long STATUS_CHECK_INTERVAL_MILLIS = 60 * 1000L; // 1 minute
+ public static final int STARTUP_STATUS_REQUEST_TRIES = 2;
private final PodStateManager podStateManager;
private final RileyLinkServiceData rileyLinkServiceData;
- private final ServiceTaskExecutor serviceTaskExecutor;
private final AapsOmnipodManager aapsOmnipodManager;
private final AapsOmnipodUtil aapsOmnipodUtil;
private final RileyLinkUtil rileyLinkUtil;
private final OmnipodAlertUtil omnipodAlertUtil;
+ private final ProfileFunction profileFunction;
private final AAPSLogger aapsLogger;
private final RxBusWrapper rxBus;
private final ActivePluginProvider activePlugin;
@@ -124,9 +136,8 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
private final ServiceConnection serviceConnection;
private final PumpType pumpType = PumpType.Insulet_Omnipod;
- private final List customActions = new ArrayList<>();
- private final List statusRequestList = new ArrayList<>();
private final CompositeDisposable disposables = new CompositeDisposable();
+ private final NSUpload nsUpload;
// variables for handling statuses and history
private boolean firstRun = true;
@@ -136,12 +147,11 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
private boolean busy = false;
private int timeChangeRetries;
private long nextPodCheck;
- private boolean sentIdToFirebase;
private long lastConnectionTimeMillis;
private final Handler loopHandler = new Handler(Looper.getMainLooper());
private final Runnable statusChecker;
- private OmnipodCommandType currentCommand;
+ private boolean isCancelTempBasalRunning;
@Inject
public OmnipodPumpPlugin(
@@ -157,19 +167,21 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
CommandQueueProvider commandQueue,
FabricPrivacy fabricPrivacy,
RileyLinkServiceData rileyLinkServiceData,
- ServiceTaskExecutor serviceTaskExecutor,
DateUtil dateUtil,
AapsOmnipodUtil aapsOmnipodUtil,
RileyLinkUtil rileyLinkUtil,
- OmnipodAlertUtil omnipodAlertUtil
+ OmnipodAlertUtil omnipodAlertUtil,
+ ProfileFunction profileFunction,
+ NSUpload nsUpload
) {
super(new PluginDescription() //
.mainType(PluginType.PUMP) //
- .fragmentClass(OmnipodFragment.class.getName()) //
+ .fragmentClass(OmnipodOverviewFragment.class.getName()) //
+ .pluginIcon(R.drawable.ic_pod)
.pluginName(R.string.omnipod_name) //
.shortName(R.string.omnipod_name_short) //
.preferencesId(R.xml.pref_omnipod) //
- .description(R.string.description_pump_omnipod), //
+ .description(R.string.omnipod_pump_description), //
injector, aapsLogger, resourceHelper, commandQueue);
this.aapsLogger = aapsLogger;
this.rxBus = rxBus;
@@ -181,17 +193,15 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
this.dateUtil = dateUtil;
this.podStateManager = podStateManager;
this.rileyLinkServiceData = rileyLinkServiceData;
- this.serviceTaskExecutor = serviceTaskExecutor;
this.aapsOmnipodManager = aapsOmnipodManager;
this.aapsOmnipodUtil = aapsOmnipodUtil;
this.rileyLinkUtil = rileyLinkUtil;
this.omnipodAlertUtil = omnipodAlertUtil;
+ this.profileFunction = profileFunction;
+ this.nsUpload = nsUpload;
pumpDescription = new PumpDescription(pumpType);
- customActions.add(new CustomAction(
- R.string.omnipod_custom_action_reset_rileylink, OmnipodCustomActionType.RESET_RILEY_LINK_CONFIGURATION, true));
-
this.serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
@@ -228,14 +238,16 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
aapsOmnipodManager.createSuspendedFakeTbrIfNotExists();
}
- if (!getCommandQueue().statusInQueue()) {
- if (!OmnipodPumpPlugin.this.statusRequestList.isEmpty()) {
- getCommandQueue().readStatus("Status Refresh Requested", null);
- } else if (OmnipodPumpPlugin.this.hasTimeDateOrTimeZoneChanged) {
- getCommandQueue().readStatus("Date or Time Zone Changed", null);
- } else if (!OmnipodPumpPlugin.this.verifyPodAlertConfiguration()) {
- getCommandQueue().readStatus("Expiration Alerts Changed", null);
- }
+ if (OmnipodPumpPlugin.this.hasTimeDateOrTimeZoneChanged) {
+ getCommandQueue().customCommand(new CommandHandleTimeChange(false), null);
+ }
+ if (!OmnipodPumpPlugin.this.verifyPodAlertConfiguration()) {
+ getCommandQueue().customCommand(new CommandUpdateAlertConfiguration(), null);
+ }
+
+ if (aapsOmnipodManager.isAutomaticallyAcknowledgeAlertsEnabled() && podStateManager.isPodActivationCompleted() && !podStateManager.isPodDead() &&
+ podStateManager.getActiveAlerts().size() > 0 && !getCommandQueue().isCustomCommandInQueue(CommandAcknowledgeAlerts.class)) {
+ queueAcknowledgeAlertsCommand();
}
doPodCheck();
@@ -269,26 +281,46 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
disposables.add(rxBus
.toObservable(EventOmnipodTbrChanged.class)
.observeOn(Schedulers.io())
- .subscribe(event -> updateAapsTbr(), fabricPrivacy::logException)
+ .subscribe(event -> handleCancelledTbr(), fabricPrivacy::logException)
+ );
+ disposables.add(rxBus
+ .toObservable(EventOmnipodUncertainTbrRecovered.class)
+ .observeOn(Schedulers.io())
+ .subscribe(event -> handleUncertainTbrRecovery(), fabricPrivacy::logException)
+ );
+ disposables.add(rxBus
+ .toObservable(EventOmnipodActiveAlertsChanged.class)
+ .observeOn(Schedulers.io())
+ .subscribe(event -> handleActivePodAlerts(), fabricPrivacy::logException)
+ );
+ disposables.add(rxBus
+ .toObservable(EventOmnipodFaultEventChanged.class)
+ .observeOn(Schedulers.io())
+ .subscribe(event -> handlePodFaultEvent(), fabricPrivacy::logException)
);
disposables.add(rxBus
.toObservable(EventPreferenceChange.class)
.observeOn(Schedulers.io())
.subscribe(event -> {
- if ((event.isChanged(getResourceHelper(), R.string.key_omnipod_basal_beeps_enabled)) ||
- (event.isChanged(getResourceHelper(), R.string.key_omnipod_bolus_beeps_enabled)) ||
- (event.isChanged(getResourceHelper(), R.string.key_omnipod_tbr_beeps_enabled)) ||
- (event.isChanged(getResourceHelper(), R.string.key_omnipod_smb_beeps_enabled)) ||
- (event.isChanged(getResourceHelper(), R.string.key_omnipod_suspend_delivery_button_enabled)) ||
- (event.isChanged(getResourceHelper(), R.string.key_omnipod_pulse_log_button_enabled)) ||
- (event.isChanged(getResourceHelper(), R.string.key_omnipod_time_change_event_enabled))) {
+ if (event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.BASAL_BEEPS_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.BOLUS_BEEPS_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.TBR_BEEPS_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.SMB_BEEPS_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.SUSPEND_DELIVERY_BUTTON_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.PULSE_LOG_BUTTON_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.RILEYLINK_STATS_BUTTON_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.TIME_CHANGE_EVENT_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.NOTIFICATION_UNCERTAIN_TBR_SOUND_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.NOTIFICATION_UNCERTAIN_SMB_SOUND_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.NOTIFICATION_UNCERTAIN_BOLUS_SOUND_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.AUTOMATICALLY_ACKNOWLEDGE_ALERTS_ENABLED)) {
aapsOmnipodManager.reloadSettings();
- } else if (event.isChanged(getResourceHelper(), R.string.key_omnipod_expiration_reminder_enabled) ||
- event.isChanged(getResourceHelper(), R.string.key_omnipod_expiration_reminder_hours_before_shutdown) ||
- event.isChanged(getResourceHelper(), R.string.key_omnipod_low_reservoir_alert_enabled) ||
- event.isChanged(getResourceHelper(), R.string.key_omnipod_low_reservoir_alert_units)) {
- if (!verifyPodAlertConfiguration() && !getCommandQueue().statusInQueue()) {
- getCommandQueue().readStatus("Expiration Alerts Changed", null);
+ } else if (event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.EXPIRATION_REMINDER_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.EXPIRATION_REMINDER_HOURS_BEFORE_SHUTDOWN) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.LOW_RESERVOIR_ALERT_ENABLED) ||
+ event.isChanged(getResourceHelper(), OmnipodStorageKeys.Preferences.LOW_RESERVOIR_ALERT_UNITS)) {
+ if (!verifyPodAlertConfiguration()) {
+ getCommandQueue().customCommand(new CommandUpdateAlertConfiguration(), null);
}
}
}, fabricPrivacy::logException)
@@ -316,20 +348,72 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
);
}
- private void updateAapsTbr() {
- // As per the characteristics of the Omnipod, we only know whether or not a TBR is currently active
- // But it doesn't tell us the duration or amount, so we can only update TBR status in AAPS if
- // The pod is not running a TBR, while AAPS thinks it is
- if (!podStateManager.isTempBasalRunning()) {
- // Only report TBR cancellations if they haven't been explicitly requested
- if (currentCommand != OmnipodCommandType.CANCEL_TEMPORARY_BASAL) {
- if (activePlugin.getActiveTreatments().isTempBasalInProgress() && !aapsOmnipodManager.hasSuspendedFakeTbr()) {
- aapsOmnipodManager.reportCancelledTbr();
+ public boolean isRileyLinkReady() {
+ return rileyLinkServiceData.rileyLinkServiceState.isReady();
+ }
+
+ private void handleCancelledTbr() {
+ // Only report TBR cancellations if they haven't been explicitly requested
+ if (isCancelTempBasalRunning) {
+ return;
+ }
+ if (!podStateManager.isTempBasalRunning() && activePlugin.getActiveTreatments().isTempBasalInProgress() && !aapsOmnipodManager.hasSuspendedFakeTbr()) {
+ aapsOmnipodManager.reportCancelledTbr();
+ }
+ }
+
+ private void handleUncertainTbrRecovery() {
+ TemporaryBasal tempBasal = activePlugin.getActiveTreatments().getTempBasalFromHistory(System.currentTimeMillis());
+
+ if (podStateManager.isTempBasalRunning() && tempBasal == null) {
+ if (podStateManager.hasTempBasal()) {
+ aapsLogger.warn(LTag.PUMP, "Registering TBR that AAPS was unaware of");
+ long pumpId = aapsOmnipodManager.addTbrSuccessToHistory(podStateManager.getTempBasalStartTime().getMillis(),
+ new TempBasalPair(podStateManager.getTempBasalAmount(), false, (int) podStateManager.getTempBasalDuration().getStandardMinutes()));
+
+ TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector()) //
+ .absolute(podStateManager.getTempBasalAmount()) //
+ .duration((int) podStateManager.getTempBasalDuration().getStandardMinutes())
+ .date(podStateManager.getTempBasalStartTime().getMillis()) //
+ .source(Source.PUMP) //
+ .pumpId(pumpId);
+
+ activePlugin.getActiveTreatments().addToHistoryTempBasal(temporaryBasal);
+ } else {
+ // Not sure what's going on. Notify the user
+ aapsLogger.error(LTag.PUMP, "Unknown TBR in both Pod state and AAPS");
+ rxBus.send(new EventNewNotification(new Notification(Notification.OMNIPOD_PUMP_ALARM, resourceHelper.gs(R.string.omnipod_error_tbr_running_but_aaps_not_aware), Notification.NORMAL).sound(R.raw.boluserror)));
+ }
+ } else if (!podStateManager.isTempBasalRunning() && tempBasal != null) {
+ aapsLogger.warn(LTag.PUMP, "Removing AAPS TBR that actually hadn't succeeded");
+ activePlugin.getActiveTreatments().removeTempBasal(tempBasal);
+ }
+ }
+
+ private void handleActivePodAlerts() {
+ if (podStateManager.isPodActivationCompleted() && !podStateManager.isPodDead()) {
+ AlertSet activeAlerts = podStateManager.getActiveAlerts();
+ if (activeAlerts.size() > 0) {
+ String alerts = TextUtils.join(", ", aapsOmnipodUtil.getTranslatedActiveAlerts(podStateManager));
+ String notificationText = resourceHelper.gq(R.plurals.omnipod_pod_alerts, activeAlerts.size(), alerts);
+ Notification notification = new Notification(Notification.OMNIPOD_POD_ALERTS, notificationText, Notification.URGENT);
+ rxBus.send(new EventNewNotification(notification));
+ nsUpload.uploadError(notificationText);
+
+ if (aapsOmnipodManager.isAutomaticallyAcknowledgeAlertsEnabled() && !getCommandQueue().isCustomCommandInQueue(CommandAcknowledgeAlerts.class)) {
+ queueAcknowledgeAlertsCommand();
}
}
}
}
+ private void handlePodFaultEvent() {
+ if (podStateManager.isPodFaulted()) {
+ String notificationText = resourceHelper.gs(R.string.omnipod_pod_status_pod_fault_description, podStateManager.getFaultEventCode().getValue(), podStateManager.getFaultEventCode().name());
+ nsUpload.uploadError(notificationText);
+ }
+ }
+
@Override
protected void onStop() {
super.onStop();
@@ -342,19 +426,25 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
disposables.clear();
}
+ private void queueAcknowledgeAlertsCommand() {
+ getCommandQueue().customCommand(new CommandAcknowledgeAlerts(), new Callback() {
+ @Override public void run() {
+ if (result != null) {
+ aapsLogger.debug(LTag.PUMP, "Acknowledge alerts result: {} ({})", result.success, result.comment);
+ }
+ }
+ });
+ }
+
private void doPodCheck() {
if (System.currentTimeMillis() > this.nextPodCheck) {
if (!podStateManager.isPodRunning()) {
Notification notification = new Notification(Notification.OMNIPOD_POD_NOT_ATTACHED, resourceHelper.gs(R.string.omnipod_error_pod_not_attached), Notification.NORMAL);
rxBus.send(new EventNewNotification(notification));
} else {
- rxBus.send(new EventDismissNotification(Notification.OMNIPOD_POD_NOT_ATTACHED));
-
if (podStateManager.isSuspended()) {
Notification notification = new Notification(Notification.OMNIPOD_POD_SUSPENDED, resourceHelper.gs(R.string.omnipod_error_pod_suspended), Notification.NORMAL);
rxBus.send(new EventNewNotification(notification));
- } else {
- rxBus.send(new EventDismissNotification(Notification.OMNIPOD_POD_SUSPENDED));
}
}
@@ -362,7 +452,6 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
}
}
- // TODO is this correct?
@Override
public boolean isInitialized() {
return isConnected() && podStateManager.isPodActivationCompleted();
@@ -380,8 +469,9 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
@Override
public boolean isHandshakeInProgress() {
- if (displayConnectionMessages)
+ if (displayConnectionMessages) {
aapsLogger.debug(LTag.PUMP, "isHandshakeInProgress [OmnipodPumpPlugin] - default (empty) implementation.");
+ }
return false;
}
@@ -442,109 +532,31 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
lastConnectionTimeMillis = System.currentTimeMillis();
}
- // We abuse getPumpStatus to squeeze commands in the queue
- // The only actual status requests we send to the Pod are on startup (in initializeAfterRileyLinkConnection)
- // And when the user explicitly requested it by clicking the Refresh button on the Omnipod tab
- // We don't do periodical status requests because that can drain the Pod's battery
- // However that should be fine because we get a StatusResponse from all insulin commands sent to the Pod
+ /**
+ * We don't do periodical status requests because that could drain the Pod's battery
+ * The only actual status requests we send to the Pod here are on startup (in {@link #initializeAfterRileyLinkConnection() initializeAfterRileyLinkConnection()})
+ * And when the basal and/or temp basal status is uncertain
+ * When the user explicitly requested it by clicking the Refresh button on the Omnipod tab (which is executed through {@link #executeCustomCommand(CustomCommand)})
+ */
@Override
public void getPumpStatus() {
if (firstRun) {
initializeAfterRileyLinkConnection();
- } else if (!statusRequestList.isEmpty()) {
- Iterator iterator = statusRequestList.iterator();
-
- while (iterator.hasNext()) {
- OmnipodStatusRequestType statusRequest = iterator.next();
- switch (statusRequest) {
- case GET_PULSE_LOG:
- try {
- PodInfoRecentPulseLog result = executeCommand(OmnipodCommandType.GET_POD_PULSE_LOG, aapsOmnipodManager::readPulseLog);
- Intent i = new Intent(context, ErrorHelperActivity.class);
- i.putExtra("soundid", 0);
- i.putExtra("status", "Pulse Log (copied to clipboard):\n" + result.toString());
- i.putExtra("title", resourceHelper.gs(R.string.omnipod_warning));
- i.putExtra("clipboardContent", result.toString());
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(i);
- } catch (Exception ex) {
- aapsLogger.warn(LTag.PUMP, "Failed to retrieve pulse log", ex);
- Intent i = new Intent(context, ErrorHelperActivity.class);
- i.putExtra("soundid", 0);
- i.putExtra("status", "Failed to retrieve pulse log");
- i.putExtra("title", resourceHelper.gs(R.string.omnipod_warning));
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(i);
- }
- break;
- case ACKNOWLEDGE_ALERTS:
- executeCommand(OmnipodCommandType.ACKNOWLEDGE_ALERTS, aapsOmnipodManager::acknowledgeAlerts);
- break;
- case GET_POD_STATE:
- executeCommand(OmnipodCommandType.GET_POD_STATUS, aapsOmnipodManager::getPodStatus);
- break;
- case SUSPEND_DELIVERY:
- executeCommand(OmnipodCommandType.SUSPEND_DELIVERY, aapsOmnipodManager::suspendDelivery);
- break;
- default:
- aapsLogger.error(LTag.PUMP, "Unknown status request: " + statusRequest.name());
- }
- iterator.remove();
- }
- } else if (this.hasTimeDateOrTimeZoneChanged) {
- PumpEnactResult result = executeCommand(OmnipodCommandType.SET_TIME, aapsOmnipodManager::setTime);
-
- if (result.success) {
- this.hasTimeDateOrTimeZoneChanged = false;
- timeChangeRetries = 0;
-
- Notification notification = new Notification(
- Notification.TIME_OR_TIMEZONE_CHANGE,
- resourceHelper.gs(R.string.omnipod_time_or_timezone_change),
- Notification.INFO, 60);
- rxBus.send(new EventNewNotification(notification));
-
- } else {
- timeChangeRetries++;
-
- if (timeChangeRetries > 3) {
- this.hasTimeDateOrTimeZoneChanged = false;
- timeChangeRetries = 0;
- }
- }
- } else if (!verifyPodAlertConfiguration()) {
- Duration expirationReminderTimeBeforeShutdown = omnipodAlertUtil.getExpirationReminderTimeBeforeShutdown();
- Integer lowReservoirAlertUnits = omnipodAlertUtil.getLowReservoirAlertUnits();
-
- List alertConfigurations = new ExpirationReminderBuilder(podStateManager) //
- .expirationAdvisory(expirationReminderTimeBeforeShutdown != null,
- Optional.ofNullable(expirationReminderTimeBeforeShutdown).orElse(Duration.ZERO)) //
- .lowReservoir(lowReservoirAlertUnits != null, Optional.ofNullable(lowReservoirAlertUnits).orElse(0)) //
- .build();
-
- PumpEnactResult result = executeCommand(OmnipodCommandType.CONFIGURE_ALERTS, () -> aapsOmnipodManager.configureAlerts(alertConfigurations));
-
- if (result.success) {
- aapsLogger.info(LTag.PUMP, "Successfully configured alerts in Pod");
-
- podStateManager.setExpirationAlertTimeBeforeShutdown(expirationReminderTimeBeforeShutdown);
- podStateManager.setLowReservoirAlertUnits(lowReservoirAlertUnits);
-
- Notification notification = new Notification(
- Notification.OMNIPOD_POD_ALERTS_UPDATED,
- resourceHelper.gs(R.string.omnipod_expiration_alerts_updated),
- Notification.INFO, 60);
- rxBus.send(new EventNewNotification(notification));
- } else {
- aapsLogger.warn(LTag.PUMP, "Failed to configure alerts in Pod");
- }
+ firstRun = false;
+ } else if (!podStateManager.isBasalCertain() || !podStateManager.isTempBasalCertain()) {
+ aapsLogger.info(LTag.PUMP, "Acknowledged AAPS getPumpStatus request because basal and/or temp basal is uncertain");
+ getPodStatus();
}
}
- @NotNull
+ private PumpEnactResult getPodStatus() {
+ return executeCommand(OmnipodCommandType.GET_POD_STATUS, aapsOmnipodManager::getPodStatus);
+ }
+
+ @NonNull
@Override
public PumpEnactResult setNewBasalProfile(Profile profile) {
- PumpEnactResult result = executeCommand(OmnipodCommandType.SET_BASAL_PROFILE, () -> aapsOmnipodManager.setBasalProfile(profile));
+ PumpEnactResult result = executeCommand(OmnipodCommandType.SET_BASAL_PROFILE, () -> aapsOmnipodManager.setBasalProfile(profile, true));
aapsLogger.info(LTag.PUMP, "Basal Profile was set: " + result.success);
@@ -558,12 +570,12 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
// When we activate a new Pod, we just use ProfileFunction to set the currently active profile
return true;
}
- return podStateManager.getBasalSchedule().equals(AapsOmnipodManager.mapProfileToBasalSchedule(profile));
+ return Objects.equals(podStateManager.getBasalSchedule(), AapsOmnipodManager.mapProfileToBasalSchedule(profile));
}
@Override
public long lastDataTime() {
- return podStateManager.isPodActivationCompleted() ? podStateManager.getLastSuccessfulCommunication().getMillis() : 0;
+ return podStateManager.isPodInitialized() ? podStateManager.getLastSuccessfulCommunication().getMillis() : 0;
}
@Override
@@ -572,9 +584,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
return 0.0d;
}
- DateTime now = DateTime.now();
- Duration offset = new Duration(now.withTimeAtStartOfDay(), now);
- return podStateManager.getBasalSchedule().rateAt(offset);
+ return podStateManager.getBasalSchedule().rateAt(TimeUtil.toDuration(DateTime.now()));
}
@Override
@@ -618,13 +628,18 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
executeCommand(OmnipodCommandType.CANCEL_BOLUS, aapsOmnipodManager::cancelBolus);
}
- // if enforceNew===true current temp basal is cancelled and new TBR set (duration is prolonged),
+ // if enforceNew is true, current temp basal is cancelled and new TBR set (duration is prolonged),
// if false and the same rate is requested enacted=false and success=true is returned and TBR is not changed
@Override
+ @NonNull
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer
durationInMinutes, Profile profile, boolean enforceNew) {
aapsLogger.info(LTag.PUMP, "setTempBasalAbsolute: rate: {}, duration={}", absoluteRate, durationInMinutes);
+ if (durationInMinutes <= 0 || durationInMinutes % BASAL_STEP_DURATION.getStandardMinutes() != 0) {
+ return new PumpEnactResult(getInjector()).success(false).comment(resourceHelper.gs(R.string.omnipod_error_set_temp_basal_failed_validation, BASAL_STEP_DURATION.getStandardMinutes()));
+ }
+
// read current TBR
TemporaryBasal tbrCurrent = readTBR();
@@ -652,6 +667,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
}
@Override
+ @NonNull
public PumpEnactResult cancelTempBasal(boolean enforceNew) {
TemporaryBasal tbrCurrent = readTBR();
@@ -660,7 +676,12 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
return new PumpEnactResult(getInjector()).success(true).enacted(false);
}
- return executeCommand(OmnipodCommandType.CANCEL_TEMPORARY_BASAL, aapsOmnipodManager::cancelTemporaryBasal);
+ isCancelTempBasalRunning = true;
+ try {
+ return executeCommand(OmnipodCommandType.CANCEL_TEMPORARY_BASAL, aapsOmnipodManager::cancelTemporaryBasal);
+ } finally {
+ isCancelTempBasalRunning = false;
+ }
}
// TODO improve (i8n and more)
@@ -715,16 +736,16 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
return pump;
}
- @Override public ManufacturerType manufacturer() {
+ @Override @NonNull public ManufacturerType manufacturer() {
return pumpType.getManufacturer();
}
- @Override @NotNull
+ @Override @NonNull
public PumpType model() {
return pumpType;
}
- @NotNull
+ @NonNull
@Override
public String serialNumber() {
return podStateManager.isPodInitialized() ? String.valueOf(podStateManager.getAddress()) : "-";
@@ -766,38 +787,157 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
@Override
public List getCustomActions() {
- return customActions;
+ return Collections.emptyList();
}
@Override
public void executeCustomAction(CustomActionType customActionType) {
- OmnipodCustomActionType mcat = (OmnipodCustomActionType) customActionType;
+ aapsLogger.warn(LTag.PUMP, "Unknown custom action: " + customActionType);
+ }
- switch (mcat) {
- case RESET_RILEY_LINK_CONFIGURATION:
- serviceTaskExecutor.startTask(new ResetRileyLinkConfigurationTask(getInjector()));
- break;
-
- default:
- aapsLogger.warn(LTag.PUMP, "Unknown custom action: {}" + mcat);
- break;
+ @Override
+ public PumpEnactResult executeCustomCommand(CustomCommand command) {
+ if (!(command instanceof OmnipodCustomCommand)) {
+ aapsLogger.warn(LTag.PUMP, "Unknown custom command: " + command.getClass().getName());
+ return new PumpEnactResult(getInjector()).success(false).enacted(false).comment(resourceHelper.gs(R.string.omnipod_error_unknown_custom_command, command.getClass().getName()));
}
+
+ OmnipodCustomCommandType commandType = ((OmnipodCustomCommand) command).getType();
+
+ aapsLogger.debug(LTag.PUMP, "Executing custom command: " + commandType);
+
+ switch (commandType) {
+ case ACKNOWLEDGE_ALERTS:
+ return executeCommand(OmnipodCommandType.ACKNOWLEDGE_ALERTS, aapsOmnipodManager::acknowledgeAlerts);
+ case GET_POD_STATUS:
+ return getPodStatus();
+ case READ_PULSE_LOG:
+ return retrievePulseLog();
+ case SUSPEND_DELIVERY:
+ return executeCommand(OmnipodCommandType.SUSPEND_DELIVERY, aapsOmnipodManager::suspendDelivery);
+ case RESUME_DELIVERY:
+ return executeCommand(OmnipodCommandType.RESUME_DELIVERY, () -> aapsOmnipodManager.setBasalProfile(profileFunction.getProfile(), false));
+ case DEACTIVATE_POD:
+ return executeCommand(OmnipodCommandType.DEACTIVATE_POD, aapsOmnipodManager::deactivatePod);
+ case HANDLE_TIME_CHANGE:
+ return handleTimeChange(((CommandHandleTimeChange) command).isRequestedByUser());
+ case UPDATE_ALERT_CONFIGURATION:
+ return updateAlertConfiguration();
+ case PLAY_TEST_BEEP:
+ return executeCommand(OmnipodCommandType.PLAY_TEST_BEEP, () -> aapsOmnipodManager.playTestBeep(((CommandPlayTestBeep) command).getBeepType()));
+ default:
+ aapsLogger.warn(LTag.PUMP, "Unknown custom command: " + commandType);
+ return new PumpEnactResult(getInjector()).success(false).enacted(false).comment(resourceHelper.gs(R.string.omnipod_error_unknown_custom_command, commandType));
+ }
+ }
+
+ private PumpEnactResult retrievePulseLog() {
+ PodInfoRecentPulseLog result;
+ try {
+ result = executeCommand(OmnipodCommandType.READ_POD_PULSE_LOG, aapsOmnipodManager::readPulseLog);
+ } catch (Exception ex) {
+ return new PumpEnactResult(getInjector()).success(false).enacted(false).comment(aapsOmnipodManager.translateException(ex));
+ }
+
+ Intent i = new Intent(context, ErrorHelperActivity.class);
+ i.putExtra("soundid", 0);
+ i.putExtra("status", resourceHelper.gs(R.string.omnipod_pulse_log_value) + ":\n" + result.toString());
+ i.putExtra("title", resourceHelper.gs(R.string.omnipod_pulse_log));
+ i.putExtra("clipboardContent", result.toString());
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(i);
+ return new PumpEnactResult(getInjector()).success(true).enacted(false);
+ }
+
+ @NonNull private PumpEnactResult updateAlertConfiguration() {
+ Duration expirationReminderTimeBeforeShutdown = omnipodAlertUtil.getExpirationReminderTimeBeforeShutdown();
+ Integer lowReservoirAlertUnits = omnipodAlertUtil.getLowReservoirAlertUnits();
+
+ List alertConfigurations = new ExpirationReminderBuilder(podStateManager) //
+ .expirationAdvisory(expirationReminderTimeBeforeShutdown != null,
+ Optional.ofNullable(expirationReminderTimeBeforeShutdown).orElse(Duration.ZERO)) //
+ .lowReservoir(lowReservoirAlertUnits != null, Optional.ofNullable(lowReservoirAlertUnits).orElse(0)) //
+ .build();
+
+ PumpEnactResult result = executeCommand(OmnipodCommandType.CONFIGURE_ALERTS, () -> aapsOmnipodManager.configureAlerts(alertConfigurations));
+
+ if (result.success) {
+ aapsLogger.info(LTag.PUMP, "Successfully configured alerts in Pod");
+
+ podStateManager.setExpirationAlertTimeBeforeShutdown(expirationReminderTimeBeforeShutdown);
+ podStateManager.setLowReservoirAlertUnits(lowReservoirAlertUnits);
+
+ Notification notification = new Notification(
+ Notification.OMNIPOD_POD_ALERTS_UPDATED,
+ resourceHelper.gs(R.string.omnipod_confirmation_expiration_alerts_updated),
+ Notification.INFO, 60);
+ rxBus.send(new EventNewNotification(notification));
+ } else {
+ aapsLogger.warn(LTag.PUMP, "Failed to configure alerts in Pod");
+ }
+
+ return result;
+ }
+
+ @NonNull private PumpEnactResult handleTimeChange(boolean requestedByUser) {
+ aapsLogger.debug(LTag.PUMP, "Setting time, requestedByUser={}", requestedByUser);
+
+ PumpEnactResult result;
+ if (requestedByUser || aapsOmnipodManager.isTimeChangeEventEnabled()) {
+ result = executeCommand(OmnipodCommandType.SET_TIME, () -> aapsOmnipodManager.setTime(!requestedByUser));
+ } else {
+ // Even if automatically changing the time is disabled, we still want to at least do a GetStatus request,
+ // in order to update the Pod's activation time, which we need for calculating the time on the Pod
+ result = getPodStatus();
+ }
+
+ if (result.success) {
+ this.hasTimeDateOrTimeZoneChanged = false;
+ timeChangeRetries = 0;
+
+ if (!requestedByUser && aapsOmnipodManager.isTimeChangeEventEnabled()) {
+ Notification notification = new Notification(
+ Notification.TIME_OR_TIMEZONE_CHANGE,
+ resourceHelper.gs(R.string.omnipod_confirmation_time_on_pod_updated),
+ Notification.INFO, 60);
+ rxBus.send(new EventNewNotification(notification));
+ }
+
+ } else {
+ if (!requestedByUser) {
+ timeChangeRetries++;
+
+ if (timeChangeRetries > 3) {
+ if (aapsOmnipodManager.isTimeChangeEventEnabled()) {
+ Notification notification = new Notification(
+ Notification.TIME_OR_TIMEZONE_CHANGE,
+ resourceHelper.gs(R.string.omnipod_error_automatic_time_or_timezone_change_failed),
+ Notification.INFO, 60);
+ rxBus.send(new EventNewNotification(notification));
+ }
+ this.hasTimeDateOrTimeZoneChanged = false;
+ timeChangeRetries = 0;
+ }
+ }
+ }
+
+ return result;
}
@Override
public void timezoneOrDSTChanged(TimeChangeType timeChangeType) {
aapsLogger.warn(LTag.PUMP, "Time, Date and/or TimeZone changed. [changeType=" + timeChangeType.name() + ", eventHandlingEnabled=" + aapsOmnipodManager.isTimeChangeEventEnabled() + "]");
- if (aapsOmnipodManager.isTimeChangeEventEnabled() && podStateManager.isPodRunning()) {
+ if (podStateManager.isPodRunning()) {
aapsLogger.info(LTag.PUMP, "Time, Date and/or TimeZone changed event received and will be consumed by driver.");
- this.hasTimeDateOrTimeZoneChanged = true;
+ hasTimeDateOrTimeZoneChanged = true;
}
}
@Override
public boolean isUnreachableAlertTimeoutExceeded(long unreachableTimeoutMilliseconds) {
// We have a separate notification for when no Pod is active, see doPodCheck()
- if (podStateManager.isPodActivationCompleted() && podStateManager.getLastSuccessfulCommunication() != null) { // Null check for backwards compatibility
+ if (podStateManager.isPodActivationCompleted() && podStateManager.getLastSuccessfulCommunication() != null) {
long currentTimeMillis = System.currentTimeMillis();
if (podStateManager.getLastSuccessfulCommunication().getMillis() + unreachableTimeoutMilliseconds < currentTimeMillis) {
@@ -819,10 +959,6 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
return false;
}
- public void addPodStatusRequest(OmnipodStatusRequestType pumpStatusRequest) {
- statusRequestList.add(pumpStatusRequest);
- }
-
@Override
public boolean isFakingTempsByExtendedBoluses() {
return false;
@@ -853,50 +989,54 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
aapsLogger.debug(LTag.PUMP, "stopConnecting [PumpPluginAbstract] - default (empty) implementation.");
}
- @NotNull @Override public PumpEnactResult setTempBasalPercent(Integer percent, Integer
+ @NonNull @Override public PumpEnactResult setTempBasalPercent(Integer percent, Integer
durationInMinutes, Profile profile, boolean enforceNew) {
- aapsLogger.debug(LTag.PUMP, "setTempBasalPercent [OmnipodPumpPlugin] - Not implemented.");
- return getOperationNotSupportedWithCustomText(info.nightscout.androidaps.core.R.string.pump_operation_not_supported_by_pump_driver);
+ if (percent == 0) {
+ return setTempBasalAbsolute(0.0d, durationInMinutes, profile, enforceNew);
+ } else {
+ double absoluteValue = profile.getBasal() * (percent / 100.0d);
+ absoluteValue = pumpDescription.pumpType.determineCorrectBasalSize(absoluteValue);
+ aapsLogger.warn(LTag.PUMP, "setTempBasalPercent [OmnipodPumpPlugin] - You are trying to use setTempBasalPercent with percent other then 0% (" + percent + "). This will start setTempBasalAbsolute, with calculated value (" + absoluteValue + "). Result might not be 100% correct.");
+ return setTempBasalAbsolute(absoluteValue, durationInMinutes, profile, enforceNew);
+ }
}
- @NotNull @Override public PumpEnactResult setExtendedBolus(Double insulin, Integer
+ @NonNull @Override public PumpEnactResult setExtendedBolus(Double insulin, Integer
durationInMinutes) {
aapsLogger.debug(LTag.PUMP, "setExtendedBolus [OmnipodPumpPlugin] - Not implemented.");
return getOperationNotSupportedWithCustomText(info.nightscout.androidaps.core.R.string.pump_operation_not_supported_by_pump_driver);
}
- @NotNull @Override public PumpEnactResult cancelExtendedBolus() {
+ @NonNull @Override public PumpEnactResult cancelExtendedBolus() {
aapsLogger.debug(LTag.PUMP, "cancelExtendedBolus [OmnipodPumpPlugin] - Not implemented.");
return getOperationNotSupportedWithCustomText(info.nightscout.androidaps.core.R.string.pump_operation_not_supported_by_pump_driver);
}
- @NotNull @Override public PumpEnactResult loadTDDs() {
+ @NonNull @Override public PumpEnactResult loadTDDs() {
aapsLogger.debug(LTag.PUMP, "loadTDDs [OmnipodPumpPlugin] - Not implemented.");
return getOperationNotSupportedWithCustomText(info.nightscout.androidaps.core.R.string.pump_operation_not_supported_by_pump_driver);
}
private void initializeAfterRileyLinkConnection() {
- if (podStateManager.isPodInitialized() && podStateManager.getPodProgressStatus().isAtLeast(PodProgressStatus.PAIRING_COMPLETED)) {
- PumpEnactResult result = executeCommand(OmnipodCommandType.GET_POD_STATUS, aapsOmnipodManager::getPodStatus);
- if (result.success) {
- aapsLogger.debug(LTag.PUMP, "Successfully retrieved Pod status on startup");
- } else {
+ if (podStateManager.getActivationProgress().isAtLeast(ActivationProgress.PAIRING_COMPLETED)) {
+ boolean success = false;
+ for (int i = 0; STARTUP_STATUS_REQUEST_TRIES > i; i++) {
+ PumpEnactResult result = getPodStatus();
+ if (result.success) {
+ success = true;
+ aapsLogger.debug(LTag.PUMP, "Successfully retrieved Pod status on startup");
+ break;
+ }
+ }
+ if (!success) {
aapsLogger.warn(LTag.PUMP, "Failed to retrieve Pod status on startup");
+ rxBus.send(new EventNewNotification(new Notification(Notification.OMNIPOD_PUMP_ALARM, resourceHelper.gs(R.string.omnipod_error_failed_to_refresh_status_on_startup), Notification.NORMAL)));
}
} else {
aapsLogger.debug(LTag.PUMP, "Not retrieving Pod status on startup: no Pod running");
}
- if (!sentIdToFirebase) {
- Bundle params = new Bundle();
- params.putString("version", BuildConfig.VERSION);
-
- fabricPrivacy.getFirebaseAnalytics().logEvent("OmnipodPumpInit", params);
-
- sentIdToFirebase = true;
- }
-
- this.firstRun = false;
+ fabricPrivacy.logCustom("OmnipodPumpInit");
}
@NonNull private PumpEnactResult deliverBolus(final DetailedBolusInfo detailedBolusInfo) {
@@ -914,19 +1054,14 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
private T executeCommand(OmnipodCommandType commandType, Supplier supplier) {
try {
- currentCommand = commandType;
aapsLogger.debug(LTag.PUMP, "Executing command: {}", commandType);
rileyLinkUtil.getRileyLinkHistory().add(new RLHistoryItemOmnipod(getInjector(), commandType));
- T pumpEnactResult = supplier.get();
-
+ return supplier.get();
+ } finally {
rxBus.send(new EventRefreshOverview("Omnipod command: " + commandType.name(), false));
rxBus.send(new EventOmnipodPumpValuesChanged());
-
- return pumpEnactResult;
- } finally {
- currentCommand = null;
}
}
@@ -946,7 +1081,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
return true;
}
- private void incrementStatistics(String statsKey) {
+ private void incrementStatistics(int statsKey) {
long currentCount = sp.getLong(statsKey, 0L);
currentCount++;
sp.putLong(statsKey, currentCount);
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodInjectHelpers.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodInjectHelpers.kt
new file mode 100644
index 0000000000..cd932bad82
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodInjectHelpers.kt
@@ -0,0 +1,38 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.dagger
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import dagger.MapKey
+import javax.inject.Inject
+import javax.inject.Provider
+import javax.inject.Qualifier
+import javax.inject.Scope
+import kotlin.reflect.KClass
+
+@Qualifier
+annotation class OmnipodPluginQualifier
+
+@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
+@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
+@MapKey
+internal annotation class ViewModelKey(val value: KClass)
+
+// TODO: These annotations and Factories could be used globally -> move to core or app
+
+@Suppress("UNCHECKED_CAST")
+class ViewModelFactory @Inject constructor(
+ private val viewModels: MutableMap, @JvmSuppressWildcards Provider>
+) : ViewModelProvider.Factory {
+
+ override fun create(modelClass: Class): T = viewModels[modelClass]?.get() as T
+}
+
+@MustBeDocumented
+@Scope
+@Retention(AnnotationRetention.RUNTIME)
+annotation class ActivityScope
+
+@MustBeDocumented
+@Scope
+@Retention(AnnotationRetention.RUNTIME)
+annotation class FragmentScope
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodModule.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodModule.kt
index 225b1bb5ca..fd2b49ae1c 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodModule.kt
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodModule.kt
@@ -9,11 +9,8 @@ import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsPodStateManag
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager
import info.nightscout.androidaps.plugins.pump.omnipod.ui.PodHistoryActivity
import info.nightscout.androidaps.plugins.pump.omnipod.ui.PodManagementActivity
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionFragment
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitPodTask
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages.InitPodRefreshAction
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages.PodInfoFragment
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.removepod.RemoveActionFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.PodActivationWizardActivity
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.PodDeactivationWizardActivity
@Module
@Suppress("unused")
@@ -24,21 +21,23 @@ abstract class OmnipodModule {
abstract fun contributesPodManagementActivity(): PodManagementActivity
@ContributesAndroidInjector abstract fun contributesPodHistoryActivity(): PodHistoryActivity
- // Fragments
- @ContributesAndroidInjector abstract fun initActionFragment(): InitActionFragment
- @ContributesAndroidInjector abstract fun removeActionFragment(): RemoveActionFragment
- @ContributesAndroidInjector abstract fun podInfoFragment(): PodInfoFragment
+ @ActivityScope
+ @ContributesAndroidInjector(modules = [OmnipodWizardModule::class])
+ abstract fun contributesActivationWizardActivity(): PodActivationWizardActivity
+
+ @ActivityScope
+ @ContributesAndroidInjector(modules = [OmnipodWizardModule::class])
+ abstract fun contributesDeactivationWizardActivity(): PodDeactivationWizardActivity
// Service
@ContributesAndroidInjector
abstract fun omnipodCommunicationManagerProvider(): OmnipodRileyLinkCommunicationManager
// Data
- @ContributesAndroidInjector abstract fun initPodRefreshAction(): InitPodRefreshAction
- @ContributesAndroidInjector abstract fun initPodTask(): InitPodTask
@ContributesAndroidInjector abstract fun rlHistoryItemOmnipod(): RLHistoryItemOmnipod
companion object {
+
@Provides
fun podStateManagerProvider(aapsPodStateManager: AapsPodStateManager): PodStateManager = aapsPodStateManager
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodWizardModule.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodWizardModule.kt
new file mode 100644
index 0000000000..338534da78
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodWizardModule.kt
@@ -0,0 +1,93 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.dagger
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import dagger.Binds
+import dagger.Module
+import dagger.Provides
+import dagger.android.ContributesAndroidInjector
+import dagger.multibindings.IntoMap
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment.AttachPodInfoFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment.FillPodInfoFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment.InitializePodActionFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment.InsertCannulaActionFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment.PodActivatedInfoFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.viewmodel.InitializePodActionViewModel
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.viewmodel.InsertCannulaActionViewModel
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.fragment.DeactivatePodActionFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.fragment.DeactivatePodInfoFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.fragment.PodDeactivatedInfoFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.fragment.PodDiscardedInfoFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.viewmodel.DeactivatePodActionViewModel
+import javax.inject.Provider
+
+@Module
+abstract class OmnipodWizardModule {
+
+ companion object {
+
+ @Provides
+ @OmnipodPluginQualifier
+ fun providesViewModelFactory(@OmnipodPluginQualifier viewModels: MutableMap, @JvmSuppressWildcards Provider>): ViewModelProvider.Factory {
+ return ViewModelFactory(viewModels)
+ }
+ }
+
+ // #### VIEW MODELS ############################################################################
+ @Binds
+ @IntoMap
+ @OmnipodPluginQualifier
+ @ViewModelKey(InitializePodActionViewModel::class)
+ internal abstract fun initializePodActionViewModel(viewModel: InitializePodActionViewModel): ViewModel
+
+ @Binds
+ @IntoMap
+ @OmnipodPluginQualifier
+ @ViewModelKey(InsertCannulaActionViewModel::class)
+ internal abstract fun insertCannulaActionViewModel(viewModel: InsertCannulaActionViewModel): ViewModel
+
+ @Binds
+ @IntoMap
+ @OmnipodPluginQualifier
+ @ViewModelKey(DeactivatePodActionViewModel::class)
+ internal abstract fun deactivatePodActionViewModel(viewModel: DeactivatePodActionViewModel): ViewModel
+
+ // #### FRAGMENTS ##############################################################################
+ @FragmentScope
+ @ContributesAndroidInjector
+ internal abstract fun contributesDeactivatePodActionFragment(): DeactivatePodActionFragment
+
+ @FragmentScope
+ @ContributesAndroidInjector
+ internal abstract fun contributesInsertCannulaActionFragment(): InsertCannulaActionFragment
+
+ @FragmentScope
+ @ContributesAndroidInjector
+ internal abstract fun contributesInitializePodActionFragment(): InitializePodActionFragment
+
+ @FragmentScope
+ @ContributesAndroidInjector
+ internal abstract fun contributesAttachPodInfoFragment(): AttachPodInfoFragment
+
+ @FragmentScope
+ @ContributesAndroidInjector
+ internal abstract fun contributesDeactivatePodInfoFragment(): DeactivatePodInfoFragment
+
+ @FragmentScope
+ @ContributesAndroidInjector
+ internal abstract fun contributesFillPodInfoFragment(): FillPodInfoFragment
+
+ @FragmentScope
+ @ContributesAndroidInjector
+ internal abstract fun contributesPodDeactivatedInfoFragment(): PodDeactivatedInfoFragment
+
+ @FragmentScope
+ @ContributesAndroidInjector
+ internal abstract fun contributesPodDiscardedInfoFragment(): PodDiscardedInfoFragment
+
+ @FragmentScope
+ @ContributesAndroidInjector
+ internal abstract fun contributesPodActivatedInfoFragment(): PodActivatedInfoFragment
+}
+
+
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCommandType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCommandType.java
index b7be57c864..c6a20bb874 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCommandType.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCommandType.java
@@ -6,8 +6,8 @@ import info.nightscout.androidaps.plugins.pump.omnipod.R;
* Created by andy on 4.8.2019
*/
public enum OmnipodCommandType {
- PAIR_AND_PRIME_POD(R.string.omnipod_cmd_pair_and_prime), // First step of Pod activation
- FILL_CANNULA_AND_SET_BASAL_PROFILE(R.string.omnipod_cmd_fill_cannula_set_basal_profile), // Second step of Pod activation
+ INITIALIZE_POD(R.string.omnipod_cmd_initialize_pod), // First step of Pod activation
+ INSERT_CANNULA(R.string.omnipod_cmd_insert_cannula), // Second step of Pod activation
DEACTIVATE_POD(R.string.omnipod_cmd_deactivate_pod), //
SET_BASAL_PROFILE(R.string.omnipod_cmd_set_basal_schedule), //
SET_BOLUS(R.string.omnipod_cmd_set_bolus), //
@@ -19,10 +19,12 @@ public enum OmnipodCommandType {
SET_TIME(R.string.omnipod_cmd_set_time), //
CONFIGURE_ALERTS(R.string.omnipod_cmd_configure_alerts), //
ACKNOWLEDGE_ALERTS(R.string.omnipod_cmd_acknowledge_alerts), //
- GET_POD_PULSE_LOG(R.string.omnipod_cmd_get_pulse_log), //
- SUSPEND_DELIVERY(R.string.omnipod_cmd_suspend_delivery);
+ READ_POD_PULSE_LOG(R.string.omnipod_cmd_read_pulse_log), //
+ SUSPEND_DELIVERY(R.string.omnipod_cmd_suspend_delivery),
+ RESUME_DELIVERY(R.string.omnipod_cmd_resume_delivery),
+ PLAY_TEST_BEEP(R.string.omnipod_cmd_play_test_beep);
- private int resourceId;
+ private final int resourceId;
OmnipodCommandType(int resourceId) {
this.resourceId = resourceId;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCustomActionType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCustomActionType.java
deleted file mode 100644
index 9d9fbf3f13..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCustomActionType.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.definition;
-
-import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType;
-
-/**
- * Created by andy on 4.8.2019
- */
-
-public enum OmnipodCustomActionType implements CustomActionType {
- RESET_RILEY_LINK_CONFIGURATION;
-
- @Override
- public String getKey() {
- return this.name();
- }
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodStatusRequestType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodStatusRequestType.java
deleted file mode 100644
index c657f6fc6e..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodStatusRequestType.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.definition;
-
-public enum OmnipodStatusRequestType {
- ACKNOWLEDGE_ALERTS,
- GET_POD_STATE,
- GET_PULSE_LOG,
- SUSPEND_DELIVERY
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodStorageKeys.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodStorageKeys.java
index 9dae97c900..07601bb9bd 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodStorageKeys.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodStorageKeys.java
@@ -3,11 +3,9 @@ package info.nightscout.androidaps.plugins.pump.omnipod.definition;
import info.nightscout.androidaps.plugins.pump.omnipod.R;
public class OmnipodStorageKeys {
- private static final String PREFIX = "AAPS.Omnipod.";
-
public static class Preferences {
- public static final String POD_STATE = PREFIX + "pod_state";
- public static final String ACTIVE_BOLUS = PREFIX + "current_bolus";
+ public static final int POD_STATE = R.string.key_omnipod_pod_state;
+ public static final int ACTIVE_BOLUS = R.string.key_omnipod_current_bolus;
public static final int BASAL_BEEPS_ENABLED = R.string.key_omnipod_basal_beeps_enabled;
public static final int BOLUS_BEEPS_ENABLED = R.string.key_omnipod_bolus_beeps_enabled;
public static final int SMB_BEEPS_ENABLED = R.string.key_omnipod_smb_beeps_enabled;
@@ -19,11 +17,16 @@ public class OmnipodStorageKeys {
public static final int EXPIRATION_REMINDER_HOURS_BEFORE_SHUTDOWN = R.string.key_omnipod_expiration_reminder_hours_before_shutdown;
public static final int LOW_RESERVOIR_ALERT_ENABLED = R.string.key_omnipod_low_reservoir_alert_enabled;
public static final int LOW_RESERVOIR_ALERT_UNITS = R.string.key_omnipod_low_reservoir_alert_units;
+ public static final int NOTIFICATION_UNCERTAIN_TBR_SOUND_ENABLED = R.string.key_omnipod_notification_uncertain_tbr_sound_enabled;
+ public static final int NOTIFICATION_UNCERTAIN_SMB_SOUND_ENABLED = R.string.key_omnipod_notification_uncertain_smb_sound_enabled;
+ public static final int NOTIFICATION_UNCERTAIN_BOLUS_SOUND_ENABLED = R.string.key_omnipod_notification_uncertain_bolus_sound_enabled;
+ public static final int AUTOMATICALLY_ACKNOWLEDGE_ALERTS_ENABLED = R.string.key_omnipod_automatically_acknowledge_alerts_enabled;
+ public static final int RILEYLINK_STATS_BUTTON_ENABLED = R.string.key_omnipod_rileylink_stats_button_enabled;
}
public static class Statistics {
- public static final String TBRS_SET = PREFIX + "tbrs_set";
- public static final String STANDARD_BOLUSES_DELIVERED = PREFIX + "std_boluses_delivered";
- public static final String SMB_BOLUSES_DELIVERED = PREFIX + "smb_boluses_delivered";
+ public static final int TBRS_SET = R.string.key_omnipod_tbrs_set;
+ public static final int STANDARD_BOLUSES_DELIVERED = R.string.key_omnipod_std_boluses_delivered;
+ public static final int SMB_BOLUSES_DELIVERED = R.string.key_omnipod_smb_boluses_delivered;
}
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodHistoryEntryType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodHistoryEntryType.java
index cd15bac1a4..b367b7476c 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodHistoryEntryType.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodHistoryEntryType.java
@@ -13,16 +13,17 @@ import info.nightscout.androidaps.plugins.pump.omnipod.R;
*/
public enum PodHistoryEntryType {
- PAIR_AND_PRIME(1, R.string.omnipod_init_pod_wizard_step2_title, PumpHistoryEntryGroup.Prime),
- FILL_CANNULA_SET_BASAL_PROFILE(2, R.string.omnipod_init_pod_wizard_step4_title, PumpHistoryEntryGroup.Prime),
+ INITIALIZE_POD(1, R.string.omnipod_cmd_initialize_pod, PumpHistoryEntryGroup.Prime),
+ INSERT_CANNULA(2, R.string.omnipod_cmd_insert_cannula, PumpHistoryEntryGroup.Prime),
DEACTIVATE_POD(3, R.string.omnipod_cmd_deactivate_pod, PumpHistoryEntryGroup.Prime),
- RESET_POD_STATE(4, R.string.omnipod_cmd_discard_pod, PumpHistoryEntryGroup.Prime),
+ DISCARD_POD(4, R.string.omnipod_cmd_discard_pod, PumpHistoryEntryGroup.Prime),
SET_TEMPORARY_BASAL(10, R.string.omnipod_cmd_set_tbr, PumpHistoryEntryGroup.Basal),
CANCEL_TEMPORARY_BASAL_BY_DRIVER(11, R.string.omnipod_cmd_cancel_tbr_by_driver, PumpHistoryEntryGroup.Basal),
CANCEL_TEMPORARY_BASAL(12, R.string.omnipod_cmd_cancel_tbr, PumpHistoryEntryGroup.Basal),
SET_FAKE_SUSPENDED_TEMPORARY_BASAL(13, R.string.omnipod_cmd_set_fake_suspended_tbr, PumpHistoryEntryGroup.Basal),
CANCEL_FAKE_SUSPENDED_TEMPORARY_BASAL(14, R.string.omnipod_cmd_cancel_fake_suspended_tbr, PumpHistoryEntryGroup.Basal),
+ SPLIT_TEMPORARY_BASAL(15, R.string.omnipod_cmd_split_tbr, PumpHistoryEntryGroup.Basal),
SET_BASAL_SCHEDULE(20, R.string.omnipod_cmd_set_basal_schedule, PumpHistoryEntryGroup.Basal),
@@ -35,17 +36,18 @@ public enum PodHistoryEntryType {
CONFIGURE_ALERTS(50, R.string.omnipod_cmd_configure_alerts, PumpHistoryEntryGroup.Alarm),
ACKNOWLEDGE_ALERTS(51, R.string.omnipod_cmd_acknowledge_alerts, PumpHistoryEntryGroup.Alarm),
+ PLAY_TEST_BEEP(52, R.string.omnipod_cmd_play_test_beep, PumpHistoryEntryGroup.Alarm),
SUSPEND_DELIVERY(60, R.string.omnipod_cmd_suspend_delivery, PumpHistoryEntryGroup.Basal),
RESUME_DELIVERY(61, R.string.omnipod_cmd_resume_delivery, PumpHistoryEntryGroup.Basal),
UNKNOWN_ENTRY_TYPE(99, R.string.omnipod_cmd_unknown_entry);
- private int code;
+ private final int code;
private static final Map instanceMap;
@StringRes
- private int resourceId;
+ private final int resourceId;
private PumpHistoryEntryGroup group;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitActionType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitActionType.java
deleted file mode 100644
index 1424712010..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitActionType.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.definition;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.R;
-
-public enum PodInitActionType {
-
- PAIR_AND_PRIME_WIZARD_STEP(), //
- PAIR_POD(R.string.omnipod_init_pod_pair_pod, PAIR_AND_PRIME_WIZARD_STEP), //
- PRIME_POD(R.string.omnipod_init_pod_prime_pod, PAIR_AND_PRIME_WIZARD_STEP), //
-
- FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP(), //
- FILL_CANNULA(R.string.omnipod_init_pod_fill_cannula, FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP), //
- SET_BASAL_PROFILE(R.string.omnipod_init_pod_set_basal_profile, FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP), //
-
- DEACTIVATE_POD_WIZARD_STEP(), //
- CANCEL_DELIVERY(R.string.omnipod_deactivate_pod_cancel_delivery, DEACTIVATE_POD_WIZARD_STEP), //
- DEACTIVATE_POD(R.string.omnipod_deactivate_pod_deactivate_pod, DEACTIVATE_POD_WIZARD_STEP);
-
- private int resourceId;
- private PodInitActionType parent;
-
- PodInitActionType(int resourceId, PodInitActionType parent) {
- this.resourceId = resourceId;
- this.parent = parent;
- }
-
- PodInitActionType() {
- }
-
- public boolean isParent() {
- return this.parent == null;
- }
-
- public List getChildren() {
-
- List outList = new ArrayList<>();
-
- for (PodInitActionType value : values()) {
- if (value.parent == this) {
- outList.add(value);
- }
- }
-
- return outList;
- }
-
- public int getResourceId() {
- return resourceId;
- }
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitReceiver.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitReceiver.java
deleted file mode 100644
index 35f9f41229..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitReceiver.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.definition;
-
-public interface PodInitReceiver {
-
- void returnInitTaskStatus(PodInitActionType podInitActionType, boolean isSuccess, String errorMessage);
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/AcknowledgeAlertsAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/AcknowledgeAlertsAction.java
index 6ae13b159c..5b6da7d781 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/AcknowledgeAlertsAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/AcknowledgeAlertsAction.java
@@ -6,7 +6,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertSet;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertSlot;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
@@ -16,12 +15,12 @@ public class AcknowledgeAlertsAction implements OmnipodAction {
public AcknowledgeAlertsAction(PodStateManager podStateManager, AlertSet alerts) {
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
if (alerts == null) {
- throw new ActionInitializationException("Alert set can not be null");
+ throw new IllegalArgumentException("Alert set can not be null");
} else if (alerts.size() == 0) {
- throw new ActionInitializationException("Alert set can not be empty");
+ throw new IllegalArgumentException("Alert set can not be empty");
}
this.podStateManager = podStateManager;
this.alerts = alerts;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/AssignAddressAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/AssignAddressAction.java
index 9f8fc4296a..fb1127cecc 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/AssignAddressAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/AssignAddressAction.java
@@ -5,54 +5,68 @@ import org.joda.time.DateTimeZone;
import java.util.Collections;
import java.util.Random;
+import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.OmnipodMessage;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.AssignAddressCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.VersionResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PacketType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalMessageAddressException;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalPodProgressException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalPacketTypeException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalVersionResponseTypeException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
-public class AssignAddressAction implements OmnipodAction {
+public class AssignAddressAction implements OmnipodAction {
private final PodStateManager podStateManager;
+ private final AAPSLogger aapsLogger;
- public AssignAddressAction(PodStateManager podStateManager) {
+ public AssignAddressAction(PodStateManager podStateManager, AAPSLogger aapsLogger) {
if (podStateManager == null) {
throw new IllegalArgumentException("podStateManager can not be null");
}
+ if (aapsLogger == null) {
+ throw new IllegalArgumentException("Logger can not be null");
+ }
this.podStateManager = podStateManager;
+ this.aapsLogger = aapsLogger;
}
@Override
- public VersionResponse execute(OmnipodRileyLinkCommunicationManager communicationService) {
+ public Void execute(OmnipodRileyLinkCommunicationManager communicationService) {
if (!podStateManager.hasPodState()) {
podStateManager.initState(generateRandomAddress());
}
- if (podStateManager.isPodInitialized() && podStateManager.getPodProgressStatus().isAfter(PodProgressStatus.REMINDER_INITIALIZED)) {
- throw new IllegalPodProgressException(PodProgressStatus.REMINDER_INITIALIZED, podStateManager.getPodProgressStatus());
+
+ if (podStateManager.getActivationProgress().needsPairing()) {
+ AssignAddressCommand assignAddress = new AssignAddressCommand(podStateManager.getAddress());
+ OmnipodMessage assignAddressMessage = new OmnipodMessage(OmnipodConstants.DEFAULT_ADDRESS,
+ Collections.singletonList(assignAddress), podStateManager.getMessageNumber());
+
+ try {
+ VersionResponse assignAddressResponse = communicationService.exchangeMessages(VersionResponse.class, podStateManager, assignAddressMessage,
+ OmnipodConstants.DEFAULT_ADDRESS, podStateManager.getAddress());
+
+ if (!assignAddressResponse.isAssignAddressVersionResponse()) {
+ throw new IllegalVersionResponseTypeException("assignAddress", "setupPod");
+ }
+ if (assignAddressResponse.getAddress() != podStateManager.getAddress()) {
+ throw new IllegalMessageAddressException(podStateManager.getAddress(), assignAddressResponse.getAddress());
+ }
+
+ podStateManager.setInitializationParameters(assignAddressResponse.getLot(), assignAddressResponse.getTid(), //
+ assignAddressResponse.getPiVersion(), assignAddressResponse.getPmVersion(), DateTimeZone.getDefault(), assignAddressResponse.getPodProgressStatus());
+ } catch (IllegalPacketTypeException ex) {
+ if (ex.getActual() == PacketType.ACK && podStateManager.isPodInitialized()) {
+ // When we already assigned the address before, it's possible to only get an ACK here
+ aapsLogger.debug("Received ACK instead of response in AssignAddressAction. Ignoring because we already assigned the address successfully");
+ } else {
+ throw ex;
+ }
+ }
}
- AssignAddressCommand assignAddress = new AssignAddressCommand(podStateManager.getAddress());
- OmnipodMessage assignAddressMessage = new OmnipodMessage(OmnipodConstants.DEFAULT_ADDRESS,
- Collections.singletonList(assignAddress), podStateManager.getMessageNumber());
-
- VersionResponse assignAddressResponse = communicationService.exchangeMessages(VersionResponse.class, podStateManager, assignAddressMessage,
- OmnipodConstants.DEFAULT_ADDRESS, podStateManager.getAddress());
-
- if (!assignAddressResponse.isAssignAddressVersionResponse()) {
- throw new IllegalVersionResponseTypeException("assignAddress", "setupPod");
- }
- if (assignAddressResponse.getAddress() != podStateManager.getAddress()) {
- throw new IllegalMessageAddressException(podStateManager.getAddress(), assignAddressResponse.getAddress());
- }
-
- podStateManager.setInitializationParameters(assignAddressResponse.getLot(), assignAddressResponse.getTid(), //
- assignAddressResponse.getPiVersion(), assignAddressResponse.getPmVersion(), DateTimeZone.getDefault(), assignAddressResponse.getPodProgressStatus());
-
- return assignAddressResponse;
+ return null;
}
private static int generateRandomAddress() {
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/BolusAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/BolusAction.java
index c87ccdb497..b58935eeb5 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/BolusAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/BolusAction.java
@@ -9,7 +9,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.SetInsulinScheduleCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BolusDeliverySchedule;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
@@ -23,10 +22,10 @@ public class BolusAction implements OmnipodAction {
public BolusAction(PodStateManager podStateManager, double units, Duration timeBetweenPulses,
boolean acknowledgementBeep, boolean completionBeep) {
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
if (timeBetweenPulses == null) {
- throw new ActionInitializationException("Time between pulses cannot be null");
+ throw new IllegalArgumentException("Time between pulses cannot be null");
}
this.podStateManager = podStateManager;
this.units = units;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/CancelDeliveryAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/CancelDeliveryAction.java
index 7b83b3ee96..b0b4c0ad18 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/CancelDeliveryAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/CancelDeliveryAction.java
@@ -10,7 +10,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.BeepType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.DeliveryType;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
@@ -22,10 +21,10 @@ public class CancelDeliveryAction implements OmnipodAction {
public CancelDeliveryAction(PodStateManager podStateManager, EnumSet deliveryTypes,
boolean acknowledgementBeep) {
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
if (deliveryTypes == null) {
- throw new ActionInitializationException("Delivery types cannot be null");
+ throw new IllegalArgumentException("Delivery types cannot be null");
}
this.podStateManager = podStateManager;
this.deliveryTypes = deliveryTypes;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/ConfigureAlertsAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/ConfigureAlertsAction.java
index bc4235c2e0..345127e91e 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/ConfigureAlertsAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/ConfigureAlertsAction.java
@@ -5,7 +5,6 @@ import java.util.List;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.ConfigureAlertsCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertConfiguration;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
@@ -15,10 +14,10 @@ public class ConfigureAlertsAction implements OmnipodAction {
public ConfigureAlertsAction(PodStateManager podStateManager, List alertConfigurations) {
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
if (alertConfigurations == null) {
- throw new ActionInitializationException("Alert configurations cannot be null");
+ throw new IllegalArgumentException("Alert configurations cannot be null");
}
this.podStateManager = podStateManager;
this.alertConfigurations = alertConfigurations;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/ConfigureBeepAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/ConfigureBeepAction.java
new file mode 100644
index 0000000000..e5c0e0dbb4
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/ConfigureBeepAction.java
@@ -0,0 +1,48 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action;
+
+import org.joda.time.Duration;
+
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.BeepConfigCommand;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.BeepConfigType;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
+import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
+
+public class ConfigureBeepAction implements OmnipodAction {
+ private final PodStateManager podStateManager;
+ private final BeepConfigType beepType;
+ private final boolean basalCompletionBeep;
+ private final Duration basalIntervalBeep;
+ private final boolean tempBasalCompletionBeep;
+ private final Duration tempBasalIntervalBeep;
+ private final boolean bolusCompletionBeep;
+ private final Duration bolusIntervalBeep;
+
+ public ConfigureBeepAction(PodStateManager podState, BeepConfigType beepType, boolean basalCompletionBeep, Duration basalIntervalBeep, boolean tempBasalCompletionBeep, Duration tempBasalIntervalBeep, boolean bolusCompletionBeep, Duration bolusIntervalBeep) {
+ if (podState == null || beepType == null) {
+ throw new IllegalArgumentException("Required parameter(s) missing");
+ }
+
+ this.beepType = beepType;
+ this.basalCompletionBeep = basalCompletionBeep;
+ this.basalIntervalBeep = basalIntervalBeep;
+ this.tempBasalCompletionBeep = tempBasalCompletionBeep;
+ this.tempBasalIntervalBeep = tempBasalIntervalBeep;
+ this.bolusCompletionBeep = bolusCompletionBeep;
+ this.bolusIntervalBeep = bolusIntervalBeep;
+ this.podStateManager = podState;
+ }
+
+ public ConfigureBeepAction(PodStateManager podState, BeepConfigType beepType) {
+ this(podState, beepType, false, Duration.ZERO, false, Duration.ZERO, false, Duration.ZERO);
+ }
+
+ @Override
+ public StatusResponse execute(OmnipodRileyLinkCommunicationManager communicationService) {
+ return communicationService.sendCommand(
+ StatusResponse.class, podStateManager,
+ new BeepConfigCommand(beepType, basalCompletionBeep, basalIntervalBeep,
+ tempBasalCompletionBeep, tempBasalIntervalBeep,
+ bolusCompletionBeep, bolusIntervalBeep));
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/DeactivatePodAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/DeactivatePodAction.java
index efe855b82f..266396d6e4 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/DeactivatePodAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/DeactivatePodAction.java
@@ -5,7 +5,6 @@ import java.util.EnumSet;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.DeactivatePodCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.DeliveryType;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodFaultException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
@@ -16,7 +15,7 @@ public class DeactivatePodAction implements OmnipodAction {
public DeactivatePodAction(PodStateManager podStateManager, boolean acknowledgementBeep) {
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
this.podStateManager = podStateManager;
this.acknowledgementBeep = acknowledgementBeep;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/GetPodInfoAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/GetPodInfoAction.java
index cc925c6e4c..217c768a78 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/GetPodInfoAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/GetPodInfoAction.java
@@ -3,7 +3,6 @@ package info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.act
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.GetStatusCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodInfoType;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
@@ -13,10 +12,10 @@ public class GetPodInfoAction implements OmnipodAction {
public GetPodInfoAction(PodStateManager podStateManager, PodInfoType podInfoType) {
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
if (podInfoType == null) {
- throw new ActionInitializationException("Pod info type cannot be null");
+ throw new IllegalArgumentException("Pod info type cannot be null");
}
this.podStateManager = podStateManager;
this.podInfoType = podInfoType;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/GetStatusAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/GetStatusAction.java
index aac7b55d6c..27d1f3a129 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/GetStatusAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/GetStatusAction.java
@@ -3,7 +3,6 @@ package info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.act
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.GetStatusCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodInfoType;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
@@ -12,7 +11,7 @@ public class GetStatusAction implements OmnipodAction {
public GetStatusAction(PodStateManager podState) {
if (podState == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
this.podStateManager = podState;
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/InsertCannulaAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/InsertCannulaAction.java
index b364aa8c81..a6fdd139d9 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/InsertCannulaAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/InsertCannulaAction.java
@@ -6,17 +6,15 @@ import java.util.List;
import java.util.Optional;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.service.ExpirationReminderBuilder;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertConfiguration;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BasalSchedule;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalPodProgressException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalActivationProgressException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
-public class InsertCannulaAction implements OmnipodAction {
+public class InsertCannulaAction implements OmnipodAction {
private final PodStateManager podStateManager;
private final BasalSchedule initialBasalSchedule;
@@ -26,10 +24,10 @@ public class InsertCannulaAction implements OmnipodAction {
public InsertCannulaAction(PodStateManager podStateManager, BasalSchedule initialBasalSchedule,
Duration expirationReminderTimeBeforeShutdown, Integer lowReservoirAlertUnits) {
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
if (initialBasalSchedule == null) {
- throw new ActionInitializationException("Initial basal schedule cannot be null");
+ throw new IllegalArgumentException("Initial basal schedule cannot be null");
}
this.podStateManager = podStateManager;
this.initialBasalSchedule = initialBasalSchedule;
@@ -38,31 +36,33 @@ public class InsertCannulaAction implements OmnipodAction {
}
@Override
- public StatusResponse execute(OmnipodRileyLinkCommunicationManager communicationService) {
- if (!podStateManager.isPodInitialized() || podStateManager.getPodProgressStatus().isBefore(PodProgressStatus.PRIMING_COMPLETED)) {
- throw new IllegalPodProgressException(PodProgressStatus.PRIMING_COMPLETED, podStateManager.isPodInitialized() ? podStateManager.getPodProgressStatus() : null);
+ public Void execute(OmnipodRileyLinkCommunicationManager communicationService) {
+ if (podStateManager.getActivationProgress().isBefore(ActivationProgress.PRIMING_COMPLETED)) {
+ throw new IllegalActivationProgressException(ActivationProgress.PRIMING_COMPLETED, podStateManager.getActivationProgress());
}
- if (podStateManager.getPodProgressStatus().isBefore(PodProgressStatus.BASAL_INITIALIZED)) {
+ if (podStateManager.getActivationProgress().needsBasalSchedule()) {
podStateManager.setBasalSchedule(initialBasalSchedule);
communicationService.executeAction(new SetBasalScheduleAction(podStateManager, initialBasalSchedule,
true, podStateManager.getScheduleOffset(), false));
+ podStateManager.setActivationProgress(ActivationProgress.BASAL_INITIALIZED);
}
- if (podStateManager.getPodProgressStatus().isBefore(PodProgressStatus.INSERTING_CANNULA)) {
+ if (podStateManager.getActivationProgress().needsExpirationReminders()) {
communicationService.executeAction(new ConfigureAlertsAction(podStateManager, buildAlertConfigurations()));
podStateManager.setExpirationAlertTimeBeforeShutdown(expirationReminderTimeBeforeShutdown);
podStateManager.setLowReservoirAlertUnits(lowReservoirAlertUnits);
-
- return communicationService.executeAction(new BolusAction(podStateManager, OmnipodConstants.POD_CANNULA_INSERTION_BOLUS_UNITS,
- Duration.standardSeconds(1), false, false));
- } else if (podStateManager.getPodProgressStatus().equals(PodProgressStatus.INSERTING_CANNULA)) {
- // Check status
- return communicationService.executeAction(new GetStatusAction(podStateManager));
- } else {
- throw new IllegalPodProgressException(null, podStateManager.getPodProgressStatus());
+ podStateManager.setActivationProgress(ActivationProgress.EXPIRATION_REMINDERS_SET);
}
+
+ if (podStateManager.getActivationProgress().needsCannulaInsertion()) {
+ communicationService.executeAction(new BolusAction(podStateManager, OmnipodConstants.POD_CANNULA_INSERTION_BOLUS_UNITS,
+ Duration.standardSeconds(1), false, true));
+ podStateManager.setActivationProgress(ActivationProgress.INSERTING_CANNULA);
+ }
+
+ return null;
}
private List buildAlertConfigurations() {
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/PrimeAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/PrimeAction.java
index 115ad1c6b1..c1269e3e39 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/PrimeAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/PrimeAction.java
@@ -1,45 +1,49 @@
package info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.service.PrimeService;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalPodProgressException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalActivationProgressException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
-public class PrimeAction implements OmnipodAction {
+public class PrimeAction implements OmnipodAction {
private final PrimeService service;
private final PodStateManager podStateManager;
public PrimeAction(PrimeService primeService, PodStateManager podStateManager) {
if (primeService == null) {
- throw new ActionInitializationException("Prime service cannot be null");
+ throw new IllegalArgumentException("Prime service cannot be null");
}
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
this.service = primeService;
this.podStateManager = podStateManager;
}
@Override
- public StatusResponse execute(OmnipodRileyLinkCommunicationManager communicationService) {
- if (!podStateManager.isPodInitialized() || podStateManager.getPodProgressStatus().isBefore(PodProgressStatus.PAIRING_COMPLETED)) {
- throw new IllegalPodProgressException(PodProgressStatus.PAIRING_COMPLETED, podStateManager.isPodInitialized() ? podStateManager.getPodProgressStatus() : null);
+ public Void execute(OmnipodRileyLinkCommunicationManager communicationService) {
+ if (podStateManager.getActivationProgress().isBefore(ActivationProgress.PAIRING_COMPLETED)) {
+ throw new IllegalActivationProgressException(ActivationProgress.PAIRING_COMPLETED, podStateManager.getActivationProgress());
}
- if (podStateManager.getPodProgressStatus().isBefore(PodProgressStatus.PRIMING)) {
+
+ if (podStateManager.getActivationProgress().needsDisableTab5Sub16And17()) {
// FaultConfigCommand sets internal pod variables to effectively disable $6x faults which occur more often with a 0 TBR
service.executeDisableTab5Sub16And17FaultConfigCommand(communicationService, podStateManager);
-
- service.executeFinishSetupReminderAlertCommand(communicationService, podStateManager);
- return service.executePrimeBolusCommand(communicationService, podStateManager);
- } else if (podStateManager.getPodProgressStatus().equals(PodProgressStatus.PRIMING)) {
- // Check status
- return communicationService.executeAction(new GetStatusAction(podStateManager));
- } else {
- throw new IllegalPodProgressException(null, podStateManager.getPodProgressStatus());
+ podStateManager.setActivationProgress(ActivationProgress.TAB_5_SUB_16_AND_17_DISABLED);
}
+
+ if (podStateManager.getActivationProgress().needsSetupReminders()) {
+ service.executeFinishSetupReminderAlertCommand(communicationService, podStateManager);
+ podStateManager.setActivationProgress(ActivationProgress.SETUP_REMINDERS_SET);
+ }
+
+ if (podStateManager.getActivationProgress().needsPriming()) {
+ service.executePrimeBolusCommand(communicationService, podStateManager);
+ podStateManager.setActivationProgress(ActivationProgress.PRIMING);
+ }
+
+ return null;
}
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetBasalScheduleAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetBasalScheduleAction.java
index a64766c5d3..4b35bb781c 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetBasalScheduleAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetBasalScheduleAction.java
@@ -9,7 +9,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.SetInsulinScheduleCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BasalSchedule;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
@@ -23,13 +22,13 @@ public class SetBasalScheduleAction implements OmnipodAction {
public SetBasalScheduleAction(PodStateManager podStateManager, BasalSchedule basalSchedule,
boolean confidenceReminder, Duration scheduleOffset, boolean acknowledgementBeep) {
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
if (basalSchedule == null) {
- throw new ActionInitializationException("Basal schedule cannot be null");
+ throw new IllegalArgumentException("Basal schedule cannot be null");
}
if (scheduleOffset == null) {
- throw new ActionInitializationException("Schedule offset cannot be null");
+ throw new IllegalArgumentException("Schedule offset cannot be null");
}
this.podStateManager = podStateManager;
this.basalSchedule = basalSchedule;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetTempBasalAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetTempBasalAction.java
index cadb602f68..e33de1f8c5 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetTempBasalAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetTempBasalAction.java
@@ -10,7 +10,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.SetInsulinScheduleCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.TempBasalExtraCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
@@ -24,10 +23,10 @@ public class SetTempBasalAction implements OmnipodAction {
public SetTempBasalAction(PodStateManager podStateManager, double rate, Duration duration,
boolean acknowledgementBeep, boolean completionBeep) {
if (podStateManager == null) {
- throw new ActionInitializationException("Pod state manager cannot be null");
+ throw new IllegalArgumentException("Pod state manager cannot be null");
}
if (duration == null) {
- throw new ActionInitializationException("Duration cannot be null");
+ throw new IllegalArgumentException("Duration cannot be null");
}
this.podStateManager = podStateManager;
this.rate = rate;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetupPodAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetupPodAction.java
index f811e711db..8cb2a1ddde 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetupPodAction.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/SetupPodAction.java
@@ -4,49 +4,72 @@ import org.joda.time.DateTime;
import java.util.Collections;
+import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.OmnipodMessage;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.SetupPodCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.VersionResponse;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PacketType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalMessageAddressException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalPacketTypeException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalPodProgressException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalVersionResponseTypeException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
-public class SetupPodAction implements OmnipodAction {
+public class SetupPodAction implements OmnipodAction {
private final PodStateManager podStateManager;
+ private final AAPSLogger aapsLogger;
- public SetupPodAction(PodStateManager podStateManager) {
+ public SetupPodAction(PodStateManager podStateManager, AAPSLogger aapsLogger) {
if (podStateManager == null) {
throw new IllegalArgumentException("Pod state manager can not be null");
}
+ if (aapsLogger == null) {
+ throw new IllegalArgumentException("Logger can not be null");
+ }
this.podStateManager = podStateManager;
+ this.aapsLogger = aapsLogger;
}
@Override
- public VersionResponse execute(OmnipodRileyLinkCommunicationManager communicationService) {
- if (!podStateManager.isPodInitialized() || !podStateManager.getPodProgressStatus().equals(PodProgressStatus.REMINDER_INITIALIZED)) {
+ public Void execute(OmnipodRileyLinkCommunicationManager communicationService) {
+ if (!podStateManager.isPodInitialized()) {
throw new IllegalPodProgressException(PodProgressStatus.REMINDER_INITIALIZED, podStateManager.isPodInitialized() ? podStateManager.getPodProgressStatus() : null);
}
- DateTime activationDate = DateTime.now(podStateManager.getTimeZone());
- SetupPodCommand setupPodCommand = new SetupPodCommand(podStateManager.getAddress(), activationDate,
- podStateManager.getLot(), podStateManager.getTid());
- OmnipodMessage message = new OmnipodMessage(OmnipodConstants.DEFAULT_ADDRESS,
- Collections.singletonList(setupPodCommand), podStateManager.getMessageNumber());
- VersionResponse setupPodResponse;
- setupPodResponse = communicationService.exchangeMessages(VersionResponse.class, podStateManager,
- message, OmnipodConstants.DEFAULT_ADDRESS, podStateManager.getAddress());
+ if (podStateManager.getActivationProgress().needsPairing()) {
+ DateTime activationDate = DateTime.now(podStateManager.getTimeZone());
- if (!setupPodResponse.isSetupPodVersionResponse()) {
- throw new IllegalVersionResponseTypeException("setupPod", "assignAddress");
- }
- if (setupPodResponse.getAddress() != podStateManager.getAddress()) {
- throw new IllegalMessageAddressException(podStateManager.getAddress(), setupPodResponse.getAddress());
+ SetupPodCommand setupPodCommand = new SetupPodCommand(podStateManager.getAddress(), activationDate,
+ podStateManager.getLot(), podStateManager.getTid());
+ OmnipodMessage message = new OmnipodMessage(OmnipodConstants.DEFAULT_ADDRESS,
+ Collections.singletonList(setupPodCommand), podStateManager.getMessageNumber());
+
+ try {
+ VersionResponse setupPodResponse = communicationService.exchangeMessages(VersionResponse.class, podStateManager,
+ message, OmnipodConstants.DEFAULT_ADDRESS, podStateManager.getAddress());
+
+ if (!setupPodResponse.isSetupPodVersionResponse()) {
+ throw new IllegalVersionResponseTypeException("setupPod", "assignAddress");
+ }
+ if (setupPodResponse.getAddress() != podStateManager.getAddress()) {
+ throw new IllegalMessageAddressException(podStateManager.getAddress(), setupPodResponse.getAddress());
+ }
+ } catch (IllegalPacketTypeException ex) {
+ if (PacketType.ACK.equals(ex.getActual())) {
+ // Pod is already configured
+ aapsLogger.debug("Received ACK instead of response in SetupPodAction. Ignoring");
+ } else {
+ throw ex;
+ }
+ }
+
+ podStateManager.setActivationProgress(ActivationProgress.PAIRING_COMPLETED);
}
- return setupPodResponse;
+ return null;
}
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/service/ExpirationReminderBuilder.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/service/ExpirationReminderBuilder.java
index 990bed5de6..0c39fefd99 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/service/ExpirationReminderBuilder.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/service/ExpirationReminderBuilder.java
@@ -17,11 +17,9 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.util.AlertConfigur
public final class ExpirationReminderBuilder {
private final Map alerts = new HashMap<>();
private final DateTime endOfServiceTime;
- private final PodStateManager podStateManager;
public ExpirationReminderBuilder(PodStateManager podStateManager) {
this.endOfServiceTime = podStateManager.getActivatedAt().plus(OmnipodConstants.SERVICE_DURATION);
- this.podStateManager = podStateManager;
}
public ExpirationReminderBuilder defaults() {
@@ -45,21 +43,17 @@ public final class ExpirationReminderBuilder {
public ExpirationReminderBuilder expirationAdvisory(boolean active, Duration timeBeforeShutdown) {
DateTime expirationAdvisoryAlarmTime = endOfServiceTime.minus(timeBeforeShutdown);
- if (DateTime.now().isBefore(expirationAdvisoryAlarmTime)) {
- Duration timeUntilExpirationAdvisoryAlarm = new Duration(DateTime.now(),
- expirationAdvisoryAlarmTime);
- AlertConfiguration expirationAdvisoryAlertConfiguration = AlertConfigurationUtil.createExpirationAdvisoryAlertConfiguration(active,
- timeUntilExpirationAdvisoryAlarm, timeBeforeShutdown);
- alerts.put(expirationAdvisoryAlertConfiguration.getAlertSlot(), expirationAdvisoryAlertConfiguration);
- }
+ Duration timeUntilExpirationAdvisoryAlarm = DateTime.now().isBefore(expirationAdvisoryAlarmTime) ? new Duration(DateTime.now(),
+ expirationAdvisoryAlarmTime) : Duration.ZERO;
+ AlertConfiguration expirationAdvisoryAlertConfiguration = AlertConfigurationUtil.createExpirationAdvisoryAlertConfiguration(active,
+ timeUntilExpirationAdvisoryAlarm, timeBeforeShutdown);
+ alerts.put(expirationAdvisoryAlertConfiguration.getAlertSlot(), expirationAdvisoryAlertConfiguration);
return this;
}
public ExpirationReminderBuilder lowReservoir(boolean active, int units) {
- if (podStateManager.getReservoirLevel() == null || podStateManager.getReservoirLevel().intValue() > units) {
- AlertConfiguration lowReservoirAlertConfiguration = AlertConfigurationUtil.createLowReservoirAlertConfiguration(active, (double) units);
- alerts.put(lowReservoirAlertConfiguration.getAlertSlot(), lowReservoirAlertConfiguration);
- }
+ AlertConfiguration lowReservoirAlertConfiguration = AlertConfigurationUtil.createLowReservoirAlertConfiguration(active, (double) units);
+ alerts.put(lowReservoirAlertConfiguration.getAlertSlot(), lowReservoirAlertConfiguration);
return this;
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/service/PrimeService.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/service/PrimeService.java
index 062731e002..ed75d439be 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/service/PrimeService.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/service/PrimeService.java
@@ -32,6 +32,6 @@ public class PrimeService {
public StatusResponse executePrimeBolusCommand(OmnipodRileyLinkCommunicationManager communicationService, PodStateManager podStateManager) {
return communicationService.executeAction(new BolusAction(podStateManager, OmnipodConstants.POD_PRIME_BOLUS_UNITS,
- Duration.standardSeconds(1), false, false));
+ Duration.standardSeconds(1), false, true));
}
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/OmnipodMessage.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/OmnipodMessage.java
index 995121c1c3..e0c7bf9848 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/OmnipodMessage.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/OmnipodMessage.java
@@ -3,10 +3,15 @@ package info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mes
import java.util.ArrayList;
import java.util.List;
+import info.nightscout.androidaps.logging.AAPSLogger;
+import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.CancelDeliveryCommand;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.command.GetStatusCommand;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.DeliveryType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.MessageBlockType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodCrc;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PacketType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodInfoType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CrcMismatchException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.MessageDecodingException;
@@ -91,8 +96,11 @@ public class OmnipodMessage {
return encodedData;
}
- public void padWithGetStatusCommands(int packetSize) {
- while (getEncoded().length < packetSize) {
+ public void padWithGetStatusCommands(int packetSize, AAPSLogger aapsLogger) {
+ while (getEncoded().length <= packetSize) {
+ if (getEncoded().length == PacketType.PDM.getMaxBodyLength()) {
+ aapsLogger.debug(LTag.PUMPBTCOMM, "Message length equals max body length: {}", this);
+ }
messageBlocks.add(new GetStatusCommand(PodInfoType.NORMAL));
}
}
@@ -139,6 +147,14 @@ public class OmnipodMessage {
return false;
}
+ public boolean isSetTempBasalMessage() {
+ return messageBlocks.size() >= 2 && messageBlocks.get(0).getType() == MessageBlockType.SET_INSULIN_SCHEDULE && messageBlocks.get(1).getType() == MessageBlockType.TEMP_BASAL_EXTRA;
+ }
+
+ public boolean isCancelTempBasalMessage() {
+ return messageBlocks.size() >= 1 && messageBlocks.get(0).getType() == MessageBlockType.CANCEL_DELIVERY && ((CancelDeliveryCommand) messageBlocks.get(0)).getDeliveryTypes().contains(DeliveryType.TEMP_BASAL);
+ }
+
@Override
public String toString() {
return "OmnipodMessage{" +
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/BeepConfigCommand.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/BeepConfigCommand.java
index fc36e68eab..47cf4533ba 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/BeepConfigCommand.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/BeepConfigCommand.java
@@ -30,10 +30,6 @@ public class BeepConfigCommand extends MessageBlock {
encode();
}
- public BeepConfigCommand(BeepConfigType beepType) {
- this(beepType, false, Duration.ZERO, false, Duration.ZERO, false, Duration.ZERO);
- }
-
private void encode() {
encodedData = new byte[]{beepType.getValue()};
encodedData = ByteUtil.concat(encodedData, (byte) ((basalCompletionBeep ? (1 << 6) : 0) + (basalIntervalBeep.getStandardMinutes() & 0x3f)));
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/BolusExtraCommand.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/BolusExtraCommand.java
index 465d1dee13..6ec315aa16 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/BolusExtraCommand.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/BolusExtraCommand.java
@@ -6,7 +6,6 @@ import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.MessageBlock;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.MessageBlockType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommandInitializationException;
public class BolusExtraCommand extends MessageBlock {
private final boolean acknowledgementBeep;
@@ -29,9 +28,9 @@ public class BolusExtraCommand extends MessageBlock {
boolean acknowledgementBeep, boolean completionBeep,
Duration programReminderInterval, Duration timeBetweenPulses) {
if (units <= 0D) {
- throw new CommandInitializationException("Units should be > 0");
+ throw new IllegalArgumentException("Units should be > 0");
} else if (units > OmnipodConstants.MAX_BOLUS) {
- throw new CommandInitializationException("Units exceeds max bolus");
+ throw new IllegalArgumentException("Units exceeds max bolus");
}
this.units = units;
this.squareWaveUnits = squareWaveUnits;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/CancelDeliveryCommand.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/CancelDeliveryCommand.java
index 71eb4084d4..be8f09230f 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/CancelDeliveryCommand.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/CancelDeliveryCommand.java
@@ -60,6 +60,10 @@ public class CancelDeliveryCommand extends NonceResyncableMessageBlock {
encode();
}
+ public EnumSet getDeliveryTypes() {
+ return deliveryTypes.clone();
+ }
+
@Override
public String toString() {
return "CancelDeliveryCommand{" +
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/SetInsulinScheduleCommand.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/SetInsulinScheduleCommand.java
index 88ad5d206d..c9089559cb 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/SetInsulinScheduleCommand.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/SetInsulinScheduleCommand.java
@@ -12,7 +12,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedul
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BolusDeliverySchedule;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.DeliverySchedule;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.TempBasalDeliverySchedule;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommandInitializationException;
public class SetInsulinScheduleCommand extends NonceResyncableMessageBlock {
@@ -51,12 +50,12 @@ public class SetInsulinScheduleCommand extends NonceResyncableMessageBlock {
// Temp basal
public SetInsulinScheduleCommand(int nonce, double tempBasalRate, Duration duration) {
if (tempBasalRate < 0D) {
- throw new CommandInitializationException("Rate should be >= 0");
+ throw new IllegalArgumentException("Rate should be >= 0");
} else if (tempBasalRate > OmnipodConstants.MAX_BASAL_RATE) {
- throw new CommandInitializationException("Rate exceeds max basal rate");
+ throw new IllegalArgumentException("Rate exceeds max basal rate");
}
if (duration.isLongerThan(OmnipodConstants.MAX_TEMP_BASAL_DURATION)) {
- throw new CommandInitializationException("Duration exceeds max temp basal duration");
+ throw new IllegalArgumentException("Duration exceeds max temp basal duration");
}
int pulsesPerHour = (int) Math.round(tempBasalRate / OmnipodConstants.POD_PULSE_SIZE);
int pulsesPerSegment = pulsesPerHour / 2;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/TempBasalExtraCommand.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/TempBasalExtraCommand.java
index 031b36af71..8f5cf5053b 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/TempBasalExtraCommand.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/command/TempBasalExtraCommand.java
@@ -10,7 +10,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.MessageBlockType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.RateEntry;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommandInitializationException;
public class TempBasalExtraCommand extends MessageBlock {
private final boolean acknowledgementBeep;
@@ -24,12 +23,15 @@ public class TempBasalExtraCommand extends MessageBlock {
public TempBasalExtraCommand(double rate, Duration duration, boolean acknowledgementBeep, boolean completionBeep,
Duration programReminderInterval) {
if (rate < 0D) {
- throw new CommandInitializationException("Rate should be >= 0");
+ throw new IllegalArgumentException("Rate should be >= 0");
} else if (rate > OmnipodConstants.MAX_BASAL_RATE) {
- throw new CommandInitializationException("Rate exceeds max basal rate");
+ throw new IllegalArgumentException("Rate exceeds max basal rate");
}
- if (duration.isLongerThan(OmnipodConstants.MAX_TEMP_BASAL_DURATION)) {
- throw new CommandInitializationException("Duration exceeds max temp basal duration");
+
+ if (duration.isShorterThan(Duration.ZERO) || duration.equals(Duration.ZERO)) {
+ throw new IllegalArgumentException("Duration should be > 0");
+ } else if (duration.isLongerThan(OmnipodConstants.MAX_TEMP_BASAL_DURATION)) {
+ throw new IllegalArgumentException("Duration exceeds max temp basal duration");
}
this.acknowledgementBeep = acknowledgementBeep;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/ErrorResponse.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/ErrorResponse.java
index 2ef230ba2f..58f68ca6fd 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/ErrorResponse.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/ErrorResponse.java
@@ -12,9 +12,11 @@ public class ErrorResponse extends MessageBlock {
private static final int MESSAGE_LENGTH = 5;
private final byte errorResponseCode;
- private Integer nonceSearchKey; // only valid for BAD_NONCE
- private FaultEventCode faultEventCode; // valid for all but BAD_NONCE
- private PodProgressStatus podProgressStatus; // valid for all but BAD_NONCE
+
+ private final Integer nonceSearchKey; // only valid for BAD_NONCE
+ private final FaultEventCode faultEventCode; // valid for all but BAD_NONCE
+
+ private final PodProgressStatus podProgressStatus; // valid for all but BAD_NONCE
public ErrorResponse(byte[] encodedData) {
if (encodedData.length < MESSAGE_LENGTH) {
@@ -24,11 +26,16 @@ public class ErrorResponse extends MessageBlock {
errorResponseCode = encodedData[2];
- if (this.errorResponseCode == ERROR_RESPONSE_CODE_BAD_NONCE) {
+ if (errorResponseCode == ERROR_RESPONSE_CODE_BAD_NONCE) {
nonceSearchKey = ByteUtil.makeUnsignedShort(encodedData[3], encodedData[4]);
+
+ faultEventCode = null;
+ podProgressStatus = null;
} else {
faultEventCode = FaultEventCode.fromByte(encodedData[3]);
podProgressStatus = PodProgressStatus.fromByte(encodedData[4]);
+
+ nonceSearchKey = null;
}
}
@@ -53,8 +60,7 @@ public class ErrorResponse extends MessageBlock {
return nonceSearchKey;
}
- @Override
- public String toString() {
+ @Override public String toString() {
return "ErrorResponse{" +
"errorResponseCode=" + errorResponseCode +
", nonceSearchKey=" + nonceSearchKey +
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoActiveAlerts.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoActiveAlerts.java
index 6723a0a0da..36e1b1a213 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoActiveAlerts.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoActiveAlerts.java
@@ -3,7 +3,6 @@ package info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mes
import org.joda.time.Duration;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
@@ -54,7 +53,7 @@ public class PodInfoActiveAlerts extends PodInfo {
@Override
public String toString() {
return "PodInfoActiveAlerts{" +
- "word278=" + Arrays.toString(word278) +
+ "word278=" + ByteUtil.shortHexString(word278) +
", alertActivations=" + alertActivations +
'}';
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoFaultEvent.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoDetailedStatus.java
similarity index 80%
rename from omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoFaultEvent.java
rename to omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoDetailedStatus.java
index d099894ab6..0db5ed2b53 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoFaultEvent.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoDetailedStatus.java
@@ -6,13 +6,13 @@ import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusUpdatableResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertSet;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.DeliveryStatus;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ErrorEventInfo;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.FaultEventCode;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.LogEventErrorCode;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodInfoType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
-public class PodInfoFaultEvent extends PodInfo implements StatusUpdatableResponse {
+public class PodInfoDetailedStatus extends PodInfo implements StatusUpdatableResponse {
private static final int MINIMUM_MESSAGE_LENGTH = 21;
private final PodProgressStatus podProgressStatus;
@@ -27,14 +27,13 @@ public class PodInfoFaultEvent extends PodInfo implements StatusUpdatableRespons
private final Duration timeActive;
private final AlertSet unacknowledgedAlerts;
private final boolean faultAccessingTables;
- private final LogEventErrorCode logEventErrorType;
- private final PodProgressStatus logEventErrorPodProgressStatus;
+ private final ErrorEventInfo errorEventInfo;
private final byte receiverLowGain;
private final byte radioRSSI;
- private final PodProgressStatus podProgressStatusAtTimeOfFirstLoggedFaultEvent;
+ private final PodProgressStatus previousPodProgressStatus;
private final byte[] unknownValue;
- public PodInfoFaultEvent(byte[] encodedData) {
+ public PodInfoDetailedStatus(byte[] encodedData) {
super(encodedData);
if (encodedData.length < MINIMUM_MESSAGE_LENGTH) {
@@ -69,17 +68,33 @@ public class PodInfoFaultEvent extends PodInfo implements StatusUpdatableRespons
unacknowledgedAlerts = new AlertSet(encodedData[15]);
faultAccessingTables = encodedData[16] == 0x02;
- logEventErrorType = LogEventErrorCode.fromByte((byte) (encodedData[17] >>> 4));
- logEventErrorPodProgressStatus = PodProgressStatus.fromByte((byte) (encodedData[17] & 0x0f));
+ byte rawErrorEventInfo = encodedData[17];
+ if (rawErrorEventInfo == 0x00) {
+ errorEventInfo = null;
+ } else {
+ errorEventInfo = ErrorEventInfo.fromByte(rawErrorEventInfo);
+ }
receiverLowGain = (byte) (ByteUtil.convertUnsignedByteToInt(encodedData[18]) >>> 6);
radioRSSI = (byte) (encodedData[18] & 0x3f);
- podProgressStatusAtTimeOfFirstLoggedFaultEvent = PodProgressStatus.fromByte((byte) (encodedData[19] & 0x0f));
+ if (ByteUtil.convertUnsignedByteToInt(encodedData[19]) == 0xff) { // this byte is not valid (no fault has occurred)
+ previousPodProgressStatus = null;
+ } else {
+ previousPodProgressStatus = PodProgressStatus.fromByte((byte) (encodedData[19] & 0x0f));
+ }
unknownValue = ByteUtil.substring(encodedData, 20, 2);
}
@Override
public PodInfoType getType() {
- return PodInfoType.FAULT_EVENT;
+ return PodInfoType.DETAILED_STATUS;
+ }
+
+ public boolean isFaulted() {
+ return faultEventCode != null;
+ }
+
+ public boolean isActivationTimeExceeded() {
+ return podProgressStatus == PodProgressStatus.ACTIVATION_TIME_EXCEEDED;
}
@Override public PodProgressStatus getPodProgressStatus() {
@@ -130,12 +145,8 @@ public class PodInfoFaultEvent extends PodInfo implements StatusUpdatableRespons
return faultAccessingTables;
}
- public LogEventErrorCode getLogEventErrorType() {
- return logEventErrorType;
- }
-
- public PodProgressStatus getLogEventErrorPodProgressStatus() {
- return logEventErrorPodProgressStatus;
+ public ErrorEventInfo getErrorEventInfo() {
+ return errorEventInfo;
}
public byte getReceiverLowGain() {
@@ -146,8 +157,8 @@ public class PodInfoFaultEvent extends PodInfo implements StatusUpdatableRespons
return radioRSSI;
}
- public PodProgressStatus getPodProgressStatusAtTimeOfFirstLoggedFaultEvent() {
- return podProgressStatusAtTimeOfFirstLoggedFaultEvent;
+ public PodProgressStatus getPreviousPodProgressStatus() {
+ return previousPodProgressStatus;
}
public byte[] getUnknownValue() {
@@ -155,7 +166,7 @@ public class PodInfoFaultEvent extends PodInfo implements StatusUpdatableRespons
}
@Override public String toString() {
- return "PodInfoFaultEvent{" +
+ return "PodInfoDetailedStatus{" +
"podProgressStatus=" + podProgressStatus +
", deliveryStatus=" + deliveryStatus +
", bolusNotDelivered=" + bolusNotDelivered +
@@ -168,11 +179,10 @@ public class PodInfoFaultEvent extends PodInfo implements StatusUpdatableRespons
", timeActive=" + timeActive +
", unacknowledgedAlerts=" + unacknowledgedAlerts +
", faultAccessingTables=" + faultAccessingTables +
- ", logEventErrorType=" + logEventErrorType +
- ", logEventErrorPodProgressStatus=" + logEventErrorPodProgressStatus +
+ ", errorEventInfo=" + errorEventInfo +
", receiverLowGain=" + receiverLowGain +
", radioRSSI=" + radioRSSI +
- ", podProgressStatusAtTimeOfFirstLoggedFaultEvent=" + podProgressStatusAtTimeOfFirstLoggedFaultEvent +
+ ", previousPodProgressStatus=" + previousPodProgressStatus +
", unknownValue=" + ByteUtil.shortHexString(unknownValue) +
'}';
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/ActivationProgress.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/ActivationProgress.java
new file mode 100644
index 0000000000..9db21f5e59
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/ActivationProgress.java
@@ -0,0 +1,66 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.definition;
+
+public enum ActivationProgress {
+ NONE,
+ PAIRING_COMPLETED,
+ TAB_5_SUB_16_AND_17_DISABLED,
+ SETUP_REMINDERS_SET,
+ PRIMING,
+ PRIMING_COMPLETED,
+ BASAL_INITIALIZED,
+ EXPIRATION_REMINDERS_SET,
+ INSERTING_CANNULA,
+ COMPLETED;
+
+ public boolean needsPairing() {
+ return this == NONE;
+ }
+
+ public boolean needsDisableTab5Sub16And17() {
+ return this == PAIRING_COMPLETED;
+ }
+
+ public boolean needsSetupReminders() {
+ return this == TAB_5_SUB_16_AND_17_DISABLED;
+ }
+
+ public boolean needsPriming() {
+ return this == SETUP_REMINDERS_SET;
+ }
+
+ public boolean needsPrimingVerification() {
+ return this == PRIMING;
+ }
+
+ public boolean needsBasalSchedule() {
+ return this == PRIMING_COMPLETED;
+ }
+
+ public boolean needsExpirationReminders() {
+ return this == BASAL_INITIALIZED;
+ }
+
+ public boolean needsCannulaInsertion() {
+ return this == EXPIRATION_REMINDERS_SET;
+ }
+
+ public boolean needsCannulaInsertionVerification() {
+ return this == INSERTING_CANNULA;
+ }
+
+ public boolean isCompleted() {
+ return this == COMPLETED;
+ }
+
+ public boolean isBefore(ActivationProgress other) {
+ return ordinal() < other.ordinal();
+ }
+
+ public boolean isAtLeast(ActivationProgress other) {
+ return ordinal() >= other.ordinal();
+ }
+
+ public boolean isAfter(ActivationProgress other) {
+ return ordinal() > other.ordinal();
+ }
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/AlertSet.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/AlertSet.java
index c9d61f9172..28c2268212 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/AlertSet.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/AlertSet.java
@@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.pump.omnipod.driver.definition;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
public class AlertSet {
private final List alertSlots;
@@ -39,6 +40,17 @@ public class AlertSet {
return value;
}
+ @Override public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AlertSet alertSet = (AlertSet) o;
+ return alertSlots.equals(alertSet.alertSlots);
+ }
+
+ @Override public int hashCode() {
+ return Objects.hash(alertSlots);
+ }
+
@Override
public String toString() {
return "AlertSet{" +
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/ErrorEventInfo.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/ErrorEventInfo.java
new file mode 100644
index 0000000000..2f3e064d36
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/ErrorEventInfo.java
@@ -0,0 +1,52 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.definition;
+
+import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
+
+public final class ErrorEventInfo {
+ private final boolean insulinStateTableCorruption;
+ private final byte internalVariable;
+ private final boolean immediateBolusInProgress;
+ private final PodProgressStatus podProgressStatus;
+
+ private ErrorEventInfo(boolean insulinStateTableCorruption, byte internalVariable, boolean immediateBolusInProgress, PodProgressStatus podProgressStatus) {
+ this.insulinStateTableCorruption = insulinStateTableCorruption;
+ this.internalVariable = internalVariable;
+ this.immediateBolusInProgress = immediateBolusInProgress;
+ this.podProgressStatus = podProgressStatus;
+ }
+
+ public static ErrorEventInfo fromByte(byte faultEventInfo) {
+ int loggedFaultEventInfo = ByteUtil.convertUnsignedByteToInt(faultEventInfo);
+ boolean insulinStateTableCorruption = (loggedFaultEventInfo & 0x80) == 0x80;
+ byte internalVariable = (byte) ((loggedFaultEventInfo >>> 5) & 0x03);
+ boolean immediateBolusInProgress = (loggedFaultEventInfo & 0x10) == 0x10;
+ PodProgressStatus podProgressStatus = PodProgressStatus.fromByte((byte) (loggedFaultEventInfo & 0x0f));
+
+ return new ErrorEventInfo(insulinStateTableCorruption, internalVariable, immediateBolusInProgress, podProgressStatus);
+ }
+
+ public boolean isInsulinStateTableCorruption() {
+ return insulinStateTableCorruption;
+ }
+
+ public byte getInternalVariable() {
+ return internalVariable;
+ }
+
+ public boolean isImmediateBolusInProgress() {
+ return immediateBolusInProgress;
+ }
+
+ public PodProgressStatus getPodProgressStatus() {
+ return podProgressStatus;
+ }
+
+ @Override public String toString() {
+ return "ErrorEventInfo{" +
+ "insulinStateTableCorruption=" + insulinStateTableCorruption +
+ ", internalVariable=" + internalVariable +
+ ", immediateBolusInProgress=" + immediateBolusInProgress +
+ ", podProgressStatus=" + podProgressStatus +
+ '}';
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/FaultEventCode.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/FaultEventCode.java
index a6fac508db..0a42811848 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/FaultEventCode.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/FaultEventCode.java
@@ -3,7 +3,6 @@ package info.nightscout.androidaps.plugins.pump.omnipod.driver.definition;
import java.util.Locale;
public enum FaultEventCode {
- NO_FAULTS((byte) 0x00),
FAILED_FLASH_ERASE((byte) 0x01),
FAILED_FLASH_STORE((byte) 0x02),
TABLE_CORRUPTION_BASAL_SUBCOMMAND((byte) 0x03),
@@ -129,6 +128,9 @@ public enum FaultEventCode {
}
public static FaultEventCode fromByte(byte value) {
+ if (value == 0x00) { // No faults
+ return null;
+ }
for (FaultEventCode type : values()) {
if (type.value == value) {
return type;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/LogEventErrorCode.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/LogEventErrorCode.java
deleted file mode 100644
index eb7223b4f0..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/LogEventErrorCode.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.driver.definition;
-
-public enum LogEventErrorCode {
- NONE((byte) 0x00),
- IMMEDIATE_BOLUS_IN_PROGRESS((byte) 0x01),
- INTERNAL_2_BIT_VARIABLE_SET_AND_MANIPULATED_IN_MAIN_LOOP_ROUTINES_2((byte) 0x02),
- INTERNAL_2_BIT_VARIABLE_SET_AND_MANIPULATED_IN_MAIN_LOOP_ROUTINES_3((byte) 0x03),
- INSULIN_STATE_TABLE_CORRUPTION((byte) 0x04);
-
- private final byte value;
-
- LogEventErrorCode(byte value) {
- this.value = value;
- }
-
- public static LogEventErrorCode fromByte(byte value) {
- for (LogEventErrorCode type : values()) {
- if (type.value == value) {
- return type;
- }
- }
- throw new IllegalArgumentException("Unknown LogEventErrorCode: " + value);
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/OmnipodConstants.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/OmnipodConstants.java
index b36dc765c7..4b5f224e64 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/OmnipodConstants.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/OmnipodConstants.java
@@ -14,6 +14,7 @@ public class OmnipodConstants {
public static final double MAX_RESERVOIR_READING = 50.0;
public static final double MAX_BOLUS = 30.0;
public static final double MAX_BASAL_RATE = 30.0;
+ public static final Duration BASAL_STEP_DURATION = Duration.standardMinutes(30);
public static final Duration MAX_TEMP_BASAL_DURATION = Duration.standardHours(12);
public static final int DEFAULT_ADDRESS = 0xffffffff;
@@ -21,12 +22,12 @@ public class OmnipodConstants {
public static final Duration AVERAGE_TEMP_BASAL_COMMAND_COMMUNICATION_DURATION = Duration.millis(1500);
public static final Duration SERVICE_DURATION = Duration.standardHours(80);
- public static final Duration EXPIRATION_ADVISORY_WINDOW = Duration.standardHours(9);
public static final Duration END_OF_SERVICE_IMMINENT_WINDOW = Duration.standardHours(1);
public static final Duration NOMINAL_POD_LIFE = Duration.standardHours(72);
- public static final double LOW_RESERVOIR_ALERT = 20.0;
public static final double POD_PRIME_BOLUS_UNITS = 2.6;
public static final double POD_CANNULA_INSERTION_BOLUS_UNITS = 0.5;
public static final double POD_SETUP_UNITS = POD_PRIME_BOLUS_UNITS + POD_CANNULA_INSERTION_BOLUS_UNITS;
+
+ public static final int DEFAULT_MAX_RESERVOIR_ALERT_THRESHOLD = 20;
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/PodInfoType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/PodInfoType.java
index d85ee9bd3f..4198810aa1 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/PodInfoType.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/PodInfoType.java
@@ -3,15 +3,15 @@ package info.nightscout.androidaps.plugins.pump.omnipod.driver.definition;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfo;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoActiveAlerts;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoDataLog;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoDetailedStatus;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoFaultAndInitializationTime;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoFaultEvent;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoOlderPulseLog;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoRecentPulseLog;
public enum PodInfoType {
NORMAL((byte) 0x00),
ACTIVE_ALERTS((byte) 0x01),
- FAULT_EVENT((byte) 0x02),
+ DETAILED_STATUS((byte) 0x02),
DATA_LOG((byte) 0x03), // Similar to types $50 & $51. Returns up to the last 60 dwords of data.
FAULT_AND_INITIALIZATION_TIME((byte) 0x05),
RECENT_PULSE_LOG((byte) 0x50), // Starting at $4200
@@ -44,8 +44,8 @@ public enum PodInfoType {
throw new UnsupportedOperationException("Cannot decode PodInfoType.NORMAL");
case ACTIVE_ALERTS:
return new PodInfoActiveAlerts(encodedData);
- case FAULT_EVENT:
- return new PodInfoFaultEvent(encodedData);
+ case DETAILED_STATUS:
+ return new PodInfoDetailedStatus(encodedData);
case DATA_LOG:
return new PodInfoDataLog(encodedData, bodyLength);
case FAULT_AND_INITIALIZATION_TIME:
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/schedule/RateEntry.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/schedule/RateEntry.java
index e3d5d7cf28..51e6f297d0 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/schedule/RateEntry.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/definition/schedule/RateEntry.java
@@ -9,6 +9,8 @@ import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.IRawRepresentable;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
+import static info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants.BASAL_STEP_DURATION;
+
public class RateEntry implements IRawRepresentable {
private final double totalPulses;
@@ -21,6 +23,13 @@ public class RateEntry implements IRawRepresentable {
}
public static List createEntries(double rate, Duration duration) {
+ if (Duration.ZERO.equals(duration)) {
+ throw new IllegalArgumentException("Duration may not be 0 minutes.");
+ }
+ if (duration.getStandardMinutes() % BASAL_STEP_DURATION.getStandardMinutes() != 0) {
+ throw new IllegalArgumentException("Duration must be a multiple of " + BASAL_STEP_DURATION.getStandardMinutes() + " minutes.");
+ }
+
List entries = new ArrayList<>();
int remainingSegments = (int) Math.round(duration.getStandardSeconds() / 1800.0);
double pulsesPerSegment = (int) Math.round(rate / OmnipodConstants.POD_PULSE_SIZE) / 2.0;
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/ActionInitializationException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/ActionInitializationException.java
deleted file mode 100644
index 1de5bf13dc..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/ActionInitializationException.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
-
-public class ActionInitializationException extends OmnipodException {
- public ActionInitializationException(String message) {
- super(message, true);
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/ActivationTimeExceededException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/ActivationTimeExceededException.java
new file mode 100644
index 0000000000..91e4c4bab3
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/ActivationTimeExceededException.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
+
+public class ActivationTimeExceededException extends OmnipodException {
+ public ActivationTimeExceededException() {
+ super("The Pod's activation time has been exceeded", true);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/CommandInitializationException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/CommandInitializationException.java
deleted file mode 100644
index 57bd2c0189..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/CommandInitializationException.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
-
-public class CommandInitializationException extends OmnipodException {
- public CommandInitializationException(String message) {
- super(message, true);
- }
-
- public CommandInitializationException(String message, Throwable cause) {
- super(message, cause, true);
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/CommunicationException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/CommunicationException.java
deleted file mode 100644
index e9a7eb3bd0..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/CommunicationException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
-
-public class CommunicationException extends OmnipodException {
- private final Type type;
-
- public CommunicationException(Type type) {
- super(type.getDescription(), false);
- this.type = type;
- }
-
- public CommunicationException(Type type, Throwable cause) {
- super(type.getDescription() + ": " + cause, cause, false);
- this.type = type;
- }
-
- public Type getType() {
- return type;
- }
-
- public enum Type {
- TIMEOUT("Communication timeout"),
- UNEXPECTED_EXCEPTION("Caught an unexpected Exception");
-
- private final String description;
-
- Type(String description) {
- this.description = description;
- }
-
- public String getDescription() {
- return description;
- }
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/DeliveryStatusVerificationFailedException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/DeliveryStatusVerificationFailedException.java
deleted file mode 100644
index f6c86561dc..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/DeliveryStatusVerificationFailedException.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.DeliveryStatus;
-
-public class DeliveryStatusVerificationFailedException extends OmnipodException {
- private final DeliveryStatus expectedStatus;
-
- public DeliveryStatusVerificationFailedException(DeliveryStatus expectedStatus, Throwable cause) {
- super("Failed to verify delivery status (expected=" + expectedStatus + ")", cause, false);
- this.expectedStatus = expectedStatus;
- }
-
- public DeliveryStatus getExpectedStatus() {
- return expectedStatus;
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/IllegalActivationProgressException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/IllegalActivationProgressException.java
new file mode 100644
index 0000000000..0dffb93517
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/IllegalActivationProgressException.java
@@ -0,0 +1,24 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
+
+import java.util.Locale;
+
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress;
+
+public class IllegalActivationProgressException extends OmnipodException {
+ private final ActivationProgress expected;
+ private final ActivationProgress actual;
+
+ public IllegalActivationProgressException(ActivationProgress expected, ActivationProgress actual) {
+ super(String.format(Locale.getDefault(), "Illegal activation progress: %s, expected: %s", actual, expected), true);
+ this.expected = expected;
+ this.actual = actual;
+ }
+
+ public ActivationProgress getExpected() {
+ return expected;
+ }
+
+ public ActivationProgress getActual() {
+ return actual;
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/IllegalPodProgressException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/IllegalPodProgressException.java
index da319d5d83..18719fa1ce 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/IllegalPodProgressException.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/IllegalPodProgressException.java
@@ -9,7 +9,7 @@ public class IllegalPodProgressException extends OmnipodException {
private final PodProgressStatus actual;
public IllegalPodProgressException(PodProgressStatus expected, PodProgressStatus actual) {
- super(String.format(Locale.getDefault(), "Illegal setup state: %s, expected: %s", actual, expected), true);
+ super(String.format(Locale.getDefault(), "Illegal Pod progress: %s, expected: %s", actual, expected), true);
this.expected = expected;
this.actual = actual;
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodFaultException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodFaultException.java
index 884e7481eb..4786f241c7 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodFaultException.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodFaultException.java
@@ -1,16 +1,16 @@
package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoFaultEvent;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoDetailedStatus;
public class PodFaultException extends OmnipodException {
- private final PodInfoFaultEvent faultEvent;
+ private final PodInfoDetailedStatus detailedStatus;
- public PodFaultException(PodInfoFaultEvent faultEvent) {
- super(faultEvent.getFaultEventCode().toString(), true);
- this.faultEvent = faultEvent;
+ public PodFaultException(PodInfoDetailedStatus detailedStatus) {
+ super(detailedStatus.getFaultEventCode().toString(), true);
+ this.detailedStatus = detailedStatus;
}
- public PodInfoFaultEvent getFaultEvent() {
- return faultEvent;
+ public PodInfoDetailedStatus getDetailedStatus() {
+ return detailedStatus;
}
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodProgressStatusVerificationFailedException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodProgressStatusVerificationFailedException.java
new file mode 100644
index 0000000000..d429e6a900
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodProgressStatusVerificationFailedException.java
@@ -0,0 +1,16 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
+
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
+
+public class PodProgressStatusVerificationFailedException extends OmnipodException {
+ private final PodProgressStatus expectedStatus;
+
+ public PodProgressStatusVerificationFailedException(PodProgressStatus expectedStatus, Throwable cause) {
+ super("Failed to verify Pod progress status (expected=" + expectedStatus + ")", cause, false);
+ this.expectedStatus = expectedStatus;
+ }
+
+ public PodProgressStatus getExpectedStatus() {
+ return expectedStatus;
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PrecedingCommandFailedUncertainlyException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PrecedingCommandFailedUncertainlyException.java
new file mode 100644
index 0000000000..a1bbd6c7ab
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PrecedingCommandFailedUncertainlyException.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
+
+public class PrecedingCommandFailedUncertainlyException extends OmnipodException {
+ public PrecedingCommandFailedUncertainlyException(Throwable cause) {
+ super("Preceding command failed", cause, false);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkInterruptedException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkInterruptedException.java
new file mode 100644
index 0000000000..3cb5f18267
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkInterruptedException.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
+
+public class RileyLinkInterruptedException extends OmnipodException {
+ public RileyLinkInterruptedException() {
+ super("RileyLink interrupted", false);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkTimeoutException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkTimeoutException.java
new file mode 100644
index 0000000000..7e4b48a226
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkTimeoutException.java
@@ -0,0 +1,8 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
+
+// Response indicating that there was a timeout in communication between the RileyLink and the Pod
+public class RileyLinkTimeoutException extends OmnipodException {
+ public RileyLinkTimeoutException() {
+ super("Timeout in communication between RileyLink and Pod", false);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkUnexpectedException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkUnexpectedException.java
new file mode 100644
index 0000000000..e844eca158
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkUnexpectedException.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
+
+public class RileyLinkUnexpectedException extends OmnipodException {
+ public RileyLinkUnexpectedException(Throwable cause) {
+ super("Unexpected Exception during RileyLink communication", cause, false);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkUnreachableException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkUnreachableException.java
new file mode 100644
index 0000000000..05320c051d
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/RileyLinkUnreachableException.java
@@ -0,0 +1,8 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception;
+
+// Indicates that we didn't get any response from the RL
+public class RileyLinkUnreachableException extends OmnipodException {
+ public RileyLinkUnreachableException() {
+ super("Timeout in communication between phone and RileyLink", false);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/OmnipodManager.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/OmnipodManager.java
index 9da707a26b..d29f479dfa 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/OmnipodManager.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/OmnipodManager.java
@@ -18,6 +18,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.acti
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.BolusAction;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.CancelDeliveryAction;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.ConfigureAlertsAction;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.ConfigureBeepAction;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.DeactivatePodAction;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.GetPodInfoAction;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.action.GetStatusAction;
@@ -31,26 +32,26 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoRecentPulseLog;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoResponse;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertConfiguration;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.BeepConfigType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.BeepType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.DeliveryStatus;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.DeliveryType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PacketType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodInfoType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BasalSchedule;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommandFailedAfterChangingDeliveryStatusException;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommunicationException;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.DeliveryStatusVerificationFailedException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalActivationProgressException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalDeliveryStatusException;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalPacketTypeException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalPodProgressException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.NonceOutOfSyncException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.OmnipodException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodFaultException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodProgressStatusVerificationFailedException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PrecedingCommandFailedUncertainlyException;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
-import info.nightscout.androidaps.utils.sharedPreferences.SP;
import io.reactivex.Completable;
import io.reactivex.Flowable;
import io.reactivex.Single;
@@ -59,20 +60,19 @@ import io.reactivex.schedulers.Schedulers;
import io.reactivex.subjects.SingleSubject;
public class OmnipodManager {
- private static final int ACTION_VERIFICATION_TRIES = 3;
+ private static final int ACTION_VERIFICATION_TRIES = 1;
private final OmnipodRileyLinkCommunicationManager communicationService;
- private PodStateManager podStateManager;
+ private final PodStateManager podStateManager;
private ActiveBolusData activeBolusData;
private SingleSubject bolusCommandExecutionSubject;
private final Object bolusDataMutex = new Object();
- private AAPSLogger aapsLogger;
+ private final AAPSLogger aapsLogger;
public OmnipodManager(AAPSLogger aapsLogger,
- SP sp,
OmnipodRileyLinkCommunicationManager communicationService,
PodStateManager podStateManager) {
if (communicationService == null) {
@@ -87,78 +87,55 @@ public class OmnipodManager {
this.podStateManager = podStateManager;
}
- public synchronized Single pairAndPrime() {
- logStartingCommandExecution("pairAndPrime");
-
- try {
- if (!podStateManager.isPodInitialized() || podStateManager.getPodProgressStatus().isBefore(PodProgressStatus.PAIRING_COMPLETED)) {
- // Always send both 0x07 and 0x03 on retries
- try {
- communicationService.executeAction(
- new AssignAddressAction(podStateManager));
- } catch (IllegalPacketTypeException ex) {
- if (ex.getActual() == PacketType.ACK && podStateManager.isPodInitialized()) {
- // When we already assigned the address before, it's possible to only get an ACK here
- aapsLogger.debug("Received ACK instead of response in AssignAddressAction. Ignoring because we already assigned the address successfully");
- } else {
- throw ex;
- }
- }
-
- try {
- communicationService.executeAction(new SetupPodAction(podStateManager));
- } catch (IllegalPacketTypeException ex) {
- if (PacketType.ACK.equals(ex.getActual())) {
- // TODO is this true for the SetupPodCommand?
- // Pod is already configured
- aapsLogger.debug("Received ACK instead of response in SetupPodAction. Ignoring");
- }
- }
- } else if (podStateManager.getPodProgressStatus().isAfter(PodProgressStatus.PRIMING)) {
- throw new IllegalPodProgressException(PodProgressStatus.PAIRING_COMPLETED, podStateManager.getPodProgressStatus());
+ public synchronized Single pairAndPrime() {
+ if (podStateManager.isPodInitialized()) {
+ if (podStateManager.getActivationProgress().isAfter(ActivationProgress.PRIMING)) {
+ return Single.just(true);
+ }
+ if (podStateManager.getActivationProgress().needsPrimingVerification()) {
+ return Single.fromCallable(() -> verifyPodProgressStatus(PodProgressStatus.PRIMING_COMPLETED, ActivationProgress.PRIMING_COMPLETED));
}
-
- // Make sure we have an up to date PodProgressStatus
- getPodStatus();
-
- communicationService.executeAction(new PrimeAction(new PrimeService(), podStateManager));
- } finally {
- logCommandExecutionFinished("pairAndPrime");
}
- long delayInSeconds = calculateBolusDuration(OmnipodConstants.POD_PRIME_BOLUS_UNITS, OmnipodConstants.POD_PRIMING_DELIVERY_RATE).getStandardSeconds();
+ // Always send both 0x07 and 0x03 on retries
+ if (podStateManager.getActivationProgress().isBefore(ActivationProgress.PAIRING_COMPLETED)) {
+ communicationService.executeAction(
+ new AssignAddressAction(podStateManager, aapsLogger));
- return Single.timer(delayInSeconds, TimeUnit.SECONDS) //
- .map(o -> verifySetupAction(PodProgressStatus.PRIMING_COMPLETED)) //
- .observeOn(Schedulers.io());
+ communicationService.executeAction(new SetupPodAction(podStateManager, aapsLogger));
+ }
+
+ communicationService.executeAction(new PrimeAction(new PrimeService(), podStateManager));
+
+ long delayInMillis = calculateEstimatedBolusDuration(DateTime.now().minus(OmnipodConstants.AVERAGE_BOLUS_COMMAND_COMMUNICATION_DURATION), OmnipodConstants.POD_PRIME_BOLUS_UNITS, OmnipodConstants.POD_PRIMING_DELIVERY_RATE).getMillis();
+
+ return Single.timer(delayInMillis, TimeUnit.MILLISECONDS) //
+ .map(o -> verifyPodProgressStatus(PodProgressStatus.PRIMING_COMPLETED, ActivationProgress.PRIMING_COMPLETED)) //
+ .subscribeOn(Schedulers.io());
}
- public synchronized Single insertCannula(
+ public synchronized Single insertCannula(
BasalSchedule basalSchedule, Duration expirationReminderTimeBeforeShutdown, Integer lowReservoirAlertUnits) {
- if (!podStateManager.isPodInitialized() || podStateManager.getPodProgressStatus().isBefore(PodProgressStatus.PRIMING_COMPLETED)) {
- throw new IllegalPodProgressException(PodProgressStatus.PRIMING_COMPLETED, !podStateManager.isPodInitialized() ? null : podStateManager.getPodProgressStatus());
+ if (podStateManager.getActivationProgress().isBefore(ActivationProgress.PRIMING_COMPLETED)) {
+ throw new IllegalActivationProgressException(ActivationProgress.PRIMING_COMPLETED, podStateManager.getActivationProgress());
}
- // Make sure we have the latest PodProgressStatus
- getPodStatus();
-
- if (podStateManager.getPodProgressStatus().isAfter(PodProgressStatus.INSERTING_CANNULA)) {
- throw new IllegalPodProgressException(PodProgressStatus.PRIMING_COMPLETED, podStateManager.getPodProgressStatus());
+ if (podStateManager.isPodInitialized()) {
+ if (podStateManager.getActivationProgress().isCompleted()) {
+ return Single.just(true);
+ }
+ if (podStateManager.getActivationProgress().needsCannulaInsertionVerification()) {
+ return Single.fromCallable(() -> verifyPodProgressStatus(PodProgressStatus.ABOVE_FIFTY_UNITS, ActivationProgress.COMPLETED));
+ }
}
- logStartingCommandExecution("insertCannula [basalSchedule=" + basalSchedule + "]");
+ communicationService.executeAction(new InsertCannulaAction(podStateManager, basalSchedule, expirationReminderTimeBeforeShutdown, lowReservoirAlertUnits));
- try {
- communicationService.executeAction(new InsertCannulaAction(podStateManager, basalSchedule, expirationReminderTimeBeforeShutdown, lowReservoirAlertUnits));
- } finally {
- logCommandExecutionFinished("insertCannula");
- }
+ long delayInMillis = calculateEstimatedBolusDuration(DateTime.now().minus(OmnipodConstants.AVERAGE_BOLUS_COMMAND_COMMUNICATION_DURATION), OmnipodConstants.POD_CANNULA_INSERTION_BOLUS_UNITS, OmnipodConstants.POD_CANNULA_INSERTION_DELIVERY_RATE).getMillis();
- long delayInSeconds = calculateBolusDuration(OmnipodConstants.POD_CANNULA_INSERTION_BOLUS_UNITS, OmnipodConstants.POD_CANNULA_INSERTION_DELIVERY_RATE).getStandardSeconds();
-
- return Single.timer(delayInSeconds, TimeUnit.SECONDS) //
- .map(o -> verifySetupAction(PodProgressStatus.ABOVE_FIFTY_UNITS)) //
- .observeOn(Schedulers.io());
+ return Single.timer(delayInMillis, TimeUnit.MILLISECONDS) //
+ .map(o -> verifyPodProgressStatus(PodProgressStatus.ABOVE_FIFTY_UNITS, ActivationProgress.COMPLETED)) //
+ .subscribeOn(Schedulers.io());
}
public synchronized StatusResponse getPodStatus() {
@@ -166,49 +143,29 @@ public class OmnipodManager {
throw new IllegalPodProgressException(PodProgressStatus.REMINDER_INITIALIZED, null);
}
- logStartingCommandExecution("getPodStatus");
+ return communicationService.executeAction(new GetStatusAction(podStateManager));
- try {
- return communicationService.executeAction(new GetStatusAction(podStateManager));
- } finally {
- logCommandExecutionFinished("getPodStatus");
- }
}
public synchronized PodInfoResponse getPodInfo(PodInfoType podInfoType) {
assertReadyForDelivery();
- logStartingCommandExecution("getPodInfo");
-
- try {
- return communicationService.executeAction(new GetPodInfoAction(podStateManager, podInfoType));
- } finally {
- logCommandExecutionFinished("getPodInfo");
- }
+ return communicationService.executeAction(new GetPodInfoAction(podStateManager, podInfoType));
}
public synchronized StatusResponse configureAlerts(List alertConfigurations) {
assertReadyForDelivery();
- logStartingCommandExecution("configureAlerts");
- try {
- StatusResponse statusResponse = executeAndVerify(() -> communicationService.executeAction(new ConfigureAlertsAction(podStateManager, alertConfigurations)));
- ConfigureAlertsAction.updateConfiguredAlerts(podStateManager, alertConfigurations);
- return statusResponse;
- } finally {
- logCommandExecutionFinished("configureAlerts");
- }
+
+ StatusResponse statusResponse = executeAndVerify(() -> communicationService.executeAction(new ConfigureAlertsAction(podStateManager, alertConfigurations)));
+ ConfigureAlertsAction.updateConfiguredAlerts(podStateManager, alertConfigurations);
+ return statusResponse;
+
}
public synchronized StatusResponse acknowledgeAlerts() {
assertReadyForDelivery();
- logStartingCommandExecution("acknowledgeAlerts");
-
- try {
- return executeAndVerify(() -> communicationService.executeAction(new AcknowledgeAlertsAction(podStateManager, podStateManager.getActiveAlerts())));
- } finally {
- logCommandExecutionFinished("acknowledgeAlerts");
- }
+ return executeAndVerify(() -> communicationService.executeAction(new AcknowledgeAlertsAction(podStateManager, podStateManager.getActiveAlerts())));
}
// CAUTION: cancels all delivery
@@ -216,40 +173,48 @@ public class OmnipodManager {
public synchronized void setBasalSchedule(BasalSchedule schedule, boolean acknowledgementBeep) {
assertReadyForDelivery();
- logStartingCommandExecution("setBasalSchedule [basalSchedule=" + schedule + ", acknowledgementBeep=" + acknowledgementBeep + "]");
-
- try {
- boolean wasSuspended = podStateManager.isSuspended();
- if (!wasSuspended) {
- suspendDelivery(acknowledgementBeep);
- }
-
- // Store the new Basal schedule after successfully suspending delivery, so that if setting the Basal schedule fails,
- // And we later try to resume delivery, the new schedule is used
- podStateManager.setBasalSchedule(schedule);
-
+ if (!podStateManager.isBasalCertain()) {
try {
- executeAndVerify(() -> communicationService.executeAction(new SetBasalScheduleAction(podStateManager, schedule,
- false, podStateManager.getScheduleOffset(), acknowledgementBeep)));
+ getPodStatus();
+ } catch (OmnipodException ex) {
+ ex.setCertainFailure(true);
+ throw ex;
+ }
+ }
+
+ boolean wasSuspended = podStateManager.isSuspended();
+ if (!wasSuspended) {
+ try {
+ suspendDelivery(acknowledgementBeep);
} catch (OmnipodException ex) {
if (ex.isCertainFailure()) {
- if (!wasSuspended) {
- throw new CommandFailedAfterChangingDeliveryStatusException("Suspending delivery succeeded but setting the new basal schedule did not", ex);
- }
throw ex;
}
- // verifyDeliveryStatus will throw an exception if verification fails
- if (!verifyDeliveryStatus(DeliveryStatus.NORMAL, ex)) {
- if (!wasSuspended) {
- throw new CommandFailedAfterChangingDeliveryStatusException("Suspending delivery succeeded but setting the new basal schedule did not", ex);
- }
- ex.setCertainFailure(true);
- throw ex;
- }
+ // Uncertain failure
+ throw new PrecedingCommandFailedUncertainlyException(ex);
}
- } finally {
- logCommandExecutionFinished("setBasalSchedule");
+ }
+
+ BasalSchedule oldBasalSchedule = podStateManager.getBasalSchedule();
+
+ try {
+ podStateManager.setBasalSchedule(schedule);
+ podStateManager.setBasalCertain(false);
+ executeAndVerify(() -> communicationService.executeAction(new SetBasalScheduleAction(podStateManager, schedule,
+ false, podStateManager.getScheduleOffset(), acknowledgementBeep)));
+ } catch (OmnipodException ex) {
+ if (ex.isCertainFailure()) {
+ podStateManager.setBasalSchedule(oldBasalSchedule);
+ podStateManager.setBasalCertain(true);
+ if (!wasSuspended) {
+ throw new CommandFailedAfterChangingDeliveryStatusException("Suspending delivery succeeded but setting the new basal schedule did not", ex);
+ }
+ throw ex;
+ }
+
+ // Uncertain failure
+ throw ex;
}
}
@@ -257,66 +222,51 @@ public class OmnipodManager {
public synchronized void setTemporaryBasal(double rate, Duration duration, boolean acknowledgementBeep, boolean completionBeep) {
assertReadyForDelivery();
- logStartingCommandExecution("setTemporaryBasal [rate=" + rate + ", duration=" + duration + ", acknowledgementBeep=" + acknowledgementBeep + ", completionBeep=" + completionBeep + "]");
+ if (!podStateManager.isTempBasalCertain() || !podStateManager.isBasalCertain()) {
+ try {
+ getPodStatus();
+ } catch (OmnipodException ex) {
+ ex.setCertainFailure(true);
+ throw ex;
+ }
+ }
+
+ if (podStateManager.isSuspended()) {
+ throw new IllegalDeliveryStatusException(DeliveryStatus.NORMAL, DeliveryStatus.SUSPENDED);
+ }
boolean cancelCurrentTbr = podStateManager.isTempBasalRunning();
- try {
- if (cancelCurrentTbr) {
- try {
- cancelDelivery(EnumSet.of(DeliveryType.TEMP_BASAL), acknowledgementBeep);
- } catch (OmnipodException ex) {
- if (ex.isCertainFailure()) {
- throw ex;
- }
-
- // verifyDeliveryStatus will throw an exception if verification fails
- if (!verifyDeliveryStatus(DeliveryStatus.NORMAL, ex)) {
- ex.setCertainFailure(true);
- throw ex;
- }
- }
- }
-
+ if (cancelCurrentTbr) {
try {
- executeAndVerify(() -> communicationService.executeAction(new SetTempBasalAction(
- podStateManager, rate, duration, acknowledgementBeep, completionBeep)));
- podStateManager.setTempBasal(DateTime.now().minus(OmnipodConstants.AVERAGE_TEMP_BASAL_COMMAND_COMMUNICATION_DURATION), rate, duration, true);
+ cancelDelivery(EnumSet.of(DeliveryType.TEMP_BASAL), acknowledgementBeep);
} catch (OmnipodException ex) {
if (ex.isCertainFailure()) {
- if (cancelCurrentTbr) {
- throw new CommandFailedAfterChangingDeliveryStatusException("Failed to set new TBR while cancelling old TBR succeeded", ex);
- }
throw ex;
}
- // verifyDeliveryStatus will throw an exception if verification fails
- try {
- if (verifyDeliveryStatus(DeliveryStatus.TEMP_BASAL_RUNNING, ex)) {
- podStateManager.setTempBasal(DateTime.now().minus(OmnipodConstants.AVERAGE_TEMP_BASAL_COMMAND_COMMUNICATION_DURATION), rate, duration, true);
- } else {
- if (cancelCurrentTbr) {
- throw new CommandFailedAfterChangingDeliveryStatusException("Failed to set new TBR while cancelling old TBR succeeded", ex);
- }
-
- ex.setCertainFailure(true);
- throw ex;
- }
- } catch (CommandFailedAfterChangingDeliveryStatusException ex2) {
- // Don't set temp basal in Pod State for this Exception
- throw ex2;
- } catch (OmnipodException ex2) {
- if (!ex2.isCertainFailure()) {
- // We're not sure that setting the new TBR failed, so we assume that it succeeded
- // If it didn't, PodStateManager.updateFromResponse() will fix the state
- // upon receiving the next StatusResponse
- podStateManager.setTempBasal(DateTime.now().minus(OmnipodConstants.AVERAGE_TEMP_BASAL_COMMAND_COMMUNICATION_DURATION), rate, duration, false);
- }
- throw ex2;
- }
+ // Uncertain failure
+ throw new PrecedingCommandFailedUncertainlyException(ex);
}
- } finally {
- logCommandExecutionFinished("setTemporaryBasal");
+ }
+
+ try {
+ podStateManager.setTempBasal(DateTime.now().plus(OmnipodConstants.AVERAGE_TEMP_BASAL_COMMAND_COMMUNICATION_DURATION), rate, duration);
+ podStateManager.setTempBasalCertain(false);
+ executeAndVerify(() -> communicationService.executeAction(new SetTempBasalAction(
+ podStateManager, rate, duration, acknowledgementBeep, completionBeep)));
+ } catch (OmnipodException ex) {
+ if (ex.isCertainFailure()) {
+ podStateManager.clearTempBasal();
+ podStateManager.setTempBasalCertain(true);
+ if (cancelCurrentTbr) {
+ throw new CommandFailedAfterChangingDeliveryStatusException("Failed to set new TBR while cancelling old TBR succeeded", ex);
+ }
+ throw ex;
+ }
+
+ // Uncertain failure
+ throw ex;
}
}
@@ -327,16 +277,32 @@ public class OmnipodManager {
private synchronized StatusResponse cancelDelivery(EnumSet deliveryTypes, boolean acknowledgementBeep) {
assertReadyForDelivery();
- logStartingCommandExecution("cancelDelivery [deliveryTypes=" + deliveryTypes + ", acknowledgementBeep=" + acknowledgementBeep + "]");
+ if (deliveryTypes.contains(DeliveryType.BASAL)) {
+ podStateManager.setBasalCertain(false);
+ }
+ if (deliveryTypes.contains(DeliveryType.TEMP_BASAL)) {
+ podStateManager.setTempBasalCertain(false);
+ }
try {
return executeAndVerify(() -> {
- StatusResponse statusResponse = communicationService.executeAction(new CancelDeliveryAction(podStateManager, deliveryTypes, acknowledgementBeep));
+ StatusResponse statusResponse;
+ statusResponse = communicationService.executeAction(new CancelDeliveryAction(podStateManager, deliveryTypes, acknowledgementBeep));
+
aapsLogger.info(LTag.PUMPCOMM, "Status response after cancel delivery[types={}]: {}", deliveryTypes.toString(), statusResponse.toString());
return statusResponse;
});
- } finally {
- logCommandExecutionFinished("cancelDelivery");
+ } catch (OmnipodException ex) {
+ if (ex.isCertainFailure()) {
+ if (deliveryTypes.contains(DeliveryType.BASAL)) {
+ podStateManager.setBasalCertain(true);
+ }
+ if (deliveryTypes.contains(DeliveryType.TEMP_BASAL)) {
+ podStateManager.setTempBasalCertain(true);
+ }
+ }
+
+ throw ex;
}
}
@@ -346,7 +312,18 @@ public class OmnipodManager {
public synchronized BolusCommandResult bolus(Double units, boolean acknowledgementBeep, boolean completionBeep, BiConsumer progressIndicationConsumer) {
assertReadyForDelivery();
- logStartingCommandExecution("bolus [units=" + units + ", acknowledgementBeep=" + acknowledgementBeep + ", completionBeep=" + completionBeep + "]");
+ if (!podStateManager.isBasalCertain()) {
+ try {
+ getPodStatus();
+ } catch (OmnipodException ex) {
+ ex.setCertainFailure(true);
+ throw ex;
+ }
+ }
+
+ if (podStateManager.isSuspended()) {
+ throw new IllegalDeliveryStatusException(DeliveryStatus.NORMAL, DeliveryStatus.SUSPENDED);
+ }
bolusCommandExecutionSubject = SingleSubject.create();
@@ -367,7 +344,7 @@ public class OmnipodManager {
}
DateTime estimatedBolusStartDate = DateTime.now().minus(OmnipodConstants.AVERAGE_BOLUS_COMMAND_COMMUNICATION_DURATION);
- Duration estimatedBolusDuration = calculateBolusDuration(units, OmnipodConstants.POD_BOLUS_DELIVERY_RATE);
+ Duration estimatedBolusDuration = calculateEstimatedBolusDuration(estimatedBolusStartDate, units, OmnipodConstants.POD_BOLUS_DELIVERY_RATE);
Duration estimatedRemainingBolusDuration = estimatedBolusDuration.minus(OmnipodConstants.AVERAGE_BOLUS_COMMAND_COMMUNICATION_DURATION);
podStateManager.setLastBolus(estimatedBolusStartDate, units, estimatedBolusDuration, commandDeliveryStatus == CommandDeliveryStatus.SUCCESS);
@@ -376,11 +353,11 @@ public class OmnipodManager {
if (progressIndicationConsumer != null) {
- int numberOfProgressReports = Math.max(20, Math.min(100, (int) Math.ceil(units) * 10));
+ long numberOfProgressReports = Math.max(10, Math.min(100, estimatedRemainingBolusDuration.getStandardSeconds()));
long progressReportInterval = estimatedRemainingBolusDuration.getMillis() / numberOfProgressReports;
disposables.add(Flowable.intervalRange(0, numberOfProgressReports + 1, 0, progressReportInterval, TimeUnit.MILLISECONDS) //
- .observeOn(Schedulers.io()) //
+ .subscribeOn(Schedulers.io()) //
.subscribe(count -> {
int percentage = (int) ((double) count / numberOfProgressReports * 100);
double estimatedUnitsDelivered = activeBolusData == null ? 0 : activeBolusData.estimateUnitsDelivered();
@@ -400,8 +377,8 @@ public class OmnipodManager {
bolusCommandExecutionSubject = null;
disposables.add(Completable.complete() //
- .delay(estimatedRemainingBolusDuration.getMillis() + 250, TimeUnit.MILLISECONDS) //
- .observeOn(Schedulers.io()) //
+ .delay(estimatedRemainingBolusDuration.getMillis(), TimeUnit.MILLISECONDS) //
+ .subscribeOn(Schedulers.io()) //
.doOnComplete(() -> {
synchronized (bolusDataMutex) {
double bolusNotDelivered = 0.0d;
@@ -412,12 +389,11 @@ public class OmnipodManager {
StatusResponse statusResponse = getPodStatus();
if (statusResponse.getDeliveryStatus().isBolusing()) {
throw new IllegalDeliveryStatusException(DeliveryStatus.NORMAL, statusResponse.getDeliveryStatus());
- } else {
- break;
}
+ break;
} catch (PodFaultException ex) {
// Subtract units not delivered in case of a Pod failure
- bolusNotDelivered = ex.getFaultEvent().getBolusNotDelivered();
+ bolusNotDelivered = ex.getDetailedStatus().getBolusNotDelivered();
aapsLogger.debug(LTag.PUMPCOMM, "Caught PodFaultException in bolus completion verification", ex);
break;
@@ -434,8 +410,6 @@ public class OmnipodManager {
})
.subscribe());
- logCommandExecutionFinished("bolus");
-
return new BolusCommandResult(commandDeliveryStatus, bolusCompletionSubject);
}
@@ -447,16 +421,12 @@ public class OmnipodManager {
throw new IllegalDeliveryStatusException(DeliveryStatus.BOLUS_IN_PROGRESS, podStateManager.getLastDeliveryStatus());
}
- logStartingCommandExecution("cancelBolus [acknowledgementBeep=" + acknowledgementBeep + "]");
-
try {
StatusResponse statusResponse = cancelDelivery(EnumSet.of(DeliveryType.BOLUS), acknowledgementBeep);
discardActiveBolusData(statusResponse.getBolusNotDelivered());
} catch (PodFaultException ex) {
- discardActiveBolusData(ex.getFaultEvent().getBolusNotDelivered());
+ discardActiveBolusData(ex.getDetailedStatus().getBolusNotDelivered());
throw ex;
- } finally {
- logCommandExecutionFinished("cancelBolus");
}
}
}
@@ -474,23 +444,7 @@ public class OmnipodManager {
public synchronized void suspendDelivery(boolean acknowledgementBeep) {
assertReadyForDelivery();
- logStartingCommandExecution("suspendDelivery");
-
- try {
- cancelDelivery(EnumSet.allOf(DeliveryType.class), acknowledgementBeep);
- } catch (OmnipodException ex) {
- if (ex.isCertainFailure()) {
- throw ex;
- }
-
- // verifyDeliveryStatus will throw an exception if verification fails
- if (!verifyDeliveryStatus(DeliveryStatus.SUSPENDED, ex)) {
- ex.setCertainFailure(true);
- throw ex;
- }
- } finally {
- logCommandExecutionFinished("suspendDelivery");
- }
+ cancelDelivery(EnumSet.allOf(DeliveryType.class), acknowledgementBeep);
}
// CAUTION: cancels all delivery
@@ -498,24 +452,20 @@ public class OmnipodManager {
public synchronized void setTime(boolean acknowledgementBeeps) {
assertReadyForDelivery();
- logStartingCommandExecution("setTime [acknowledgementBeeps=" + acknowledgementBeeps + "]");
+ DateTimeZone oldTimeZone = podStateManager.getTimeZone();
try {
- DateTimeZone oldTimeZone = podStateManager.getTimeZone();
+ // Joda seems to cache the default time zone, so we use the JVM's
+ DateTimeZone.setDefault(DateTimeZone.forTimeZone(TimeZone.getDefault()));
+ podStateManager.setTimeZone(DateTimeZone.getDefault());
- try {
- // Joda seems to cache the default time zone, so we use the JVM's
- DateTimeZone.setDefault(DateTimeZone.forTimeZone(TimeZone.getDefault()));
- podStateManager.setTimeZone(DateTimeZone.getDefault());
-
- setBasalSchedule(podStateManager.getBasalSchedule(), acknowledgementBeeps);
- } catch (OmnipodException ex) {
- podStateManager.setTimeZone(oldTimeZone);
- throw ex;
- }
- } finally {
- logCommandExecutionFinished("setTime");
+ setBasalSchedule(podStateManager.getBasalSchedule(), acknowledgementBeeps);
+ } catch (OmnipodException ex) {
+ podStateManager.setTimeZone(oldTimeZone);
+ throw ex;
}
+
+ podStateManager.updateActivatedAt();
}
public synchronized void deactivatePod() {
@@ -523,15 +473,13 @@ public class OmnipodManager {
throw new IllegalPodProgressException(PodProgressStatus.REMINDER_INITIALIZED, null);
}
- logStartingCommandExecution("deactivatePod");
-
// Try to get pulse log for diagnostics
try {
PodInfoResponse podInfoResponse = communicationService.executeAction(new GetPodInfoAction(podStateManager, PodInfoType.RECENT_PULSE_LOG));
PodInfoRecentPulseLog pulseLogInfo = (PodInfoRecentPulseLog) podInfoResponse.getPodInfo();
- aapsLogger.info(LTag.PUMPCOMM, "Retrieved pulse log from the pod: {}", pulseLogInfo.toString());
+ aapsLogger.info(LTag.PUMPCOMM, "Read pulse log from the pod: {}", pulseLogInfo.toString());
} catch (Exception ex) {
- aapsLogger.warn(LTag.PUMPCOMM, "Failed to retrieve pulse log from the pod", ex);
+ aapsLogger.warn(LTag.PUMPCOMM, "Failed to read pulse log", ex);
}
try {
@@ -539,13 +487,30 @@ public class OmnipodManager {
communicationService.executeAction(new DeactivatePodAction(podStateManager, true));
} catch (PodFaultException ex) {
aapsLogger.info(LTag.PUMPCOMM, "Ignoring PodFaultException in deactivatePod", ex);
- } finally {
- logCommandExecutionFinished("deactivatePod");
}
podStateManager.discardState();
}
+ public synchronized void configureBeeps(BeepConfigType beepType, boolean basalCompletionBeep, Duration basalIntervalBeep,
+ boolean tempBasalCompletionBeep, Duration tempBasalIntervalBeep,
+ boolean bolusCompletionBeep, Duration bolusIntervalBeep) {
+ if (!podStateManager.isPodInitialized()) {
+ throw new IllegalPodProgressException(PodProgressStatus.REMINDER_INITIALIZED, null);
+ }
+ communicationService.executeAction(new ConfigureBeepAction(
+ podStateManager, beepType, basalCompletionBeep,
+ basalIntervalBeep, tempBasalCompletionBeep, tempBasalIntervalBeep,
+ bolusCompletionBeep, bolusIntervalBeep));
+ }
+
+ public synchronized void playTestBeep(BeepConfigType beepType) {
+ if (!podStateManager.isPodInitialized()) {
+ throw new IllegalPodProgressException(PodProgressStatus.REMINDER_INITIALIZED, null);
+ }
+ communicationService.executeAction(new ConfigureBeepAction(podStateManager, beepType));
+ }
+
public OmnipodRileyLinkCommunicationManager getCommunicationService() {
return communicationService;
}
@@ -570,10 +535,9 @@ public class OmnipodManager {
// Only works for commands with nonce resyncable message blocks
private StatusResponse executeAndVerify(Supplier supplier) {
- logStartingCommandExecution("verifyCommand");
try {
return supplier.get();
- } catch (Exception originalException) {
+ } catch (OmnipodException originalException) {
if (isCertainFailure(originalException)) {
throw originalException;
} else {
@@ -586,23 +550,14 @@ public class OmnipodManager {
return statusResponse;
} catch (NonceOutOfSyncException verificationException) {
- aapsLogger.error(LTag.PUMPCOMM, "Command resolved to FAILURE (CERTAIN_FAILURE)", verificationException);
-
- if (originalException instanceof OmnipodException) {
- ((OmnipodException) originalException).setCertainFailure(true);
- throw originalException;
- } else {
- OmnipodException newException = new CommunicationException(CommunicationException.Type.UNEXPECTED_EXCEPTION, originalException);
- newException.setCertainFailure(true);
- throw newException;
- }
+ aapsLogger.info(LTag.PUMPCOMM, "Command resolved to FAILURE (CERTAIN_FAILURE)", verificationException);
+ originalException.setCertainFailure(true);
+ throw originalException;
} catch (Exception verificationException) {
- aapsLogger.error(LTag.PUMPCOMM, "Command unresolved (UNCERTAIN_FAILURE)", verificationException);
+ aapsLogger.warn(LTag.PUMPCOMM, "Command unresolved (UNCERTAIN_FAILURE)", verificationException);
throw originalException;
}
}
- } finally {
- logCommandExecutionFinished("verifyCommand");
}
}
@@ -612,66 +567,60 @@ public class OmnipodManager {
}
}
- private SetupActionResult verifySetupAction(PodProgressStatus expectedPodProgressStatus) {
- SetupActionResult result = null;
+ /**
+ * @param expectedPodProgressStatus expected Pod progress status
+ * @return true if the Pod's progress status matches the expected status, otherwise false
+ * @throws PodProgressStatusVerificationFailedException in case reading the Pod status fails
+ */
+ private boolean verifyPodProgressStatus(PodProgressStatus expectedPodProgressStatus, ActivationProgress activationProgress) {
+ Boolean result = null;
+ Throwable lastException = null;
+
for (int i = 0; ACTION_VERIFICATION_TRIES > i; i++) {
try {
StatusResponse statusResponse = getPodStatus();
if (statusResponse.getPodProgressStatus().equals(expectedPodProgressStatus)) {
- result = new SetupActionResult(SetupActionResult.ResultType.SUCCESS);
- break;
+ podStateManager.setActivationProgress(activationProgress);
+ return true;
} else {
- result = new SetupActionResult(SetupActionResult.ResultType.FAILURE) //
- .podProgressStatus(statusResponse.getPodProgressStatus());
- break;
+ result = false;
}
} catch (Exception ex) {
- result = new SetupActionResult(SetupActionResult.ResultType.VERIFICATION_FAILURE) //
- .exception(ex);
+ lastException = ex;
}
}
- return result;
- }
- /**
- * @param expectedStatus expected delivery status
- * @param verificationCause the Exception causing us to verify the delivery status
- * @return true if the Pod's status matches the expected status, otherwise false
- * @throws DeliveryStatusVerificationFailedException in case reading the Pod status fails
- */
- private boolean verifyDeliveryStatus(DeliveryStatus expectedStatus, Throwable verificationCause) {
- aapsLogger.debug(LTag.PUMPCOMM, "Attempting to verify delivery status (expected={})", expectedStatus);
- for (int i = 0; 3 > i; i++) {
- try {
- StatusResponse podStatus = getPodStatus();
- aapsLogger.debug(LTag.PUMPCOMM, "Resolved delivery status (expected={}, actual={})", expectedStatus, podStatus.getDeliveryStatus());
- return podStatus.getDeliveryStatus().equals(expectedStatus);
- } catch (Exception ex) {
- aapsLogger.debug(LTag.PUMPCOMM, "Ignoring exception thrown in getPodStatus() during attempt to verify delivery status: {}: {}",
- ex.getClass().getSimpleName(), ex.getMessage());
- }
+ if (result != null) {
+ return result;
}
- aapsLogger.warn(LTag.PUMPCOMM, "Failed to verify delivery status");
- throw new DeliveryStatusVerificationFailedException(expectedStatus, verificationCause);
+
+ final Throwable ex = lastException;
+
+ throw new PodProgressStatusVerificationFailedException(expectedPodProgressStatus, ex);
}
- private void logStartingCommandExecution(String action) {
- aapsLogger.debug(LTag.PUMPCOMM, "Starting command execution for action: " + action);
- }
+ private Duration calculateEstimatedBolusDuration(DateTime startTime, double units, double deliveryRateInUnitsPerSecond) {
+ if (!podStateManager.isPodActivationCompleted()) {
+ // No basal or temp basal is active yet
+ return Duration.standardSeconds((long) Math.ceil(units / deliveryRateInUnitsPerSecond));
+ }
- private void logCommandExecutionFinished(String action) {
- aapsLogger.debug(LTag.PUMPCOMM, "Command execution finished for action: " + action);
- }
+ double pulseIntervalInSeconds = OmnipodConstants.POD_PULSE_SIZE / deliveryRateInUnitsPerSecond;
+ long numberOfPulses = Math.round(units / OmnipodConstants.POD_PULSE_SIZE);
+ double totalEstimatedDurationInSeconds = 0D;
- private static Duration calculateBolusDuration(double units, double deliveryRate) {
- // TODO take current (temp) basal into account
- // Be aware that the Pod possibly doesn't have a Basal Schedule yet
- return Duration.standardSeconds((long) Math.ceil(units / deliveryRate));
- }
+ for (int i = 0; numberOfPulses > i; i++) {
+ DateTime estimatedTimeAtPulse = startTime.plusMillis((int) (totalEstimatedDurationInSeconds * 1000));
+ double effectiveBasalRateAtPulse = podStateManager.getEffectiveBasalRateAt(estimatedTimeAtPulse);
+ double effectivePulsesPerHourAtPulse = effectiveBasalRateAtPulse / OmnipodConstants.POD_PULSE_SIZE;
+ double effectiveBasalPulsesPerSecondAtPulse = effectivePulsesPerHourAtPulse / 3600;
+ double effectiveBasalPulsesPerBolusPulse = pulseIntervalInSeconds * effectiveBasalPulsesPerSecondAtPulse;
- public static Duration calculateBolusDuration(double units) {
- return calculateBolusDuration(units, OmnipodConstants.POD_BOLUS_DELIVERY_RATE);
+ totalEstimatedDurationInSeconds += pulseIntervalInSeconds * (1 + effectiveBasalPulsesPerBolusPulse);
+ }
+
+ return Duration.millis(Math.round(totalEstimatedDurationInSeconds * 1000));
}
public static boolean isCertainFailure(Exception ex) {
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/PodStateManager.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/PodStateManager.java
index 4aed1057f6..570289a198 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/PodStateManager.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/PodStateManager.java
@@ -16,21 +16,26 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
import java.util.function.Supplier;
import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.OmnipodMessage;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusUpdatableResponse;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoFaultEvent;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoDetailedStatus;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertSet;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertSlot;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.DeliveryStatus;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.FaultEventCode;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.FirmwareVersion;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodCrc;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BasalSchedule;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.util.TimeUtil;
// TODO add nullchecks on some setters
public abstract class PodStateManager {
@@ -79,11 +84,12 @@ public abstract class PodStateManager {
* @return true if we have a Pod state and the Pod activation has been completed. The pod could also be dead at this point
*/
public final boolean isPodActivationCompleted() {
- return isPodInitialized() && podState.getPodProgressStatus().isAtLeast(PodProgressStatus.ABOVE_FIFTY_UNITS) && podState.getPodProgressStatus() != PodProgressStatus.ACTIVATION_TIME_EXCEEDED;
+ return getActivationProgress().isCompleted();
}
/**
* @return true if we have a Pod state and the Pod is running, meaning the activation process has completed and the Pod is not deactivated or in a fault state
+ * This does not mean the Pod is actually delivering insulin, combine with {@link #isSuspended() isSuspended()} for that
*/
public final boolean isPodRunning() {
return isPodInitialized() && getPodProgressStatus().isRunning();
@@ -96,6 +102,13 @@ public abstract class PodStateManager {
return isPodInitialized() && podState.getPodProgressStatus().equals(PodProgressStatus.FAULT_EVENT_OCCURRED);
}
+ /**
+ * @return true if the Pod's activation time has been exceeded
+ */
+ public boolean isPodActivationTimeExceeded() {
+ return isPodInitialized() && getPodProgressStatus() == PodProgressStatus.ACTIVATION_TIME_EXCEEDED;
+ }
+
/**
* @return true if we have a Pod state and the Pod is dead, meaning it is either in a fault state or activation time has been exceeded or it is deactivated
*/
@@ -104,7 +117,7 @@ public abstract class PodStateManager {
}
public final void setInitializationParameters(int lot, int tid, FirmwareVersion piVersion, FirmwareVersion pmVersion, DateTimeZone timeZone, PodProgressStatus podProgressStatus) {
- if (isPodInitialized() && getPodProgressStatus().isAfter(PodProgressStatus.REMINDER_INITIALIZED)) {
+ if (isPodInitialized() && getActivationProgress().isAtLeast(ActivationProgress.PAIRING_COMPLETED)) {
throw new IllegalStateException("Cannot set pairing parameters: pairing parameters have already been set");
}
if (piVersion == null) {
@@ -226,21 +239,8 @@ public abstract class PodStateManager {
return getSafe(() -> podState.getLastUpdatedFromResponse());
}
- /**
- * @return true if the Pod State contains a fault event. Is the Pod state does not contain
- * a fault event, this does NOT necessarily mean that the Pod is not faulted. For a reliable
- * indication on whether or not the pod is faulted, see {@link #isPodFaulted() isPodFaulted()}
- */
- public final boolean hasFaultEvent() {
- return podState != null && podState.getFaultEvent() != null;
- }
-
- public final PodInfoFaultEvent getFaultEvent() {
- return getSafe(() -> podState.getFaultEvent());
- }
-
- public final void setFaultEvent(PodInfoFaultEvent faultEvent) {
- setAndStore(() -> podState.setFaultEvent(faultEvent));
+ public final FaultEventCode getFaultEventCode() {
+ return getSafe(() -> podState.getFaultEventCode());
}
public final AlertType getConfiguredAlertType(AlertSlot alertSlot) {
@@ -295,8 +295,21 @@ public abstract class PodStateManager {
}
public final DateTime getTime() {
- DateTime now = DateTime.now();
- return now.withZone(getSafe(() -> podState.getTimeZone()));
+ DateTimeZone timeZone = getSafe(() -> podState.getTimeZone());
+ if (timeZone == null) {
+ return DateTime.now();
+ }
+ Duration timeActive = getSafe(() -> podState.getTimeActive());
+ DateTime activatedAt = getSafe(() -> podState.getActivatedAt());
+ DateTime lastUpdatedFromResponse = getSafe(() -> podState.getLastUpdatedFromResponse());
+ if (timeActive == null || activatedAt == null) {
+ return DateTime.now().withZone(timeZone);
+ }
+ return activatedAt.plus(timeActive).plus(new Duration(lastUpdatedFromResponse, DateTime.now()));
+ }
+
+ public final boolean timeDeviatesMoreThan(Duration duration) {
+ return new Duration(getTime(), DateTime.now().withZoneRetainFields(getSafe(() -> podState.getTimeZone()))).abs().isLongerThan(duration);
}
public final DateTime getActivatedAt() {
@@ -304,22 +317,34 @@ public abstract class PodStateManager {
return activatedAt == null ? null : activatedAt.withZone(getSafe(() -> podState.getTimeZone()));
}
+ public final void updateActivatedAt() {
+ setAndStore(() -> podState.setActivatedAt(DateTime.now().withZone(getSafe(() -> podState.getTimeZone())).minus(getSafe(this::getTimeActive))));
+ }
+
+ public final Duration getTimeActive() {
+ return getSafe(() -> podState.getTimeActive());
+ }
+
public final DateTime getExpiresAt() {
- DateTime expiresAt = getSafe(() -> podState.getExpiresAt());
- return expiresAt == null ? null : expiresAt.withZone(getSafe(() -> podState.getTimeZone()));
+ DateTime activatedAt = getSafe(() -> podState.getActivatedAt());
+ return activatedAt == null ? null : activatedAt.withZone(getSafe(() -> podState.getTimeZone())).plus(OmnipodConstants.NOMINAL_POD_LIFE);
+ }
+
+ public final ActivationProgress getActivationProgress() {
+ if (hasPodState()) {
+ return Optional.ofNullable(podState.getActivationProgress()).orElse(ActivationProgress.NONE);
+ }
+ return ActivationProgress.NONE;
+ }
+
+ public final void setActivationProgress(ActivationProgress activationProgress) {
+ setAndStore(() -> podState.setActivationProgress(activationProgress));
}
public final PodProgressStatus getPodProgressStatus() {
return getSafe(() -> podState.getPodProgressStatus());
}
- public final void setPodProgressStatus(PodProgressStatus podProgressStatus) {
- if (podProgressStatus == null) {
- throw new IllegalArgumentException("Pod progress status can not be null");
- }
- setAndStore(() -> podState.setPodProgressStatus(podProgressStatus));
- }
-
public final boolean isSuspended() {
return getSafe(() -> podState.isSuspended());
}
@@ -333,8 +358,7 @@ public abstract class PodStateManager {
}
public final Duration getScheduleOffset() {
- DateTime now = getTime();
- return new Duration(now.withTimeAtStartOfDay(), now);
+ return TimeUtil.toDuration(getTime());
}
public final BasalSchedule getBasalSchedule() {
@@ -345,6 +369,15 @@ public abstract class PodStateManager {
setAndStore(() -> podState.setBasalSchedule(basalSchedule));
}
+ public final boolean isBasalCertain() {
+ Boolean certain = getSafe(() -> podState.isBasalCertain());
+ return certain == null || certain;
+ }
+
+ public final void setBasalCertain(boolean certain) {
+ setAndStore(() -> podState.setBasalCertain(certain));
+ }
+
public final DateTime getLastBolusStartTime() {
return getSafe(() -> podState.getLastBolusStartTime());
}
@@ -392,11 +425,19 @@ public abstract class PodStateManager {
return certain == null || certain;
}
- public final void setTempBasal(DateTime startTime, Double amount, Duration duration, boolean certain) {
- setTempBasal(startTime, amount, duration, certain, true);
+ public final void setTempBasalCertain(boolean certain) {
+ setAndStore(() -> {
+ if (!Objects.equals(podState.isTempBasalCertain(), certain)) {
+ podState.setTempBasalCertain(certain);
+ }
+ });
}
- public final void setTempBasal(DateTime startTime, Double amount, Duration duration, Boolean certain, boolean store) {
+ public final void setTempBasal(DateTime startTime, Double amount, Duration duration) {
+ setTempBasal(startTime, amount, duration, true);
+ }
+
+ private void setTempBasal(DateTime startTime, Double amount, Duration duration, boolean store) {
DateTime currentStartTime = getTempBasalStartTime();
Double currentAmount = getTempBasalAmount();
Duration currentDuration = getTempBasalDuration();
@@ -405,7 +446,6 @@ public abstract class PodStateManager {
podState.setTempBasalStartTime(startTime);
podState.setTempBasalAmount(amount);
podState.setTempBasalDuration(duration);
- podState.setTempBasalCertain(certain);
};
if (store) {
@@ -417,6 +457,14 @@ public abstract class PodStateManager {
}
}
+ public final void clearTempBasal() {
+ clearTempBasal(true);
+ }
+
+ private void clearTempBasal(boolean store) {
+ setTempBasal(null, null, null, store);
+ }
+
/**
* @return true when a Temp Basal is stored in the Pod Stated
* Please note that this could also be an expired Temp Basal. For an indication on whether or not
@@ -427,16 +475,59 @@ public abstract class PodStateManager {
}
/**
- * @return true when a Temp Basal is stored in the Pod Stated and this temp basal is currently running (based on start time and duration)
+ * @return true when a Temp Basal is stored in the Pod State and this temp basal is currently running (based on start time and duration)
*/
public final boolean isTempBasalRunning() {
+ return isTempBasalRunningAt(null);
+ }
+
+ /**
+ * @param time the time for which to look up whether a temp basal is running, null meaning now
+ * @return true when a Temp Basal is stored in the Pod State and this temp basal is running at the given time (based on start time and duration),
+ * or when the time provided is null and the delivery status of the Pod inidicated that a TBR is running, but not TBR is stored
+ * This can happen in some rare cases.
+ */
+ public final boolean isTempBasalRunningAt(DateTime time) {
+ if (time == null) { // now
+ if (!hasTempBasal() && getLastDeliveryStatus().isTbrRunning()) {
+ return true;
+ }
+ time = DateTime.now();
+ }
if (hasTempBasal()) {
- DateTime tempBasalEndTime = getTempBasalStartTime().plus(getTempBasalDuration());
- return DateTime.now().isBefore(tempBasalEndTime);
+ DateTime tempBasalStartTime = getTempBasalStartTime();
+ DateTime tempBasalEndTime = tempBasalStartTime.plus(getTempBasalDuration());
+ return (time.isAfter(tempBasalStartTime) || time.isEqual(tempBasalStartTime)) && time.isBefore(tempBasalEndTime);
}
return false;
}
+ /**
+ * @return the current effective basal rate (taking Pod suspension, TBR, and basal profile into account)
+ */
+ public final double getEffectiveBasalRate() {
+ if (isSuspended()) {
+ return 0d;
+ }
+ return getEffectiveBasalRateAt(DateTime.now());
+ }
+
+ /**
+ * @return the effective basal rate at the given time (taking TBR, and basal profile into account)
+ * Suspension is not taken into account as we don't keep historic data of that
+ */
+ public final double getEffectiveBasalRateAt(DateTime time) {
+ BasalSchedule basalSchedule = getSafe(() -> podState.getBasalSchedule());
+ if (basalSchedule == null) {
+ return 0d;
+ }
+ if (isTempBasalRunningAt(time)) {
+ return getTempBasalAmount();
+ }
+ Duration offset = TimeUtil.toDuration(time);
+ return basalSchedule.rateAt(offset);
+ }
+
public final DeliveryStatus getLastDeliveryStatus() {
return getSafe(() -> podState.getLastDeliveryStatus());
}
@@ -460,32 +551,56 @@ public abstract class PodStateManager {
/**
* Does not automatically store pod state in order to decrease I/O load
*/
- public final void updateFromResponse(StatusUpdatableResponse statusResponse) {
+ public final void updateFromResponse(StatusUpdatableResponse status, OmnipodMessage requestMessage) {
setSafe(() -> {
if (podState.getActivatedAt() == null) {
- DateTime activatedAtCalculated = getTime().minus(statusResponse.getTimeActive());
+ DateTime activatedAtCalculated = DateTime.now().withZone(podState.getTimeZone()).minus(status.getTimeActive());
podState.setActivatedAt(activatedAtCalculated);
}
- DateTime expiresAt = podState.getExpiresAt();
- DateTime expiresAtCalculated = podState.getActivatedAt().plus(OmnipodConstants.NOMINAL_POD_LIFE);
- if (expiresAt == null || expiresAtCalculated.isBefore(expiresAt) || expiresAtCalculated.isAfter(expiresAt.plusMinutes(1))) {
- podState.setExpiresAt(expiresAtCalculated);
+ podState.setSuspended(status.getDeliveryStatus() == DeliveryStatus.SUSPENDED);
+ if (!Objects.equals(status.getUnacknowledgedAlerts(), podState.getActiveAlerts())) {
+ podState.setActiveAlerts(status.getUnacknowledgedAlerts());
+ onActiveAlertsChanged();
+ }
+ podState.setLastDeliveryStatus(status.getDeliveryStatus());
+ podState.setReservoirLevel(status.getReservoirLevel());
+ podState.setTotalTicksDelivered(status.getTicksDelivered());
+ podState.setPodProgressStatus(status.getPodProgressStatus());
+ podState.setTimeActive(status.getTimeActive());
+
+ boolean isBasalCertain = podState.isBasalCertain() == null || podState.isBasalCertain();
+ boolean isTempBasalCertain = podState.isTempBasalCertain() == null || podState.isTempBasalCertain();
+ if (!status.getDeliveryStatus().isTbrRunning() && hasTempBasal()) {
+ if (isTempBasalCertain) {
+ clearTempBasal(); // Triggers onTbrChanged when appropriate
+ } else {
+ // Don't trigger onTbrChanged as we will trigger onUncertainTbrRecovered below
+ podState.setTempBasalStartTime(null);
+ podState.setTempBasalAmount(null);
+ podState.setTempBasalDuration(null);
+ }
+ }
+ if (!isTempBasalCertain) {
+ podState.setTempBasalCertain(true);
+ if (!requestMessage.isSetTempBasalMessage() // We always set TBR to uncertain before sending the set temp basal command, so this is not an actual recovery
+ && !requestMessage.isCancelTempBasalMessage()) { // Delivery status changed, so we can't recover here
+ onUncertainTbrRecovered();
+ }
+ }
+ if (!isBasalCertain) {
+ podState.setBasalCertain(true);
}
- podState.setSuspended(statusResponse.getDeliveryStatus() == DeliveryStatus.SUSPENDED);
- podState.setActiveAlerts(statusResponse.getUnacknowledgedAlerts());
- podState.setLastDeliveryStatus(statusResponse.getDeliveryStatus());
- podState.setReservoirLevel(statusResponse.getReservoirLevel());
- podState.setTotalTicksDelivered(statusResponse.getTicksDelivered());
- podState.setPodProgressStatus(statusResponse.getPodProgressStatus());
- if (statusResponse.getDeliveryStatus().isTbrRunning()) {
- if (!isTempBasalCertain() && isTempBasalRunning()) {
- podState.setTempBasalCertain(true);
+ if (status instanceof PodInfoDetailedStatus) {
+ PodInfoDetailedStatus detailedStatus = (PodInfoDetailedStatus) status;
+ if (detailedStatus.isFaulted()) {
+ if (!Objects.equals(podState.getFaultEventCode(), detailedStatus.getFaultEventCode())) {
+ podState.setFaultEventCode(detailedStatus.getFaultEventCode());
+ onFaultEventChanged();
+ }
}
- } else {
- // Triggers {@link #onTbrChanged() onTbrChanged()} when appropriate
- setTempBasal(null, null, null, true, false);
}
+
podState.setLastUpdatedFromResponse(DateTime.now());
});
}
@@ -495,6 +610,21 @@ public abstract class PodStateManager {
// Can be overridden in subclasses
}
+ protected void onUncertainTbrRecovered() {
+ // Deliberately left empty
+ // Can be overridden in subclasses
+ }
+
+ protected void onActiveAlertsChanged() {
+ // Deliberately left empty
+ // Can be overridden in subclasses
+ }
+
+ protected void onFaultEventChanged() {
+ // Deliberately left empty
+ // Can be overridden in subclasses
+ }
+
private void setAndStore(Runnable runnable) {
setSafe(runnable);
storePodState();
@@ -577,16 +707,18 @@ public abstract class PodStateManager {
private DateTime lastUpdatedFromResponse;
private DateTimeZone timeZone;
private DateTime activatedAt;
- private DateTime expiresAt;
- private PodInfoFaultEvent faultEvent;
+ private Duration timeActive;
+ private FaultEventCode faultEventCode;
private Double reservoirLevel;
private Integer totalTicksDelivered;
private boolean suspended;
private NonceState nonceState;
+ private ActivationProgress activationProgress = ActivationProgress.NONE;
private PodProgressStatus podProgressStatus;
private DeliveryStatus lastDeliveryStatus;
private AlertSet activeAlerts;
private BasalSchedule basalSchedule;
+ private Boolean basalCertain;
private DateTime lastBolusStartTime;
private Double lastBolusAmount;
private Duration lastBolusDuration;
@@ -695,20 +827,20 @@ public abstract class PodStateManager {
this.activatedAt = activatedAt;
}
- DateTime getExpiresAt() {
- return expiresAt;
+ public Duration getTimeActive() {
+ return timeActive;
}
- void setExpiresAt(DateTime expiresAt) {
- this.expiresAt = expiresAt;
+ public void setTimeActive(Duration timeActive) {
+ this.timeActive = timeActive;
}
- PodInfoFaultEvent getFaultEvent() {
- return faultEvent;
+ FaultEventCode getFaultEventCode() {
+ return faultEventCode;
}
- void setFaultEvent(PodInfoFaultEvent faultEvent) {
- this.faultEvent = faultEvent;
+ void setFaultEventCode(FaultEventCode faultEventCode) {
+ this.faultEventCode = faultEventCode;
}
Double getReservoirLevel() {
@@ -751,6 +883,14 @@ public abstract class PodStateManager {
this.nonceState = nonceState;
}
+ ActivationProgress getActivationProgress() {
+ return activationProgress;
+ }
+
+ void setActivationProgress(ActivationProgress activationProgress) {
+ this.activationProgress = activationProgress;
+ }
+
PodProgressStatus getPodProgressStatus() {
return podProgressStatus;
}
@@ -783,6 +923,14 @@ public abstract class PodStateManager {
this.basalSchedule = basalSchedule;
}
+ Boolean isBasalCertain() {
+ return basalCertain;
+ }
+
+ void setBasalCertain(Boolean certain) {
+ this.basalCertain = certain;
+ }
+
DateTime getLastBolusStartTime() {
return lastBolusStartTime;
}
@@ -881,12 +1029,13 @@ public abstract class PodStateManager {
", lastUpdatedFromResponse=" + lastUpdatedFromResponse +
", timeZone=" + timeZone +
", activatedAt=" + activatedAt +
- ", expiresAt=" + expiresAt +
- ", faultEvent=" + faultEvent +
+ ", timeActive=" + timeActive +
+ ", faultEventCode=" + faultEventCode +
", reservoirLevel=" + reservoirLevel +
", totalTicksDelivered=" + totalTicksDelivered +
", suspended=" + suspended +
", nonceState=" + nonceState +
+ ", activationProgress=" + activationProgress +
", podProgressStatus=" + podProgressStatus +
", lastDeliveryStatus=" + lastDeliveryStatus +
", activeAlerts=" + activeAlerts +
@@ -899,7 +1048,7 @@ public abstract class PodStateManager {
", tempBasalStartTime=" + tempBasalStartTime +
", tempBasalDuration=" + tempBasalDuration +
", tempBasalCertain=" + tempBasalCertain +
- ", expirationAlertHoursBeforeShutdown=" + expirationAlertTimeBeforeShutdown +
+ ", expirationAlertTimeBeforeShutdown=" + expirationAlertTimeBeforeShutdown +
", lowReservoirAlertUnits=" + lowReservoirAlertUnits +
", configuredAlerts=" + configuredAlerts +
'}';
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/SetupActionResult.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/SetupActionResult.java
deleted file mode 100644
index 867c56aa9f..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/SetupActionResult.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.driver.manager;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus;
-
-public class SetupActionResult {
- private final ResultType resultType;
- private String message;
- private Exception exception;
- private PodProgressStatus podProgressStatus;
-
- public SetupActionResult(ResultType resultType) {
- this.resultType = resultType;
- }
-
- public SetupActionResult message(String message) {
- this.message = message;
- return this;
- }
-
- public SetupActionResult exception(Exception ex) {
- exception = ex;
- return this;
- }
-
- public SetupActionResult podProgressStatus(PodProgressStatus podProgressStatus) {
- this.podProgressStatus = podProgressStatus;
- return this;
- }
-
- public ResultType getResultType() {
- return resultType;
- }
-
- public String getMessage() {
- return message;
- }
-
- public Exception getException() {
- return exception;
- }
-
- public PodProgressStatus getPodProgressStatus() {
- return podProgressStatus;
- }
-
- public enum ResultType {
- SUCCESS(true),
- VERIFICATION_FAILURE(false),
- FAILURE(false);
-
- private final boolean success;
-
- ResultType(boolean success) {
- this.success = success;
- }
-
- public boolean isSuccess() {
- return success;
- }
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/util/AlertConfigurationUtil.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/util/AlertConfigurationUtil.java
index 0d223458d6..92e2d2d74d 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/util/AlertConfigurationUtil.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/util/AlertConfigurationUtil.java
@@ -18,12 +18,12 @@ public class AlertConfigurationUtil {
public static AlertConfiguration createExpirationAdvisoryAlertConfiguration(boolean active, Duration timeUntilAlert, Duration duration) {
return new AlertConfiguration(AlertType.EXPIRATION_ADVISORY_ALERT, AlertSlot.SLOT7, active, false, duration,
- new TimerAlertTrigger(timeUntilAlert), BeepType.BIP_BEEP_BIP_BEEP_BIP_BEEP_BIP_BEEP, BeepRepeat.EVERY_15_MINUTES);
+ new TimerAlertTrigger(timeUntilAlert), BeepType.BIP_BEEP_BIP_BEEP_BIP_BEEP_BIP_BEEP, BeepRepeat.EVERY_MINUTE_FOR_3_MINUTES_REPEAT_EVERY_15_MINUTES);
}
public static AlertConfiguration createShutdownImminentAlertConfiguration(Duration timeUntilAlert) {
return new AlertConfiguration(AlertType.SHUTDOWN_IMMINENT_ALARM, AlertSlot.SLOT2, true, false, Duration.ZERO,
- new TimerAlertTrigger(timeUntilAlert), BeepType.BIP_BEEP_BIP_BEEP_BIP_BEEP_BIP_BEEP, BeepRepeat.EVERY_MINUTE_FOR_3_MINUTES_REPEAT_EVERY_15_MINUTES);
+ new TimerAlertTrigger(timeUntilAlert), BeepType.BIP_BEEP_BIP_BEEP_BIP_BEEP_BIP_BEEP, BeepRepeat.EVERY_15_MINUTES);
}
public static AlertConfiguration createAutoOffAlertConfiguration(boolean active, Duration countdownDuration) {
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/util/TimeUtil.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/util/TimeUtil.java
new file mode 100644
index 0000000000..dc37e42b54
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/util/TimeUtil.java
@@ -0,0 +1,21 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.driver.util;
+
+import org.joda.time.DateTime;
+import org.joda.time.Duration;
+
+public final class TimeUtil {
+ private TimeUtil() {
+ }
+
+ /**
+ * @param dateTime DateTime to convert to duration
+ * @return duration from the start of the day, not taking DST into account
+ * (thus always having 24 hours in a day, not 23 or 25 in days where DST changes)
+ */
+ public static Duration toDuration(DateTime dateTime) {
+ if (dateTime == null) {
+ throw new IllegalArgumentException("dateTime can not be null");
+ }
+ return new Duration(dateTime.toLocalTime().getMillisOfDay());
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/event/EventOmnipodActiveAlertsChanged.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/event/EventOmnipodActiveAlertsChanged.kt
new file mode 100644
index 0000000000..743d321d69
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/event/EventOmnipodActiveAlertsChanged.kt
@@ -0,0 +1,8 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.event
+
+import info.nightscout.androidaps.events.Event
+
+/**
+ * Created by andy on 04.06.2018.
+ */
+class EventOmnipodActiveAlertsChanged : Event()
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/event/EventOmnipodFaultEventChanged.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/event/EventOmnipodFaultEventChanged.kt
new file mode 100644
index 0000000000..d9d2b1e11d
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/event/EventOmnipodFaultEventChanged.kt
@@ -0,0 +1,8 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.event
+
+import info.nightscout.androidaps.events.Event
+
+/**
+ * Created by andy on 04.06.2018.
+ */
+class EventOmnipodFaultEventChanged : Event()
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/event/EventOmnipodUncertainTbrRecovered.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/event/EventOmnipodUncertainTbrRecovered.kt
new file mode 100644
index 0000000000..f2c4dc855a
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/event/EventOmnipodUncertainTbrRecovered.kt
@@ -0,0 +1,8 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.event
+
+import info.nightscout.androidaps.events.Event
+
+/**
+ * Created by andy on 04.06.2018.
+ */
+class EventOmnipodUncertainTbrRecovered : Event()
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsOmnipodManager.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsOmnipodManager.java
index 97a2123d76..9d9e4a0433 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsOmnipodManager.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsOmnipodManager.java
@@ -1,28 +1,39 @@
package info.nightscout.androidaps.plugins.pump.omnipod.manager;
+import android.content.Context;
+import android.content.Intent;
+
import org.joda.time.DateTime;
import org.joda.time.Duration;
+import org.json.JSONException;
+import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import java.util.function.Supplier;
import javax.inject.Inject;
import javax.inject.Singleton;
import dagger.android.HasAndroidInjector;
+import info.nightscout.androidaps.activities.ErrorHelperActivity;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.OmnipodHistoryRecord;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.Event;
+import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
+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.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress;
@@ -32,26 +43,23 @@ import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
import info.nightscout.androidaps.plugins.pump.omnipod.R;
import info.nightscout.androidaps.plugins.pump.omnipod.data.ActiveBolus;
+import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodCommandType;
import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodStorageKeys;
import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodHistoryEntryType;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitReceiver;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoRecentPulseLog;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.AlertConfiguration;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.DeliveryStatus;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.BeepConfigType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.FaultEventCode;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodInfoType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BasalSchedule;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BasalScheduleEntry;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActionInitializationException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActivationTimeExceededException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommandFailedAfterChangingDeliveryStatusException;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommandInitializationException;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommunicationException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CrcMismatchException;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.DeliveryStatusVerificationFailedException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalActivationProgressException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalDeliveryStatusException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalMessageAddressException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalMessageSequenceNumberException;
@@ -65,17 +73,22 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.NonceRes
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.NotEnoughDataException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.OmnipodException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodFaultException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodProgressStatusVerificationFailedException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodReturnedErrorResponseException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PrecedingCommandFailedUncertainlyException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.RileyLinkInterruptedException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.RileyLinkTimeoutException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.RileyLinkUnexpectedException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.RileyLinkUnreachableException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.OmnipodManager;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.SetupActionResult;
import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged;
import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager;
import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil;
import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodAlertUtil;
+import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.resources.ResourceHelper;
import info.nightscout.androidaps.utils.sharedPreferences.SP;
-import io.reactivex.disposables.Disposable;
import io.reactivex.subjects.SingleSubject;
@Singleton
@@ -92,6 +105,9 @@ public class AapsOmnipodManager {
private final OmnipodManager delegate;
private final DatabaseHelperInterface databaseHelper;
private final OmnipodAlertUtil omnipodAlertUtil;
+ private final NSUpload nsUpload;
+ private final ProfileFunction profileFunction;
+ private final Context context;
private boolean basalBeepsEnabled;
private boolean bolusBeepsEnabled;
@@ -100,6 +116,12 @@ public class AapsOmnipodManager {
private boolean suspendDeliveryButtonEnabled;
private boolean pulseLogButtonEnabled;
private boolean timeChangeEventEnabled;
+ private boolean notificationUncertainTbrSoundEnabled;
+ private boolean notificationUncertainSmbSoundEnabled;
+ private boolean notificationUncertainBolusSoundEnabled;
+ private boolean automaticallyAcknowledgeAlertsEnabled;
+ private boolean testBeepButtonEnabled;
+ private boolean rileylinkStatsButtonEnabled;
@Inject
public AapsOmnipodManager(OmnipodRileyLinkCommunicationManager communicationService,
@@ -112,22 +134,26 @@ public class AapsOmnipodManager {
HasAndroidInjector injector,
ActivePluginProvider activePlugin,
DatabaseHelperInterface databaseHelper,
- OmnipodAlertUtil omnipodAlertUtil) {
- if (podStateManager == null) {
- throw new IllegalArgumentException("Pod state manager can not be null");
- }
+ OmnipodAlertUtil omnipodAlertUtil,
+ NSUpload nsUpload,
+ ProfileFunction profileFunction,
+ Context context) {
+
this.podStateManager = podStateManager;
this.aapsOmnipodUtil = aapsOmnipodUtil;
this.aapsLogger = aapsLogger;
this.rxBus = rxBus;
+ this.sp = sp;
this.resourceHelper = resourceHelper;
this.injector = injector;
this.activePlugin = activePlugin;
this.databaseHelper = databaseHelper;
- this.sp = sp;
this.omnipodAlertUtil = omnipodAlertUtil;
+ this.nsUpload = nsUpload;
+ this.profileFunction = profileFunction;
+ this.context = context;
- delegate = new OmnipodManager(aapsLogger, sp, communicationService, podStateManager);
+ delegate = new OmnipodManager(aapsLogger, communicationService, podStateManager);
reloadSettings();
}
@@ -136,147 +162,182 @@ public class AapsOmnipodManager {
basalBeepsEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.BASAL_BEEPS_ENABLED, true);
bolusBeepsEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.BOLUS_BEEPS_ENABLED, true);
smbBeepsEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.SMB_BEEPS_ENABLED, true);
- tbrBeepsEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.TBR_BEEPS_ENABLED, true);
+ tbrBeepsEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.TBR_BEEPS_ENABLED, false);
suspendDeliveryButtonEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.SUSPEND_DELIVERY_BUTTON_ENABLED, false);
pulseLogButtonEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.PULSE_LOG_BUTTON_ENABLED, false);
+ rileylinkStatsButtonEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.RILEYLINK_STATS_BUTTON_ENABLED, false);
timeChangeEventEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.TIME_CHANGE_EVENT_ENABLED, true);
+ notificationUncertainTbrSoundEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.NOTIFICATION_UNCERTAIN_TBR_SOUND_ENABLED, false);
+ notificationUncertainSmbSoundEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.NOTIFICATION_UNCERTAIN_SMB_SOUND_ENABLED, true);
+ notificationUncertainBolusSoundEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.NOTIFICATION_UNCERTAIN_BOLUS_SOUND_ENABLED, true);
+ automaticallyAcknowledgeAlertsEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.AUTOMATICALLY_ACKNOWLEDGE_ALERTS_ENABLED, false);
}
- public PumpEnactResult pairAndPrime(PodInitActionType podInitActionType, PodInitReceiver podInitReceiver) {
- if (podInitActionType != PodInitActionType.PAIR_AND_PRIME_WIZARD_STEP) {
- return new PumpEnactResult(injector).success(false).enacted(false).comment(getStringResource(R.string.omnipod_error_illegal_init_action_type, podInitActionType.name()));
+ public PumpEnactResult initializePod() {
+ PumpEnactResult result = new PumpEnactResult(injector);
+ try {
+ Boolean res = executeCommand(delegate::pairAndPrime)
+ .blockingGet();
+
+ result.success(res).enacted(res);
+
+ if (!res) {
+ result.comment(R.string.omnipod_error_failed_to_initialize_pod);
+ }
+ } catch (Exception ex) {
+ result.success(false).enacted(false).comment(translateException(ex));
}
- try {
- Disposable disposable = delegate.pairAndPrime().subscribe(res -> //
- handleSetupActionResult(podInitActionType, podInitReceiver, res, System.currentTimeMillis(), null));
+ addToHistory(System.currentTimeMillis(), PodHistoryEntryType.INITIALIZE_POD, result.comment, result.success);
- return new PumpEnactResult(injector).success(true).enacted(true);
- } catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- podInitReceiver.returnInitTaskStatus(podInitActionType, false, comment);
- addFailureToHistory(System.currentTimeMillis(), PodHistoryEntryType.PAIR_AND_PRIME, comment);
+ return result;
+ }
+
+ public PumpEnactResult insertCannula(Profile profile) {
+ if (profile == null) {
+ String comment = getStringResource(R.string.omnipod_error_set_initial_basal_schedule_no_profile);
return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
}
- }
- public PumpEnactResult setInitialBasalScheduleAndInsertCannula(PodInitActionType podInitActionType, PodInitReceiver podInitReceiver, Profile profile) {
- if (podInitActionType != PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP) {
- return new PumpEnactResult(injector).success(false).enacted(false).comment(getStringResource(R.string.omnipod_error_illegal_init_action_type, podInitActionType.name()));
- }
+ PumpEnactResult result = new PumpEnactResult(injector);
try {
- BasalSchedule basalSchedule;
- try {
- basalSchedule = mapProfileToBasalSchedule(profile);
- } catch (Exception ex) {
- throw new CommandInitializationException("Basal profile mapping failed", ex);
+ BasalSchedule basalSchedule = mapProfileToBasalSchedule(profile);
+
+ Boolean res = executeCommand(() -> delegate.insertCannula(basalSchedule, omnipodAlertUtil.getExpirationReminderTimeBeforeShutdown(), omnipodAlertUtil.getLowReservoirAlertUnits())) //
+ .blockingGet();
+
+ result.success(res).enacted(res);
+ if (!res) {
+ result.comment(R.string.omnipod_error_failed_to_insert_cannula);
}
+ } catch (Exception ex) {
+ result.success(false).enacted(false).comment(translateException(ex));
+ }
- Disposable disposable = delegate.insertCannula(basalSchedule, omnipodAlertUtil.getExpirationReminderTimeBeforeShutdown(), omnipodAlertUtil.getLowReservoirAlertUnits()).subscribe(res -> //
- handleSetupActionResult(podInitActionType, podInitReceiver, res, System.currentTimeMillis(), profile));
+ addToHistory(System.currentTimeMillis(), PodHistoryEntryType.INSERT_CANNULA, result.comment, result.success);
- rxBus.send(new EventDismissNotification(Notification.OMNIPOD_POD_NOT_ATTACHED));
+ if (result.success) {
+ uploadCareportalEvent(System.currentTimeMillis() - 2000, CareportalEvent.PUMPBATTERYCHANGE);
+ uploadCareportalEvent(System.currentTimeMillis() - 1000, CareportalEvent.INSULINCHANGE);
+ uploadCareportalEvent(System.currentTimeMillis(), CareportalEvent.SITECHANGE);
+
+ sendEvent(new EventDismissNotification(Notification.OMNIPOD_POD_NOT_ATTACHED));
cancelSuspendedFakeTbrIfExists();
-
- return new PumpEnactResult(injector).success(true).enacted(true);
- } catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- podInitReceiver.returnInitTaskStatus(podInitActionType, false, comment);
- addFailureToHistory(PodHistoryEntryType.FILL_CANNULA_SET_BASAL_PROFILE, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
}
+
+ return result;
}
public PumpEnactResult configureAlerts(List alertConfigurations) {
try {
- StatusResponse statusResponse = delegate.configureAlerts(alertConfigurations);
- addSuccessToHistory(PodHistoryEntryType.CONFIGURE_ALERTS, alertConfigurations);
- return new PumpEnactResult(injector).success(true).enacted(false);
+ executeCommand(() -> delegate.configureAlerts(alertConfigurations));
} catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- addFailureToHistory(PodHistoryEntryType.CONFIGURE_ALERTS, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ String errorMessage = translateException(ex);
+ addFailureToHistory(PodHistoryEntryType.CONFIGURE_ALERTS, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
+
+ addSuccessToHistory(PodHistoryEntryType.CONFIGURE_ALERTS, alertConfigurations);
+ return new PumpEnactResult(injector).success(true).enacted(false);
}
+ public PumpEnactResult playTestBeep(BeepConfigType beepType) {
+ try {
+ executeCommand(() -> delegate.playTestBeep(beepType));
+ } catch (Exception ex) {
+ String errorMessage = translateException(ex);
+ addFailureToHistory(PodHistoryEntryType.PLAY_TEST_BEEP, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
+ }
+
+ addSuccessToHistory(PodHistoryEntryType.PLAY_TEST_BEEP, beepType);
+ return new PumpEnactResult(injector).success(true).enacted(false);
+ }
+
+
public PumpEnactResult getPodStatus() {
+ StatusResponse statusResponse;
+
try {
- StatusResponse statusResponse = delegate.getPodStatus();
- addSuccessToHistory(PodHistoryEntryType.GET_POD_STATUS, statusResponse);
- return new PumpEnactResult(injector).success(true).enacted(false);
+ statusResponse = executeCommand(delegate::getPodStatus);
} catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- addFailureToHistory(PodHistoryEntryType.GET_POD_STATUS, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ String errorMessage = translateException(ex);
+ addFailureToHistory(PodHistoryEntryType.GET_POD_STATUS, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
+
+ addSuccessToHistory(PodHistoryEntryType.GET_POD_STATUS, statusResponse);
+ return new PumpEnactResult(injector).success(true).enacted(false);
}
- public PumpEnactResult deactivatePod(PodInitReceiver podInitReceiver) {
+ public PumpEnactResult deactivatePod() {
try {
- delegate.deactivatePod();
+ executeCommand(delegate::deactivatePod);
} catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- podInitReceiver.returnInitTaskStatus(PodInitActionType.DEACTIVATE_POD_WIZARD_STEP, false, comment);
- addFailureToHistory(PodHistoryEntryType.DEACTIVATE_POD, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ String errorMessage = translateException(ex);
+ addFailureToHistory(PodHistoryEntryType.DEACTIVATE_POD, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
addSuccessToHistory(PodHistoryEntryType.DEACTIVATE_POD, null);
-
createSuspendedFakeTbrIfNotExists();
- podInitReceiver.returnInitTaskStatus(PodInitActionType.DEACTIVATE_POD_WIZARD_STEP, true, null);
-
return new PumpEnactResult(injector).success(true).enacted(true);
}
- public PumpEnactResult setBasalProfile(Profile profile) {
+ public PumpEnactResult setBasalProfile(Profile profile, boolean showNotifications) {
+ if (profile == null) {
+ String note = getStringResource(R.string.omnipod_error_failed_to_set_profile_empty_profile);
+ showNotification(Notification.FAILED_UDPATE_PROFILE, note, Notification.URGENT, R.raw.boluserror);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(note);
+ }
+
PodHistoryEntryType historyEntryType = podStateManager.isSuspended() ? PodHistoryEntryType.RESUME_DELIVERY : PodHistoryEntryType.SET_BASAL_SCHEDULE;
try {
- BasalSchedule basalSchedule;
- try {
- basalSchedule = mapProfileToBasalSchedule(profile);
- } catch (Exception ex) {
- throw new CommandInitializationException("Basal profile mapping failed", ex);
- }
- delegate.setBasalSchedule(basalSchedule, isBasalBeepsEnabled());
-
- if (historyEntryType == PodHistoryEntryType.RESUME_DELIVERY) {
- cancelSuspendedFakeTbrIfExists();
- }
- addSuccessToHistory(historyEntryType, profile.getBasalValues());
+ BasalSchedule basalSchedule = mapProfileToBasalSchedule(profile);
+ executeCommand(() -> delegate.setBasalSchedule(basalSchedule, isBasalBeepsEnabled()));
} catch (CommandFailedAfterChangingDeliveryStatusException ex) {
createSuspendedFakeTbrIfNotExists();
- String comment = getStringResource(R.string.omnipod_error_set_basal_failed_delivery_suspended);
- showNotification(Notification.FAILED_UDPATE_PROFILE, comment, Notification.URGENT, R.raw.boluserror);
- addFailureToHistory(historyEntryType, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
- } catch (DeliveryStatusVerificationFailedException ex) {
- String comment;
- if (ex.getExpectedStatus() == DeliveryStatus.SUSPENDED) {
- // Happened when suspending delivery before setting the new profile
- comment = getStringResource(R.string.omnipod_error_set_basal_failed_delivery_might_be_suspended);
- } else {
- // Happened when setting the new profile (after suspending delivery)
- comment = getStringResource(R.string.omnipod_error_set_basal_might_have_failed_delivery_might_be_suspended);
+ if (showNotifications) {
+ showNotification(Notification.FAILED_UDPATE_PROFILE, getStringResource(R.string.omnipod_error_set_basal_failed_delivery_suspended), Notification.URGENT, R.raw.boluserror);
}
- showNotification(Notification.FAILED_UDPATE_PROFILE, comment, Notification.URGENT, R.raw.boluserror);
- addFailureToHistory(historyEntryType, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ String errorMessage = translateException(ex.getCause());
+ addFailureToHistory(historyEntryType, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
+ } catch (PrecedingCommandFailedUncertainlyException ex) {
+ if (showNotifications) {
+ showNotification(Notification.FAILED_UDPATE_PROFILE, getStringResource(R.string.omnipod_error_set_basal_failed_delivery_might_be_suspended), Notification.URGENT, R.raw.boluserror);
+ }
+ String errorMessage = translateException(ex.getCause());
+ addFailureToHistory(historyEntryType, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
} catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- showNotification(Notification.FAILED_UDPATE_PROFILE, comment, Notification.URGENT, R.raw.boluserror);
- addFailureToHistory(historyEntryType, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ if (showNotifications) {
+ String note;
+ if (OmnipodManager.isCertainFailure(ex)) {
+ note = getStringResource(R.string.omnipod_error_set_basal_failed);
+ } else {
+ note = getStringResource(R.string.omnipod_error_set_basal_might_have_failed_delivery_might_be_suspended);
+ }
+ showNotification(Notification.FAILED_UDPATE_PROFILE, note, Notification.URGENT, R.raw.boluserror);
+ }
+ String errorMessage = translateException(ex);
+ addFailureToHistory(historyEntryType, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
- rxBus.send(new EventDismissNotification(Notification.OMNIPOD_POD_SUSPENDED));
- showNotification(Notification.PROFILE_SET_OK,
- resourceHelper.gs(R.string.profile_set_ok),
- Notification.INFO, null);
+ if (historyEntryType == PodHistoryEntryType.RESUME_DELIVERY) {
+ cancelSuspendedFakeTbrIfExists();
+ sendEvent(new EventDismissNotification(Notification.OMNIPOD_POD_SUSPENDED));
+ }
+ addSuccessToHistory(historyEntryType, profile.getBasalValues());
+
+ if (showNotifications) {
+ showNotification(Notification.PROFILE_SET_OK, resourceHelper.gs(R.string.profile_set_ok), Notification.INFO, null);
+ }
return new PumpEnactResult(injector).success(true).enacted(true);
}
@@ -284,10 +345,13 @@ public class AapsOmnipodManager {
public PumpEnactResult discardPodState() {
podStateManager.discardState();
- addSuccessToHistory(System.currentTimeMillis(), PodHistoryEntryType.RESET_POD_STATE, null);
+ addSuccessToHistory(System.currentTimeMillis(), PodHistoryEntryType.DISCARD_POD, null);
createSuspendedFakeTbrIfNotExists();
+ sendEvent(new EventOmnipodPumpValuesChanged());
+ rxBus.send(new EventRefreshOverview("Omnipod command: " + OmnipodCommandType.DISCARD_POD, false));
+
return new PumpEnactResult(injector).success(true).enacted(true);
}
@@ -298,27 +362,27 @@ public class AapsOmnipodManager {
Date bolusStarted;
try {
- bolusCommandResult = delegate.bolus(PumpType.Insulet_Omnipod.determineCorrectBolusSize(detailedBolusInfo.insulin), beepsEnabled, beepsEnabled, detailedBolusInfo.isSMB ? null :
+ bolusCommandResult = executeCommand(() -> delegate.bolus(PumpType.Insulet_Omnipod.determineCorrectBolusSize(detailedBolusInfo.insulin), beepsEnabled, beepsEnabled, detailedBolusInfo.isSMB ? null :
(estimatedUnitsDelivered, percentage) -> {
EventOverviewBolusProgress progressUpdateEvent = EventOverviewBolusProgress.INSTANCE;
progressUpdateEvent.setStatus(getStringResource(R.string.bolusdelivering, detailedBolusInfo.insulin));
progressUpdateEvent.setPercent(percentage);
sendEvent(progressUpdateEvent);
- });
+ }));
bolusStarted = new Date();
} catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- addFailureToHistory(System.currentTimeMillis(), PodHistoryEntryType.SET_BOLUS, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ String errorMessage = translateException(ex);
+ addFailureToHistory(System.currentTimeMillis(), PodHistoryEntryType.SET_BOLUS, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
if (OmnipodManager.CommandDeliveryStatus.UNCERTAIN_FAILURE.equals(bolusCommandResult.getCommandDeliveryStatus())) {
// For safety reasons, we treat this as a bolus that has successfully been delivered, in order to prevent insulin overdose
if (detailedBolusInfo.isSMB) {
- showNotification(getStringResource(R.string.omnipod_bolus_failed_uncertain_smb, detailedBolusInfo.insulin), Notification.URGENT, R.raw.boluserror);
+ showNotification(getStringResource(R.string.omnipod_error_bolus_failed_uncertain_smb, detailedBolusInfo.insulin), Notification.URGENT, isNotificationUncertainSmbSoundEnabled() ? R.raw.boluserror : null);
} else {
- showNotification(getStringResource(R.string.omnipod_bolus_failed_uncertain), Notification.URGENT, R.raw.boluserror);
+ showErrorDialog(getStringResource(R.string.omnipod_error_bolus_failed_uncertain), isNotificationUncertainBolusSoundEnabled() ? R.raw.boluserror : null);
}
}
@@ -378,7 +442,7 @@ public class AapsOmnipodManager {
aapsLogger.debug(LTag.PUMP, "Bolus command successfully executed. Proceeding bolus cancellation");
} else {
aapsLogger.debug(LTag.PUMP, "Not cancelling bolus: bolus command failed");
- String comment = getStringResource(R.string.omnipod_bolus_did_not_succeed);
+ String comment = getStringResource(R.string.omnipod_error_bolus_did_not_succeed);
addFailureToHistory(System.currentTimeMillis(), PodHistoryEntryType.CANCEL_BOLUS, comment);
return new PumpEnactResult(injector).success(true).enacted(false).comment(comment);
}
@@ -387,19 +451,19 @@ public class AapsOmnipodManager {
String comment = null;
for (int i = 1; delegate.hasActiveBolus(); i++) {
aapsLogger.debug(LTag.PUMP, "Attempting to cancel bolus (#{})", i);
+
try {
- delegate.cancelBolus(isBolusBeepsEnabled());
+ executeCommand(() -> delegate.cancelBolus(isBolusBeepsEnabled()));
aapsLogger.debug(LTag.PUMP, "Successfully cancelled bolus", i);
addSuccessToHistory(System.currentTimeMillis(), PodHistoryEntryType.CANCEL_BOLUS, null);
return new PumpEnactResult(injector).success(true).enacted(true);
} catch (PodFaultException ex) {
aapsLogger.debug(LTag.PUMP, "Successfully cancelled bolus (implicitly because of a Pod Fault)");
- showPodFaultNotification(ex.getFaultEvent().getFaultEventCode());
addSuccessToHistory(System.currentTimeMillis(), PodHistoryEntryType.CANCEL_BOLUS, null);
return new PumpEnactResult(injector).success(true).enacted(true);
} catch (Exception ex) {
aapsLogger.debug(LTag.PUMP, "Failed to cancel bolus", ex);
- comment = handleAndTranslateException(ex);
+ comment = translateException(ex);
}
}
@@ -410,19 +474,26 @@ public class AapsOmnipodManager {
public PumpEnactResult setTemporaryBasal(TempBasalPair tempBasalPair) {
boolean beepsEnabled = isTbrBeepsEnabled();
try {
- delegate.setTemporaryBasal(PumpType.Insulet_Omnipod.determineCorrectBasalSize(tempBasalPair.getInsulinRate()), Duration.standardMinutes(tempBasalPair.getDurationMinutes()), beepsEnabled, beepsEnabled);
+ executeCommand(() -> delegate.setTemporaryBasal(PumpType.Insulet_Omnipod.determineCorrectBasalSize(tempBasalPair.getInsulinRate()), Duration.standardMinutes(tempBasalPair.getDurationMinutes()), beepsEnabled, beepsEnabled));
} catch (CommandFailedAfterChangingDeliveryStatusException ex) {
- String comment = getStringResource(R.string.omnipod_cancelled_old_tbr_failed_to_set_new);
- addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, comment);
- showNotification(comment, Notification.NORMAL, null);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
- } catch (DeliveryStatusVerificationFailedException ex) {
- String comment;
- if (ex.getExpectedStatus() == DeliveryStatus.TEMP_BASAL_RUNNING) {
- // Happened after cancelling the old TBR, when attempting to set new TBR
+ String errorMessage = translateException(ex.getCause());
+ addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
+ } catch (PrecedingCommandFailedUncertainlyException ex) {
+ String errorMessage = translateException(ex.getCause());
+ addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, errorMessage);
- comment = getStringResource(R.string.omnipod_error_set_temp_basal_failed_old_tbr_cancelled_new_might_have_failed);
- long pumpId = addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, comment);
+ showNotification(getStringResource(R.string.omnipod_error_set_temp_basal_failed_old_tbr_might_be_cancelled), Notification.URGENT, isNotificationUncertainTbrSoundEnabled() ? R.raw.boluserror : null);
+
+ splitActiveTbr(); // Split any active TBR so when we recover from the uncertain TBR status,we only cancel the part after the cancellation
+
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
+ } catch (Exception ex) {
+ String errorMessage = translateException(ex);
+ long pumpId = addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, errorMessage);
+
+ if (!OmnipodManager.isCertainFailure(ex)) {
+ showNotification(getStringResource(R.string.omnipod_error_set_temp_basal_failed_old_tbr_cancelled_new_might_have_failed), Notification.URGENT, isNotificationUncertainTbrSoundEnabled() ? R.raw.boluserror : null);
// Assume that setting the temp basal succeeded here, because in case it didn't succeed,
// The next StatusResponse that we receive will allow us to recover from the wrong state
@@ -430,35 +501,35 @@ public class AapsOmnipodManager {
// If we would assume that the TBR didn't succeed, we couldn't properly recover upon the next StatusResponse,
// as we could only see that the Pod is running a TBR, but we don't know the rate and duration as
// the Pod doesn't provide this information
+
addTempBasalTreatment(System.currentTimeMillis(), pumpId, tempBasalPair);
- } else {
- // Happened when attempting to cancel the old TBR
- comment = getStringResource(R.string.omnipod_error_set_temp_basal_failed_old_tbr_might_be_cancelled);
- addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, comment);
}
- showNotification(comment, Notification.URGENT, R.raw.boluserror);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
- } catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
long pumpId = addSuccessToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, tempBasalPair);
addTempBasalTreatment(System.currentTimeMillis(), pumpId, tempBasalPair);
- return new PumpEnactResult(injector).success(true).enacted(true);
+ return new PumpEnactResult(injector)
+ .duration(tempBasalPair.getDurationMinutes())
+ .absolute(PumpType.Insulet_Omnipod.determineCorrectBasalSize(tempBasalPair.getInsulinRate()))
+ .success(true).enacted(true);
}
public PumpEnactResult cancelTemporaryBasal() {
try {
- delegate.cancelTemporaryBasal(isTbrBeepsEnabled());
+ executeCommand(() -> delegate.cancelTemporaryBasal(isTbrBeepsEnabled()));
} catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- addFailureToHistory(PodHistoryEntryType.CANCEL_TEMPORARY_BASAL, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ if (OmnipodManager.isCertainFailure(ex)) {
+ showNotification(getStringResource(R.string.omnipod_error_cancel_temp_basal_failed_uncertain), Notification.URGENT, isNotificationUncertainTbrSoundEnabled() ? R.raw.boluserror : null);
+ } else {
+ splitActiveTbr(); // Split any active TBR so when we recover from the uncertain TBR status,we only cancel the part after the cancellation
+ }
+ String errorMessage = translateException(ex);
+ addFailureToHistory(PodHistoryEntryType.CANCEL_TEMPORARY_BASAL, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
long pumpId = addSuccessToHistory(PodHistoryEntryType.CANCEL_TEMPORARY_BASAL, null);
@@ -476,59 +547,66 @@ public class AapsOmnipodManager {
public PumpEnactResult acknowledgeAlerts() {
try {
- delegate.acknowledgeAlerts();
- addSuccessToHistory(PodHistoryEntryType.ACKNOWLEDGE_ALERTS, null);
+ executeCommand(delegate::acknowledgeAlerts);
} catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- addFailureToHistory(PodHistoryEntryType.ACKNOWLEDGE_ALERTS, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ String errorMessage = translateException(ex);
+ addFailureToHistory(PodHistoryEntryType.ACKNOWLEDGE_ALERTS, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
+
+ addSuccessToHistory(PodHistoryEntryType.ACKNOWLEDGE_ALERTS, null);
return new PumpEnactResult(injector).success(true).enacted(true);
}
public PumpEnactResult suspendDelivery() {
try {
- delegate.suspendDelivery(isBasalBeepsEnabled());
+ executeCommand(() -> delegate.suspendDelivery(isBasalBeepsEnabled()));
} catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- addFailureToHistory(PodHistoryEntryType.SUSPEND_DELIVERY, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ String errorMessage = translateException(ex);
+ addFailureToHistory(PodHistoryEntryType.SUSPEND_DELIVERY, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
addSuccessToHistory(PodHistoryEntryType.SUSPEND_DELIVERY, null);
-
createSuspendedFakeTbrIfNotExists();
return new PumpEnactResult(injector).success(true).enacted(true);
}
// Updates the pods current time based on the device timezone and the pod's time zone
- public PumpEnactResult setTime() {
+ public PumpEnactResult setTime(boolean showNotifications) {
try {
- delegate.setTime(isBasalBeepsEnabled());
- addSuccessToHistory(PodHistoryEntryType.SET_TIME, null);
+ executeCommand(() -> delegate.setTime(isBasalBeepsEnabled()));
} catch (CommandFailedAfterChangingDeliveryStatusException ex) {
createSuspendedFakeTbrIfNotExists();
- String comment = getStringResource(R.string.omnipod_error_set_time_failed_delivery_suspended);
- showNotification(comment, Notification.URGENT, R.raw.boluserror);
- addFailureToHistory(PodHistoryEntryType.SET_TIME, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
- } catch (DeliveryStatusVerificationFailedException ex) {
- String comment = getStringResource(R.string.omnipod_error_set_time_failed_delivery_might_be_suspended);
- showNotification(comment, Notification.URGENT, R.raw.boluserror);
- addFailureToHistory(PodHistoryEntryType.SET_TIME, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ if (showNotifications) {
+ showNotification(getStringResource(R.string.omnipod_error_set_time_failed_delivery_suspended), Notification.URGENT, R.raw.boluserror);
+ }
+ String errorMessage = translateException(ex.getCause());
+ addFailureToHistory(PodHistoryEntryType.SET_TIME, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
+ } catch (PrecedingCommandFailedUncertainlyException ex) {
+ if (showNotifications) {
+ showNotification(getStringResource(R.string.omnipod_error_set_time_failed_delivery_might_be_suspended), Notification.URGENT, R.raw.boluserror);
+ }
+ String errorMessage = translateException(ex.getCause());
+ addFailureToHistory(PodHistoryEntryType.SET_TIME, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
} catch (Exception ex) {
- String comment = handleAndTranslateException(ex);
- addFailureToHistory(PodHistoryEntryType.SET_TIME, comment);
- return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
+ if (showNotifications) {
+ showNotification(getStringResource(R.string.omnipod_error_set_time_failed_delivery_might_be_suspended), Notification.URGENT, R.raw.boluserror);
+ }
+ String errorMessage = translateException(ex);
+ addFailureToHistory(PodHistoryEntryType.SET_TIME, errorMessage);
+ return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage);
}
+ addSuccessToHistory(PodHistoryEntryType.SET_TIME, null);
return new PumpEnactResult(injector).success(true).enacted(true);
}
public PodInfoRecentPulseLog readPulseLog() {
- PodInfoResponse response = delegate.getPodInfo(PodInfoType.RECENT_PULSE_LOG);
+ PodInfoResponse response = executeCommand(() -> delegate.getPodInfo(PodInfoType.RECENT_PULSE_LOG));
return (PodInfoRecentPulseLog) response.getPodInfo();
}
@@ -564,10 +642,34 @@ public class AapsOmnipodManager {
return pulseLogButtonEnabled;
}
+ public boolean isTestBeepButtonEnabled() {
+ return testBeepButtonEnabled;
+ }
+
+ public boolean isRileylinkStatsButtonEnabled() {
+ return rileylinkStatsButtonEnabled;
+ }
+
public boolean isTimeChangeEventEnabled() {
return timeChangeEventEnabled;
}
+ public boolean isNotificationUncertainTbrSoundEnabled() {
+ return notificationUncertainTbrSoundEnabled;
+ }
+
+ public boolean isNotificationUncertainSmbSoundEnabled() {
+ return notificationUncertainSmbSoundEnabled;
+ }
+
+ public boolean isNotificationUncertainBolusSoundEnabled() {
+ return notificationUncertainBolusSoundEnabled;
+ }
+
+ public boolean isAutomaticallyAcknowledgeAlertsEnabled() {
+ return automaticallyAcknowledgeAlertsEnabled;
+ }
+
public void addBolusToHistory(DetailedBolusInfo originalDetailedBolusInfo) {
DetailedBolusInfo detailedBolusInfo = originalDetailedBolusInfo.copy();
@@ -632,17 +734,53 @@ public class AapsOmnipodManager {
}
public void reportCancelledTbr() {
+ reportCancelledTbr(System.currentTimeMillis());
+ }
+
+ public void reportCancelledTbr(long time) {
aapsLogger.debug(LTag.PUMP, "Reporting cancelled TBR to AAPS");
long pumpId = addSuccessToHistory(PodHistoryEntryType.CANCEL_TEMPORARY_BASAL_BY_DRIVER, null);
TemporaryBasal temporaryBasal = new TemporaryBasal(injector) //
- .date(System.currentTimeMillis()) //
+ .date(time) //
.duration(0) //
.source(Source.PUMP) //
.pumpId(pumpId);
activePlugin.getActiveTreatments().addToHistoryTempBasal(temporaryBasal);
+
+ sendEvent(new EventRefreshOverview("AapsOmnipodManager.reportCancelledTbr()", false));
+ }
+
+ public long addTbrSuccessToHistory(long requestTime, TempBasalPair tempBasalPair) {
+ return addSuccessToHistory(requestTime, PodHistoryEntryType.SET_TEMPORARY_BASAL, tempBasalPair);
+ }
+
+ // Cancels current TBR and adds a new TBR for the remaining duration
+ private void splitActiveTbr() {
+ TemporaryBasal previouslyRunningTempBasal = activePlugin.getActiveTreatments().getTempBasalFromHistory(System.currentTimeMillis());
+ if (previouslyRunningTempBasal != null) {
+ // Cancel the previously running TBR and start a NEW TBR here for the remaining duration,
+ // so that we only cancel the remaining part when recovering from an uncertain failure in the cancellation
+ int minutesRemaining = previouslyRunningTempBasal.getPlannedRemainingMinutesRoundedUp();
+
+ if (minutesRemaining > 0) {
+ reportCancelledTbr(System.currentTimeMillis() - 1000);
+
+ TempBasalPair newTempBasalPair = new TempBasalPair(previouslyRunningTempBasal.absoluteRate, false, minutesRemaining);
+ long pumpId = addSuccessToHistory(PodHistoryEntryType.SPLIT_TEMPORARY_BASAL, newTempBasalPair);
+
+ TemporaryBasal tempBasal = new TemporaryBasal(injector) //
+ .date(System.currentTimeMillis()) //
+ .absolute(previouslyRunningTempBasal.absoluteRate)
+ .duration(minutesRemaining) //
+ .pumpId(pumpId) //
+ .source(Source.PUMP);
+
+ activePlugin.getActiveTreatments().addToHistoryTempBasal(tempBasal);
+ }
+ }
}
private void addTempBasalTreatment(long time, long pumpId, TempBasalPair tempBasalPair) {
@@ -660,7 +798,8 @@ public class AapsOmnipodManager {
return addSuccessToHistory(System.currentTimeMillis(), entryType, data);
}
- private long addSuccessToHistory(long requestTime, PodHistoryEntryType entryType, Object data) {
+ private long addSuccessToHistory(long requestTime, PodHistoryEntryType entryType, Object
+ data) {
return addToHistory(requestTime, entryType, data, true);
}
@@ -668,11 +807,13 @@ public class AapsOmnipodManager {
return addFailureToHistory(System.currentTimeMillis(), entryType, data);
}
- private long addFailureToHistory(long requestTime, PodHistoryEntryType entryType, Object data) {
+ private long addFailureToHistory(long requestTime, PodHistoryEntryType entryType, Object
+ data) {
return addToHistory(requestTime, entryType, data, false);
}
- private long addToHistory(long requestTime, PodHistoryEntryType entryType, Object data, boolean success) {
+ private long addToHistory(long requestTime, PodHistoryEntryType entryType, Object data,
+ boolean success) {
OmnipodHistoryRecord omnipodHistoryRecord = new OmnipodHistoryRecord(requestTime, entryType.getCode());
if (data != null) {
@@ -691,94 +832,106 @@ public class AapsOmnipodManager {
return omnipodHistoryRecord.getPumpId();
}
- private void handleSetupActionResult(PodInitActionType podInitActionType, PodInitReceiver podInitReceiver, SetupActionResult res, long time, Profile profile) {
- String comment = null;
- switch (res.getResultType()) {
- case FAILURE: {
- aapsLogger.error(LTag.PUMP, "Setup action failed: illegal setup progress: {}", res.getPodProgressStatus());
- comment = getStringResource(R.string.omnipod_driver_error_invalid_progress_state, res.getPodProgressStatus());
- }
- break;
- case VERIFICATION_FAILURE: {
- aapsLogger.error(LTag.PUMP, "Setup action verification failed: caught exception", res.getException());
- comment = getStringResource(R.string.omnipod_driver_error_setup_action_verification_failed);
- }
- break;
+ private void executeCommand(Runnable runnable) {
+ try {
+ runnable.run();
+ } catch (Exception ex) {
+ handleException(ex);
+ throw ex;
}
-
- if (podInitActionType == PodInitActionType.PAIR_AND_PRIME_WIZARD_STEP) {
- addToHistory(time, PodHistoryEntryType.PAIR_AND_PRIME, comment, res.getResultType().isSuccess());
- } else {
- addToHistory(time, PodHistoryEntryType.FILL_CANNULA_SET_BASAL_PROFILE, res.getResultType().isSuccess() ? profile.getBasalValues() : comment, res.getResultType().isSuccess());
- }
-
- podInitReceiver.returnInitTaskStatus(podInitActionType, res.getResultType().isSuccess(), comment);
}
- private String handleAndTranslateException(Exception ex) {
+ private T executeCommand(Supplier supplier) {
+ try {
+ return supplier.get();
+ } catch (Exception ex) {
+ handleException(ex);
+ throw ex;
+ }
+ }
+
+ private void handleException(Exception ex) {
+ if (ex instanceof OmnipodException) {
+ aapsLogger.error(LTag.PUMP, String.format("Caught OmnipodException[certainFailure=%s] from OmnipodManager", ((OmnipodException) ex).isCertainFailure()), ex);
+ if (ex instanceof PodFaultException) {
+ FaultEventCode faultEventCode = ((PodFaultException) ex).getDetailedStatus().getFaultEventCode();
+ showPodFaultNotification(faultEventCode);
+ }
+ } else {
+ aapsLogger.error(LTag.PUMP, "Caught an unexpected non-OmnipodException from OmnipodManager", ex);
+ }
+ }
+
+ public String translateException(Throwable ex) {
String comment;
- if (ex instanceof OmnipodException) {
- if (ex instanceof ActionInitializationException || ex instanceof CommandInitializationException) {
- comment = getStringResource(R.string.omnipod_driver_error_invalid_parameters);
- } else if (ex instanceof CommunicationException) {
- if (((CommunicationException) ex).getType() == CommunicationException.Type.TIMEOUT) {
- comment = getStringResource(R.string.omnipod_driver_error_communication_failed_timeout);
- } else {
- comment = getStringResource(R.string.omnipod_driver_error_communication_failed_unexpected_exception);
- }
- } else if (ex instanceof CrcMismatchException) {
- comment = getStringResource(R.string.omnipod_driver_error_crc_mismatch);
- } else if (ex instanceof IllegalPacketTypeException) {
- comment = getStringResource(R.string.omnipod_driver_error_invalid_packet_type);
- } else if (ex instanceof IllegalPodProgressException || ex instanceof IllegalDeliveryStatusException) {
- comment = getStringResource(R.string.omnipod_driver_error_invalid_progress_state);
- } else if (ex instanceof IllegalVersionResponseTypeException) {
- comment = getStringResource(R.string.omnipod_driver_error_invalid_response);
- } else if (ex instanceof IllegalResponseException) {
- comment = getStringResource(R.string.omnipod_driver_error_invalid_response);
- } else if (ex instanceof IllegalMessageSequenceNumberException) {
- comment = getStringResource(R.string.omnipod_driver_error_invalid_message_sequence_number);
- } else if (ex instanceof IllegalMessageAddressException) {
- comment = getStringResource(R.string.omnipod_driver_error_invalid_message_address);
- } else if (ex instanceof MessageDecodingException) {
- comment = getStringResource(R.string.omnipod_driver_error_message_decoding_failed);
- } else if (ex instanceof NonceOutOfSyncException) {
- comment = getStringResource(R.string.omnipod_driver_error_nonce_out_of_sync);
- } else if (ex instanceof NonceResyncException) {
- comment = getStringResource(R.string.omnipod_driver_error_nonce_resync_failed);
- } else if (ex instanceof NotEnoughDataException) {
- comment = getStringResource(R.string.omnipod_driver_error_not_enough_data);
- } else if (ex instanceof PodFaultException) {
- FaultEventCode faultEventCode = ((PodFaultException) ex).getFaultEvent().getFaultEventCode();
- showPodFaultNotification(faultEventCode);
- comment = createPodFaultErrorMessage(faultEventCode);
- } else if (ex instanceof PodReturnedErrorResponseException) {
- comment = getStringResource(R.string.omnipod_driver_error_pod_returned_error_response);
- } else {
- // Shouldn't be reachable
- comment = getStringResource(R.string.omnipod_driver_error_unexpected_exception_type, ex.getClass().getName());
- }
- aapsLogger.error(LTag.PUMP, String.format("Caught OmnipodException[certainFailure=%s] from OmnipodManager (user-friendly error message: %s)", ((OmnipodException) ex).isCertainFailure(), comment), ex);
+ if (ex instanceof CrcMismatchException) {
+ comment = getStringResource(R.string.omnipod_error_crc_mismatch);
+ } else if (ex instanceof IllegalPacketTypeException) {
+ comment = getStringResource(R.string.omnipod_error_invalid_packet_type);
+ } else if (ex instanceof IllegalPodProgressException || ex instanceof IllegalActivationProgressException ||
+ ex instanceof IllegalDeliveryStatusException) {
+ comment = getStringResource(R.string.omnipod_error_invalid_progress_state);
+ } else if (ex instanceof PodProgressStatusVerificationFailedException) {
+ comment = getStringResource(R.string.omnipod_error_failed_to_verify_activation_progress);
+ } else if (ex instanceof IllegalVersionResponseTypeException) {
+ comment = getStringResource(R.string.omnipod_error_invalid_response);
+ } else if (ex instanceof IllegalResponseException) {
+ comment = getStringResource(R.string.omnipod_error_invalid_response);
+ } else if (ex instanceof IllegalMessageSequenceNumberException) {
+ comment = getStringResource(R.string.omnipod_error_invalid_message_sequence_number);
+ } else if (ex instanceof IllegalMessageAddressException) {
+ comment = getStringResource(R.string.omnipod_error_invalid_message_address);
+ } else if (ex instanceof MessageDecodingException) {
+ comment = getStringResource(R.string.omnipod_error_message_decoding_failed);
+ } else if (ex instanceof NonceOutOfSyncException) {
+ comment = getStringResource(R.string.omnipod_error_nonce_out_of_sync);
+ } else if (ex instanceof NonceResyncException) {
+ comment = getStringResource(R.string.omnipod_error_nonce_resync_failed);
+ } else if (ex instanceof NotEnoughDataException) {
+ comment = getStringResource(R.string.omnipod_error_not_enough_data);
+ } else if (ex instanceof PodFaultException) {
+ FaultEventCode faultEventCode = ((PodFaultException) ex).getDetailedStatus().getFaultEventCode();
+ comment = createPodFaultErrorMessage(faultEventCode);
+ } else if (ex instanceof ActivationTimeExceededException) {
+ comment = getStringResource(R.string.omnipod_error_pod_fault_activation_time_exceeded);
+ } else if (ex instanceof PodReturnedErrorResponseException) {
+ comment = getStringResource(R.string.omnipod_error_pod_returned_error_response);
+ } else if (ex instanceof RileyLinkUnreachableException) {
+ comment = getStringResource(R.string.omnipod_error_communication_failed_no_response_from_riley_link);
+ } else if (ex instanceof RileyLinkInterruptedException) {
+ comment = getStringResource(R.string.omnipod_error_communication_failed_riley_link_interrupted);
+ } else if (ex instanceof RileyLinkTimeoutException) {
+ comment = getStringResource(R.string.omnipod_error_communication_failed_no_response_from_pod);
+ } else if (ex instanceof RileyLinkUnexpectedException) {
+ Throwable cause = ex.getCause();
+ comment = getStringResource(R.string.omnipod_error_unexpected_exception, cause.getClass().getName(), cause.getMessage());
} else {
- comment = getStringResource(R.string.omnipod_driver_error_unexpected_exception_type, ex.getClass().getName());
- aapsLogger.error(LTag.PUMP, String.format("Caught unexpected exception type[certainFailure=false] from OmnipodManager (user-friendly error message: %s)", comment), ex);
+ // Shouldn't be reachable
+ comment = getStringResource(R.string.omnipod_error_unexpected_exception, ex.getClass().getName(), ex.getMessage());
}
return comment;
}
private String createPodFaultErrorMessage(FaultEventCode faultEventCode) {
- String comment;
- comment = getStringResource(R.string.omnipod_driver_error_pod_fault,
+ return getStringResource(R.string.omnipod_error_pod_fault,
ByteUtil.convertUnsignedByteToInt(faultEventCode.getValue()), faultEventCode.name());
- return comment;
}
private void sendEvent(Event event) {
rxBus.send(event);
}
+ private void showErrorDialog(String message, Integer sound) {
+ Intent intent = new Intent(context, ErrorHelperActivity.class);
+ intent.putExtra("soundid", sound);
+ intent.putExtra("status", message);
+ intent.putExtra("title", resourceHelper.gs(R.string.error));
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(intent);
+ }
+
private void showPodFaultNotification(FaultEventCode faultEventCode) {
showPodFaultNotification(faultEventCode, R.raw.boluserror);
}
@@ -822,4 +975,29 @@ public class AapsOmnipodManager {
return new BasalSchedule(entries);
}
+
+ private void uploadCareportalEvent(long date, String event) {
+ if (databaseHelper.getCareportalEventFromTimestamp(date) != null)
+ return;
+ try {
+ JSONObject data = new JSONObject();
+ String enteredBy = sp.getString("careportal_enteredby", "");
+ if (enteredBy.isEmpty()) {
+ data.put("enteredBy", enteredBy);
+ }
+ data.put("created_at", DateUtil.toISOString(date));
+ data.put("mills", date);
+ data.put("eventType", event);
+ data.put("units", profileFunction.getUnits());
+ CareportalEvent careportalEvent = new CareportalEvent(injector);
+ careportalEvent.date = date;
+ careportalEvent.source = Source.USER;
+ careportalEvent.eventType = event;
+ careportalEvent.json = data.toString();
+ databaseHelper.createOrUpdate(careportalEvent);
+ nsUpload.uploadCareportalEntryToNS(data);
+ } catch (JSONException e) {
+ aapsLogger.error(LTag.PUMPCOMM, "Unhandled exception when uploading SiteChange event.", e);
+ }
+ }
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsPodStateManager.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsPodStateManager.java
index 158c4472ad..6ebaa1d3b9 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsPodStateManager.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsPodStateManager.java
@@ -7,7 +7,10 @@ import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodStorageKeys;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
+import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodActiveAlertsChanged;
+import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodFaultEventChanged;
import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodTbrChanged;
+import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodUncertainTbrRecovered;
import info.nightscout.androidaps.utils.sharedPreferences.SP;
@Singleton
@@ -32,7 +35,19 @@ public class AapsPodStateManager extends PodStateManager {
sp.putString(OmnipodStorageKeys.Preferences.POD_STATE, podState);
}
+ @Override protected void onUncertainTbrRecovered() {
+ rxBus.send(new EventOmnipodUncertainTbrRecovered());
+ }
+
@Override protected void onTbrChanged() {
rxBus.send(new EventOmnipodTbrChanged());
}
+
+ @Override protected void onActiveAlertsChanged() {
+ rxBus.send(new EventOmnipodActiveAlertsChanged());
+ }
+
+ @Override protected void onFaultEventChanged() {
+ rxBus.send(new EventOmnipodFaultEventChanged());
+ }
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandAcknowledgeAlerts.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandAcknowledgeAlerts.java
new file mode 100644
index 0000000000..649623e05e
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandAcknowledgeAlerts.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+public final class CommandAcknowledgeAlerts extends OmnipodCustomCommand {
+ public CommandAcknowledgeAlerts() {
+ super(OmnipodCustomCommandType.ACKNOWLEDGE_ALERTS);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandDeactivatePod.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandDeactivatePod.java
new file mode 100644
index 0000000000..3921ec19d7
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandDeactivatePod.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+public final class CommandDeactivatePod extends OmnipodCustomCommand {
+ public CommandDeactivatePod() {
+ super(OmnipodCustomCommandType.DEACTIVATE_POD);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandGetPodStatus.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandGetPodStatus.java
new file mode 100644
index 0000000000..0dfe7880f8
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandGetPodStatus.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+public final class CommandGetPodStatus extends OmnipodCustomCommand {
+ public CommandGetPodStatus() {
+ super(OmnipodCustomCommandType.GET_POD_STATUS);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandHandleTimeChange.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandHandleTimeChange.java
new file mode 100644
index 0000000000..c760b401b5
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandHandleTimeChange.java
@@ -0,0 +1,14 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+public final class CommandHandleTimeChange extends OmnipodCustomCommand {
+ private final boolean requestedByUser;
+
+ public CommandHandleTimeChange(boolean requestedByUser) {
+ super(OmnipodCustomCommandType.HANDLE_TIME_CHANGE);
+ this.requestedByUser = requestedByUser;
+ }
+
+ public boolean isRequestedByUser() {
+ return requestedByUser;
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandPlayTestBeep.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandPlayTestBeep.java
new file mode 100644
index 0000000000..79b3d8a71f
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandPlayTestBeep.java
@@ -0,0 +1,16 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.BeepConfigType;
+
+public class CommandPlayTestBeep extends OmnipodCustomCommand {
+ private final BeepConfigType beepType;
+
+ public CommandPlayTestBeep(BeepConfigType beepType) {
+ super(OmnipodCustomCommandType.PLAY_TEST_BEEP);
+ this.beepType = beepType;
+ }
+
+ public BeepConfigType getBeepType() {
+ return beepType;
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandReadPulseLog.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandReadPulseLog.java
new file mode 100644
index 0000000000..5eb910c6db
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandReadPulseLog.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+public final class CommandReadPulseLog extends OmnipodCustomCommand {
+ public CommandReadPulseLog() {
+ super(OmnipodCustomCommandType.READ_PULSE_LOG);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandResumeDelivery.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandResumeDelivery.java
new file mode 100644
index 0000000000..fe3b07de9f
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandResumeDelivery.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+public final class CommandResumeDelivery extends OmnipodCustomCommand {
+ public CommandResumeDelivery() {
+ super(OmnipodCustomCommandType.RESUME_DELIVERY);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandSuspendDelivery.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandSuspendDelivery.java
new file mode 100644
index 0000000000..12dc8e8d42
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandSuspendDelivery.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+public final class CommandSuspendDelivery extends OmnipodCustomCommand {
+ public CommandSuspendDelivery() {
+ super(OmnipodCustomCommandType.SUSPEND_DELIVERY);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandUpdateAlertConfiguration.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandUpdateAlertConfiguration.java
new file mode 100644
index 0000000000..4edc243845
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandUpdateAlertConfiguration.java
@@ -0,0 +1,7 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+public final class CommandUpdateAlertConfiguration extends OmnipodCustomCommand {
+ public CommandUpdateAlertConfiguration() {
+ super(OmnipodCustomCommandType.UPDATE_ALERT_CONFIGURATION);
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommand.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommand.java
new file mode 100644
index 0000000000..06b2e2a051
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommand.java
@@ -0,0 +1,21 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+import androidx.annotation.NonNull;
+
+import info.nightscout.androidaps.queue.commands.CustomCommand;
+
+public abstract class OmnipodCustomCommand implements CustomCommand {
+ private final OmnipodCustomCommandType type;
+
+ OmnipodCustomCommand(@NonNull OmnipodCustomCommandType type) {
+ this.type = type;
+ }
+
+ public final OmnipodCustomCommandType getType() {
+ return type;
+ }
+
+ @Override public final String getStatusDescription() {
+ return type.getDescription();
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommandType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommandType.java
new file mode 100644
index 0000000000..f88777638e
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommandType.java
@@ -0,0 +1,23 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.queue.command;
+
+public enum OmnipodCustomCommandType {
+ ACKNOWLEDGE_ALERTS("ACKNOWLEDGE ALERTS"),
+ GET_POD_STATUS("GET POD STATUS"),
+ READ_PULSE_LOG("READ PULSE LOG"),
+ SUSPEND_DELIVERY("SUSPEND DELIVERY"),
+ RESUME_DELIVERY("RESUME DELIVERY"),
+ DEACTIVATE_POD("DEACTIVATE POD"),
+ HANDLE_TIME_CHANGE("HANDLE TIME CHANGE"),
+ UPDATE_ALERT_CONFIGURATION("UPDATE ALERT CONFIGURATION"),
+ PLAY_TEST_BEEP("PLAY TEST BEEP");
+
+ private final String description;
+
+ OmnipodCustomCommandType(String description) {
+ this.description = description;
+ }
+
+ String getDescription() {
+ return description;
+ }
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/rileylink/manager/OmnipodRileyLinkCommunicationManager.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/rileylink/manager/OmnipodRileyLinkCommunicationManager.java
index 19b6b6a4a0..44f2069c59 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/rileylink/manager/OmnipodRileyLinkCommunicationManager.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/rileylink/manager/OmnipodRileyLinkCommunicationManager.java
@@ -12,7 +12,6 @@ import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.pump.common.defs.PumpDeviceState;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkCommunicationException;
-import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RLMessage;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RLMessageType;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkBLEError;
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
@@ -24,13 +23,13 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.ErrorResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusUpdatableResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfo;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoFaultEvent;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoDetailedStatus;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoResponse;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.MessageBlockType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PacketType;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodInfoType;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommunicationException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.ActivationTimeExceededException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalMessageAddressException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalMessageSequenceNumberException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalPacketTypeException;
@@ -41,13 +40,16 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.NotEnoug
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.OmnipodException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodFaultException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodReturnedErrorResponseException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.RileyLinkTimeoutException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.RileyLinkUnexpectedException;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.RileyLinkUnreachableException;
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
/**
* Created by andy on 6/29/18.
*/
@Singleton
-public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunicationManager {
+public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunicationManager {
// This empty constructor must be kept, otherwise dagger injection might break!
@Inject
public OmnipodRileyLinkCommunicationManager() {
@@ -69,7 +71,7 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
}
@Override
- public RLMessage createResponseMessage(byte[] payload) {
+ public OmnipodPacket createResponseMessage(byte[] payload) {
return new OmnipodPacket(payload);
}
@@ -127,17 +129,17 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
aapsLogger.debug(LTag.PUMPBTCOMM, "Received response from the Pod [responseMessageBlock={}]", responseMessageBlock);
if (responseMessageBlock instanceof StatusUpdatableResponse) {
- podStateManager.updateFromResponse((StatusUpdatableResponse) responseMessageBlock);
+ podStateManager.updateFromResponse((StatusUpdatableResponse) responseMessageBlock, message);
} else if (responseMessageBlock instanceof PodInfoResponse) {
PodInfo podInfo = ((PodInfoResponse) responseMessageBlock).getPodInfo();
if (podInfo instanceof StatusUpdatableResponse) {
- podStateManager.updateFromResponse((StatusUpdatableResponse) podInfo);
+ podStateManager.updateFromResponse((StatusUpdatableResponse) podInfo, message);
}
}
if (responseClass.isInstance(responseMessageBlock)) {
podStateManager.setLastSuccessfulCommunication(DateTime.now());
- return (T) responseMessageBlock;
+ return responseClass.cast(responseMessageBlock);
} else {
if (responseMessageBlock.getType() == MessageBlockType.ERROR_RESPONSE) {
ErrorResponse error = (ErrorResponse) responseMessageBlock;
@@ -155,12 +157,21 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
podStateManager.setLastFailedCommunication(DateTime.now());
throw new PodReturnedErrorResponseException(error);
}
- } else if (responseMessageBlock.getType() == MessageBlockType.POD_INFO_RESPONSE && ((PodInfoResponse) responseMessageBlock).getSubType() == PodInfoType.FAULT_EVENT) {
- PodInfoFaultEvent faultEvent = (PodInfoFaultEvent) ((PodInfoResponse) responseMessageBlock).getPodInfo();
- podStateManager.setFaultEvent(faultEvent);
- // Treat as successful communication as the user will get notified and can work with this response
- podStateManager.setLastSuccessfulCommunication(DateTime.now());
- throw new PodFaultException(faultEvent);
+ } else if (responseMessageBlock.getType() == MessageBlockType.POD_INFO_RESPONSE && ((PodInfoResponse) responseMessageBlock).getSubType() == PodInfoType.DETAILED_STATUS) {
+ PodInfoDetailedStatus detailedStatus = (PodInfoDetailedStatus) ((PodInfoResponse) responseMessageBlock).getPodInfo();
+ if (detailedStatus.isFaulted()) {
+ // Treat as successful communication in order to prevent false positive pump unreachable alarms
+ podStateManager.setLastSuccessfulCommunication(DateTime.now());
+ throw new PodFaultException(detailedStatus);
+ } else if (detailedStatus.isActivationTimeExceeded()) {
+ // Treat as successful communication in order to prevent false positive pump unreachable alarms
+ podStateManager.setLastSuccessfulCommunication(DateTime.now());
+ throw new ActivationTimeExceededException();
+ } else {
+ // Shouldn't happen
+ podStateManager.setLastFailedCommunication(DateTime.now());
+ throw new IllegalResponseException(responseClass.getSimpleName(), responseMessageBlock.getType());
+ }
} else {
podStateManager.setLastFailedCommunication(DateTime.now());
throw new IllegalResponseException(responseClass.getSimpleName(), responseMessageBlock.getType());
@@ -173,6 +184,7 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
} finally {
podStateManager.storePodState();
}
+
}
private MessageBlock transportMessages(PodStateManager podStateManager, OmnipodMessage message, Integer addressOverride, Integer ackAddressOverride) {
@@ -194,13 +206,13 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
// receive an ACK instead of a normal response, or a partial response and a communication timeout
if (message.isNonceResyncable() && !message.containsBlock(DeactivatePodCommand.class)) {
OmnipodMessage paddedMessage = new OmnipodMessage(message);
- // If messages are nonce resyncable, we want do distinguish between certain and uncertain failures for verification purposes
+ // If messages are nonce resyncable, we want to distinguish between certain and uncertain failures for verification purposes
// However, some commands (e.g. cancel delivery) are single packet command by nature. When we get a timeout with a single packet,
// we are unsure whether or not the command was received by the pod
// However, if we send > 1 packet, we know that the command wasn't received if we never send the subsequent packets,
// because the last packet contains the CRC.
// So we pad the message with get status commands to make it > packet
- paddedMessage.padWithGetStatusCommands(PacketType.PDM.getMaxBodyLength()); // First packet is of type PDM
+ paddedMessage.padWithGetStatusCommands(PacketType.PDM.getMaxBodyLength(), aapsLogger); // First packet is of type PDM
encodedMessage = paddedMessage.getEncoded();
} else {
encodedMessage = message.getEncoded();
@@ -219,23 +231,16 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
try {
// We actually ignore previous (ack) responses if it was not last packet to send
response = exchangePackets(podStateManager, packet);
- } catch (Exception ex) {
- OmnipodException newException;
- if (ex instanceof OmnipodException) {
- newException = (OmnipodException) ex;
- } else {
- newException = new CommunicationException(CommunicationException.Type.UNEXPECTED_EXCEPTION, ex);
- }
-
+ } catch (OmnipodException ex) {
boolean lastPacket = encodedMessage.length == 0;
// If this is not the last packet, the message wasn't fully sent,
// so it's impossible for the pod to have received the message
- newException.setCertainFailure(!lastPacket);
+ ex.setCertainFailure(!lastPacket);
- aapsLogger.debug(LTag.PUMPBTCOMM, "Caught exception in transportMessages. Set certainFailure to {} because encodedMessage.length={}", newException.isCertainFailure(), encodedMessage.length);
+ aapsLogger.debug(LTag.PUMPBTCOMM, "Caught OmnipodException in transportMessages. Set certainFailure to {} because encodedMessage.length={}", ex.isCertainFailure(), encodedMessage.length);
- throw newException;
+ throw ex;
}
}
@@ -247,6 +252,7 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
byte[] receivedMessageData = response.getEncodedMessage();
while (receivedMessage == null) {
try {
+ aapsLogger.debug(LTag.PUMPBTCOMM, "Attempting to decode message: {}", ByteUtil.shortHexStringWithoutSpaces(receivedMessageData));
receivedMessage = OmnipodMessage.decodeMessage(receivedMessageData);
if (receivedMessage.getAddress() != message.getAddress()) {
throw new IllegalMessageAddressException(message.getAddress(), receivedMessage.getAddress());
@@ -261,18 +267,11 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
OmnipodPacket ackForCon = createAckPacket(podStateManager, packetAddress, ackAddressOverride);
- try {
- OmnipodPacket conPacket = exchangePackets(podStateManager, ackForCon, 3, 40);
- if (conPacket.getPacketType() != PacketType.CON) {
- throw new IllegalPacketTypeException(PacketType.CON, conPacket.getPacketType());
- }
- receivedMessageData = ByteUtil.concat(receivedMessageData, conPacket.getEncodedMessage());
- } catch (OmnipodException ex2) {
- throw ex2;
- } catch (Exception ex2) {
- throw new CommunicationException(CommunicationException.Type.UNEXPECTED_EXCEPTION, ex2);
+ OmnipodPacket conPacket = exchangePackets(podStateManager, ackForCon, 3, 40);
+ if (conPacket.getPacketType() != PacketType.CON) {
+ throw new IllegalPacketTypeException(PacketType.CON, conPacket.getPacketType());
}
-
+ receivedMessageData = ByteUtil.concat(receivedMessageData, conPacket.getEncodedMessage());
}
}
@@ -317,8 +316,6 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
}
} catch (OmnipodException ex) {
aapsLogger.debug(LTag.PUMPBTCOMM, "Ignoring exception in ackUntilQuiet", ex);
- } catch (Exception ex) {
- throw new CommunicationException(CommunicationException.Type.UNEXPECTED_EXCEPTION, ex);
}
podStateManager.increasePacketNumber();
@@ -337,24 +334,32 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
podStateManager.increasePacketNumber();
+ boolean gotResponseFromRileyLink = false;
+
while (System.currentTimeMillis() < timeoutTime) {
OmnipodPacket response;
try {
- response = (OmnipodPacket) sendAndListen(packet, responseTimeoutMilliseconds, repeatCount, 9, preambleExtensionMilliseconds);
- } catch (RileyLinkCommunicationException | OmnipodException ex) {
+ response = sendAndListen(packet, responseTimeoutMilliseconds, repeatCount, 9, preambleExtensionMilliseconds);
+ gotResponseFromRileyLink = true;
+ } catch (RileyLinkCommunicationException ex) {
+ if (ex.getErrorCode() != RileyLinkBLEError.NoResponse) {
+ gotResponseFromRileyLink = true;
+ }
+ aapsLogger.debug(LTag.PUMPBTCOMM, "Ignoring exception in exchangePackets: " + ex.getClass().getSimpleName() + ": " + ex.getMessage());
+ continue;
+ } catch (OmnipodException ex) {
+ gotResponseFromRileyLink = true;
aapsLogger.debug(LTag.PUMPBTCOMM, "Ignoring exception in exchangePackets: " + ex.getClass().getSimpleName() + ": " + ex.getMessage());
continue;
} catch (Exception ex) {
- throw new CommunicationException(CommunicationException.Type.UNEXPECTED_EXCEPTION, ex);
+ throw new RileyLinkUnexpectedException(ex);
}
- if (response == null) {
- aapsLogger.debug(LTag.PUMPBTCOMM, "exchangePackets response is null");
- continue;
- } else if (!response.isValid()) {
+ if (!response.isValid()) {
aapsLogger.debug(LTag.PUMPBTCOMM, "exchangePackets response is invalid: " + response);
continue;
}
+
if (response.getAddress() != packet.getAddress() &&
response.getAddress() != OmnipodConstants.DEFAULT_ADDRESS) { // In some (strange) cases, the Pod remains a packet address of 0xffffffff during it's lifetime
aapsLogger.debug(LTag.PUMPBTCOMM, "Packet address " + response.getAddress() + " doesn't match " + packet.getAddress());
@@ -371,7 +376,12 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
return response;
}
- throw new CommunicationException(CommunicationException.Type.TIMEOUT);
+
+ if (gotResponseFromRileyLink) {
+ throw new RileyLinkTimeoutException();
+ }
+
+ throw new RileyLinkUnreachableException();
}
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodFragment.kt
deleted file mode 100644
index ca7382149e..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodFragment.kt
+++ /dev/null
@@ -1,524 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui
-
-import android.content.Intent
-import android.graphics.Color
-import android.os.Bundle
-import android.os.Handler
-import android.os.Looper
-import android.text.TextUtils
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import dagger.android.support.DaggerFragment
-import info.nightscout.androidaps.Constants
-import info.nightscout.androidaps.events.EventPreferenceChange
-import info.nightscout.androidaps.interfaces.ActivePluginProvider
-import info.nightscout.androidaps.interfaces.CommandQueueProvider
-import info.nightscout.androidaps.plugins.bus.RxBusWrapper
-import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange
-import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState
-import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice
-import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusActivity
-import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData
-import info.nightscout.androidaps.plugins.pump.omnipod.OmnipodPumpPlugin
-import info.nightscout.androidaps.plugins.pump.omnipod.R
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodStatusRequestType
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager
-import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged
-import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager
-import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil
-import info.nightscout.androidaps.queue.commands.Command
-import info.nightscout.androidaps.queue.events.EventQueueChanged
-import info.nightscout.androidaps.utils.DateUtil
-import info.nightscout.androidaps.utils.FabricPrivacy
-import info.nightscout.androidaps.utils.WarnColors
-import info.nightscout.androidaps.utils.alertDialogs.OKDialog
-import info.nightscout.androidaps.utils.extensions.plusAssign
-import info.nightscout.androidaps.utils.protection.ProtectionCheck
-import info.nightscout.androidaps.utils.resources.ResourceHelper
-import info.nightscout.androidaps.utils.sharedPreferences.SP
-import info.nightscout.androidaps.utils.ui.UIRunnable
-import io.reactivex.android.schedulers.AndroidSchedulers
-import io.reactivex.disposables.CompositeDisposable
-import io.reactivex.schedulers.Schedulers
-import kotlinx.android.synthetic.main.omnipod_fragment.*
-import org.apache.commons.lang3.StringUtils
-import org.joda.time.DateTime
-import org.joda.time.Duration
-import javax.inject.Inject
-
-class OmnipodFragment : DaggerFragment() {
- companion object {
- private val REFRESH_INTERVAL_MILLIS = 15 * 1000L; // 15 seconds
- private val PLACEHOLDER = "-"; // 15 seconds
- }
-
- @Inject lateinit var fabricPrivacy: FabricPrivacy
- @Inject lateinit var resourceHelper: ResourceHelper
- @Inject lateinit var rxBus: RxBusWrapper
- @Inject lateinit var commandQueue: CommandQueueProvider
- @Inject lateinit var activePlugin: ActivePluginProvider
- @Inject lateinit var omnipodPumpPlugin: OmnipodPumpPlugin
- @Inject lateinit var warnColors: WarnColors
- @Inject lateinit var podStateManager: PodStateManager
- @Inject lateinit var sp: SP
- @Inject lateinit var omnipodUtil: AapsOmnipodUtil
- @Inject lateinit var rileyLinkServiceData: RileyLinkServiceData
- @Inject lateinit var dateUtil: DateUtil
- @Inject lateinit var omnipodManager: AapsOmnipodManager
- @Inject lateinit var protectionCheck: ProtectionCheck
-
- private var disposables: CompositeDisposable = CompositeDisposable()
-
- private val loopHandler = Handler(Looper.getMainLooper())
- private lateinit var refreshLoop: Runnable
-
- init {
- refreshLoop = Runnable {
- activity?.runOnUiThread { updateUi() }
- loopHandler.postDelayed(refreshLoop, REFRESH_INTERVAL_MILLIS)
- }
- }
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- return inflater.inflate(R.layout.omnipod_fragment, container, false)
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- omnipod_button_resume_delivery.setOnClickListener {
- disablePodActionButtons()
- commandQueue.startPump(null)
- }
-
- omnipod_button_pod_mgmt.setOnClickListener {
- if (omnipodPumpPlugin.rileyLinkService?.verifyConfiguration() == true) {
- activity?.let { activity ->
- protectionCheck.queryProtection(
- activity, ProtectionCheck.Protection.PREFERENCES,
- UIRunnable(Runnable { startActivity(Intent(context, PodManagementActivity::class.java)) })
- )
- }
- } else {
- displayNotConfiguredDialog()
- }
- }
-
- omnipod_button_refresh_status.setOnClickListener {
- disablePodActionButtons()
- omnipodPumpPlugin.addPodStatusRequest(OmnipodStatusRequestType.GET_POD_STATE);
- commandQueue.readStatus("Clicked Refresh", null)
- }
-
- omnipod_button_rileylink_stats.setOnClickListener {
- if (omnipodPumpPlugin.rileyLinkService?.verifyConfiguration() == true) {
- startActivity(Intent(context, RileyLinkStatusActivity::class.java))
- } else {
- displayNotConfiguredDialog()
- }
- }
-
- omnipod_button_acknowledge_active_alerts.setOnClickListener {
- disablePodActionButtons()
- omnipodPumpPlugin.addPodStatusRequest(OmnipodStatusRequestType.ACKNOWLEDGE_ALERTS);
- commandQueue.readStatus("Clicked Acknowledge Alert", null)
- }
-
- omnipod_button_suspend_delivery.setOnClickListener {
- disablePodActionButtons()
- omnipodPumpPlugin.addPodStatusRequest(OmnipodStatusRequestType.SUSPEND_DELIVERY);
- commandQueue.readStatus("Clicked Suspend Delivery", null)
- }
-
- omnipod_button_pulse_log.setOnClickListener {
- disablePodActionButtons()
- omnipodPumpPlugin.addPodStatusRequest(OmnipodStatusRequestType.GET_PULSE_LOG);
- commandQueue.readStatus("Clicked Pulse Log", null)
- }
- }
-
- override fun onResume() {
- super.onResume()
- loopHandler.postDelayed(refreshLoop, REFRESH_INTERVAL_MILLIS)
- disposables += rxBus
- .toObservable(EventRileyLinkDeviceStatusChange::class.java)
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe({
- updateRileyLinkStatus()
- updatePodActionButtons()
- }, { fabricPrivacy.logException(it) })
- disposables += rxBus
- .toObservable(EventOmnipodPumpValuesChanged::class.java)
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe({
- updateOmnipodStatus()
- updatePodActionButtons()
- }, { fabricPrivacy.logException(it) })
- disposables += rxBus
- .toObservable(EventQueueChanged::class.java)
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe({
- updateQueueStatus()
- updatePodActionButtons()
- }, { fabricPrivacy.logException(it) })
- disposables += rxBus
- .toObservable(EventPreferenceChange::class.java)
- .observeOn(Schedulers.io())
- .subscribe({
- updatePulseLogButton()
- }, { fabricPrivacy.logException(it) })
- updateUi()
- }
-
- override fun onPause() {
- super.onPause()
- disposables.clear()
- loopHandler.removeCallbacks(refreshLoop)
- }
-
- private fun updateUi() {
- updateRileyLinkStatus()
- updateOmnipodStatus()
- updatePodActionButtons()
- updateQueueStatus()
- }
-
- @Synchronized
- private fun updateRileyLinkStatus() {
- val rileyLinkServiceState = rileyLinkServiceData.rileyLinkServiceState
-
- val resourceId = rileyLinkServiceState.getResourceId()
- val rileyLinkError = rileyLinkServiceData.rileyLinkError
-
- omnipod_rl_status.text =
- when {
- rileyLinkServiceState == RileyLinkServiceState.NotStarted -> resourceHelper.gs(resourceId)
- rileyLinkServiceState.isConnecting -> "{fa-bluetooth-b spin} " + resourceHelper.gs(resourceId)
- rileyLinkServiceState.isError && rileyLinkError == null -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId)
- rileyLinkServiceState.isError && rileyLinkError != null -> "{fa-bluetooth-b} " + resourceHelper.gs(rileyLinkError.getResourceId(RileyLinkTargetDevice.Omnipod))
- else -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId)
- }
- omnipod_rl_status.setTextColor(if (rileyLinkServiceState.isError || rileyLinkError != null) Color.RED else Color.WHITE)
- }
-
- private fun updateOmnipodStatus() {
- updateLastConnection()
- updateLastBolus()
- updateTempBasal()
- updatePodStatus()
-
- val errors = ArrayList();
- if (omnipodPumpPlugin.rileyLinkService != null) {
- val rileyLinkErrorDescription = omnipodPumpPlugin.rileyLinkService.errorDescription
- if (StringUtils.isNotEmpty(rileyLinkErrorDescription)) {
- errors.add(rileyLinkErrorDescription)
- }
- }
-
- if (!podStateManager.hasPodState() || !podStateManager.isPodInitialized) {
- omnipod_pod_address.text = if (podStateManager.hasPodState()) {
- podStateManager.address.toString()
- } else {
- PLACEHOLDER
- }
- omnipod_pod_lot.text = PLACEHOLDER
- omnipod_pod_tid.text = PLACEHOLDER
- omnipod_pod_firmware_version.text = PLACEHOLDER
- omnipod_pod_expiry.text = PLACEHOLDER
- omnipod_pod_expiry.setTextColor(Color.WHITE)
- omnipod_base_basal_rate.text = PLACEHOLDER
- omnipod_total_delivered.text = PLACEHOLDER
- omnipod_reservoir.text = PLACEHOLDER
- omnipod_pod_active_alerts.text = PLACEHOLDER
- } else {
- omnipod_pod_address.text = podStateManager.address.toString()
- omnipod_pod_lot.text = podStateManager.lot.toString()
- omnipod_pod_tid.text = podStateManager.tid.toString()
- omnipod_pod_firmware_version.text = resourceHelper.gs(R.string.omnipod_pod_firmware_version_value, podStateManager.pmVersion.toString(), podStateManager.piVersion.toString())
- val expiresAt = podStateManager.expiresAt
- if (expiresAt == null) {
- omnipod_pod_expiry.text = PLACEHOLDER
- omnipod_pod_expiry.setTextColor(Color.WHITE)
- } else {
- omnipod_pod_expiry.text = dateUtil.dateAndTimeString(expiresAt.toDate())
- omnipod_pod_expiry.setTextColor(if (DateTime.now().isAfter(expiresAt)) {
- Color.RED
- } else {
- Color.WHITE
- })
- }
-
- if (podStateManager.hasFaultEvent()) {
- val faultEventCode = podStateManager.faultEvent.faultEventCode
- errors.add(resourceHelper.gs(R.string.omnipod_pod_status_pod_fault_description, faultEventCode.value, faultEventCode.name))
- }
-
- val now = DateTime.now()
-
- // base basal rate
- omnipod_base_basal_rate.text = if (podStateManager.isPodActivationCompleted) {
- resourceHelper.gs(R.string.pump_basebasalrate, omnipodPumpPlugin.model().determineCorrectBasalSize(podStateManager.basalSchedule.rateAt(Duration(now.withTimeAtStartOfDay(), now))))
- } else {
- PLACEHOLDER
- }
-
- // total delivered
- omnipod_total_delivered.text = if (podStateManager.isPodActivationCompleted && podStateManager.totalInsulinDelivered != null) {
- resourceHelper.gs(R.string.omnipod_total_delivered, podStateManager.totalInsulinDelivered - OmnipodConstants.POD_SETUP_UNITS);
- } else {
- PLACEHOLDER
- }
-
- // reservoir
- if (podStateManager.reservoirLevel == null) {
- omnipod_reservoir.text = resourceHelper.gs(R.string.omnipod_reservoir_over50)
- omnipod_reservoir.setTextColor(Color.WHITE)
- } else {
- omnipod_reservoir.text = resourceHelper.gs(R.string.omnipod_reservoir_left, podStateManager.reservoirLevel)
- warnColors.setColorInverse(omnipod_reservoir, podStateManager.reservoirLevel, 50.0, 20.0)
- }
-
- omnipod_pod_active_alerts.text = if (podStateManager.hasActiveAlerts()) {
- TextUtils.join(System.lineSeparator(), omnipodUtil.getTranslatedActiveAlerts(podStateManager))
- } else {
- PLACEHOLDER
- }
- }
-
- if (errors.size == 0) {
- omnipod_errors.text = PLACEHOLDER
- omnipod_errors.setTextColor(Color.WHITE)
- } else {
- omnipod_errors.text = StringUtils.join(errors, System.lineSeparator())
- omnipod_errors.setTextColor(Color.RED)
- }
- }
-
- private fun updateLastConnection() {
- if (podStateManager.isPodInitialized && podStateManager.lastSuccessfulCommunication != null) {
- omnipod_last_connection.text = readableDuration(podStateManager.lastSuccessfulCommunication)
- val lastConnectionColor =
- if (omnipodPumpPlugin.isUnreachableAlertTimeoutExceeded(getPumpUnreachableTimeout().millis)) {
- Color.RED
- } else {
- Color.WHITE
- }
- omnipod_last_connection.setTextColor(lastConnectionColor)
- } else {
- omnipod_last_connection.setTextColor(Color.WHITE)
- omnipod_last_connection.text = if (podStateManager.hasPodState() && podStateManager.lastSuccessfulCommunication != null) {
- readableDuration(podStateManager.lastSuccessfulCommunication)
- } else {
- PLACEHOLDER
- }
- }
- }
-
- private fun updatePodStatus() {
- omnipod_pod_status.text = if (!podStateManager.hasPodState()) {
- resourceHelper.gs(R.string.omnipod_pod_status_no_active_pod)
- } else if (!podStateManager.isPodActivationCompleted) {
- if (!podStateManager.isPodInitialized) {
- resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_pair_and_prime)
- } else {
- if (PodProgressStatus.ACTIVATION_TIME_EXCEEDED == podStateManager.podProgressStatus) {
- resourceHelper.gs(R.string.omnipod_pod_status_activation_time_exceeded)
- } else if (podStateManager.podProgressStatus.isBefore(PodProgressStatus.PRIMING_COMPLETED)) {
- resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_pair_and_prime)
- } else {
- resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_cannula_insertion)
- }
- }
- } else {
- if (podStateManager.podProgressStatus.isRunning) {
- if (podStateManager.isSuspended) {
- resourceHelper.gs(R.string.omnipod_pod_status_suspended)
- } else {
- resourceHelper.gs(R.string.omnipod_pod_status_running)
- }
- } else if (podStateManager.podProgressStatus == PodProgressStatus.FAULT_EVENT_OCCURRED) {
- resourceHelper.gs(R.string.omnipod_pod_status_pod_fault)
- } else if (podStateManager.podProgressStatus == PodProgressStatus.INACTIVE) {
- resourceHelper.gs(R.string.omnipod_pod_status_inactive)
- } else {
- podStateManager.podProgressStatus.toString()
- }
- }
-
- val podStatusColor = if (!podStateManager.isPodActivationCompleted || podStateManager.isPodDead || podStateManager.isSuspended) {
- Color.RED
- } else {
- Color.WHITE
- }
- omnipod_pod_status.setTextColor(podStatusColor)
- }
-
- private fun updateLastBolus() {
- if (podStateManager.isPodActivationCompleted && podStateManager.hasLastBolus()) {
- var text = resourceHelper.gs(R.string.omnipod_last_bolus, omnipodPumpPlugin.model().determineCorrectBolusSize(podStateManager.lastBolusAmount), resourceHelper.gs(R.string.insulin_unit_shortname), readableDuration(podStateManager.lastBolusStartTime))
- val textColor: Int
-
- if (podStateManager.isLastBolusCertain) {
- textColor = Color.WHITE
- } else {
- textColor = Color.RED
- text += " (" + resourceHelper.gs(R.string.omnipod_uncertain) + ")"
- }
-
- omnipod_last_bolus.text = text;
- omnipod_last_bolus.setTextColor(textColor)
-
- } else {
- omnipod_last_bolus.text = PLACEHOLDER
- omnipod_last_bolus.setTextColor(Color.WHITE)
- }
- }
-
- private fun updateTempBasal() {
- if (podStateManager.isPodActivationCompleted && podStateManager.isTempBasalRunning) {
- val now = DateTime.now()
-
- val startTime = podStateManager.tempBasalStartTime;
- val amount = podStateManager.tempBasalAmount
- val duration = podStateManager.tempBasalDuration;
-
- val minutesRunning = Duration(startTime, now).standardMinutes
-
- var text: String
- val textColor: Int
- text = resourceHelper.gs(R.string.omnipod_temp_basal, amount, dateUtil.timeString(startTime.millis), minutesRunning, duration.standardMinutes)
- if (podStateManager.isTempBasalCertain) {
- textColor = Color.WHITE
- } else {
- textColor = Color.RED
- text += " (" + resourceHelper.gs(R.string.omnipod_uncertain) + ")"
- }
-
- omnipod_temp_basal.text = text;
- omnipod_temp_basal.setTextColor(textColor)
- } else {
- omnipod_temp_basal.text = PLACEHOLDER
- omnipod_temp_basal.setTextColor(Color.WHITE)
- }
- }
-
- private fun updateQueueStatus() {
- if (isQueueEmpty()) {
- omnipod_queue.visibility = View.GONE
- } else {
- omnipod_queue.visibility = View.VISIBLE
- omnipod_queue.text = commandQueue.spannedStatus().toString()
- }
- }
-
- private fun updatePodActionButtons() {
- updateRefreshStatusButton()
- updateResumeDeliveryButton()
- updateAcknowledgeAlertsButton()
- updateSuspendDeliveryButton()
- updatePulseLogButton()
- }
-
- private fun disablePodActionButtons() {
- omnipod_button_acknowledge_active_alerts.isEnabled = false
- omnipod_button_resume_delivery.isEnabled = false
- omnipod_button_refresh_status.isEnabled = false
- omnipod_button_pulse_log.isEnabled = false
- }
-
- private fun updateRefreshStatusButton() {
- omnipod_button_refresh_status.isEnabled = podStateManager.isPodInitialized && podStateManager.podProgressStatus.isAtLeast(PodProgressStatus.PAIRING_COMPLETED)
- && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
- }
-
- private fun updateResumeDeliveryButton() {
- val queueEmptyOrStartingPump = isQueueEmpty() || commandQueue.isRunning(Command.CommandType.START_PUMP)
- if (podStateManager.isPodActivationCompleted && podStateManager.isSuspended && queueEmptyOrStartingPump) {
- omnipod_button_resume_delivery.visibility = View.VISIBLE
- omnipod_button_resume_delivery.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
- } else {
- omnipod_button_resume_delivery.visibility = View.GONE
- }
- }
-
- private fun updateAcknowledgeAlertsButton() {
- omnipod_button_acknowledge_active_alerts.isEnabled = podStateManager.isPodActivationCompleted && podStateManager.hasActiveAlerts()
- && !podStateManager.isPodDead && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
- }
-
- private fun updateSuspendDeliveryButton() {
- // If the Pod is currently suspended, we show the Resume delivery button instead.
- if (omnipodManager.isSuspendDeliveryButtonEnabled && !(podStateManager.isPodRunning && podStateManager.isSuspended)) {
- omnipod_button_suspend_delivery.visibility = View.VISIBLE
- omnipod_button_suspend_delivery.isEnabled = podStateManager.isPodRunning && !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
- } else {
- omnipod_button_suspend_delivery.visibility = View.GONE
- }
- }
-
- private fun updatePulseLogButton() {
- if (omnipodManager.isPulseLogButtonEnabled) {
- omnipod_button_pulse_log.visibility = View.VISIBLE
- omnipod_button_pulse_log.isEnabled = podStateManager.isPodActivationCompleted && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
- } else {
- omnipod_button_pulse_log.visibility = View.GONE
- }
- }
-
- private fun displayNotConfiguredDialog() {
- context?.let {
- OKDialog.show(it, resourceHelper.gs(R.string.omnipod_warning),
- resourceHelper.gs(R.string.omnipod_error_operation_not_possible_no_configuration), null)
- }
- }
-
- private fun readableDuration(dateTime: DateTime): String {
- val duration = Duration(dateTime, DateTime.now())
- val hours = duration.standardHours.toInt()
- val minutes = duration.standardMinutes.toInt()
- val seconds = duration.standardSeconds.toInt()
- when {
- seconds < 10 -> {
- return resourceHelper.gs(R.string.omnipod_moments_ago)
- }
-
- seconds < 60 -> {
- return resourceHelper.gs(R.string.omnipod_less_than_a_minute_ago)
- }
-
- seconds < 60 * 60 -> { // < 1 hour
- return resourceHelper.gs(R.string.omnipod_time_ago, resourceHelper.gq(R.plurals.omnipod_minutes, minutes, minutes))
- }
-
- seconds < 24 * 60 * 60 -> { // < 1 day
- val minutesLeft = minutes % 60
- if (minutesLeft > 0)
- return resourceHelper.gs(R.string.omnipod_time_ago,
- resourceHelper.gs(R.string.omnipod_composite_time, resourceHelper.gq(R.plurals.omnipod_hours, hours, hours), resourceHelper.gq(R.plurals.omnipod_minutes, minutesLeft, minutesLeft)))
- return resourceHelper.gs(R.string.omnipod_time_ago, resourceHelper.gq(R.plurals.omnipod_hours, hours, hours))
- }
-
- else -> {
- val days = hours / 24
- val hoursLeft = hours % 24
- if (hoursLeft > 0)
- return resourceHelper.gs(R.string.omnipod_time_ago,
- resourceHelper.gs(R.string.omnipod_composite_time, resourceHelper.gq(R.plurals.omnipod_days, days, days), resourceHelper.gq(R.plurals.omnipod_hours, hoursLeft, hoursLeft)))
- return resourceHelper.gs(R.string.omnipod_time_ago, resourceHelper.gq(R.plurals.omnipod_days, days, days))
- }
- }
- }
-
- private fun isQueueEmpty(): Boolean {
- return commandQueue.size() == 0 && commandQueue.performing() == null
- }
-
- // FIXME ideally we should just have access to LocalAlertUtils here
- private fun getPumpUnreachableTimeout(): Duration {
- return Duration.standardMinutes(sp.getInt(resourceHelper.gs(R.string.key_pump_unreachable_threshold_minutes), Constants.DEFAULT_PUMP_UNREACHABLE_THRESHOLD_MINUTES).toLong())
- }
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodOverviewFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodOverviewFragment.kt
new file mode 100644
index 0000000000..d745d5a978
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodOverviewFragment.kt
@@ -0,0 +1,620 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui
+
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import android.text.TextUtils
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import dagger.android.support.DaggerFragment
+import info.nightscout.androidaps.Constants
+import info.nightscout.androidaps.activities.ErrorHelperActivity
+import info.nightscout.androidaps.events.EventPreferenceChange
+import info.nightscout.androidaps.interfaces.ActivePluginProvider
+import info.nightscout.androidaps.interfaces.CommandQueueProvider
+import info.nightscout.androidaps.plugins.bus.RxBusWrapper
+import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange
+import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState
+import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice
+import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData
+import info.nightscout.androidaps.plugins.pump.omnipod.OmnipodPumpPlugin
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.util.TimeUtil
+import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged
+import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandAcknowledgeAlerts
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandGetPodStatus
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandHandleTimeChange
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandResumeDelivery
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandSuspendDelivery
+import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil
+import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodAlertUtil
+import info.nightscout.androidaps.queue.Callback
+import info.nightscout.androidaps.queue.events.EventQueueChanged
+import info.nightscout.androidaps.utils.DateUtil
+import info.nightscout.androidaps.utils.FabricPrivacy
+import info.nightscout.androidaps.utils.alertDialogs.OKDialog
+import info.nightscout.androidaps.utils.extensions.plusAssign
+import info.nightscout.androidaps.utils.protection.ProtectionCheck
+import info.nightscout.androidaps.utils.resources.ResourceHelper
+import info.nightscout.androidaps.utils.sharedPreferences.SP
+import info.nightscout.androidaps.utils.ui.UIRunnable
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.CompositeDisposable
+import kotlinx.android.synthetic.main.omnipod_overview.*
+import org.apache.commons.lang3.StringUtils
+import org.joda.time.DateTime
+import org.joda.time.Duration
+import java.util.*
+import javax.inject.Inject
+import kotlin.collections.ArrayList
+
+class OmnipodOverviewFragment : DaggerFragment() {
+ companion object {
+
+ private val REFRESH_INTERVAL_MILLIS = 15 * 1000L // 15 seconds
+ private val PLACEHOLDER = "-" // 15 seconds
+ }
+
+ @Inject lateinit var fabricPrivacy: FabricPrivacy
+ @Inject lateinit var resourceHelper: ResourceHelper
+ @Inject lateinit var rxBus: RxBusWrapper
+ @Inject lateinit var commandQueue: CommandQueueProvider
+ @Inject lateinit var activePlugin: ActivePluginProvider
+ @Inject lateinit var omnipodPumpPlugin: OmnipodPumpPlugin
+ @Inject lateinit var podStateManager: PodStateManager
+ @Inject lateinit var sp: SP
+ @Inject lateinit var omnipodUtil: AapsOmnipodUtil
+ @Inject lateinit var omnipodAlertUtil: OmnipodAlertUtil
+ @Inject lateinit var rileyLinkServiceData: RileyLinkServiceData
+ @Inject lateinit var dateUtil: DateUtil
+ @Inject lateinit var omnipodManager: AapsOmnipodManager
+ @Inject lateinit var protectionCheck: ProtectionCheck
+
+ private var disposables: CompositeDisposable = CompositeDisposable()
+
+ private val loopHandler = Handler(Looper.getMainLooper())
+ private lateinit var refreshLoop: Runnable
+
+ init {
+ refreshLoop = Runnable {
+ activity?.runOnUiThread { updateUi() }
+ loopHandler.postDelayed(refreshLoop, REFRESH_INTERVAL_MILLIS)
+ }
+ }
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ return inflater.inflate(R.layout.omnipod_overview, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ omnipod_overview_button_pod_management.setOnClickListener {
+ if (omnipodPumpPlugin.rileyLinkService?.verifyConfiguration() == true) {
+ activity?.let { activity ->
+ protectionCheck.queryProtection(
+ activity, ProtectionCheck.Protection.PREFERENCES,
+ UIRunnable(Runnable { startActivity(Intent(context, PodManagementActivity::class.java)) })
+ )
+ }
+ } else {
+ displayNotConfiguredDialog()
+ }
+ }
+
+ omnipod_overview_button_resume_delivery.setOnClickListener {
+ disablePodActionButtons()
+ commandQueue.customCommand(CommandResumeDelivery(),
+ DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_resume_delivery), true).messageOnSuccess(resourceHelper.gs(R.string.omnipod_confirmation_delivery_resumed)))
+ }
+
+ omnipod_overview_button_refresh_status.setOnClickListener {
+ disablePodActionButtons()
+ commandQueue.customCommand(CommandGetPodStatus(),
+ DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_refresh_status), false))
+ }
+
+ omnipod_overview_button_acknowledge_active_alerts.setOnClickListener {
+ disablePodActionButtons()
+ commandQueue.customCommand(CommandAcknowledgeAlerts(),
+ DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_acknowledge_alerts), false)
+ .messageOnSuccess(resourceHelper.gs(R.string.omnipod_confirmation_acknowledged_alerts)))
+ }
+
+ omnipod_overview_button_suspend_delivery.setOnClickListener {
+ disablePodActionButtons()
+ commandQueue.customCommand(CommandSuspendDelivery(),
+ DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_suspend_delivery), true)
+ .messageOnSuccess(resourceHelper.gs(R.string.omnipod_confirmation_suspended_delivery)))
+ }
+
+ omnipod_overview_button_set_time.setOnClickListener {
+ disablePodActionButtons()
+ commandQueue.customCommand(CommandHandleTimeChange(true),
+ DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_set_time), true)
+ .messageOnSuccess(resourceHelper.gs(R.string.omnipod_confirmation_time_on_pod_updated)))
+ }
+ }
+
+ override fun onResume() {
+ super.onResume()
+ loopHandler.postDelayed(refreshLoop, REFRESH_INTERVAL_MILLIS)
+ disposables += rxBus
+ .toObservable(EventRileyLinkDeviceStatusChange::class.java)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe({
+ updateRileyLinkStatus()
+ updatePodActionButtons()
+ }, { fabricPrivacy.logException(it) })
+ disposables += rxBus
+ .toObservable(EventOmnipodPumpValuesChanged::class.java)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe({
+ updateOmnipodStatus()
+ updatePodActionButtons()
+ }, { fabricPrivacy.logException(it) })
+ disposables += rxBus
+ .toObservable(EventQueueChanged::class.java)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe({
+ updateQueueStatus()
+ updatePodActionButtons()
+ }, { fabricPrivacy.logException(it) })
+ disposables += rxBus
+ .toObservable(EventPreferenceChange::class.java)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe({
+ updatePodActionButtons()
+ }, { fabricPrivacy.logException(it) })
+ updateUi()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ disposables.clear()
+ loopHandler.removeCallbacks(refreshLoop)
+ }
+
+ private fun updateUi() {
+ updateRileyLinkStatus()
+ updateOmnipodStatus()
+ updatePodActionButtons()
+ updateQueueStatus()
+ }
+
+ @Synchronized
+ private fun updateRileyLinkStatus() {
+ val rileyLinkServiceState = rileyLinkServiceData.rileyLinkServiceState
+
+ val resourceId = rileyLinkServiceState.resourceId
+ val rileyLinkError = rileyLinkServiceData.rileyLinkError
+
+ omnipod_overview_riley_link_status.text =
+ when {
+ rileyLinkServiceState == RileyLinkServiceState.NotStarted -> resourceHelper.gs(resourceId)
+ rileyLinkServiceState.isConnecting -> "{fa-bluetooth-b spin} " + resourceHelper.gs(resourceId)
+ rileyLinkServiceState.isError && rileyLinkError == null -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId)
+ rileyLinkServiceState.isError && rileyLinkError != null -> "{fa-bluetooth-b} " + resourceHelper.gs(rileyLinkError.getResourceId(RileyLinkTargetDevice.Omnipod))
+ else -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId)
+ }
+ omnipod_overview_riley_link_status.setTextColor(if (rileyLinkServiceState.isError || rileyLinkError != null) Color.RED else Color.WHITE)
+ }
+
+ private fun updateOmnipodStatus() {
+ updateLastConnection()
+ updateLastBolus()
+ updateTempBasal()
+ updatePodStatus()
+
+ val errors = ArrayList()
+ if (omnipodPumpPlugin.rileyLinkService != null) {
+ val rileyLinkErrorDescription = omnipodPumpPlugin.rileyLinkService.errorDescription
+ if (StringUtils.isNotEmpty(rileyLinkErrorDescription)) {
+ errors.add(rileyLinkErrorDescription)
+ }
+ }
+
+ if (!podStateManager.hasPodState() || !podStateManager.isPodInitialized) {
+ omnipod_overview_pod_address.text = if (podStateManager.hasPodState()) {
+ podStateManager.address.toString()
+ } else {
+ PLACEHOLDER
+ }
+ omnipod_overview_pod_lot.text = PLACEHOLDER
+ omnipod_overview_pod_tid.text = PLACEHOLDER
+ omnipod_overview_firmware_version.text = PLACEHOLDER
+ omnipod_overview_time_on_pod.text = PLACEHOLDER
+ omnipod_overview_pod_expiry_date.text = PLACEHOLDER
+ omnipod_overview_pod_expiry_date.setTextColor(Color.WHITE)
+ omnipod_overview_base_basal_rate.text = PLACEHOLDER
+ omnipod_overview_total_delivered.text = PLACEHOLDER
+ omnipod_overview_reservoir.text = PLACEHOLDER
+ omnipod_overview_reservoir.setTextColor(Color.WHITE)
+ omnipod_overview_pod_active_alerts.text = PLACEHOLDER
+ } else {
+ omnipod_overview_pod_address.text = podStateManager.address.toString()
+ omnipod_overview_pod_lot.text = podStateManager.lot.toString()
+ omnipod_overview_pod_tid.text = podStateManager.tid.toString()
+ omnipod_overview_firmware_version.text = resourceHelper.gs(R.string.omnipod_firmware_version_value, podStateManager.pmVersion.toString(), podStateManager.piVersion.toString())
+
+ omnipod_overview_time_on_pod.text = readableZonedTime(podStateManager.time)
+ omnipod_overview_time_on_pod.setTextColor(if (podStateManager.timeDeviatesMoreThan(Duration.standardMinutes(5))) {
+ Color.RED
+ } else {
+ Color.WHITE
+ })
+ val expiresAt = podStateManager.expiresAt
+ if (expiresAt == null) {
+ omnipod_overview_pod_expiry_date.text = PLACEHOLDER
+ omnipod_overview_pod_expiry_date.setTextColor(Color.WHITE)
+ } else {
+ omnipod_overview_pod_expiry_date.text = readableZonedTime(expiresAt)
+ omnipod_overview_pod_expiry_date.setTextColor(if (DateTime.now().isAfter(expiresAt)) {
+ Color.RED
+ } else {
+ Color.WHITE
+ })
+ }
+
+ if (podStateManager.isPodFaulted) {
+ val faultEventCode = podStateManager.faultEventCode
+ errors.add(resourceHelper.gs(R.string.omnipod_pod_status_pod_fault_description, faultEventCode.value, faultEventCode.name))
+ }
+
+ // base basal rate
+ omnipod_overview_base_basal_rate.text = if (podStateManager.isPodActivationCompleted) {
+ resourceHelper.gs(R.string.pump_basebasalrate, omnipodPumpPlugin.model().determineCorrectBasalSize(podStateManager.basalSchedule.rateAt(TimeUtil.toDuration(DateTime.now()))))
+ } else {
+ PLACEHOLDER
+ }
+
+ // total delivered
+ omnipod_overview_total_delivered.text = if (podStateManager.isPodActivationCompleted && podStateManager.totalInsulinDelivered != null) {
+ resourceHelper.gs(R.string.omnipod_overview_total_delivered_value, podStateManager.totalInsulinDelivered - OmnipodConstants.POD_SETUP_UNITS)
+ } else {
+ PLACEHOLDER
+ }
+
+ // reservoir
+ if (podStateManager.reservoirLevel == null) {
+ omnipod_overview_reservoir.text = resourceHelper.gs(R.string.omnipod_overview_reservoir_value_over50)
+ omnipod_overview_reservoir.setTextColor(Color.WHITE)
+ } else {
+ val lowReservoirThreshold = (omnipodAlertUtil.lowReservoirAlertUnits
+ ?: OmnipodConstants.DEFAULT_MAX_RESERVOIR_ALERT_THRESHOLD).toDouble()
+
+ omnipod_overview_reservoir.text = resourceHelper.gs(R.string.omnipod_overview_reservoir_value, podStateManager.reservoirLevel)
+ omnipod_overview_reservoir.setTextColor(if (podStateManager.reservoirLevel < lowReservoirThreshold) {
+ Color.RED
+ } else {
+ Color.WHITE
+ })
+ }
+
+ omnipod_overview_pod_active_alerts.text = if (podStateManager.hasActiveAlerts()) {
+ TextUtils.join(System.lineSeparator(), omnipodUtil.getTranslatedActiveAlerts(podStateManager))
+ } else {
+ PLACEHOLDER
+ }
+ }
+
+ if (errors.size == 0) {
+ omnipod_overview_errors.text = PLACEHOLDER
+ omnipod_overview_errors.setTextColor(Color.WHITE)
+ } else {
+ omnipod_overview_errors.text = StringUtils.join(errors, System.lineSeparator())
+ omnipod_overview_errors.setTextColor(Color.RED)
+ }
+ }
+
+ private fun updateLastConnection() {
+ if (podStateManager.isPodInitialized && podStateManager.lastSuccessfulCommunication != null) {
+ omnipod_overview_last_connection.text = readableDuration(podStateManager.lastSuccessfulCommunication)
+ val lastConnectionColor =
+ if (omnipodPumpPlugin.isUnreachableAlertTimeoutExceeded(getPumpUnreachableTimeout().millis)) {
+ Color.RED
+ } else {
+ Color.WHITE
+ }
+ omnipod_overview_last_connection.setTextColor(lastConnectionColor)
+ } else {
+ omnipod_overview_last_connection.setTextColor(Color.WHITE)
+ omnipod_overview_last_connection.text = if (podStateManager.hasPodState() && podStateManager.lastSuccessfulCommunication != null) {
+ readableDuration(podStateManager.lastSuccessfulCommunication)
+ } else {
+ PLACEHOLDER
+ }
+ }
+ }
+
+ private fun updatePodStatus() {
+ omnipod_overview_pod_status.text = if (!podStateManager.hasPodState()) {
+ resourceHelper.gs(R.string.omnipod_pod_status_no_active_pod)
+ } else if (!podStateManager.isPodActivationCompleted) {
+ if (!podStateManager.isPodInitialized) {
+ resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_activation)
+ } else {
+ if (podStateManager.activationProgress.isBefore(ActivationProgress.PRIMING_COMPLETED)) {
+ resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_activation)
+ } else {
+ resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_cannula_insertion)
+ }
+ }
+ } else {
+ if (podStateManager.podProgressStatus.isRunning) {
+ var status = if (podStateManager.isSuspended) {
+ resourceHelper.gs(R.string.omnipod_pod_status_suspended)
+ } else {
+ resourceHelper.gs(R.string.omnipod_pod_status_running)
+ }
+
+ if (!podStateManager.isBasalCertain) {
+ status += " (" + resourceHelper.gs(R.string.omnipod_uncertain) + ")"
+ }
+
+ status
+ } else if (podStateManager.podProgressStatus == PodProgressStatus.FAULT_EVENT_OCCURRED) {
+ resourceHelper.gs(R.string.omnipod_pod_status_pod_fault)
+ } else if (podStateManager.podProgressStatus == PodProgressStatus.INACTIVE) {
+ resourceHelper.gs(R.string.omnipod_pod_status_inactive)
+ } else {
+ podStateManager.podProgressStatus.toString()
+ }
+ }
+
+ val podStatusColor = if (!podStateManager.isPodActivationCompleted || podStateManager.isPodDead || podStateManager.isSuspended || (podStateManager.isPodRunning && !podStateManager.isBasalCertain)) {
+ Color.RED
+ } else {
+ Color.WHITE
+ }
+ omnipod_overview_pod_status.setTextColor(podStatusColor)
+ }
+
+ private fun updateLastBolus() {
+ if (podStateManager.isPodActivationCompleted && podStateManager.hasLastBolus()) {
+ var text = resourceHelper.gs(R.string.omnipod_overview_last_bolus_value, omnipodPumpPlugin.model().determineCorrectBolusSize(podStateManager.lastBolusAmount), resourceHelper.gs(R.string.insulin_unit_shortname), readableDuration(podStateManager.lastBolusStartTime))
+ val textColor: Int
+
+ if (podStateManager.isLastBolusCertain) {
+ textColor = Color.WHITE
+ } else {
+ textColor = Color.RED
+ text += " (" + resourceHelper.gs(R.string.omnipod_uncertain) + ")"
+ }
+
+ omnipod_overview_last_bolus.text = text
+ omnipod_overview_last_bolus.setTextColor(textColor)
+
+ } else {
+ omnipod_overview_last_bolus.text = PLACEHOLDER
+ omnipod_overview_last_bolus.setTextColor(Color.WHITE)
+ }
+ }
+
+ private fun updateTempBasal() {
+ if (podStateManager.isPodActivationCompleted && podStateManager.isTempBasalRunning) {
+ if (!podStateManager.hasTempBasal()) {
+ omnipod_overview_temp_basal.text = "???"
+ omnipod_overview_temp_basal.setTextColor(Color.RED)
+ } else {
+ val now = DateTime.now()
+
+ val startTime = podStateManager.tempBasalStartTime
+ val amount = podStateManager.tempBasalAmount
+ val duration = podStateManager.tempBasalDuration
+
+ val minutesRunning = Duration(startTime, now).standardMinutes
+
+ var text: String
+ val textColor: Int
+ text = resourceHelper.gs(R.string.omnipod_overview_temp_basal_value, amount, dateUtil.timeString(startTime.millis), minutesRunning, duration.standardMinutes)
+ if (podStateManager.isTempBasalCertain) {
+ textColor = Color.WHITE
+ } else {
+ textColor = Color.RED
+ text += " (" + resourceHelper.gs(R.string.omnipod_uncertain) + ")"
+ }
+
+ omnipod_overview_temp_basal.text = text
+ omnipod_overview_temp_basal.setTextColor(textColor)
+ }
+ } else {
+ var text = PLACEHOLDER
+ val textColor: Int
+
+ if (!podStateManager.isPodActivationCompleted || podStateManager.isTempBasalCertain) {
+ textColor = Color.WHITE
+ } else {
+ textColor = Color.RED
+ text += " (" + resourceHelper.gs(R.string.omnipod_uncertain) + ")"
+ }
+
+ omnipod_overview_temp_basal.text = text
+ omnipod_overview_temp_basal.setTextColor(textColor)
+ }
+ }
+
+ private fun updateQueueStatus() {
+ if (isQueueEmpty()) {
+ omnipod_overview_queue.visibility = View.GONE
+ } else {
+ omnipod_overview_queue.visibility = View.VISIBLE
+ omnipod_overview_queue.text = commandQueue.spannedStatus().toString()
+ }
+ }
+
+ private fun updatePodActionButtons() {
+ updateRefreshStatusButton()
+ updateResumeDeliveryButton()
+ updateAcknowledgeAlertsButton()
+ updateSuspendDeliveryButton()
+ updateSetTimeButton()
+ }
+
+ private fun disablePodActionButtons() {
+ omnipod_overview_button_acknowledge_active_alerts.isEnabled = false
+ omnipod_overview_button_resume_delivery.isEnabled = false
+ omnipod_overview_button_suspend_delivery.isEnabled = false
+ omnipod_overview_button_set_time.isEnabled = false
+ omnipod_overview_button_refresh_status.isEnabled = false
+ }
+
+ private fun updateRefreshStatusButton() {
+ omnipod_overview_button_refresh_status.isEnabled = podStateManager.isPodInitialized && podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)
+ && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
+ }
+
+ private fun updateResumeDeliveryButton() {
+ if (podStateManager.isPodRunning && (podStateManager.isSuspended || commandQueue.isCustomCommandInQueue(CommandResumeDelivery::class.java))) {
+ omnipod_overview_button_resume_delivery.visibility = View.VISIBLE
+ omnipod_overview_button_resume_delivery.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
+ } else {
+ omnipod_overview_button_resume_delivery.visibility = View.GONE
+ }
+ }
+
+ private fun updateAcknowledgeAlertsButton() {
+ if (!omnipodManager.isAutomaticallyAcknowledgeAlertsEnabled && podStateManager.isPodRunning && (podStateManager.hasActiveAlerts() || commandQueue.isCustomCommandInQueue(CommandAcknowledgeAlerts::class.java))) {
+ omnipod_overview_button_acknowledge_active_alerts.visibility = View.VISIBLE
+ omnipod_overview_button_acknowledge_active_alerts.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
+ } else {
+ omnipod_overview_button_acknowledge_active_alerts.visibility = View.GONE
+ }
+ }
+
+ private fun updateSuspendDeliveryButton() {
+ // If the Pod is currently suspended, we show the Resume delivery button instead.
+ if (omnipodManager.isSuspendDeliveryButtonEnabled && podStateManager.isPodRunning && (!podStateManager.isSuspended || commandQueue.isCustomCommandInQueue(CommandSuspendDelivery::class.java))) {
+ omnipod_overview_button_suspend_delivery.visibility = View.VISIBLE
+ omnipod_overview_button_suspend_delivery.isEnabled = podStateManager.isPodRunning && !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
+ } else {
+ omnipod_overview_button_suspend_delivery.visibility = View.GONE
+ }
+ }
+
+ private fun updateSetTimeButton() {
+ if (podStateManager.isPodRunning && (podStateManager.timeDeviatesMoreThan(Duration.standardMinutes(5)) || commandQueue.isCustomCommandInQueue(CommandHandleTimeChange::class.java))) {
+ omnipod_overview_button_set_time.visibility = View.VISIBLE
+ omnipod_overview_button_set_time.isEnabled = !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
+ } else {
+ omnipod_overview_button_set_time.visibility = View.GONE
+ }
+ }
+
+ private fun displayNotConfiguredDialog() {
+ context?.let {
+ UIRunnable(Runnable {
+ OKDialog.show(it, resourceHelper.gs(R.string.omnipod_warning),
+ resourceHelper.gs(R.string.omnipod_error_operation_not_possible_no_configuration), null)
+ }).run()
+ }
+ }
+
+ private fun displayErrorDialog(title: String, message: String, withSound: Boolean) {
+ context?.let {
+ val i = Intent(it, ErrorHelperActivity::class.java)
+ i.putExtra("soundid", if (withSound) R.raw.boluserror else 0)
+ i.putExtra("status", message)
+ i.putExtra("title", title)
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ it.startActivity(i)
+ }
+ }
+
+ private fun displayOkDialog(title: String, message: String) {
+ context?.let {
+ UIRunnable(Runnable {
+ OKDialog.show(it, title, message, null)
+ }).run()
+ }
+ }
+
+ private fun readableZonedTime(time: DateTime): String {
+ val timeAsJavaData = time.toLocalDateTime().toDate()
+ val timeZone = podStateManager.timeZone.toTimeZone()
+ if (timeZone == TimeZone.getDefault()) {
+ return dateUtil.dateAndTimeString(timeAsJavaData)
+ }
+
+ val isDaylightTime = timeZone.inDaylightTime(timeAsJavaData)
+ val locale = resources.configuration.locales.get(0)
+ val timeZoneDisplayName = timeZone.getDisplayName(isDaylightTime, TimeZone.SHORT, locale) + " " + timeZone.getDisplayName(isDaylightTime, TimeZone.LONG, locale)
+ return resourceHelper.gs(R.string.omnipod_time_with_timezone, dateUtil.dateAndTimeString(timeAsJavaData), timeZoneDisplayName)
+ }
+
+ private fun readableDuration(dateTime: DateTime): String {
+ val duration = Duration(dateTime, DateTime.now())
+ val hours = duration.standardHours.toInt()
+ val minutes = duration.standardMinutes.toInt()
+ val seconds = duration.standardSeconds.toInt()
+ when {
+ seconds < 10 -> {
+ return resourceHelper.gs(R.string.omnipod_moments_ago)
+ }
+
+ seconds < 60 -> {
+ return resourceHelper.gs(R.string.omnipod_less_than_a_minute_ago)
+ }
+
+ seconds < 60 * 60 -> { // < 1 hour
+ return resourceHelper.gs(R.string.omnipod_time_ago, resourceHelper.gq(R.plurals.omnipod_minutes, minutes, minutes))
+ }
+
+ seconds < 24 * 60 * 60 -> { // < 1 day
+ val minutesLeft = minutes % 60
+ if (minutesLeft > 0)
+ return resourceHelper.gs(R.string.omnipod_time_ago,
+ resourceHelper.gs(R.string.omnipod_composite_time, resourceHelper.gq(R.plurals.omnipod_hours, hours, hours), resourceHelper.gq(R.plurals.omnipod_minutes, minutesLeft, minutesLeft)))
+ return resourceHelper.gs(R.string.omnipod_time_ago, resourceHelper.gq(R.plurals.omnipod_hours, hours, hours))
+ }
+
+ else -> {
+ val days = hours / 24
+ val hoursLeft = hours % 24
+ if (hoursLeft > 0)
+ return resourceHelper.gs(R.string.omnipod_time_ago,
+ resourceHelper.gs(R.string.omnipod_composite_time, resourceHelper.gq(R.plurals.omnipod_days, days, days), resourceHelper.gq(R.plurals.omnipod_hours, hoursLeft, hoursLeft)))
+ return resourceHelper.gs(R.string.omnipod_time_ago, resourceHelper.gq(R.plurals.omnipod_days, days, days))
+ }
+ }
+ }
+
+ private fun isQueueEmpty(): Boolean {
+ return commandQueue.size() == 0 && commandQueue.performing() == null
+ }
+
+ // FIXME ideally we should just have access to LocalAlertUtils here
+ private fun getPumpUnreachableTimeout(): Duration {
+ return Duration.standardMinutes(sp.getInt(resourceHelper.gs(R.string.key_pump_unreachable_threshold_minutes), Constants.DEFAULT_PUMP_UNREACHABLE_THRESHOLD_MINUTES).toLong())
+ }
+
+ inner class DisplayResultDialogCallback(private val errorMessagePrefix: String, private val withSoundOnError: Boolean) : Callback() {
+
+ private var messageOnSuccess: String? = null
+
+ override fun run() {
+ if (result.success) {
+ val messageOnSuccess = this.messageOnSuccess
+ if (messageOnSuccess != null) {
+ displayOkDialog(resourceHelper.gs(R.string.omnipod_confirmation), messageOnSuccess)
+ }
+ } else {
+ displayErrorDialog(resourceHelper.gs(R.string.omnipod_warning), resourceHelper.gs(R.string.omnipod_two_strings_concatenated_by_colon, errorMessagePrefix, result.comment), withSoundOnError)
+ }
+ }
+
+ fun messageOnSuccess(message: String): DisplayResultDialogCallback {
+ messageOnSuccess = message
+ return this
+ }
+ }
+
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodHistoryActivity.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodHistoryActivity.java
index 4913bb6614..9cc797b375 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodHistoryActivity.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodHistoryActivity.java
@@ -248,13 +248,14 @@ public class PodHistoryActivity extends NoSplashAppCompatActivity {
PodHistoryEntryType entryType = PodHistoryEntryType.getByCode(historyEntry.getPodEntryTypeCode());
switch (entryType) {
- case SET_TEMPORARY_BASAL: {
+ case SET_TEMPORARY_BASAL:
+ case SPLIT_TEMPORARY_BASAL: {
TempBasalPair tempBasalPair = aapsOmnipodUtil.getGsonInstance().fromJson(historyEntry.getData(), TempBasalPair.class);
- valueView.setText(resourceHelper.gs(R.string.omnipod_cmd_tbr_value, tempBasalPair.getInsulinRate(), tempBasalPair.getDurationMinutes()));
+ valueView.setText(resourceHelper.gs(R.string.omnipod_history_tbr_value, tempBasalPair.getInsulinRate(), tempBasalPair.getDurationMinutes()));
}
break;
- case FILL_CANNULA_SET_BASAL_PROFILE:
+ case INSERT_CANNULA:
case SET_BASAL_SCHEDULE: {
if (historyEntry.getData() != null) {
setProfileValue(historyEntry.getData(), valueView);
@@ -265,23 +266,29 @@ public class PodHistoryActivity extends NoSplashAppCompatActivity {
case SET_BOLUS: {
if (historyEntry.getData().contains(";")) {
String[] splitVal = historyEntry.getData().split(";");
- valueView.setText(resourceHelper.gs(R.string.omnipod_cmd_bolus_value_with_carbs, Double.valueOf(splitVal[0]), Double.valueOf(splitVal[1])));
+ valueView.setText(resourceHelper.gs(R.string.omnipod_history_bolus_value_with_carbs, Double.valueOf(splitVal[0]), Double.valueOf(splitVal[1])));
} else {
- valueView.setText(resourceHelper.gs(R.string.omnipod_cmd_bolus_value, Double.valueOf(historyEntry.getData())));
+ valueView.setText(resourceHelper.gs(R.string.omnipod_history_bolus_value, Double.valueOf(historyEntry.getData())));
}
}
break;
+ case PLAY_TEST_BEEP: {
+ if (historyEntry.getData() != null) {
+ valueView.setText(historyEntry.getData());
+ }
+ }
+ break;
case GET_POD_STATUS:
case GET_POD_INFO:
case SET_TIME:
- case PAIR_AND_PRIME:
+ case INITIALIZE_POD:
case CANCEL_TEMPORARY_BASAL_BY_DRIVER:
case CANCEL_TEMPORARY_BASAL:
case CONFIGURE_ALERTS:
case CANCEL_BOLUS:
case DEACTIVATE_POD:
- case RESET_POD_STATE:
+ case DISCARD_POD:
case ACKNOWLEDGE_ALERTS:
case SUSPEND_DELIVERY:
case RESUME_DELIVERY:
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodManagementActivity.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodManagementActivity.kt
index 43f4046a5e..43d032991d 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodManagementActivity.kt
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodManagementActivity.kt
@@ -1,37 +1,40 @@
package info.nightscout.androidaps.plugins.pump.omnipod.ui
+import android.content.Context
import android.content.Intent
import android.os.Bundle
-import android.view.View
-import android.widget.LinearLayout
-import androidx.fragment.app.FragmentStatePagerAdapter
-import com.atech.android.library.wizardpager.WizardPagerActivity
-import com.atech.android.library.wizardpager.WizardPagerContext
-import com.atech.android.library.wizardpager.data.WizardPagerSettings
-import com.atech.android.library.wizardpager.defs.WizardStepsWayType
import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
import info.nightscout.androidaps.interfaces.CommandQueueProvider
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange
+import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusActivity
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData
+import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ResetRileyLinkConfigurationTask
+import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTaskExecutor
+import info.nightscout.androidaps.plugins.pump.omnipod.OmnipodPumpPlugin
import info.nightscout.androidaps.plugins.pump.omnipod.R
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.BeepConfigType
import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager
import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged
import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.defs.PodActionType
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model.FullInitPodWizardModel
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model.RemovePodWizardModel
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model.ShortInitPodWizardModel
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages.InitPodRefreshAction
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandPlayTestBeep
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandReadPulseLog
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.PodActivationWizardActivity
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.PodDeactivationWizardActivity
+import info.nightscout.androidaps.queue.Callback
+import info.nightscout.androidaps.queue.events.EventQueueChanged
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.extensions.plusAssign
+import info.nightscout.androidaps.utils.extensions.toVisibility
import info.nightscout.androidaps.utils.resources.ResourceHelper
+import info.nightscout.androidaps.utils.ui.UIRunnable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
-import kotlinx.android.synthetic.main.omnipod_pod_mgmt.*
+import kotlinx.android.synthetic.main.omnipod_pod_management.*
import javax.inject.Inject
/**
@@ -47,27 +50,72 @@ class PodManagementActivity : NoSplashAppCompatActivity() {
@Inject lateinit var injector: HasAndroidInjector
@Inject lateinit var rileyLinkServiceData: RileyLinkServiceData
@Inject lateinit var aapsOmnipodManager: AapsOmnipodManager
+ @Inject lateinit var context: Context
+ @Inject lateinit var omnipodPumpPlugin: OmnipodPumpPlugin
+ @Inject lateinit var serviceTaskExecutor: ServiceTaskExecutor
private var disposables: CompositeDisposable = CompositeDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.omnipod_pod_mgmt)
+ setContentView(R.layout.omnipod_pod_management)
- initpod_init_pod.setOnClickListener {
- initPodAction()
+ omnipod_pod_management_button_activate_pod.setOnClickListener {
+ startActivity(Intent(this, PodActivationWizardActivity::class.java))
}
- initpod_remove_pod.setOnClickListener {
- deactivatePodAction()
+ omnipod_pod_management_button_deactivate_pod.setOnClickListener {
+ startActivity(Intent(this, PodDeactivationWizardActivity::class.java))
}
- initpod_reset_pod.setOnClickListener {
- discardPodAction()
+ omnipod_pod_management_button_discard_pod.setOnClickListener {
+ OKDialog.showConfirmation(this,
+ resourceHelper.gs(R.string.omnipod_pod_management_discard_pod_confirmation), Thread {
+ aapsOmnipodManager.discardPodState()
+ })
}
- initpod_pod_history.setOnClickListener {
- showPodHistory()
+ omnipod_pod_management_button_rileylink_stats.setOnClickListener {
+ if (omnipodPumpPlugin.rileyLinkService?.verifyConfiguration() == true) {
+ startActivity(Intent(context, RileyLinkStatusActivity::class.java))
+ } else {
+ displayNotConfiguredDialog()
+ }
+ }
+
+ omnipod_pod_management_button_reset_rileylink_config.setOnClickListener {
+ // TODO improvement: properly disable button until task is finished
+ serviceTaskExecutor.startTask(ResetRileyLinkConfigurationTask(injector))
+ }
+
+ omnipod_pod_management_button_play_test_beep.setOnClickListener {
+ omnipod_pod_management_button_play_test_beep.isEnabled = false
+ omnipod_pod_management_button_play_test_beep.setText(R.string.omnipod_pod_management_button_playing_test_beep)
+
+ commandQueue.customCommand(CommandPlayTestBeep(BeepConfigType.BEEEP), object : Callback() {
+ override fun run() {
+ if (!result.success) {
+ displayErrorDialog(resourceHelper.gs(R.string.omnipod_warning), resourceHelper.gs(R.string.omnipod_two_strings_concatenated_by_colon, resourceHelper.gs(R.string.omnipod_error_failed_to_play_test_beep), result.comment), false)
+ }
+ }
+ })
+ }
+
+ omnipod_pod_management_button_pulse_log.setOnClickListener {
+ omnipod_pod_management_button_pulse_log.isEnabled = false
+ omnipod_pod_management_button_pulse_log.setText(R.string.omnipod_pod_management_button_reading_pulse_log)
+
+ commandQueue.customCommand(CommandReadPulseLog(), object : Callback() {
+ override fun run() {
+ if (!result.success) {
+ displayErrorDialog(resourceHelper.gs(R.string.omnipod_warning), resourceHelper.gs(R.string.omnipod_two_strings_concatenated_by_colon, resourceHelper.gs(R.string.omnipod_error_failed_to_read_pulse_log), result.comment), false)
+ }
+ }
+ })
+ }
+
+ omnipod_pod_management_button_pod_history.setOnClickListener {
+ startActivity(Intent(this, PodHistoryActivity::class.java))
}
}
@@ -81,6 +129,10 @@ class PodManagementActivity : NoSplashAppCompatActivity() {
.toObservable(EventOmnipodPumpValuesChanged::class.java)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ refreshButtons() }, { fabricPrivacy.logException(it) })
+ disposables += rxBus
+ .toObservable(EventQueueChanged::class.java)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe({ refreshButtons() }, { fabricPrivacy.logException(it) })
refreshButtons()
}
@@ -90,87 +142,86 @@ class PodManagementActivity : NoSplashAppCompatActivity() {
disposables.clear()
}
- private fun initPodAction() {
-
- val pagerSettings = WizardPagerSettings()
- var refreshAction = InitPodRefreshAction(injector, PodActionType.INIT_POD)
-
- pagerSettings.setWizardStepsWayType(WizardStepsWayType.CancelNext)
- pagerSettings.setFinishStringResourceId(R.string.close)
- pagerSettings.setFinishButtonBackground(R.drawable.finish_background)
- pagerSettings.setNextButtonBackground(R.drawable.selectable_item_background)
- pagerSettings.setBackStringResourceId(R.string.cancel)
- pagerSettings.cancelAction = refreshAction
- pagerSettings.finishAction = refreshAction
- pagerSettings.pagerAdapterBehavior = FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
-
- val wizardPagerContext = WizardPagerContext.getInstance()
-
- wizardPagerContext.clearContext()
- wizardPagerContext.pagerSettings = pagerSettings
- val isFullInit = !podStateManager.isPodInitialized || podStateManager.podProgressStatus.isBefore(PodProgressStatus.PRIMING_COMPLETED)
- if (isFullInit) {
- wizardPagerContext.wizardModel = FullInitPodWizardModel(applicationContext)
- } else {
- wizardPagerContext.wizardModel = ShortInitPodWizardModel(applicationContext)
- }
-
- val myIntent = Intent(this@PodManagementActivity, WizardPagerActivity::class.java)
- this@PodManagementActivity.startActivity(myIntent)
- }
-
- private fun deactivatePodAction() {
- val pagerSettings = WizardPagerSettings()
- var refreshAction = InitPodRefreshAction(injector, PodActionType.DEACTIVATE_POD)
-
- pagerSettings.setWizardStepsWayType(WizardStepsWayType.CancelNext)
- pagerSettings.setFinishStringResourceId(R.string.close)
- pagerSettings.setFinishButtonBackground(R.drawable.finish_background)
- pagerSettings.setNextButtonBackground(R.drawable.selectable_item_background)
- pagerSettings.setBackStringResourceId(R.string.cancel)
- pagerSettings.cancelAction = refreshAction
- pagerSettings.finishAction = refreshAction
- pagerSettings.pagerAdapterBehavior = FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
-
- val wizardPagerContext = WizardPagerContext.getInstance();
-
- wizardPagerContext.clearContext()
- wizardPagerContext.pagerSettings = pagerSettings
- wizardPagerContext.wizardModel = RemovePodWizardModel(applicationContext)
-
- val myIntent = Intent(this@PodManagementActivity, WizardPagerActivity::class.java)
- this@PodManagementActivity.startActivity(myIntent)
-
- }
-
- private fun discardPodAction() {
- OKDialog.showConfirmation(this,
- resourceHelper.gs(R.string.omnipod_cmd_discard_pod_desc), Thread {
- aapsOmnipodManager.discardPodState()
- rxBus.send(EventOmnipodPumpValuesChanged())
- })
- }
-
- private fun showPodHistory() {
- startActivity(Intent(applicationContext, PodHistoryActivity::class.java))
- }
-
private fun refreshButtons() {
- initpod_init_pod.isEnabled = !podStateManager.isPodActivationCompleted
- initpod_remove_pod.isEnabled = podStateManager.isPodInitialized
- initpod_reset_pod.isEnabled = podStateManager.hasPodState()
+ // Only show the discard button to reset a cached Pod address before the Pod has actually been initialized
+ // Otherwise, users should use the Deactivate Pod Wizard. In case proper deactivation fails,
+ // they will get an option to discard the Pod state there
+ val discardButtonEnabled = podStateManager.hasPodState() && !podStateManager.isPodInitialized
+ omnipod_pod_management_button_discard_pod.visibility = discardButtonEnabled.toVisibility()
- val waitingForRlView = findViewById(R.id.initpod_waiting_for_rl_layout)
+ val pulseLogButtonEnabled = aapsOmnipodManager.isPulseLogButtonEnabled
+ omnipod_pod_management_button_pulse_log.visibility = pulseLogButtonEnabled.toVisibility()
+
+ omnipod_pod_management_button_rileylink_stats.visibility = aapsOmnipodManager.isRileylinkStatsButtonEnabled.toVisibility()
+ omnipod_pod_management_waiting_for_rl_layout.visibility = (!rileyLinkServiceData.rileyLinkServiceState.isReady).toVisibility()
if (rileyLinkServiceData.rileyLinkServiceState.isReady) {
- waitingForRlView.visibility = View.GONE
+ omnipod_pod_management_button_activate_pod.isEnabled = !podStateManager.isPodActivationCompleted
+ omnipod_pod_management_button_deactivate_pod.isEnabled = podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)
+
+ if (podStateManager.isPodInitialized && podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)) {
+ if (commandQueue.isCustomCommandInQueue(CommandPlayTestBeep::class.java)) {
+ omnipod_pod_management_button_play_test_beep.isEnabled = false
+ omnipod_pod_management_button_play_test_beep.setText(R.string.omnipod_pod_management_button_playing_test_beep)
+ } else {
+ omnipod_pod_management_button_play_test_beep.isEnabled = true
+ omnipod_pod_management_button_play_test_beep.setText(R.string.omnipod_pod_management_button_play_test_beep)
+ }
+ } else {
+ omnipod_pod_management_button_play_test_beep.isEnabled = false
+ omnipod_pod_management_button_play_test_beep.setText(R.string.omnipod_pod_management_button_play_test_beep)
+ }
+
+ if (discardButtonEnabled) {
+ omnipod_pod_management_button_discard_pod.isEnabled = true
+ }
+ if (pulseLogButtonEnabled) {
+ if (podStateManager.isPodActivationCompleted) {
+ if (commandQueue.isCustomCommandInQueue(CommandReadPulseLog::class.java)) {
+ omnipod_pod_management_button_pulse_log.isEnabled = false
+ omnipod_pod_management_button_pulse_log.setText(R.string.omnipod_pod_management_button_reading_pulse_log)
+ } else {
+ omnipod_pod_management_button_pulse_log.isEnabled = true
+ omnipod_pod_management_button_pulse_log.setText(R.string.omnipod_pod_management_button_read_pulse_log)
+ }
+ } else {
+ omnipod_pod_management_button_pulse_log.isEnabled = false
+ omnipod_pod_management_button_pulse_log.setText(R.string.omnipod_pod_management_button_read_pulse_log)
+ }
+ }
} else {
- // if rileylink is not running we disable all operations that require a RL connection
- waitingForRlView.visibility = View.VISIBLE
- initpod_init_pod.isEnabled = false
- initpod_remove_pod.isEnabled = false
- initpod_reset_pod.isEnabled = false
+ omnipod_pod_management_button_play_test_beep.setText(R.string.omnipod_pod_management_button_play_test_beep)
+ omnipod_pod_management_button_activate_pod.isEnabled = false
+ omnipod_pod_management_button_deactivate_pod.isEnabled = false
+ omnipod_pod_management_button_play_test_beep.isEnabled = false
+
+ if (discardButtonEnabled) {
+ omnipod_pod_management_button_discard_pod.isEnabled = false
+ }
+ if (pulseLogButtonEnabled) {
+ omnipod_pod_management_button_pulse_log.isEnabled = false
+ omnipod_pod_management_button_pulse_log.setText(R.string.omnipod_pod_management_button_read_pulse_log)
+ }
}
}
+ private fun displayErrorDialog(title: String, message: String, withSound: Boolean) {
+ context.let {
+ val i = Intent(it, ErrorHelperActivity::class.java)
+ i.putExtra("soundid", if (withSound) R.raw.boluserror else 0)
+ i.putExtra("status", message)
+ i.putExtra("title", title)
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ it.startActivity(i)
+ }
+ }
+
+ private fun displayNotConfiguredDialog() {
+ context.let {
+ UIRunnable(Runnable {
+ OKDialog.show(it, resourceHelper.gs(R.string.omnipod_warning),
+ resourceHelper.gs(R.string.omnipod_error_operation_not_possible_no_configuration), null)
+ }).run()
+ }
+ }
}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/PodActivationWizardActivity.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/PodActivationWizardActivity.kt
new file mode 100644
index 0000000000..b5f4ee3114
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/PodActivationWizardActivity.kt
@@ -0,0 +1,61 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation
+
+import android.os.Bundle
+import androidx.annotation.IdRes
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.activity.OmnipodWizardActivityBase
+import javax.inject.Inject
+
+class PodActivationWizardActivity : OmnipodWizardActivityBase() {
+ companion object {
+
+ const val KEY_START_DESTINATION = "startDestination"
+ }
+
+ @Inject
+ lateinit var podStateManager: PodStateManager
+
+ @IdRes
+ private var startDestination: Int = R.id.fillPodInfoFragment
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContentView(R.layout.omnipod_pod_activation_wizard_activity)
+
+ startDestination = savedInstanceState?.getInt(KEY_START_DESTINATION, R.id.fillPodInfoFragment)
+ ?: if (podStateManager.activationProgress.isBefore(ActivationProgress.PRIMING_COMPLETED)) {
+ R.id.fillPodInfoFragment
+ } else {
+ R.id.attachPodInfoFragment
+ }
+
+ setStartDestination(startDestination)
+ }
+
+ private fun setStartDestination(@IdRes startDestination: Int) {
+ this.startDestination = startDestination
+ val navController = getNavController()
+ val navInflater = navController.navInflater
+ val graph = navInflater.inflate(R.navigation.omnipod_pod_activation_wizard_navigation_graph)
+ graph.startDestination = startDestination
+ navController.graph = graph
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ outState.putInt(KEY_START_DESTINATION, startDestination)
+ }
+
+ override fun getTotalDefinedNumberOfSteps(): Int = 5
+
+ override fun getActualNumberOfSteps(): Int {
+ if (startDestination == R.id.attachPodInfoFragment) {
+ return 3
+ }
+ return 5
+ }
+
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/AttachPodInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/AttachPodInfoFragment.kt
new file mode 100644
index 0000000000..8fc2d30b65
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/AttachPodInfoFragment.kt
@@ -0,0 +1,41 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment
+
+import android.os.Bundle
+import android.view.View
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import androidx.appcompat.app.AlertDialog
+import androidx.navigation.fragment.findNavController
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment.InfoFragmentBase
+import kotlinx.android.synthetic.main.omnipod_wizard_nav_buttons.*
+
+class AttachPodInfoFragment : InfoFragmentBase() {
+
+ @StringRes
+ override fun getTitleId(): Int = R.string.omnipod_pod_activation_wizard_attach_pod_title
+
+ @StringRes
+ override fun getTextId(): Int = R.string.omnipod_pod_activation_wizard_attach_pod_text
+
+ @IdRes
+ override fun getNextPageActionId(): Int = R.id.action_attachPodInfoFragment_to_insertCannulaActionFragment
+
+ override fun getIndex(): Int = 3
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ omnipod_wizard_button_next.setOnClickListener {
+ context?.let {
+ AlertDialog.Builder(it)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setTitle(getString(getTitleId()))
+ .setMessage(getString(R.string.omnipod_pod_activation_wizard_attach_pod_confirm_insert_cannula_text))
+ .setPositiveButton(getString(R.string.omnipod_ok)) { _, _ -> findNavController().navigate(getNextPageActionId()) }
+ .setNegativeButton(getString(R.string.omnipod_cancel), null)
+ .show()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/FillPodInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/FillPodInfoFragment.kt
new file mode 100644
index 0000000000..f7a1053785
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/FillPodInfoFragment.kt
@@ -0,0 +1,20 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment
+
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment.InfoFragmentBase
+
+class FillPodInfoFragment : InfoFragmentBase() {
+
+ @StringRes
+ override fun getTitleId(): Int = R.string.omnipod_pod_activation_wizard_fill_pod_title
+
+ @StringRes
+ override fun getTextId(): Int = R.string.omnipod_pod_activation_wizard_fill_pod_text
+
+ @IdRes
+ override fun getNextPageActionId(): Int = R.id.action_fillPodInfoFragment_to_initializePodActionFragment
+
+ override fun getIndex(): Int = 1
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/InitializePodActionFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/InitializePodActionFragment.kt
new file mode 100644
index 0000000000..82af74414f
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/InitializePodActionFragment.kt
@@ -0,0 +1,36 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment
+
+import android.os.Bundle
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.ViewModelProvider
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.dagger.OmnipodPluginQualifier
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.viewmodel.InitializePodActionViewModel
+import javax.inject.Inject
+
+class InitializePodActionFragment : PodActivationActionFragmentBase() {
+
+ @Inject
+ @OmnipodPluginQualifier
+ lateinit var viewModelFactory: ViewModelProvider.Factory
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ val vm: InitializePodActionViewModel by viewModels { viewModelFactory }
+ this.viewModel = vm
+ }
+
+ @StringRes
+ override fun getTitleId(): Int = R.string.omnipod_pod_activation_wizard_initialize_pod_title
+
+ @StringRes
+ override fun getTextId(): Int = R.string.omnipod_pod_activation_wizard_initialize_pod_text
+
+ @IdRes
+ override fun getNextPageActionId(): Int = R.id.action_initializePodActionFragment_to_attachPodInfoFragment
+
+ override fun getIndex(): Int = 2
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/InsertCannulaActionFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/InsertCannulaActionFragment.kt
new file mode 100644
index 0000000000..76a470ee3a
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/InsertCannulaActionFragment.kt
@@ -0,0 +1,36 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment
+
+import android.os.Bundle
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.ViewModelProvider
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.dagger.OmnipodPluginQualifier
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.viewmodel.InsertCannulaActionViewModel
+import javax.inject.Inject
+
+class InsertCannulaActionFragment : PodActivationActionFragmentBase() {
+
+ @Inject
+ @OmnipodPluginQualifier
+ lateinit var viewModelFactory: ViewModelProvider.Factory
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ val vm: InsertCannulaActionViewModel by viewModels { viewModelFactory }
+ this.viewModel = vm
+ }
+
+ @StringRes
+ override fun getTitleId(): Int = R.string.omnipod_pod_activation_wizard_insert_cannula_title
+
+ @StringRes
+ override fun getTextId(): Int = R.string.omnipod_pod_activation_wizard_insert_cannula_text
+
+ @IdRes
+ override fun getNextPageActionId(): Int = R.id.action_insertCannulaActionFragment_to_PodActivatedInfoFragment
+
+ override fun getIndex(): Int = 4
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/PodActivatedInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/PodActivatedInfoFragment.kt
new file mode 100644
index 0000000000..d0c807a4e3
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/PodActivatedInfoFragment.kt
@@ -0,0 +1,20 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment
+
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment.InfoFragmentBase
+
+class PodActivatedInfoFragment : InfoFragmentBase() {
+
+ @StringRes
+ override fun getTitleId(): Int = R.string.omnipod_pod_activation_wizard_pod_activated_title
+
+ @StringRes
+ override fun getTextId(): Int = R.string.omnipod_pod_activation_wizard_pod_activated_text
+
+ @IdRes
+ override fun getNextPageActionId(): Int? = null
+
+ override fun getIndex(): Int = 5
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/PodActivationActionFragmentBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/PodActivationActionFragmentBase.kt
new file mode 100644
index 0000000000..40c8e9fbc9
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/fragment/PodActivationActionFragmentBase.kt
@@ -0,0 +1,35 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.fragment
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.ActivationProgress
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment.ActionFragmentBase
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.PodDeactivationWizardActivity
+import kotlinx.android.synthetic.main.omnipod_wizard_action_page_fragment.*
+import javax.inject.Inject
+
+abstract class PodActivationActionFragmentBase : ActionFragmentBase() {
+
+ @Inject
+ protected lateinit var podStateManager: PodStateManager
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ omnipod_wizard_button_deactivate_pod.setOnClickListener {
+ activity?.let {
+ startActivity(Intent(it, PodDeactivationWizardActivity::class.java))
+ it.finish()
+ }
+ }
+ }
+
+ override fun onActionFailure() {
+ if ((podStateManager.isPodActivationTimeExceeded && podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)) || podStateManager.isPodFaulted) {
+ omnipod_wizard_button_retry.visibility = View.GONE
+ omnipod_wizard_button_deactivate_pod.visibility = View.VISIBLE
+ }
+ }
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/viewmodel/InitializePodActionViewModel.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/viewmodel/InitializePodActionViewModel.kt
new file mode 100644
index 0000000000..674ca9f8a7
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/viewmodel/InitializePodActionViewModel.kt
@@ -0,0 +1,11 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.viewmodel
+
+import info.nightscout.androidaps.data.PumpEnactResult
+import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.viewmodel.ActionViewModelBase
+import javax.inject.Inject
+
+class InitializePodActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager) : ActionViewModelBase() {
+
+ override fun doExecuteAction(): PumpEnactResult = aapsOmnipodManager.initializePod()
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/viewmodel/InsertCannulaActionViewModel.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/viewmodel/InsertCannulaActionViewModel.kt
new file mode 100644
index 0000000000..1b1bd126dc
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/activation/viewmodel/InsertCannulaActionViewModel.kt
@@ -0,0 +1,12 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.viewmodel
+
+import info.nightscout.androidaps.data.PumpEnactResult
+import info.nightscout.androidaps.interfaces.ProfileFunction
+import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.viewmodel.ActionViewModelBase
+import javax.inject.Inject
+
+class InsertCannulaActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager, private val profileFunction: ProfileFunction) : ActionViewModelBase() {
+
+ override fun doExecuteAction(): PumpEnactResult = aapsOmnipodManager.insertCannula(profileFunction.getProfile())
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/activity/OmnipodWizardActivityBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/activity/OmnipodWizardActivityBase.kt
new file mode 100644
index 0000000000..0621cd02d5
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/activity/OmnipodWizardActivityBase.kt
@@ -0,0 +1,35 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.activity
+
+import androidx.appcompat.app.AlertDialog
+import androidx.navigation.NavController
+import androidx.navigation.fragment.NavHostFragment
+import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+
+abstract class OmnipodWizardActivityBase : NoSplashAppCompatActivity() {
+
+ override fun onBackPressed() {
+ exitActivityAfterConfirmation()
+ }
+
+ fun exitActivityAfterConfirmation() {
+ if (getNavController().previousBackStackEntry == null) {
+ finish()
+ } else {
+ AlertDialog.Builder(this)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setTitle(getString(R.string.omnipod_wizard_exit_confirmation_title))
+ .setMessage(getString(R.string.omnipod_wizard_exit_confirmation_text))
+ .setPositiveButton(getString(R.string.omnipod_yes)) { _, _ -> finish() }
+ .setNegativeButton(getString(R.string.omnipod_no), null)
+ .show()
+ }
+ }
+
+ protected fun getNavController(): NavController =
+ (supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment).navController
+
+ abstract fun getTotalDefinedNumberOfSteps(): Int
+
+ abstract fun getActualNumberOfSteps(): Int
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/fragment/ActionFragmentBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/fragment/ActionFragmentBase.kt
new file mode 100644
index 0000000000..a8167c4568
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/fragment/ActionFragmentBase.kt
@@ -0,0 +1,80 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment
+
+import android.os.Bundle
+import android.view.View
+import androidx.annotation.LayoutRes
+import androidx.annotation.StringRes
+import androidx.lifecycle.Observer
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.viewmodel.ActionViewModelBase
+import info.nightscout.androidaps.utils.extensions.toVisibility
+import kotlinx.android.synthetic.main.omnipod_wizard_action_page_fragment.*
+import kotlinx.android.synthetic.main.omnipod_wizard_nav_buttons.*
+
+abstract class ActionFragmentBase : WizardFragmentBase() {
+
+ protected lateinit var viewModel: ActionViewModelBase
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ omnipod_wizard_button_next.isEnabled = false
+ omnipod_wizard_action_page_text.setText(getTextId())
+
+ omnipod_wizard_button_retry.setOnClickListener { viewModel.executeAction() }
+
+ viewModel.isActionExecutingLiveData.observe(viewLifecycleOwner, Observer { isExecuting ->
+ if (isExecuting) {
+ omnipod_wizard_action_error.visibility = View.GONE
+ omnipod_wizard_button_deactivate_pod.visibility = View.GONE
+ omnipod_wizard_button_discard_pod.visibility = View.GONE
+ omnipod_wizard_button_retry.visibility = View.GONE
+ }
+ omnipod_wizard_action_progress_indication.visibility = isExecuting.toVisibility()
+ omnipod_wizard_button_cancel.isEnabled = !isExecuting
+ })
+
+ viewModel.actionResultLiveData.observe(viewLifecycleOwner, Observer { result ->
+ result?.let {
+ val isExecuting = isActionExecuting()
+
+ omnipod_wizard_button_next.isEnabled = result.success
+ omnipod_wizard_action_success.visibility = result.success.toVisibility()
+ omnipod_wizard_action_error.visibility = (!isExecuting && !result.success).toVisibility()
+ omnipod_wizard_button_retry.visibility = (!isExecuting && !result.success).toVisibility()
+
+ if (result.success) {
+ onActionSuccess()
+ } else {
+ omnipod_wizard_action_error.text = result.comment
+ onActionFailure()
+ }
+ }
+ })
+
+ if (savedInstanceState == null && !isActionExecuting()) {
+ viewModel.executeAction()
+ }
+
+ }
+
+ protected fun isActionExecuting() = viewModel.isActionExecutingLiveData.value!!
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ viewModel.isActionExecutingLiveData.removeObservers(viewLifecycleOwner)
+ viewModel.actionResultLiveData.removeObservers(viewLifecycleOwner)
+ }
+
+ fun onActionSuccess() {}
+
+ open fun onActionFailure() {}
+
+ @StringRes
+ abstract fun getTextId(): Int
+
+ @LayoutRes
+ override fun getLayoutId(): Int {
+ return R.layout.omnipod_wizard_action_page_fragment
+ }
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/fragment/InfoFragmentBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/fragment/InfoFragmentBase.kt
new file mode 100644
index 0000000000..d1008a1bea
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/fragment/InfoFragmentBase.kt
@@ -0,0 +1,26 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment
+
+import android.os.Bundle
+import android.view.View
+import androidx.annotation.LayoutRes
+import androidx.annotation.StringRes
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import kotlinx.android.synthetic.main.omnipod_wizard_info_page_fragment.*
+
+abstract class InfoFragmentBase : WizardFragmentBase() {
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ omnipod_wizard_info_page_text.setText(getTextId())
+ }
+
+ @StringRes
+ abstract fun getTextId(): Int
+
+ @LayoutRes
+ override fun getLayoutId(): Int {
+ return R.layout.omnipod_wizard_info_page_fragment
+ }
+
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/fragment/WizardFragmentBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/fragment/WizardFragmentBase.kt
new file mode 100644
index 0000000000..086273a938
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/fragment/WizardFragmentBase.kt
@@ -0,0 +1,85 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment
+
+import android.content.res.ColorStateList
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.ViewStub
+import androidx.annotation.IdRes
+import androidx.annotation.LayoutRes
+import androidx.annotation.StringRes
+import androidx.navigation.fragment.findNavController
+import dagger.android.support.DaggerFragment
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.activity.OmnipodWizardActivityBase
+import kotlinx.android.synthetic.main.omnipod_wizard_base_fragment.*
+import kotlinx.android.synthetic.main.omnipod_wizard_nav_buttons.*
+import kotlinx.android.synthetic.main.omnipod_wizard_progress_indication.*
+import kotlin.math.roundToInt
+
+abstract class WizardFragmentBase : DaggerFragment() {
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ val baseView = inflater.inflate(R.layout.omnipod_wizard_base_fragment, container, false)
+ val contentView = baseView.findViewById(R.id.omnipod_wizard_base_fragment_content)
+ contentView?.let {
+ it.layoutResource = getLayoutId()
+ it.inflate()
+ }
+ return baseView
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ omnipod_wizard_base_fragment_title.setText(getTitleId())
+
+ val nextPage = getNextPageActionId()
+
+ if (nextPage == null) {
+ omnipod_wizard_button_next.text = getString(R.string.omnipod_wizard_button_finish)
+ omnipod_wizard_button_next.backgroundTintList = ColorStateList.valueOf(resources.getColor(R.color.omnipod_wizard_finish_button, context?.theme))
+ }
+
+ updateProgressIndication()
+
+ omnipod_wizard_button_next.setOnClickListener {
+ if (nextPage == null) {
+ activity?.finish()
+ } else {
+ findNavController().navigate(nextPage)
+ }
+ }
+
+ omnipod_wizard_button_cancel.setOnClickListener {
+ (activity as? OmnipodWizardActivityBase)?.exitActivityAfterConfirmation()
+ }
+ }
+
+ private fun updateProgressIndication() {
+ (activity as? OmnipodWizardActivityBase)?.let {
+ val numberOfSteps = it.getActualNumberOfSteps()
+
+ val currentFragment = getIndex() - (it.getTotalDefinedNumberOfSteps() - numberOfSteps)
+ val progressPercentage = (currentFragment / numberOfSteps.toDouble() * 100).roundToInt()
+
+ omnipod_wizard_progress_indication.progress = progressPercentage
+ }
+ }
+
+ @LayoutRes
+ protected abstract fun getLayoutId(): Int
+
+ @IdRes
+ protected abstract fun getNextPageActionId(): Int?
+
+ @StringRes
+ protected abstract fun getTitleId(): Int
+
+ protected abstract fun getIndex(): Int
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/viewmodel/ActionViewModelBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/viewmodel/ActionViewModelBase.kt
new file mode 100644
index 0000000000..dc47132515
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/common/viewmodel/ActionViewModelBase.kt
@@ -0,0 +1,30 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.viewmodel
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import info.nightscout.androidaps.data.PumpEnactResult
+import io.reactivex.schedulers.Schedulers
+import io.reactivex.subjects.SingleSubject
+
+abstract class ActionViewModelBase : ViewModel() {
+
+ private val _isActionExecutingLiveData = MutableLiveData(false)
+ val isActionExecutingLiveData: LiveData = _isActionExecutingLiveData
+
+ private val _actionResultLiveData = MutableLiveData(null)
+ val actionResultLiveData: LiveData = _actionResultLiveData
+
+ fun executeAction() {
+ _isActionExecutingLiveData.postValue(true)
+ SingleSubject.fromCallable(this::doExecuteAction)
+ .subscribeOn(Schedulers.io())
+ .doOnSuccess { result ->
+ _isActionExecutingLiveData.postValue(false)
+ _actionResultLiveData.postValue(result)
+ }
+ .subscribe()
+ }
+
+ protected abstract fun doExecuteAction(): PumpEnactResult
+}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/PodDeactivationWizardActivity.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/PodDeactivationWizardActivity.kt
new file mode 100644
index 0000000000..dafba7fb4d
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/PodDeactivationWizardActivity.kt
@@ -0,0 +1,19 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation
+
+import android.os.Bundle
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.activity.OmnipodWizardActivityBase
+
+class PodDeactivationWizardActivity : OmnipodWizardActivityBase() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContentView(R.layout.omnipod_pod_deactivation_wizard_activity)
+ }
+
+ override fun getTotalDefinedNumberOfSteps(): Int = 3
+
+ override fun getActualNumberOfSteps(): Int = 3
+
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/DeactivatePodActionFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/DeactivatePodActionFragment.kt
new file mode 100644
index 0000000000..59843bc180
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/DeactivatePodActionFragment.kt
@@ -0,0 +1,68 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.fragment
+
+import android.os.Bundle
+import android.view.View
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import androidx.appcompat.app.AlertDialog
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.ViewModelProvider
+import androidx.navigation.fragment.findNavController
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.dagger.OmnipodPluginQualifier
+import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment.ActionFragmentBase
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.viewmodel.DeactivatePodActionViewModel
+import info.nightscout.androidaps.utils.extensions.toVisibility
+import kotlinx.android.synthetic.main.omnipod_wizard_action_page_fragment.*
+import javax.inject.Inject
+
+class DeactivatePodActionFragment : ActionFragmentBase() {
+
+ @Inject
+ @OmnipodPluginQualifier
+ lateinit var viewModelFactory: ViewModelProvider.Factory
+
+ @Inject
+ lateinit var aapsOmnipodManager: AapsOmnipodManager
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ val vm: DeactivatePodActionViewModel by viewModels { viewModelFactory }
+ this.viewModel = vm
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ omnipod_wizard_button_discard_pod.setOnClickListener {
+ context?.let {
+ AlertDialog.Builder(it)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setTitle(getString(R.string.omnipod_pod_deactivation_wizard_discard_pod))
+ .setMessage(getString(R.string.omnipod_pod_deactivation_wizard_discard_pod_confirmation))
+ .setPositiveButton(getString(R.string.omnipod_yes)) { _, _ ->
+ aapsOmnipodManager.discardPodState()
+ findNavController().navigate(R.id.action_deactivatePodActionFragment_to_podDiscardedInfoFragment)
+ }
+ .setNegativeButton(getString(R.string.omnipod_no), null)
+ .show()
+ }
+ }
+ }
+
+ override fun onActionFailure() {
+ omnipod_wizard_button_discard_pod.visibility = (!isActionExecuting()).toVisibility()
+ }
+
+ @StringRes
+ override fun getTitleId(): Int = R.string.omnipod_pod_deactivation_wizard_deactivating_pod_title
+
+ @StringRes
+ override fun getTextId(): Int = R.string.omnipod_pod_deactivation_wizard_deactivating_pod_text
+
+ @IdRes
+ override fun getNextPageActionId(): Int = R.id.action_deactivatePodActionFragment_to_podDeactivatedInfoFragment
+
+ override fun getIndex(): Int = 2
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/DeactivatePodInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/DeactivatePodInfoFragment.kt
new file mode 100644
index 0000000000..8a24e2767b
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/DeactivatePodInfoFragment.kt
@@ -0,0 +1,20 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.fragment
+
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment.InfoFragmentBase
+
+class DeactivatePodInfoFragment : InfoFragmentBase() {
+
+ @StringRes
+ override fun getTitleId(): Int = R.string.omnipod_pod_deactivation_wizard_deactivate_pod_title
+
+ @StringRes
+ override fun getTextId(): Int = R.string.omnipod_pod_deactivation_wizard_deactivate_pod_text
+
+ @IdRes
+ override fun getNextPageActionId(): Int = R.id.action_deactivatePodInfoFragment_to_deactivatePodActionFragment
+
+ override fun getIndex(): Int = 1
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/PodDeactivatedInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/PodDeactivatedInfoFragment.kt
new file mode 100644
index 0000000000..240efe4735
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/PodDeactivatedInfoFragment.kt
@@ -0,0 +1,20 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.fragment
+
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment.InfoFragmentBase
+
+class PodDeactivatedInfoFragment : InfoFragmentBase() {
+
+ @StringRes
+ override fun getTitleId(): Int = R.string.omnipod_pod_deactivation_wizard_pod_deactivated_title
+
+ @StringRes
+ override fun getTextId(): Int = R.string.omnipod_pod_deactivation_wizard_pod_deactivated_text
+
+ @IdRes
+ override fun getNextPageActionId(): Int? = null
+
+ override fun getIndex(): Int = 3
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/PodDiscardedInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/PodDiscardedInfoFragment.kt
new file mode 100644
index 0000000000..ebbfa0b3fd
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/fragment/PodDiscardedInfoFragment.kt
@@ -0,0 +1,20 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.fragment
+
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import info.nightscout.androidaps.plugins.pump.omnipod.R
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment.InfoFragmentBase
+
+class PodDiscardedInfoFragment : InfoFragmentBase() {
+
+ @StringRes
+ override fun getTitleId(): Int = R.string.omnipod_pod_deactivation_wizard_pod_discarded_title
+
+ @StringRes
+ override fun getTextId(): Int = R.string.omnipod_pod_deactivation_wizard_pod_discarded_text
+
+ @IdRes
+ override fun getNextPageActionId(): Int? = null
+
+ override fun getIndex(): Int = 3
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/viewmodel/DeactivatePodActionViewModel.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/viewmodel/DeactivatePodActionViewModel.kt
new file mode 100644
index 0000000000..9e0b75f2e3
--- /dev/null
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/deactivation/viewmodel/DeactivatePodActionViewModel.kt
@@ -0,0 +1,23 @@
+package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.deactivation.viewmodel
+
+import info.nightscout.androidaps.data.PumpEnactResult
+import info.nightscout.androidaps.interfaces.CommandQueueProvider
+import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager
+import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandDeactivatePod
+import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.viewmodel.ActionViewModelBase
+import info.nightscout.androidaps.queue.Callback
+import io.reactivex.subjects.SingleSubject
+import javax.inject.Inject
+
+class DeactivatePodActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager, private val commandQueueProvider: CommandQueueProvider) : ActionViewModelBase() {
+
+ override fun doExecuteAction(): PumpEnactResult {
+ val singleSubject = SingleSubject.create()
+ commandQueueProvider.customCommand(CommandDeactivatePod(), object : Callback() {
+ override fun run() {
+ singleSubject.onSuccess(result)
+ }
+ })
+ return singleSubject.blockingGet()
+ }
+}
\ No newline at end of file
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/defs/PodActionType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/defs/PodActionType.java
deleted file mode 100644
index 48380638c2..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/defs/PodActionType.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.defs;
-
-public enum PodActionType {
- INIT_POD,
- DEACTIVATE_POD,
- DISCARD_POD
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionFragment.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionFragment.java
deleted file mode 100644
index e05c86ec5b..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionFragment.java
+++ /dev/null
@@ -1,223 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.graphics.Color;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import androidx.fragment.app.FragmentActivity;
-
-import com.atech.android.library.wizardpager.util.WizardPagesUtil;
-import com.tech.freak.wizardpager.model.Page;
-import com.tech.freak.wizardpager.ui.PageFragmentCallbacks;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import javax.inject.Inject;
-
-import dagger.android.HasAndroidInjector;
-import dagger.android.support.DaggerFragment;
-import info.nightscout.androidaps.data.PumpEnactResult;
-import info.nightscout.androidaps.plugins.pump.omnipod.R;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitReceiver;
-
-/**
- * Created by andy on 12/11/2019
- */
-public class InitActionFragment extends DaggerFragment implements PodInitReceiver {
- protected static final String ARG_KEY = "key";
- protected static final String ARG_POD_INIT_ACTION_TYPE = "podInitActionType";
-
- private static boolean isFirstView;
-
- private PageFragmentCallbacks mCallbacks;
- private String mKey;
- protected InitActionPage mPage;
-
- protected ProgressBar progressBar;
- protected TextView errorView;
- protected Button retryButton;
-
- PodInitActionType podInitActionType;
- private List children;
- protected Map mapCheckBoxes;
-
- protected PumpEnactResult callResult;
-
- @Inject HasAndroidInjector injector;
-
- public static InitActionFragment create(String key, PodInitActionType podInitActionType) {
- Bundle args = new Bundle();
- args.putString(ARG_KEY, key);
- args.putSerializable(ARG_POD_INIT_ACTION_TYPE, podInitActionType);
-
- InitActionFragment fragment = new InitActionFragment();
- fragment.setArguments(args);
- return fragment;
- }
-
- @SuppressLint("SourceLockedOrientationActivity")
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- if (savedInstanceState == null) {
- isFirstView = true;
- }
-
- getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
-
- Bundle args = getArguments();
- mKey = args.getString(ARG_KEY);
- podInitActionType = (PodInitActionType) args.getSerializable(ARG_POD_INIT_ACTION_TYPE);
- mPage = (InitActionPage) mCallbacks.onGetPage(mKey);
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- super.onCreateView(inflater, container, savedInstanceState);
-
- View rootView = inflater.inflate(R.layout.omnipod_initpod_init_action, container, false);
- WizardPagesUtil.setTitle(mPage, rootView);
-
- this.progressBar = rootView.findViewById(R.id.initAction_progressBar);
- this.errorView = rootView.findViewById(R.id.initAction_textErrorMessage);
-
- TextView headerView = rootView.findViewById(R.id.initAction_header);
-
- LinearLayout linearLayout = rootView.findViewById(R.id.initAction_ItemsHolder);
-
- children = podInitActionType.getChildren();
- mapCheckBoxes = new HashMap<>();
-
- for (PodInitActionType child : children) {
- CheckBox checkBox1 = new CheckBox(getContext());
- checkBox1.setText(child.getResourceId());
- checkBox1.setClickable(false);
- checkBox1.setTextAppearance(R.style.WizardPagePodListItem);
- checkBox1.setHeight(120);
- checkBox1.setTextSize(15);
- checkBox1.setTextColor(headerView.getTextColors().getDefaultColor());
-
- linearLayout.addView(checkBox1);
-
- mapCheckBoxes.put(child, checkBox1);
- }
-
- if (podInitActionType == PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP) {
- headerView.setText(R.string.omnipod_init_pod_wizard_step4_action_header);
- } else if (podInitActionType == PodInitActionType.DEACTIVATE_POD_WIZARD_STEP) {
- headerView.setText(R.string.omnipod_remove_pod_wizard_step2_action_header);
- }
-
- this.retryButton = rootView.findViewById(R.id.initAction_RetryButton);
-
- this.retryButton.setOnClickListener(view -> {
-
- getActivity().runOnUiThread(() -> {
- for (PodInitActionType actionType : mapCheckBoxes.keySet()) {
- mapCheckBoxes.get(actionType).setChecked(false);
- mapCheckBoxes.get(actionType).setTextColor(headerView.getTextColors().getDefaultColor());
- }
- });
-
- new InitPodTask(injector, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- });
-
- return rootView;
- }
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
-
- FragmentActivity activity = getActivity();
-
- if (!(activity instanceof PageFragmentCallbacks)) {
- throw new ClassCastException("Activity must implement PageFragmentCallbacks");
- }
-
- mCallbacks = (PageFragmentCallbacks) activity;
- }
-
- @Override
- public void onDetach() {
- super.onDetach();
- mCallbacks = null;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if (isFirstView) {
- isFirstView = false;
- new InitPodTask(injector, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
- }
-
- public void actionOnReceiveResponse(String result) {
- }
-
- @Override
- public void returnInitTaskStatus(PodInitActionType podInitActionType, boolean isSuccess, String errorMessage) {
- if (podInitActionType.isParent()) {
- for (PodInitActionType actionType : mapCheckBoxes.keySet()) {
- setCheckBox(actionType, isSuccess);
- }
-
- // special handling for init
- processOnFinishedActions(isSuccess, errorMessage);
-
- } else {
- setCheckBox(podInitActionType, isSuccess);
- }
- }
-
- private void processOnFinishedActions(boolean isOk, String errorMessage) {
- FragmentActivity activity = getActivity();
- if (activity != null) {
- activity.runOnUiThread(() -> {
- progressBar.setVisibility(View.GONE);
-
- if (!isOk) {
- errorView.setVisibility(View.VISIBLE);
- errorView.setText(errorMessage);
-
- retryButton.setVisibility(View.VISIBLE);
- }
-
- mPage.setActionCompleted(isOk);
-
- mPage.getData().putString(Page.SIMPLE_DATA_KEY, UUID.randomUUID().toString());
- mPage.notifyDataChanged();
-
- });
- }
- }
-
- protected void setCheckBox(PodInitActionType podInitActionType, boolean isSuccess) {
- FragmentActivity activity = getActivity();
- if (activity != null) {
- activity.runOnUiThread(() -> {
- mapCheckBoxes.get(podInitActionType).setChecked(isSuccess);
- mapCheckBoxes.get(podInitActionType).setTextColor(isSuccess ? Color.rgb(34, 135, 91) :
- Color.rgb(168, 36, 15));
- });
- }
- }
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionPage.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionPage.java
deleted file mode 100644
index 8c086ffe6e..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionPage.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod;
-
-import androidx.annotation.StringRes;
-import androidx.fragment.app.Fragment;
-
-import com.tech.freak.wizardpager.model.ModelCallbacks;
-import com.tech.freak.wizardpager.model.Page;
-import com.tech.freak.wizardpager.model.ReviewItem;
-
-import java.util.ArrayList;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType;
-
-
-/**
- * Created by andy on 12/11/2019
- *
- * This page is for InitPod and RemovePod, but Fragments called for this 2 actions are different
- */
-public class InitActionPage extends Page {
-
- protected PodInitActionType podInitActionType;
-
- private boolean actionCompleted = false;
- private boolean actionSuccess = false;
-
- protected InitActionPage(ModelCallbacks callbacks, String title) {
- super(callbacks, title);
- }
-
- public InitActionPage(ModelCallbacks callbacks, @StringRes int titleId, PodInitActionType podInitActionType) {
- super(callbacks, titleId);
- this.podInitActionType = podInitActionType;
- }
-
- @Override
- public Fragment createFragment() {
- return InitActionFragment.create(getKey(), this.podInitActionType);
- }
-
- @Override
- public void getReviewItems(ArrayList dest) {
- }
-
- @Override
- public boolean isCompleted() {
- return actionCompleted;
- }
-
- public void setActionCompleted(boolean success) {
- this.actionCompleted = success;
- this.actionSuccess = success;
- }
-
- /**
- * This is used just if we want to override default behavior (for example when we enter Page we want prevent any action, until something happens.
- *
- * @return
- */
- @Override public boolean isBackActionPossible() {
- return actionCompleted;
- }
-
- /**
- * This is used just if we want to override default behavior (for example when we enter Page we want prevent any action, until something happens.
- *
- * @return
- */
- @Override public boolean isNextActionPossible() {
- return actionSuccess;
- }
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitPodTask.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitPodTask.java
deleted file mode 100644
index 12742ff108..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitPodTask.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod;
-
-import android.os.AsyncTask;
-import android.view.View;
-
-import javax.inject.Inject;
-
-import dagger.android.HasAndroidInjector;
-import info.nightscout.androidaps.interfaces.ProfileFunction;
-import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType;
-import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged;
-import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager;
-
-/**
- * Created by andy on 11/12/2019
- */
-public class InitPodTask extends AsyncTask {
-
- @Inject ProfileFunction profileFunction;
- @Inject AapsOmnipodManager aapsOmnipodManager;
- @Inject RxBusWrapper rxBus;
- private final InitActionFragment initActionFragment;
-
- public InitPodTask(HasAndroidInjector injector, InitActionFragment initActionFragment) {
- injector.androidInjector().inject(this);
- this.initActionFragment = initActionFragment;
- }
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- initActionFragment.progressBar.setVisibility(View.VISIBLE);
- initActionFragment.errorView.setVisibility(View.GONE);
- initActionFragment.retryButton.setVisibility(View.GONE);
- }
-
- @Override
- protected String doInBackground(Void... params) {
- if (initActionFragment.podInitActionType == PodInitActionType.PAIR_AND_PRIME_WIZARD_STEP) {
- initActionFragment.callResult = aapsOmnipodManager.pairAndPrime(
- initActionFragment.podInitActionType,
- initActionFragment
- );
- } else if (initActionFragment.podInitActionType == PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP) {
- initActionFragment.callResult = aapsOmnipodManager.setInitialBasalScheduleAndInsertCannula(
- initActionFragment.podInitActionType,
- initActionFragment,
- profileFunction.getProfile()
- );
- } else if (initActionFragment.podInitActionType == PodInitActionType.DEACTIVATE_POD_WIZARD_STEP) {
- initActionFragment.callResult = aapsOmnipodManager.deactivatePod(initActionFragment);
- }
-
- rxBus.send(new EventOmnipodPumpValuesChanged());
-
- return "OK";
- }
-
- @Override
- protected void onPostExecute(String result) {
- super.onPostExecute(result);
-
- initActionFragment.actionOnReceiveResponse(result);
- }
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/FullInitPodWizardModel.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/FullInitPodWizardModel.java
deleted file mode 100644
index af364324ae..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/FullInitPodWizardModel.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model;
-
-import android.content.Context;
-
-import com.atech.android.library.wizardpager.model.DisplayTextPage;
-import com.tech.freak.wizardpager.model.PageList;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.R;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType;
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionPage;
-
-/**
- * Created by andy on 12/11/2019
- */
-// Full init pod wizard model
-// Cannot be merged with ShortInitPodWizardModel, because we can't set any instance variables
-// before the onNewRootPageList method is called (which happens in the super constructor)
-public class FullInitPodWizardModel extends InitPodWizardModel {
-
- public FullInitPodWizardModel(Context context) {
- super(context);
- }
-
- @Override
- protected PageList onNewRootPageList() {
- return new PageList(
- new DisplayTextPage(this,
- R.string.omnipod_init_pod_wizard_step1_title,
- R.string.omnipod_init_pod_wizard_step1_desc,
- R.style.WizardPagePodContent).setRequired(true).setCancelReason("None"),
-
- new InitActionPage(this,
- R.string.omnipod_init_pod_wizard_step2_title,
- PodInitActionType.PAIR_AND_PRIME_WIZARD_STEP
- ).setRequired(true).setCancelReason("Cancel"),
-
- new DisplayTextPage(this,
- R.string.omnipod_init_pod_wizard_step3_title,
- R.string.omnipod_init_pod_wizard_step3_desc,
- R.style.WizardPagePodContent).setRequired(true).setCancelReason("Cancel"),
-
- new InitActionPage(this,
- R.string.omnipod_init_pod_wizard_step4_title,
- PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP
- ).setRequired(true).setCancelReason("Cancel")
- );
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/InitPodWizardModel.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/InitPodWizardModel.java
deleted file mode 100644
index e3c4e9c1fe..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/InitPodWizardModel.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model;
-
-import android.content.Context;
-
-import androidx.fragment.app.Fragment;
-
-import com.tech.freak.wizardpager.model.AbstractWizardModel;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages.PodInfoFragment;
-
-abstract class InitPodWizardModel extends AbstractWizardModel {
- InitPodWizardModel(Context context) {
- super(context);
- }
-
- @Override
- public Fragment getReviewFragment() {
- return PodInfoFragment.create(true);
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/RemovePodWizardModel.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/RemovePodWizardModel.java
deleted file mode 100644
index 381dcb1950..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/RemovePodWizardModel.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2012 Roman Nurik
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model;
-
-import android.content.Context;
-
-import androidx.fragment.app.Fragment;
-
-import com.atech.android.library.wizardpager.model.DisplayTextPage;
-import com.tech.freak.wizardpager.model.AbstractWizardModel;
-import com.tech.freak.wizardpager.model.PageList;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.R;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType;
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages.PodInfoFragment;
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.removepod.RemovePodActionPage;
-
-/**
- * Created by andy on 12/11/2019
- */
-public class RemovePodWizardModel extends AbstractWizardModel {
-
- public RemovePodWizardModel(Context context) {
- super(context);
- }
-
- @Override
- protected PageList onNewRootPageList() {
- return new PageList(
- new DisplayTextPage(this,
- R.string.omnipod_remove_pod_wizard_step1_title,
- R.string.omnipod_remove_pod_wizard_step1_desc,
- R.style.WizardPagePodContent).setRequired(true).setCancelReason("None"),
-
- new RemovePodActionPage(this,
- R.string.omnipod_remove_pod_wizard_step2_title,
- PodInitActionType.DEACTIVATE_POD_WIZARD_STEP
- ).setRequired(true).setCancelReason("Cancel")
-
- );
- }
-
- @Override public Fragment getReviewFragment() {
- return PodInfoFragment.create(false);
- }
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/ShortInitPodWizardModel.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/ShortInitPodWizardModel.java
deleted file mode 100644
index 3813520e80..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/ShortInitPodWizardModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model;
-
-import android.content.Context;
-
-import com.atech.android.library.wizardpager.model.DisplayTextPage;
-import com.tech.freak.wizardpager.model.PageList;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.R;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType;
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionPage;
-
-/**
- * Created by andy on 12/11/2019
- */
-// Init pod wizard model without the pair and prime step
-// Cannot be merged with FullInitPodWizardModel, because we can't set any instance variables
-// before the onNewRootPageList method is called (which happens in the super constructor)
-public class ShortInitPodWizardModel extends InitPodWizardModel {
-
- public ShortInitPodWizardModel(Context context) {
- super(context);
- }
-
- @Override
- protected PageList onNewRootPageList() {
- return new PageList(
- new DisplayTextPage(this,
- R.string.omnipod_init_pod_wizard_step3_title,
- R.string.omnipod_init_pod_wizard_step3_desc,
- R.style.WizardPagePodContent).setRequired(true).setCancelReason("Cancel"),
-
- new InitActionPage(this,
- R.string.omnipod_init_pod_wizard_step4_title,
- PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP
- ).setRequired(true).setCancelReason("Cancel")
- );
-
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/InitPodRefreshAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/InitPodRefreshAction.java
deleted file mode 100644
index 9f7c47be2b..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/InitPodRefreshAction.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages;
-
-import com.atech.android.library.wizardpager.defs.action.AbstractCancelAction;
-import com.atech.android.library.wizardpager.defs.action.FinishActionInterface;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import javax.inject.Inject;
-
-import dagger.android.HasAndroidInjector;
-import info.nightscout.androidaps.db.CareportalEvent;
-import info.nightscout.androidaps.db.Source;
-import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
-import info.nightscout.androidaps.interfaces.ProfileFunction;
-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.omnipod.driver.manager.PodStateManager;
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.defs.PodActionType;
-import info.nightscout.androidaps.utils.DateUtil;
-import info.nightscout.androidaps.utils.sharedPreferences.SP;
-
-
-/**
- * Created by andy on 12/11/2019
- */
-public class InitPodRefreshAction extends AbstractCancelAction implements FinishActionInterface {
-
- private final PodActionType actionType;
- private final HasAndroidInjector injector;
-
- @Inject PodStateManager podStateManager;
- @Inject AAPSLogger aapsLogger;
- @Inject SP sp;
- @Inject NSUpload nsUpload;
- @Inject DatabaseHelperInterface databaseHelper;
- @Inject ProfileFunction profileFunction;
-
- public InitPodRefreshAction(HasAndroidInjector injector, PodActionType actionType) {
- this.injector = injector;
- injector.androidInjector().inject(this);
- this.actionType = actionType;
- }
-
- @Override
- public void execute(String cancelReason) {
- if (cancelReason != null && cancelReason.trim().length() > 0) {
- this.cancelActionText = cancelReason;
- }
- }
-
- @Override
- public void execute() {
- if (actionType == PodActionType.INIT_POD) {
- if (podStateManager.isPodRunning()) {
- uploadCareportalEvent(System.currentTimeMillis() - 2000, CareportalEvent.PUMPBATTERYCHANGE);
- uploadCareportalEvent(System.currentTimeMillis() - 1000, CareportalEvent.INSULINCHANGE);
- uploadCareportalEvent(System.currentTimeMillis(), CareportalEvent.SITECHANGE);
- }
- }
- }
-
- private void uploadCareportalEvent(long date, String event) {
- if (databaseHelper.getCareportalEventFromTimestamp(date) != null)
- return;
- try {
- JSONObject data = new JSONObject();
- String enteredBy = sp.getString("careportal_enteredby", "");
- if (enteredBy.isEmpty()) {
- data.put("enteredBy", enteredBy);
- }
- data.put("created_at", DateUtil.toISOString(date));
- data.put("mills", date);
- data.put("eventType", event);
- data.put("units", profileFunction.getUnits());
- CareportalEvent careportalEvent = new CareportalEvent(injector);
- careportalEvent.date = date;
- careportalEvent.source = Source.USER;
- careportalEvent.eventType = event;
- careportalEvent.json = data.toString();
- databaseHelper.createOrUpdate(careportalEvent);
- nsUpload.uploadCareportalEntryToNS(data);
- } catch (JSONException e) {
- aapsLogger.error(LTag.PUMPCOMM, "Unhandled exception when uploading SiteChange event.", e);
- }
- }
-
- @Override
- public String getFinishActionText() {
- return "Finish_OK";
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/PodInfoFragment.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/PodInfoFragment.java
deleted file mode 100644
index 83dbeb0125..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/PodInfoFragment.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import androidx.fragment.app.FragmentActivity;
-
-import com.tech.freak.wizardpager.model.ReviewItem;
-import com.tech.freak.wizardpager.ui.PageFragmentCallbacks;
-
-import java.util.ArrayList;
-
-import javax.inject.Inject;
-
-import dagger.android.support.DaggerFragment;
-import info.nightscout.androidaps.plugins.pump.omnipod.R;
-import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager;
-import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil;
-
-
-/**
- * Created by andy on 12/11/2019
- */
-public class PodInfoFragment extends DaggerFragment {
- private static final String ARG_INIT_POD = "initPod";
-
- @Inject AapsOmnipodUtil aapsOmnipodUtil;
- @Inject PodStateManager podStateManager;
-
- private boolean isInitPod;
- private ArrayList mCurrentReviewItems;
-
- public static PodInfoFragment create(boolean initPod) {
- Bundle args = new Bundle();
- args.putBoolean(ARG_INIT_POD, initPod);
-
- PodInfoFragment fragment = new PodInfoFragment();
- fragment.setArguments(args);
- return fragment;
- }
-
- @SuppressLint("SourceLockedOrientationActivity") @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
-
- Bundle args = getArguments();
- isInitPod = args.getBoolean(ARG_INIT_POD);
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View rootView = inflater.inflate(R.layout.omnipod_initpod_pod_info, container, false);
-
- TextView titleView = rootView.findViewById(R.id.podInfoTitle);
- titleView.setText(R.string.omnipod_init_pod_wizard_pod_info_title);
- titleView.setTextColor(getResources().getColor(com.tech.freak.wizardpager.R.color.review_green));
-
- TextView headerText = rootView.findViewById(R.id.podInfoText);
- headerText.setText(isInitPod ? //
- R.string.omnipod_init_pod_wizard_pod_info_init_pod_description : //
- R.string.omnipod_init_pod_wizard_pod_info_remove_pod_description);
-
- if (isInitPod) {
- if (createDataOfPod()) {
-
- ListView listView = (ListView) rootView.findViewById(R.id.podInfoList);
- listView.setAdapter(new PodInfoAdapter(mCurrentReviewItems, getContext()));
- listView.setChoiceMode(ListView.CHOICE_MODE_NONE);
- }
- }
-
- return rootView;
- }
-
- private boolean createDataOfPod() {
- if (podStateManager == null)
- return false;
-
- mCurrentReviewItems = new ArrayList<>();
- mCurrentReviewItems.add(new ReviewItem("Pod Address", "" + podStateManager.getAddress(), "33"));
- mCurrentReviewItems.add(new ReviewItem("Activated At", podStateManager.getActivatedAt() == null ? "Not activated yet" : podStateManager.getActivatedAt().toString("dd.MM.yyyy HH:mm:ss"), "34"));
- if (podStateManager.getLot() != null) {
- mCurrentReviewItems.add(new ReviewItem("LOT", "" + podStateManager.getLot(), "35"));
- }
- if (podStateManager.getTid() != null) {
- mCurrentReviewItems.add(new ReviewItem("TID", "" + podStateManager.getLot(), "36"));
- }
- if (podStateManager.getPiVersion() != null) {
- mCurrentReviewItems.add(new ReviewItem("Pi Version", podStateManager.getPiVersion().toString(), "37"));
- }
- if (podStateManager.getPmVersion() != null) {
- mCurrentReviewItems.add(new ReviewItem("Pm Version", podStateManager.getPmVersion().toString(), "38"));
- }
-
- return true;
- }
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
-
- FragmentActivity activity = getActivity();
-
- if (!(activity instanceof PageFragmentCallbacks)) {
- throw new ClassCastException("Activity must implement PageFragmentCallbacks");
- }
- }
-
- @Override
- public void onDetach() {
- super.onDetach();
- }
-
- private static class PodInfoAdapter extends ArrayAdapter {
- PodInfoAdapter(ArrayList data, Context context) {
- super(context, com.tech.freak.wizardpager.R.layout.list_item_review, data);
- }
-
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- // Get the data item for this position
- ReviewItem dataModel = getItem(position);
- // Check if an existing view is being reused, otherwise inflate the view
- ViewHolder viewHolder; // view lookup cache stored in tag
-
- if (convertView == null) {
-
- viewHolder = new ViewHolder();
- LayoutInflater inflater = LayoutInflater.from(getContext());
- convertView = inflater.inflate(R.layout.omnipod_initpod_pod_info_item, parent, false);
- viewHolder.txtName = (TextView) convertView.findViewById(android.R.id.text1);
- viewHolder.txtType = (TextView) convertView.findViewById(android.R.id.text2);
-
- convertView.setTag(viewHolder);
- } else {
- viewHolder = (ViewHolder) convertView.getTag();
- }
-
- viewHolder.txtName.setText(dataModel.getTitle());
- viewHolder.txtType.setText(dataModel.getDisplayValue());
-
- // Return the completed view to render on screen
- return convertView;
- }
- }
-
- private static class ViewHolder {
- TextView txtName;
- TextView txtType;
- }
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemoveActionFragment.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemoveActionFragment.java
deleted file mode 100644
index 2ca5a1d198..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemoveActionFragment.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.removepod;
-
-import android.os.Bundle;
-import android.view.View;
-
-import com.tech.freak.wizardpager.model.Page;
-
-import java.util.UUID;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType;
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitReceiver;
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionFragment;
-
-/**
- * Created by andy on 29/11/2019
- */
-public class RemoveActionFragment extends InitActionFragment implements PodInitReceiver {
- public static RemoveActionFragment create(String key, PodInitActionType podInitActionType) {
- Bundle args = new Bundle();
- args.putString(ARG_KEY, key);
- args.putSerializable(ARG_POD_INIT_ACTION_TYPE, podInitActionType);
-
- RemoveActionFragment fragment = new RemoveActionFragment();
- fragment.setArguments(args);
- return fragment;
- }
-
- @Override
- public void actionOnReceiveResponse(String result) {
- System.out.println("ACTION: actionOnReceiveResponse: " + result);
-
- boolean isOk = callResult.success;
-
- progressBar.setVisibility(View.GONE);
-
- if (!isOk) {
- errorView.setVisibility(View.VISIBLE);
- errorView.setText(callResult.comment);
-
- retryButton.setVisibility(View.VISIBLE);
- }
-
- mPage.setActionCompleted(isOk);
-
- mPage.getData().putString(Page.SIMPLE_DATA_KEY, UUID.randomUUID().toString());
- mPage.notifyDataChanged();
- }
-
-
- @Override
- public void returnInitTaskStatus(PodInitActionType podInitActionType, boolean isSuccess, String errorMessage) {
- if (podInitActionType.isParent()) {
- for (PodInitActionType actionType : mapCheckBoxes.keySet()) {
- setCheckBox(actionType, isSuccess);
- }
- } else {
- setCheckBox(podInitActionType, isSuccess);
- }
- }
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemovePodActionPage.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemovePodActionPage.java
deleted file mode 100644
index 7d1b319d8c..0000000000
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemovePodActionPage.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.removepod;
-
-import androidx.annotation.StringRes;
-import androidx.fragment.app.Fragment;
-
-import com.tech.freak.wizardpager.model.ModelCallbacks;
-
-import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType;
-import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionPage;
-
-
-/**
- * Created by andy on 12/11/2019
- */
-public class RemovePodActionPage extends InitActionPage {
-
- public RemovePodActionPage(ModelCallbacks callbacks, String title) {
- super(callbacks, title);
- }
-
- public RemovePodActionPage(ModelCallbacks callbacks, @StringRes int titleId, PodInitActionType podInitActionType) {
- super(callbacks, titleId, podInitActionType);
- }
-
- @Override
- public Fragment createFragment() {
- return RemoveActionFragment.create(getKey(), this.podInitActionType);
- }
-
-}
diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/util/OmnipodAlertUtil.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/util/OmnipodAlertUtil.java
index f9e541f986..02cd645b16 100644
--- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/util/OmnipodAlertUtil.java
+++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/util/OmnipodAlertUtil.java
@@ -6,6 +6,7 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodStorageKeys;
+import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants;
import info.nightscout.androidaps.utils.sharedPreferences.SP;
@Singleton
@@ -24,6 +25,6 @@ public class OmnipodAlertUtil {
public Integer getLowReservoirAlertUnits() {
boolean lowReservoirAlertEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.LOW_RESERVOIR_ALERT_ENABLED, true);
- return lowReservoirAlertEnabled ? sp.getInt(OmnipodStorageKeys.Preferences.LOW_RESERVOIR_ALERT_UNITS, 20) : null;
+ return lowReservoirAlertEnabled ? sp.getInt(OmnipodStorageKeys.Preferences.LOW_RESERVOIR_ALERT_UNITS, OmnipodConstants.DEFAULT_MAX_RESERVOIR_ALERT_THRESHOLD) : null;
}
}
diff --git a/omnipod/src/main/res/drawable/ic_actions_temptarget.xml b/omnipod/src/main/res/drawable/ic_actions_temptarget.xml
deleted file mode 100644
index 5dbd5d8b0c..0000000000
--- a/omnipod/src/main/res/drawable/ic_actions_temptarget.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/omnipod/src/main/res/drawable/ic_cp_aaps_offline.xml b/omnipod/src/main/res/drawable/ic_cp_aaps_offline.xml
deleted file mode 100644
index 0b267a6d88..0000000000
--- a/omnipod/src/main/res/drawable/ic_cp_aaps_offline.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
diff --git a/omnipod/src/main/res/drawable/ic_cp_bolus_correction.xml b/omnipod/src/main/res/drawable/ic_cp_bolus_correction.xml
deleted file mode 100644
index e14bb7c14f..0000000000
--- a/omnipod/src/main/res/drawable/ic_cp_bolus_correction.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/omnipod/src/main/res/drawable/ic_cp_pump_canula.xml b/omnipod/src/main/res/drawable/ic_cp_pump_canula.xml
deleted file mode 100644
index b43de7ceaa..0000000000
--- a/omnipod/src/main/res/drawable/ic_cp_pump_canula.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/omnipod/src/main/res/drawable/ic_exit_to_app.xml b/omnipod/src/main/res/drawable/ic_exit_to_app.xml
deleted file mode 100644
index 37a6c7d058..0000000000
--- a/omnipod/src/main/res/drawable/ic_exit_to_app.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/omnipod/src/main/res/drawable/ic_local_activate.xml b/omnipod/src/main/res/drawable/ic_local_activate.xml
deleted file mode 100644
index 905ade57d3..0000000000
--- a/omnipod/src/main/res/drawable/ic_local_activate.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/omnipod/src/main/res/drawable/ic_loop_disabled.xml b/omnipod/src/main/res/drawable/ic_loop_disabled.xml
deleted file mode 100644
index ed79c96429..0000000000
--- a/omnipod/src/main/res/drawable/ic_loop_disabled.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
diff --git a/omnipod/src/main/res/drawable/ic_omnipod_overview_acknowledge_alerts.xml b/omnipod/src/main/res/drawable/ic_omnipod_overview_acknowledge_alerts.xml
new file mode 100644
index 0000000000..2908c8f16b
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_omnipod_overview_acknowledge_alerts.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_omnipod_overview_pod_management.xml b/omnipod/src/main/res/drawable/ic_omnipod_overview_pod_management.xml
new file mode 100644
index 0000000000..a1d2818dab
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_omnipod_overview_pod_management.xml
@@ -0,0 +1,21 @@
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_omnipod_overview_refresh_pod_status.xml b/omnipod/src/main/res/drawable/ic_omnipod_overview_refresh_pod_status.xml
new file mode 100644
index 0000000000..83f0a2345d
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_omnipod_overview_refresh_pod_status.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_omnipod_overview_resume_delivery.xml b/omnipod/src/main/res/drawable/ic_omnipod_overview_resume_delivery.xml
new file mode 100644
index 0000000000..4e2ae87839
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_omnipod_overview_resume_delivery.xml
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_omnipod_overview_set_time.xml b/omnipod/src/main/res/drawable/ic_omnipod_overview_set_time.xml
new file mode 100644
index 0000000000..d5c6e682c3
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_omnipod_overview_set_time.xml
@@ -0,0 +1,18 @@
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_omnipod_overview_suspend_delivery.xml b/omnipod/src/main/res/drawable/ic_omnipod_overview_suspend_delivery.xml
new file mode 100644
index 0000000000..033f53217b
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_omnipod_overview_suspend_delivery.xml
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_omnipod_wizard_success.xml b/omnipod/src/main/res/drawable/ic_omnipod_wizard_success.xml
new file mode 100644
index 0000000000..851e84568c
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_omnipod_wizard_success.xml
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/drawable/ic_pod.xml b/omnipod/src/main/res/drawable/ic_pod.xml
new file mode 100644
index 0000000000..dea07bc5d9
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_pod.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_pod_activity_reset_rileylink_config.xml b/omnipod/src/main/res/drawable/ic_pod_activity_reset_rileylink_config.xml
new file mode 100644
index 0000000000..eee2a2ec84
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_pod_activity_reset_rileylink_config.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_pod_management_activate_pod.xml b/omnipod/src/main/res/drawable/ic_pod_management_activate_pod.xml
new file mode 100644
index 0000000000..04fe453a83
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_pod_management_activate_pod.xml
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_pod_management_deactivate_pod.xml b/omnipod/src/main/res/drawable/ic_pod_management_deactivate_pod.xml
new file mode 100644
index 0000000000..d6b053423e
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_pod_management_deactivate_pod.xml
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_pod_management_discard_pod.xml b/omnipod/src/main/res/drawable/ic_pod_management_discard_pod.xml
new file mode 100644
index 0000000000..1ba380492b
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_pod_management_discard_pod.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_pod_management_play_test_beep.xml b/omnipod/src/main/res/drawable/ic_pod_management_play_test_beep.xml
new file mode 100644
index 0000000000..46b82ac9e5
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_pod_management_play_test_beep.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_pod_management_pod_history.xml b/omnipod/src/main/res/drawable/ic_pod_management_pod_history.xml
new file mode 100644
index 0000000000..eb2372c685
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_pod_management_pod_history.xml
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_pod_management_pulse_log.xml b/omnipod/src/main/res/drawable/ic_pod_management_pulse_log.xml
new file mode 100644
index 0000000000..7b1823e7a1
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_pod_management_pulse_log.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/drawable/ic_pod_management_rl_stats.xml b/omnipod/src/main/res/drawable/ic_pod_management_rl_stats.xml
new file mode 100644
index 0000000000..09c8eea8b7
--- /dev/null
+++ b/omnipod/src/main/res/drawable/ic_pod_management_rl_stats.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/layout/omnipod_initpod.xml b/omnipod/src/main/res/layout/omnipod_initpod.xml
deleted file mode 100644
index af83f9583c..0000000000
--- a/omnipod/src/main/res/layout/omnipod_initpod.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/omnipod/src/main/res/layout/omnipod_initpod_init_action.xml b/omnipod/src/main/res/layout/omnipod_initpod_init_action.xml
deleted file mode 100644
index b9eb1e7ae5..0000000000
--- a/omnipod/src/main/res/layout/omnipod_initpod_init_action.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/omnipod/src/main/res/layout/omnipod_initpod_pod_info.xml b/omnipod/src/main/res/layout/omnipod_initpod_pod_info.xml
deleted file mode 100644
index 2f06de192d..0000000000
--- a/omnipod/src/main/res/layout/omnipod_initpod_pod_info.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/omnipod/src/main/res/layout/omnipod_initpod_pod_info_item.xml b/omnipod/src/main/res/layout/omnipod_initpod_pod_info_item.xml
deleted file mode 100644
index 30c84771fb..0000000000
--- a/omnipod/src/main/res/layout/omnipod_initpod_pod_info_item.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/omnipod/src/main/res/layout/omnipod_fragment.xml b/omnipod/src/main/res/layout/omnipod_overview.xml
similarity index 75%
rename from omnipod/src/main/res/layout/omnipod_fragment.xml
rename to omnipod/src/main/res/layout/omnipod_overview.xml
index cad9139a1a..25aa66c0f6 100644
--- a/omnipod/src/main/res/layout/omnipod_fragment.xml
+++ b/omnipod/src/main/res/layout/omnipod_overview.xml
@@ -2,8 +2,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context="info.nightscout.androidaps.plugins.pump.omnipod.ui.OmnipodFragment">
-
+ tools:context="info.nightscout.androidaps.plugins.pump.omnipod.ui.OmnipodOverviewFragment">
-
-
@@ -76,20 +72,19 @@
android:textSize="14sp" />
-
-
@@ -146,8 +143,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/omnipod_pod_lot"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_lot"
android:textSize="14sp" />
@@ -182,8 +181,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/omnipod_pod_tid"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_tid"
android:textSize="14sp" />
@@ -218,8 +219,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/omnipod_pod_firmware_version"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_overview_firmware_version"
android:textSize="14sp" />
+
+
+
+
+
+
+
+
+
+
@@ -292,8 +335,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/omnipod_pod_status"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_overview_pod_status"
android:textSize="14sp" />
@@ -391,8 +437,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/lastbolus_label"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_overview_last_bolus"
android:textSize="14sp" />
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -482,8 +484,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/tempbasal_label"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_overview_base_basal_rate"
android:textSize="14sp" />
@@ -527,8 +531,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/reservoir_label"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_overview_temp_basal_rate"
android:textSize="14sp" />
@@ -572,8 +578,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/omnipod_total_delivered_label"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_overview_reservoir"
android:textSize="14sp" />
@@ -617,8 +625,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/omnipod_errors"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_overview_total_delivered"
android:textSize="14sp" />
@@ -662,8 +672,9 @@
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
- android:paddingRight="5dp"
- android:text="@string/omnipod_pod_active_alerts"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:text="@string/omnipod_overview_errors"
android:textSize="14sp" />
@@ -697,13 +709,66 @@
android:layout_marginBottom="5dp"
android:background="@color/listdelimiter" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:drawableTop="@drawable/ic_omnipod_overview_refresh_pod_status"
+ android:drawablePadding="@dimen/omnipod_icon_button_drawable_padding"
+ android:text="@string/omnipod_overview_button_refresh" />
+ android:drawableTop="@drawable/ic_omnipod_overview_pod_management"
+ android:drawablePadding="@dimen/omnipod_icon_button_drawable_padding"
+ android:text="@string/omnipod_overview_button_pod_management" />
+ android:drawableTop="@drawable/ic_omnipod_overview_acknowledge_alerts"
+ android:drawablePadding="@dimen/omnipod_icon_button_drawable_padding"
+ android:text="@string/omnipod_overview_button_acknowledge_active_alerts" />
-
-
diff --git a/omnipod/src/main/res/layout/omnipod_pod_activation_wizard_activity.xml b/omnipod/src/main/res/layout/omnipod_pod_activation_wizard_activity.xml
new file mode 100644
index 0000000000..afbc055b78
--- /dev/null
+++ b/omnipod/src/main/res/layout/omnipod_pod_activation_wizard_activity.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/layout/omnipod_pod_deactivation_wizard_activity.xml b/omnipod/src/main/res/layout/omnipod_pod_deactivation_wizard_activity.xml
new file mode 100644
index 0000000000..8104ed2ec4
--- /dev/null
+++ b/omnipod/src/main/res/layout/omnipod_pod_deactivation_wizard_activity.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/layout/omnipod_pod_history_activity.xml b/omnipod/src/main/res/layout/omnipod_pod_history_activity.xml
index 7e4a7a2aa3..d2a91efbc7 100644
--- a/omnipod/src/main/res/layout/omnipod_pod_history_activity.xml
+++ b/omnipod/src/main/res/layout/omnipod_pod_history_activity.xml
@@ -34,7 +34,7 @@
android:layout_weight="1"
android:background="@drawable/pillborder"
android:gravity="center_horizontal"
- android:text="@string/omnipod_cmd_pod_history" />
+ android:text="@string/omnipod_history_title" />
diff --git a/omnipod/src/main/res/layout/omnipod_pod_history_item.xml b/omnipod/src/main/res/layout/omnipod_pod_history_item.xml
index 9d61d9cee6..0534481536 100644
--- a/omnipod/src/main/res/layout/omnipod_pod_history_item.xml
+++ b/omnipod/src/main/res/layout/omnipod_pod_history_item.xml
@@ -1,15 +1,16 @@
+ android:paddingStart="20dp"
+ android:paddingTop="10dp"
+ android:paddingEnd="20dp">
@@ -17,7 +18,6 @@
android:id="@+id/omnipod_history_source"
android:layout_width="132dp"
android:layout_height="match_parent"
- android:gravity="center_vertical"
android:text="@string/omnipod_history_item_source"
android:textSize="12sp" />
@@ -25,7 +25,6 @@
android:id="@+id/omnipod_history_description"
android:layout_width="fill_parent"
android:layout_height="match_parent"
- android:gravity="center_vertical"
android:text="@string/omnipod_history_item_description"
android:textSize="12sp" />
diff --git a/omnipod/src/main/res/layout/omnipod_pod_management.xml b/omnipod/src/main/res/layout/omnipod_pod_management.xml
new file mode 100644
index 0000000000..5ee71e1da3
--- /dev/null
+++ b/omnipod/src/main/res/layout/omnipod_pod_management.xml
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/layout/omnipod_pod_mgmt.xml b/omnipod/src/main/res/layout/omnipod_pod_mgmt.xml
deleted file mode 100644
index 6db1b7d19f..0000000000
--- a/omnipod/src/main/res/layout/omnipod_pod_mgmt.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/omnipod/src/main/res/layout/omnipod_wizard_action_page_fragment.xml b/omnipod/src/main/res/layout/omnipod_wizard_action_page_fragment.xml
new file mode 100644
index 0000000000..54061c7d07
--- /dev/null
+++ b/omnipod/src/main/res/layout/omnipod_wizard_action_page_fragment.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/layout/omnipod_wizard_base_fragment.xml b/omnipod/src/main/res/layout/omnipod_wizard_base_fragment.xml
new file mode 100644
index 0000000000..f0e9649066
--- /dev/null
+++ b/omnipod/src/main/res/layout/omnipod_wizard_base_fragment.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/layout/omnipod_wizard_info_page_fragment.xml b/omnipod/src/main/res/layout/omnipod_wizard_info_page_fragment.xml
new file mode 100644
index 0000000000..9a6b30a397
--- /dev/null
+++ b/omnipod/src/main/res/layout/omnipod_wizard_info_page_fragment.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/layout/omnipod_wizard_nav_buttons.xml b/omnipod/src/main/res/layout/omnipod_wizard_nav_buttons.xml
new file mode 100644
index 0000000000..abf9a835e2
--- /dev/null
+++ b/omnipod/src/main/res/layout/omnipod_wizard_nav_buttons.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/layout/omnipod_wizard_progress_indication.xml b/omnipod/src/main/res/layout/omnipod_wizard_progress_indication.xml
new file mode 100644
index 0000000000..cb718d1ceb
--- /dev/null
+++ b/omnipod/src/main/res/layout/omnipod_wizard_progress_indication.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/navigation/omnipod_pod_activation_wizard_navigation_graph.xml b/omnipod/src/main/res/navigation/omnipod_pod_activation_wizard_navigation_graph.xml
new file mode 100644
index 0000000000..b5ad757c49
--- /dev/null
+++ b/omnipod/src/main/res/navigation/omnipod_pod_activation_wizard_navigation_graph.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/navigation/omnipod_pod_deactivation_wizard_navigation_graph.xml b/omnipod/src/main/res/navigation/omnipod_pod_deactivation_wizard_navigation_graph.xml
new file mode 100644
index 0000000000..d1c431652c
--- /dev/null
+++ b/omnipod/src/main/res/navigation/omnipod_pod_deactivation_wizard_navigation_graph.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/values-af-rZA/strings.xml b/omnipod/src/main/res/values-af-rZA/strings.xml
index 036e78a8a3..67511ccc70 100644
--- a/omnipod/src/main/res/values-af-rZA/strings.xml
+++ b/omnipod/src/main/res/values-af-rZA/strings.xml
@@ -1,11 +1,19 @@
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values-bg-rBG/strings.xml b/omnipod/src/main/res/values-bg-rBG/strings.xml
index e0a39163b9..bb55a607d7 100644
--- a/omnipod/src/main/res/values-bg-rBG/strings.xml
+++ b/omnipod/src/main/res/values-bg-rBG/strings.xml
@@ -1,73 +1,119 @@
-
-
- Интеграция на помпата Omnipod, изисква RileyLink устройство (с фърмуер минимум 2.0 ) .
-
+
+
+
Звук при болус активенЗвук при базал активенЗвук при SMB активенЗвук при временен базал активен
- Бутон за спиране на инсулина активен
- Разрешено е бутонът за Pulse Log
+ Показвай спряна доставката в раздела Omnipod
+ Показване на PULSE LOG в менюто на Pod Management
+ Бутон Показване RileyLink Stats в меню Управление на PodРазрешено е Лятно часово времеНапомняне за срокЧасове преди изключванеМалко инсулин в резервоарБрой единици
-
- Преди малко
- Настройки на под
- Статус на под
- Общо доставени
- %1$.2fЕ
- %1$.2f Е остават
- Над 50 Е
- Адрес на под
- Капсулата изтича
- Внимание
+ Сигнал при неясни TBR известия, разрешен
+ Сигнал при неясни SMB известия, разрешен
+ Сигнал при неясни болус известия, разрешен
+ Не показвай Pod алармите
+ RileyLink
+ Друго
+ Известия
+ Звук за потвърждение
+ Известия
+
Няма активен под
- Настройка в прогрес (изчакване на сдвояване и пълнене)
+ Настройка в прогрес (активиране на под)Настройка в прогрес (въвеждане на канюла)ИзпълняваПрекратеноГрешка в подВремето за активация изтечеНеактивен
- Грешка на под: %1$s %2$s
- Сигнали за активен под
- Потвърди аларми
-
- Omnipod (433.91 MHz)
+ Грешка на под: %1$03d %2$s
+
+ Край на напомняне за сдвояване
+ Край на напомнянето за настройка
+ Подът скоро ще изтече
+ Подът скоро ще изтече
+ Спирането е неизбежно
+ Минимален инсулин в резервоара
+ Непозната аларма
+
+ История на под
+ Описание
+ Източник
+ Дата
+ Тип:
+ %1$.2fЕ
+ %1$.2f Е, Вх=%2$.1f гр
+ Количество: %1$.2f U, Продължителност: %2$d мин
+ ВниманиеГрешен RileyLink адрес.Забранено действие.\n\n Първо трябва да конфигурурате Omnipod , преди да използвате тази операция,.
- Операцията не е възможна.\n\n Трябва да изчакате няколко минути, докато AAPS се опита да зададе профил за първи път.
- Неправилен PodInitActionType: %1$sНяма активен под
- Грешка при проверка на командата
- Непредвидена грешка. Моля, докладвайте! (тип: %1$s).
- Неуспешна комуникация: получени грешни входни параметри
- Връзката е неуспешна: таймаут
- Комуникацията е неуспешна: възникнала е неочаквана грешка. Моля, докладвайте!
- Неуспешна комуникация: проверката на целостта на съобщението е неуспешна
- Неуспешна комуникация: получени грешни входни параметри
- Съобщението е неуспешно: Pod е в лошо състояние
- Неуспешна комуникация: получени грешни входни параметри
- Неуспешна комуникация: получи съобщение с невалиден номер на последователност от Pod
- Неуспешна комуникация: получи съобщение с невалиден номер на последователност от Pod
- Неуспешна комуникация: получени грешни входни параметри
- Комуникацията е неуспешна: nonce ресинхронизирането е неуспешно
- Комуникацията е неуспешна: nonce ресинхронизирането е неуспешно
- Комуникацията е неуспешна: няма достатъчно данни, получени от Pod
- Грешка на Pod (%1$03d %2$s). Моля, деактивирайте вашия Pod и стартирайте нов
- Комуникацията е неуспешна: Pod върна отговор с грешка
-
- Управление на Pod
- Инициализация на Pod
+ Непредвидена грешка. Моля, докладвайте! (%1$s: %2$s).
+ Неуспешна комуникация: проверката на цялостта на съобщението е неуспешна
+ Неуспешна комуникация: получиен невалиден пакет от под
+ Съобщението е неуспешно: под е в грешно състояние
+ Неуспешна комуникация: получени грешен отговор от под
+ Неуспешна комуникация: получи съобщение с невалиден номер на последователност от Pod
+ Неуспешна комуникация: получено съобщение с невалиден адрес от Pod
+ Неуспешна комуникация: неуспешно декодиране на съобщение от Pod
+ Комуникацията е неуспешна: ресинхронизирането е неуспешно
+ Комуникацията е неуспешна: ресинхронизирането е неуспешно
+ Комуникацията е неуспешна: не достатъчно данни получени от Pod
+ Грешка на Pod (%1$03d %2$s). Моля, деактивирайте вашия Pod и стартирайте нов
+ Комуникацията е неуспешна: Pod върна отговор с грешка
+ Няма отговор от RileyLink
+ RileyLink прекъснат
+ Няма отговор от Pod
+ Неуспешно задаване на базален профил. Доставката може да бъде спряна! Моля, ръчно опреснете състоянието на Pod от раздел Omnipod и възобновете доставката, ако е необходимо.
+ Неуспешно задаване на базален профил. Доставката може да бъде спряна! Моля, ръчно опреснете състоянието на Pod от раздел Omnipod и възобновете доставката, ако е необходимо.
+ Неуспешно задаване на базален профил. Доставката е спряна! Моля, ръчно подновяване на доставката от раздела Omnipod.
+ Неуспешно задаване на базален профил.
+ Отменянето на временния базал може да е неуспешно. Моля, ръчно опреснете статуса на Pod от раздел Omnipod.
+ Задаването на временен базал е неуспешно. Ако преди това е изпълнявал временен базал, може да е бил отменен. Моля, ръчно опреснете статуса на Pod от раздела Omnipod.
+ Задаването на временен базал е неуспешно. Ако преди това е изпълнявал временен базал, може да е бил отменен. Моля, ръчно опреснете статуса на Pod от раздела Omnipod.
+ Продължителността трябва да бъде по-голяма от нула и кратно на %1$s минути.
+ Неуспешно задаване на базален профил. Доставката може да бъде спряна! Моля, ръчно опреснете състоянието на Pod от раздел Omnipod и възобновете доставката, ако е необходимо.
+ Неуспешно задаване на базален профил. Доставката е спряна! Моля, ръчно подновяване на доставката от раздела Omnipod.
+ Неуспешно задаване на базален профил: получен празен профил. Уверете се, че сте активирали базалния профил.
+ Не е активен базален профил. Уверете се, че сте активирали базалния профил.
+ Неизвестна команда: %1$s
+ Неуспешно прочитане на Pulse Log
+ Неуспешно опресняване на състояние
+ Неуспешно опресняване на състоянието при стартиране
+ Неуспешно спиране на аларми
+ Неуспешно спиране на болус
+ Неуспешно задаване на време
+ Неуспешно подновяване на доставкатана инсулин
+ Неуспешно променяне на времето на капсулата. Трябва ръчно да синхронизирате времето в раздела Omnipod.
+ Не може да се провери дали болуса е успешен. Моля, уверете се ръчно, че Вашата Pod се активира чрез слушане на кликвания. Ако сте сигурни, че болус не е успял, вие трябва ръчно да изтриете хрешния запис от леченията, дори ако щракнете върху \'Отказ от болус\' сега!
+ Не може да се провери дали SMB болус(%1$.2f Е) е успешен. Ако сте сигурни, че не е успял, трябва ръчно да изтриете запис SMB от леченията.
+ Болус неуспешен.
+ Неуспешно инициализиране на Pod
+ Неуспешно вмъкване на канюла
+ Времето за активиране на капсулата е превишено. Капсулата вече не може да бъде активирана.
+ Неуспешно проверяване на прогреса на активиране. Моля, опитайте отново.
+ Pod изключен
+ Неуспешно възпроизвеждане на тест-звук
+ В Pod има пуснат временен базал но AAPS не знае за него. Моля, отменете временния си базал ръчно.
+
+ Потвърждение
+ Време и/или промяна на часовата зона на помпата.
+ Конфигурацията на аларма е обновена в Pod.
+ Времето на Pod е актуализирано.
+ Цялата доставка на инсулин е спряна.
+ Активните аларми са потърдени.
+ Доставката на инсулин е подновена.
+
Деактивирай подПремахни под
- История на подСтартирай болусОтмяна на болусПриложи временен базал
@@ -82,88 +128,96 @@
Спиране на доставката на инсулинПодновяване на доставкатаНепознат запис
- %1$.2fЕ
- %1$.2f U, CH=%2$.1f g
- Скорост: %1$.2f U, Продължителност: %2$d мин
- Ако натиснете OK, състоянието на Pod ще бъде нулирано и няма да можете да общувате с него повече. Правете това, само ако вече не можете да се свързвате с него. Ако все още можете да общувате с Под, моля, използвайте опцията Деактивирай Pod.
- Историята на Pod не е достъпна в момента.
- Напълни Pod
- \nНапълнете с достатъчно инсулин за 3 дни.\n\nИзчакайте два сигнала от Pod по време на процеса на зареждане. Те показват, че е вмъкнат минималният размер от 85U. Уверете се, че сте изпразнил напълно спринцовката, дори след като сте чули двата сигнала.\n\nСлед пълнене на Pod, моля натиснете Следващ.\n\nЗабележка: не вадете капачката на капсулата на Podв този момент.
- Пълнене
- Опитвам се да се сдвоя с Pod.\n\nКогато всички елементи са проверени, можете да натиснете Следващ.\n\nЗабележка: задръжте Pod много близо до RileyLink в този момент.
- Прикрепете Pod
- \nПодгответе мястото за инфузия. Отстранете капачката на Pod и лепенката и прикрепете капсулата към мястото за инфузия.\n\nАко канюла стърчи, моля натиснете Отказ и изхвърлете вашия Pod.\n\nПрес Следваща да се вмъкне канюлата и да започне базалната доставка.
- Вмъкване на канюла
- Опитвам се да определя първоначалния базален график и да вмъкна канюлата.\n\nКогато всички елементи са проверени, можете да натиснете Следващ.
- Информация за Pod
- \Podе активна.\n\nВашият базален график е програмиран и канюлата вмъкната.\n\nМоля, проверете дали канюлата е поставена правилно или заменете Pod, ако чувствате, че не е.
- Деактивирай Pod
- \nНатиснете Следващ , за да деактивирате Pod.\n\nЗабележка: Това ще спре всички доставки на инсулин и деактивира Pod.
- Деактивиране на Pod
- Деактивиране на Pod.\n\nКогато всички елементи са проверени, можете да натиснете Следващ.\n\nЗабележка: Ако деактивирането непрекъснато се проваля, моля натиснете Отказ и използвайте опция Нулирай Pod , за да възстановите състоянието на Pod.
- Pod изключен.\n\nмоля, извадете Pod от тялото си и го хвърли.
- Сдвояване на под
- Пълнене на под
- Напълни канула
- Приложи базалният профил
- Отмяна
- Деактивирай под
-
- Край на напомняне за сдвояване
- Край на напомнянето за настройка
- Подът скоро ще изтече
- Подът скоро ще изтече
- Спирането е неизбежно
- Минимален инсулин в резервоара
- Непозната аларма
- Неуспешно задаване на базален профил. Доставката може да бъде спряна! Моля, ръчно опреснете състоянието на Pod от раздел Omnipod и възобновете доставката, ако е необходимо.
- Неуспешно задаване на базален профил. Доставката може да бъде спряна! Моля, ръчно опреснете състоянието на Pod от раздел Omnipod и възобновете доставката, ако е необходимо.
- Неуспешно задаване на базален профил. Доставката е спряна! Моля, ръчно подновяване на доставката от раздела Omnipod.
- Задаването на временен базал е неуспешно. Ако преди това е изпълнявал временен базал, може да е бил отменен. Моля, ръчно опреснете статуса на Pod от раздела Omnipod.
- Задаването на временен базал е неуспешно. Ако преди това е изпълнявал временен базал, може да е бил отменен. Моля, ръчно опреснете статуса на Pod от раздела Omnipod.
- Неуспешно задаване на базален профил. Доставката може да бъде спряна! Моля, ръчно опреснете състоянието на Pod от раздел Omnipod и възобновете доставката, ако е необходимо.
- Неуспешно задаване на базален профил. Доставката е спряна! Моля, ръчно подновяване на доставката от раздела Omnipod.
- Не може да се провери дали болус е успял. Моля, уверете се ръчно, че Вашата Pod се активира чрез слушане на кликвания. Ако сте сигурни, че болус не е успял, вие трябва ръчно да изтриете болния запис от лечение, дори ако щракнете върху \'Отказ от болус\' сега!
- Не може да се провери дали SMB bolus (%1$.2f U) е успял. Ако сте сигурни, че на Bolus не е успял, трябва ръчно да изтриете запис SMB от лечение.
- Статистика на RL
- Pulse лог
- LOT
- TID
- Firmware версия
- Грешки
- Профилът е идентичен.
- Нулирай RileyLink конфигурацията
- Време и/или промяна на часовата зона на помпата
- %1$s и %2$s
- преди %s
- Изчакване за връзка...
- Болус неуспешен
- Обнови
- Подновяване на доставката
- Pod изключен
- преди по-малко от минута
- Спиране
- Сдвояване и пълнене
- Запълнете канюлата и настройте базалния профил
- Вземи лога
- Неизвестна грешка
- Спрян стар базал, но неуспешно задаване на нов
+ Инициализация на Pod
+ Вмъкване на канюла
+ Вземи логаПоставете фалшив временен базал, защото Pod е спряноАнулират фалшив временен базал, който е създаден, защото Pod е спряно
- неизвестно
- Конфигурация на тревога актуализирана в Pod
- RileyLink
- Друго
- Известия
- Звук за потвърждение
- Изход
- Предишен
- Следващ
+ Конфигуразия на звук
+ Възпроизвеждане на тестов звук
+
+ Управление на Pod
+ Изчакване на RileyLink връзка…
+ Активирай Pod
+ Деактивирай Pod
+ Премахни Pod
+ История в Pod
+ RileyLink статистика
+ Прочети Pulse log
+ Четене на pulse log…
+ Ако натиснете OK, състоянието на Pod ще бъде нулирано и няма да можете да общувате с него повече. Правете това, само ако вече не можете да се свързвате с него. Ако все още можете да общувате с Pod, моля, използвайте опцията Деактивирай Pod!
+ Възпроизвеждане на тестов звук
+ Пускам тестов звук…
+
+ ОткажиКрай
- Описание
- Източник
- Дата
- Тип:
+ Следващ
+ Повтори
+ Деактивирай Pod
+ Премахни Pod
+ Все още не сте изпълнили всички стъпки. Сигурни ли сте, че искате да излезете?
+ Изход
+
+ Напълнете Pod
+ \nНапълнете с достатъчно инсулин за 3 дни.\n\nИзчакайте два сигнала от Pod по време на процеса на зареждане. Те показват, че е вмъкнат минималният размер от 85U. Уверете се, че сте изпразнил напълно спринцовката, дори след като сте чули двата сигнала.\n\nСлед пълнене на Pod, моля натиснете Следващ.\n\nЗабележка: не вадете капачката на капсулата на Podв този момент.
+ Инициализация на Pod
+ Опитвам се да се сдвоя с Pod.\n\nКогато всички елементи са проверени, можете да натиснете Следващ.\n\nЗабележка: задръжте Pod много близо до RileyLink в този момент.
+ Прикрепете Pod
+ \nПодгответе мястото за инфузия. Отстранете капачката на Pod и лепенката и прикрепете капсулата към мястото за инфузия.\n\nАко канюла стърчи, моля натиснете Отказ и изхвърлете вашия Pod.\n\Натиснете Следваща да се вмъкне канюлата и да започне базалната доставка.
+ Когато натиснете OK, ще бъде вмъкната канюлата. Уверете се, че сте залепили Poda към мястото за инфузия.
+ Вмъкване на канюла
+ Опитвам се да определя първоначалния базален график и да вмъкна канюлата.\n\nКогато всички елементи са проверени, можете да натиснете Следващ.
+ Pod активиран
+ \Pod е активен.\n\nВашият базален график е програмиран и канюлата вмъкната.\n\nМоля, проверете дали канюлата е поставена правилно или заменете Pod, ако чувствате, че не е.
+
+ Деактивирай Pod
+ \nНатиснете Следващ, за да деактивирате Pod.\n\nЗабележка: Това ще спре всички доставки на инсулин и деактивира Pod.
+ Деактивиране на Pod
+ Деактивиране на Pod.\n\nКогато деактивирането завърши успешно, можете да натиснете Следващ.
+ Pod деактивиран
+ Pod изключен.\n\nмоля, извадете Pod от тялото си и го изхвърлете.
+ Pod неактивен
+ Състоянието на Pod е некоректнов. Инсулиновата доставка не е била спряна, тъй като Pod не е бил правилно деактивиран!\n\nМоля, премахнете Pod от тялото си и го рециклирайте.
+ Ако деактивирате Pod, няма да можете да общувате повече с него. Трябва да направите това само когато всички комуникации с Pod упорито се провалят. Сигурни ли сте, че желаете да го направите?
+ Изхвърли Pod
+
+ Задаване на часа
+ Спиране
+ Опресни
+ Подновяване на доставката
+ Управление на Pod
+ Потвърди аларми
+ Статус на под
+ Общо доставени
+ %1$.2fЕ
+ Адрес на под
+ Под изтича
+ Последна връзка
+ Последен болус
+ Временна базална стойност
+ Базова базална стойност
+ Резервоар
+ Активни аларми
+ Версия на фърмуера
+ Време на Pod
+ %1$.2fЕ/я @%2$s (%3$d/%4$d минути)
+ %1$.2f Е остават
+ Над 50 Е
+ Грешки
+
+ Използването на помпа Omnipod, изисква RileyLink устройство (с фърмуер минимум 2.0).
+ неизвестно
+ Pulse лог
+ Pulse лога (копиран в клипборда)
+ Да
+ Не
+ ОК
+ Отказ
+
+ Преди малко
+ преди по-малко от минута
+ %1$s и %2$s
+ преди %s%1$d минути%1$d минути
@@ -172,4 +226,12 @@
%1$d часа%1$d часа
+
+ %1$d ден
+ %1$d дни
+
+
+ Pod аларма: %1$s
+ Pod аларми
+
diff --git a/omnipod/src/main/res/values-cs-rCZ/strings.xml b/omnipod/src/main/res/values-cs-rCZ/strings.xml
index e109019798..ecdca2f3cf 100644
--- a/omnipod/src/main/res/values-cs-rCZ/strings.xml
+++ b/omnipod/src/main/res/values-cs-rCZ/strings.xml
@@ -1,73 +1,119 @@
-
-
- Integrace pumpy pro Omnipod, vyžaduje zařízení RileyLink (s firmwarem alespoň 2.0).
-
+
+
+
Pípnutí při bolusu povolenoPípnutí při bazálu povolenoPípnutí při SMB povolenoPípnutí při TBR povoleno
- Tlačítko Pozastavit doručení povoleno
- Tlačítko Pulse Log je zapnuto
+ Zobrazit tlačítko \"Pozastavit dodávku\" na záložce Omnipod
+ Zobrazit tlačítko Pulzní Log v menu Správa Podu
+ Zobrazit tlačítko Statistika RileyLink v nabídce Správa PoduLetní čas / Detekce časového pásma povolenoPřipomenutí vypršení platnosti povolenoHodiny před vypnutímUpozornění na nízký stav zásobníku povolenoPočet jednotek
-
- před chvílí
- Správa Podu
- Stav Podu
- Celkem dodáno
- %1$.2f U
- Zbývá %1$.2f U
- Více než 50 U
- Adresa Podu
- Expirace Podu
- Varování
+ Zvuk notifikace pro nejistý dočasný bazál povolen
+ Zvuk notifikace pro nejistý SMB povolen
+ Zvuk notifikace pro nejistý bolus povolen
+ Automaticky potvrzovat výstrahy Podu
+ RileyLink
+ Jiné
+ Varování
+ Potvrzovací pípnutí
+ Oznámení
+
Žádný aktivní Pod
- Instalace probíhá (čekání na párování a plnění)
+ Probíhá instalace (čeká se na aktivaci Podu)Instalace probíhá (čeká se na vložení kanyly)BěžíPozastavenoChyba PoduByl překročen čas aktivaceNeaktivní
- Chyba Podu: %1$s %2$s
- Výstrahy aktivního Podu
- Potrvdit upozornění
-
- Omnipod (433,91 MHz)
+ Chyba Podu: %1$03d %2$s
+
+ Upomínka dokončení párování
+ Upomínka dokončení nastavení
+ Životnost Podu brzy skončí
+ Pod brzy vyprší
+ Blíží se vypnutí
+ Nízký stav zásobníku
+ Neznámá výstraha
+
+ Historie Podu
+ Popis
+ Zdroj
+ Datum
+ Typ:
+ %1$.2f U
+ %1$.2f U, SACH=%2$.1f g
+ Rychlost: %1$.2f U, doba trvání: %2$d minut
+ VarováníChybná adresa RileyLinku.Operace není možná.\n\nNejdříve je nutné nakonfigurovat Omnipod, než bude možné tuto funkci použít.
- Operace není možná.\n\n Je třeba několik minut počkat, dokud se AAPS nepokusí poprvé nastavit profil.
- Neplatný atribut PodInitActionType: %1$sŽádný aktivní Pod
- Ověření příkazu se nezdařilo
- Došlo k neočekávané chybě. Nahlaste ji! (typ: %1$s).
- Komunikace selhala: byly přijaty neplatné vstupní parametry
- Komunikace selhala: časový limit vypršel
- Komunikace se nezdařila: došlo k neočekávané chybě. Prosím nahlašte!
- Komunikace selhala: ověření integrity zprávy se nezdařilo
- Komunikace selhala: byly přijaty neplatné pakety z podu
- Komunikace selhala: Pod je v chybném stavu
- Komunikace selhala: byla přijata neplatná odezva z Podu
- Komunikace selhala: od Podu byla přijata zpráva s neplatným pořadovým číslem
- Komunikace selhala: od Podu byla přijata zpráva s neplatnou adresou
- Komunikace selhala: nepodařilo se dekódovat zprávu z Podu
- Komunikace selhala: synchronizace hodnoty Nonce se nezdařila
- Komunikace selhala: hodnota Nonce nebyla synchronizována
- Komunikace selhala: nedostatek dat přijatých z Podu
- Byla zjištěna chyba Podu (%1$03d %2$s). Deaktivujte Pod a spusťte nový
- Komunikace selhala: Pod vrátil chybovou odezvu
-
- Správa Podu
- Inicializovat Pod
+ Došlo k neočekávané chybě. Prosíme o její nahlášeníní! (%1$s: %2$s).
+ Komunikace selhala: nezdařilo se ověření integrity zprávy
+ Komunikace selhala: z podu byly přijaty neplatné pakety
+ Komunikace selhala: Pod se nachází v chybném stavu
+ Komunikace selhala: byla přijata neplatná odezva z Podu
+ Komunikace selhala: od Podu byla přijata zpráva s neplatným pořadovým číslem
+ Komunikace selhala: od Podu byla přijata zpráva s neplatnou adresou
+ Komunikace selhala: nepodařilo se dekódovat zprávu z Podu
+ Komunikace selhala: opakovaná synchronizace hodnoty Nonce se nezdařila
+ Komunikace selhala: hodnota Nonce nebyla synchronizována
+ Komunikace selhala: nedostatek dat přijatých z Podu
+ Byla zjištěna chyba Podu (%1$03d %2$s). Deaktivujte Pod a spusťte nový
+ Komunikace selhala: Pod vrátil chybovou odezvu
+ Žádná odpověď od RileyLinku
+ RileyLink komunikace přerušena
+ Žádná odezva z Podu
+ Nastavení bazálního profilu se nezdařilo. Výdej může být pozastaven! Prosím ručně obnovte stav Podu na záložce Omnipod a obnovte výdej.
+ Nastavení bazálního profilu se možná nezdařilo. Výdej může být pozastaven! Prosím ručně obnovte stav Podu na záložce Omnipod a obnovte výdej pokud je to potřeba.
+ Nastavení bazální profilu se nezdařilo. Výdej je pozastaven! Ručně obnovte výdej z karty Omnipod.
+ Nastavení bazálního profilu selhalo.
+ Zrušení dočasného bazálu se možná nezdařilo. Aktualizujte prosím stav Podu z karty Omnipod.
+ Nastavení dočasného bazátu selhalo. Pokud byl dočasný bazální již dříve spuštěn, mohl být zrušen. Aktualizujte prosím stav Podu z karty Omnipod.
+ Nastavení dočasného bazálu mohlo být neúspěšné. Pokud již dočasný bazál dříve běžel, byl zrušen. Aktualizujte prosím ručně stav Podu na záložce Omnipod.
+ Doba trvání TBR musí být větší než nula, a musí být násobkem %1$s minut.
+ Nastavení času se možná nezdařilo. Výdej může být pozastaven! Prosím ručně obnovte stav Podu na záložce Omnipod a obnovte výdej pokud je to potřeba.
+ Nastavení času se nezdařilo. Výdej je pozastaven! Ručně obnovte výdej z karty Omnipod.
+ Nepodařilo se nastavit bazální profil: byl přijat prázdný profil. Nezapomeňte aktivovat váš bazální profil.
+ Žádný bazální profil není aktivní. Ujistěte se, že jste aktivovali váš bazální profil.
+ Neznámý vlastní příkaz: %1$s
+ Nezdařilo se čtení protokolu pulzů
+ Nebylo možné aktualizovat stav
+ Nepodařilo se aktualizovat stav při spuštění
+ Nezdařilo se potvrdit výstrahy
+ Nepodařilo se pozastavit výdej
+ Nepodařilo se nastavit čas
+ Nepodařilo se obnovit výdej
+ Nezdařilo se automaticky změnit čas na Podu. Měli byste ručně synchronizovat čas na kartě Omnipod.
+ Nelze ověřit, zda bolus proběhl úspěšně. Ověřte prosím manuálně, zda je podáván bolus, nasloucháním kliků z Podu. Pokud jste si jisti, že bolus nebyl úspěšný, byste měli ručně odstranit položku bolusu z ošetření, i když klepnete na tlačítko \'Zrušit bolus\' nyní!
+ Nelze ověřit, zda byl bolus SMB (%1$.2f U) úspěšně vydán. Pokud jste si jisti, že bolus nebyl vydán, měli byste ručně odstranit položku SMB z Ošetření.
+ Podání bolusu nebylo úspěšné.
+ Nepodařilo se inicializovat Pod
+ Nepodařilo se vložit kanylu
+ Byl překročen čas aktivace Podu. Tento Pod již nelze aktivovat.
+ Ověření procesu aktivace se nezdařilo. Zkuste to znovu.
+ Pod pozastavený
+ Nepodařilo se přehrát testovací pípnutí
+ Dočasný bazál běží na Podu, ale AAPS o tomto dočasném bazálu neví. Prosím zrušte svůj dočasný bazál ručně.
+
+ Potvrzení
+ Čas a/nebo časová zóna změněna na Podu.
+ Nastavení výstrahy bylo v Podu aktualizováno.
+ Čas na Podu byl aktualizován.
+ Všechny dodávky inzulínu byly pozastaveny.
+ Aktivní výstrahy byly potvrzeny.
+ Podávání inzulínu bylo obnoveno.
+
Deaktivovat PodVyřadit Pod
- Historie PoduNastavit bolusZrušit bolusNastavit dočasný bazál
@@ -82,73 +128,100 @@
Pozastavit dodávání inzulínuObnovit dodávání inzulínuNeznámá položka
- %1$.2f U
- %1$.2f U, Sach=%2$.1f g
- Rychlost: %1$.2f U, doba trvání: %2$d min
- Pokud stisknete OK, 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 Deaktivovat Pod.\n\nPokud chcete pokračovat, ujistěte se, že Pod je sundaný z těla.
- Historie Podu není v daném okamžiku k dispozici.
- Naplňte Pod
- \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 Další.\n\nPoznámka: prozatím nesundavejte kryt jehly.\nPoznámka:prosím umístěte RileyLink ve svislé pozici blízko Podu.
- Plnění
- Nasaďte Pod
- \nPřipravte infuzní místo. Odstraňte krytku jehly a náplasti a nalepte Pod.\n\nPokud se kanyla odlepí, stiskněte Zrušit a zahoďte Pod.\n\nStiskněte Další pro vložení kanyly a spuštění bazálů.
- Vkládání kanyly
- 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 Další.
- \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.
- Deaktivovat Pod
- \nStiskněte Další pro deaktivaci Podu.\n\nPoznámka: Zastavíte veškerý výdej inzulínu a deaktivujete Pod.
- Deaktivace Podu
- Pod deaktivován.\n\nOdstraňte Pod z těla a znehodnoťte jej.
- Párování Podu
- Plnění Podu
- Deaktivovat Pod
-
- Upomínka dokončení párování
- Upomínka dokončení nastavení
- Životnost Podu brzy skončí
- Pod brzy vyprší
- Blíží se vypnutí
- Nízký stav zásobníku
- Neznámá výstraha
- Nelze ověřit, zda byl bolus SMB (%1$.2f U) úspěšně vydán. Pokud jste si jisti, že bolus nebyl vydán, měli byste ručně odstranit položku SMB z Ošetření.
- Statistika RL
- Pulse log
- LOT
- TID
- Verze firmwaru
- Chyby
- Bazální profil je stejný, takže nebude znovu nastaven.
- Resetovat konfiguraci RileyLinku
- Změna času nebo časového pásma Podu
- %1$s a %2$s
- před %1$s
- Čekání na připojení RileyLink...
- Podání bolusu bylo neúspěšné
- Obnovit
- Obnovit dodávání inzulínu
- Pod pozastavený
- Před méně než minutou
- Vypnutí
- Spárovat a naplnit
- Naplnit kanylu a nastavit bazální profil
- Neznámá chyba
- Byl zrušen starý dočasný bazál, ale nový dočasný bazál se nepodařilo nastavit
+ Inicializovat Pod
+ Vložit kanylu
+ Číst protokol pulsůNastavit falešný dočasný bazál, protože Pod je pozastavenZrušit falešný dočasný bazál který byl vytvořen, protože Pod byl pozastaven
- neznámé
- Nastavení výstrahy bylo v Podu aktualizováno
- RileyLink
- Jiné
- Varování
- Potvrzovací pípnutí
- Konec
- Předchozí
- Další
+ Rozdělit dočasný bazál kvůli nejisté chybě při rušení
+ Nastavení pípnutí
+ Přehrát testovací pípnutí
+
+ Správa Podu
+ Akce
+ Nástroje
+ Čekám na připojení RileyLink…
+ Aktivovat Pod
+ Deaktivovat Pod
+ Vyřadit Pod
+ Historie Podu
+ Statistika RileyLink
+ Resetovat konfiguraci RileyLinku
+ Číst protokol pulsů
+ Čtení protokolu pulsů…
+ Pokud zahodíte Pod, již s ním nebudete moci komunikovat. Měli byste to udělat pouze tehdy, pokud veškerá komunikace s Podem trvale selhává. Pokud stále můžete komunikovat s Podem, použijte možnost Deaktivovat Pod.\n\nPokud si přejete pokračovat, ujistěte se prosím, že odstraníte Pod z těla!
+ Přehrát testovací pípnutí
+ Přehrávání testovacího pípnutí…
+
+ ZrušitKonec
- Popis
- Zdroj
- Datum
- Typ:
+ Další
+ Opakovat
+ Deaktivovat Pod
+ Vyřadit Pod
+ Dosud jste nedokončili všechny kroky. Jste si jisti, že chcete ukončit práci?
+ Konec
+
+ Naplnit Pod
+ Naplň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 Další.\n\nPoznámka: prozatím nesundavejte kryt jehly.\nPoznámka:prosím umístěte RileyLink ve svislé pozici blízko Podu.
+ Inicializovat Pod
+ Snažíte se spárovat novýPod a naplnit ho.\n\nKdyž byl úspěšně dokončen inicializační proces, můžete stisknout tlačítko Další.\n\nPoznámka: položte RileyLink ve vzpřímené poloze a umístěte ho pár centimetrů od Podu.
+ Nasaďte Pod
+ Připravte infuzní místo. Odstraňte krytku jehly a náplasti a nalepte Pod.\n\nPokud se kanyla odlepí, stiskněte Zrušit a zahoďte Pod.\n\nStiskněte Další pro vložení kanyly a spuštění bazálů.
+ Když stisknete OK, kanyla se vloží. Ujistěte se, že jste připojili Pod k infuznímu místu.
+ Vložit kanylu
+ Snažím se nastavit počáteční základní bazál a vložit kanylu.\n\nPo úspěšném vložení kanyly můžete stisknout tlačítko Další.
+ Pod aktivován
+ Pod 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.
+
+ Deaktivovat Pod
+ Stiskněte Další pro deaktivaci Podu.\n\nPoznámka: Zastavíte veškerý výdej inzulínu a deaktivujete Pod.
+ Deaktivace Podu
+ Deaktivace Podu.\n\nPo úspěšném dokončení deaktivace můžete stisknout Další.
+ Pod deaktivován
+ Pod deaktivován.\n\nOdstraňte Pod z těla a znehodnoťte jej.
+ Pod vyřazen
+ Stav Podu byl vyřazen. Doručení inzulinu nebylo pozastaveno, protože Pod nebyl řádně deaktivován!\n\nOdstraňte Podod z vašeho těla a recyklujte ho.
+ Pokud tento Pod vyřadíte, nebudete s ním již moci komunikovat. Tuto operaci byste měli provést pouze v případě, že veškerá komunikace s tímto Pod trvale selhává. Opravdu chcete vyřadit Pod?
+ Vyřadit Pod
+
+ Nastavení času
+ Pozastavit
+ Obnovit
+ Obnovit podávání inzulínu
+ Správa Podu
+ Potvrdit výstrahy
+ Stav Podu
+ Celkem vydáno
+ %1$.2f U
+ Adresa Podu
+ Pod expiruje
+ Poslední spojení
+ Poslední bolus
+ Dočasná bazální dávka
+ Základní hodnota bazálu
+ Zásobník
+ Výstrahy aktivního Podu
+ Verze firmwaru
+ Čas na Podu
+ %1$.2fU/h @%2$s (%3$d/%4$d minut)
+ Zbývá %1$.2f U
+ Zbývá více než 50 U
+ Chyby
+
+ Integrace pumpy pro Omnipod, vyžaduje zařízení RileyLink (s firmwarem alespoň 2.0).
+ neznámé
+ Protokol pulzů
+ Protokol pulzů (zkopírováno do schránky)
+ Ano
+ Ne
+ OK
+ Zrušit
+
+ před chvílí
+ Před méně než minutou
+ %1$s a %2$s
+ před %1$s%1$d minuta%1$d minut
@@ -167,4 +240,10 @@
%1$d dnů%1$d dnů
+
+ Výstraha Podu: %1$s
+ Výstrahy Podu: %1$s
+ Výstrahy Podu: %1$s
+ Výstrahy Podu: %1$s
+
diff --git a/omnipod/src/main/res/values-de-rDE/strings.xml b/omnipod/src/main/res/values-de-rDE/strings.xml
index 2fb32ae818..0dc58f8250 100644
--- a/omnipod/src/main/res/values-de-rDE/strings.xml
+++ b/omnipod/src/main/res/values-de-rDE/strings.xml
@@ -1,71 +1,119 @@
-
-
- Um den Omnipod nutzen zu können, brauchst Du einen RileyLink (mind. Firmware 2.0).
-
+
+
+
Bolus-Piep aktiviertBasal-Piep aktiviertSMB-Piep aktiviertTBR-Piep aktiviert
- Button Abgabe aussetzen aktiviert
+ Button \'Insulinabgabe unterbrechen\' im Omnipod Tab anzeigen
+ Button \'Pulse Log\' im Menü Pod Mgmt. anzeigen
+ Button \'RileyLink Status\' im Menü Pod Mgmt. anzeigenSommerzeit/Zeitzonen-Erkennung aktiviertAblauferinnerung aktiviert
+ Stunden bis zum PodendeWarnung niedriger Reservoirstand aktiviertAnzahl der Einheiten
-
- gerade eben
- Pod mgmt
- Pod Status
- Insgesamt abgegeben
- %1$.2f IE
- %1$.2f IE übrig
- über 50 IE
- Pod Adresse
- Pod läuft ab
- Warnung
+ Ton für unsichere TBR-Benachrichtigungen aktiviert
+ Ton für unsichere SMB-Benachrichtigungen aktiviert
+ Ton für unsichere Bolus-Benachrichtigungen aktiviert
+ Pod-Alarme automatisch bestätigen
+ RileyLink
+ Andere
+ Alarme
+ Bestätigungstöne
+ Benachrichtigungen
+
Kein aktiver Pod
- Einrichtung im Gang (Warten auf Verbindung und Füllen)
+ Einrichtung im Gange (Warten auf Pod-Aktivierung)Einrichtung im Gang (Warten auf Setzen der Kanüle)In BetriebAngehaltenPod-FehlerAktivierungszeit überschrittenInaktiv
- Pod-Fehler: %1$s %2$s
- Aktive Pod-Warnungen
- Alarm bestätigen
-
- Omnipod (433.91 MHz)
+ Pod-Fehler: %1$03d %2$s
+
+ Erinnerung Kopplung beendet
+ Erinnerung Setup beendet
+ Pod läuft in Kürze ab
+ Pod läuft in Kürze ab
+ Herunterfahren steht unmittelbar bevor
+ Niedriger Reservoirstand
+ Unbekannter Alarm
+
+ Pod Historie
+ Beschreibung
+ Quelle
+ Datum
+ Typ:
+ %1$.2f IE
+ %1$.2f IE, KH=%2$.1fg
+ Rate: %1$.2f IE, Dauer: %2$d min.
+ WarnungRileyLink Adresse ungültig.Aktion ist nicht möglich.\n\n Du musst zuerst den Omnipod konfigurieren, bevor Du diese Operation verwenden kannst.
- Aktion ist nicht möglich.\n\n Du musst ein paar Minuten warten bis AAPS versucht, das Basalprofil zum ersten Mal zu setzen.
- Illegal PodInitActionType: %1$sKein aktiver Pod
- Kommandoprüfung fehlgeschlagen
- Es ist ein unerwarteter Fehler aufgetreten. Bitte melden! (Typ: %1$s).
- Kommunikation fehlgeschlagen: Ungültige Eingabeparameter empfangen
- Keine Verbindung: Zeitüberschreitung
- Keine Verbindung: Es ist ein unerwarteter Fehler aufgetreten. Bitte melden!
- Kommunikation fehlgeschlagen: Die Überprüfung der Nachrichtenintegrität ist fehlgeschlagen
- Kommunikation fehlgeschlagen: Es wurde ein ungültiges Paket vom Pod empfangen
- Kommunikation fehlgeschlagen: Der Pod befindet sich in einem falschen Status
- Kommunikation fehlgeschlagen: Es wurde eine ungültige Antwort vom Pod empfangen
- Kommunikation fehlgeschlagen: Ungültige Zeichenfolge vom Pod empfangen
- Kommunikation fehlgeschlagen: Ungültige Adresse vom Pod empfangen
- Kommunikation fehlgeschlagen: Nachricht vom Pod konnte nicht decodiert werden
- Kommunikation fehlgeschlagen: Nonce resync fehlgeschlagen
- Kommunikation fehlgeschlagen: Nonce nicht synchronisiert
- Kommunikation fehlgeschlagen: Nicht genügend Daten vom Pod empfangen
- Ein Pod-Fehler (%1$03d %2$s) wurde festgestellt. Bitte deaktiviere den Pod und starte einen neuen
- Kommunikation fehlgeschlagen: Fehlerhafte Antwort vom Pod
-
- Pod Management
- Init Pod
+ Es ist ein unerwarteter Fehler aufgetreten. Bitte melden! (%1$s: %2$s)
+ Kommunikation fehlgeschlagen: Die Überprüfung der Nachrichtenintegrität ist fehlgeschlagen
+ Kommunikation fehlgeschlagen: Es wurde ein ungültiges Paket vom Pod empfangen.
+ Kommunikation fehlgeschlagen: Der Pod befindet sich in einem falschen Zustand.
+ Kommunikation fehlgeschlagen: Es wurde eine ungültige Antwort vom Pod empfangen.
+ Kommunikation fehlgeschlagen: Ungültige Zeichenfolge vom Pod empfangen.
+ Kommunikation fehlgeschlagen: Ungültige Adresse vom Pod empfangen.
+ Kommunikation fehlgeschlagen: Nachricht vom Pod konnte nicht decodiert werden.
+ Kommunikation fehlgeschlagen: Nonce resync fehlgeschlagen.
+ Kommunikation fehlgeschlagen: Nonce nicht synchronisiert.
+ Kommunikation fehlgeschlagen: Nicht genügend Daten vom Pod empfangen.
+ Ein Pod-Fehler (%1$03d %2$s) wurde festgestellt. Bitte deaktiviere den Pod und aktiviere einen neuen.
+ Kommunikation fehlgeschlagen: Fehlerhafte Antwort vom Pod.
+ Keine Antwort vom RileyLink
+ RileyLink unterbrochen
+ Keine Rückmeldung vom Pod
+ Basalprofil konnte nicht eingestellt werden. Insulinabgabe wird evtl. unterbrochen. Aktualisiere den Pod Status bitte manuell im Omnipod Tab und starte die Abgabe falls notwendig neu.
+ Basalprofil konnte evtl. nicht eingestellt werden. Insulinabgabe wird evtl. unterbrochen. Aktualisiere den Pod Status bitte manuell im Omnipod Tab und starte die Abgabe falls notwendig neu.
+ Basalprofil konnte nicht eingestellt werden. Insulinabgabe wurde unterbrochen. Bitte starte die Abgabe manuell im Omnipod Tab neu.
+ Setzen des Basal-Profils fehlgeschlagen.
+ Abbruch der temporären Basalrate evtl. fehlgeschlagen. Aktualisiere den Pod Status manuell im Omnipod Tab.
+ TBR konnte nicht gesetzt werden. Falls zuvor eine andere TBR aktiv war, wurde diese evtl. abgebrochen. Aktualisiere bitte manuell den Pod Status im Omnipod Tab.
+ TBR konnte evtl. nicht gesetzt werden. Falls zuvor eine andere TBR aktiv war, wurde diese evtl. abgebrochen. Aktualisiere bitte manuell den Pod Status im Omnipod Tab.
+ TBR Dauer muss größer null und ein Vielfaches von %1$s Minuten sein.
+ Zeit konnte evtl. nicht eingestellt werden. Insulinabgabe wird evtl. unterbrochen. Aktualisiere den Pod Status bitte manuell im Omnipod Tab und starte die Abgabe falls notwendig neu.
+ Zeit konnte nicht eingestellt werden. Insulinabgabe wurde unterbrochen. Bitte starte die Abgabe manuell im Omnipod Tab neu.
+ Fehler beim Festlegen des Basalprofils: Ein leeres Profil wurde empfangen. Akiviere Dein Basalprofil.
+ Kein Basalprofil aktiv. Aktiviere Dein Profil.
+ Unbekannter benutzerdefinierter Befehl: %1$s
+ Fehler beim Lesen des Pulse-Log
+ Status konnte nicht aktualisiert werden.
+ Status konnte beim Start nicht aktualisiert werden
+ Warnungen konnten nicht bestätigt werden.
+ Insulinabgabe konnte nicht unterbrochen werden.
+ Zeiteinstellung fehlgeschlagen
+ Insulinabgabe konnte nicht gestartet werden.
+ Zeit auf den Pod konnte nicht geändert werden. Synchronisiere die Zeit manuell im Omnipod tab.
+ Bolusabgabe kann nicht verifiziert werden. Prüfe manuell, ob der Pod Insulin abgibt, indem Du auf Klickgeräusche achtest. Wenn Du sicher bist, dass der Bolus nicht abgegeben wurde, musst Du ihn manuell aus den Behandlungen löschen. Dies gilt auch, wenn Du jetzt \'Bolus abbrechen\' klickst!
+ SMB-Abgabe (%1$.2f IE) kann nicht verifiziert werden. Wenn Du sicher bist, dass der SMB nicht abgegeben wurde, musst Du ihn manuell aus den Behandlungen löschen.
+ Bolus nicht abgegeben
+ Pod konnte nicht initalisiert werden.
+ Kanüle konnte nicht eingeführt werden.
+ Die Aktivierungszeit des Pods wurde überschritten. Dieser Pod kann nicht mehr aktiviert werden.
+ Überprüfen des Aktivierungsfortschritts gescheitert. Bitte erneut versuchen.
+ Pod unterbrochen
+ Test-Piepton konnte nicht abgespielt werden
+ Auf dem Pod läuft eine temp. Basalrate, aber AAPS kennt diese nicht. Brich die TBR bitte manuell ab.
+
+ Bestätigung
+ Zeit und/oder Zeitzone auf dem Pod geändert.
+ Alarm-Einstellungen auf dem Pod geändert.
+ Zeit auf dem Pod geändert.
+ Insulinabgabe komplett ausgesetzt.
+ Aktive Warnungen wurden bestätigt.
+ Insulinabgabe wieder aufgenommen.
+
Pod deaktivierenPod ablegen
- Pod HistorieMahlzeiten Bolus abgebenBolus abbrechenTemp. Basalrate setzen
@@ -80,41 +128,99 @@
Abgabe unterbrechenAbgabe fortsetzenUnbekannte Eingabe
- %1$.2f IE
- %1$.2f IE, CH=%2$.1f g
- Pod Historie derzeit nicht verfügbar.
- Befülle den Pod
- Befüllen
- Befestige den Pod
- \nBereite die Infusionsstelle vor. Entferne den Nadelschutz des Pods und die Schutzfolie über dem Kleber. Klebe dann den Pod an die gewünschte Körperstelle.\n\nFalls die Kanüle herausragt, klicke Abbrechen und verwirf den Pod.\n\nKlicke Weiter; um die Kanüle zu setzen und die Insulinabgabe zu beginnen.
- Kanüle setzen
- Erste Basalrate und Kanüle werden nun gesetzt.\n\nWenn alle Häkchen gesetzt sind, kannst Du Weiter klicken.
- \nDer Pod ist jetzt aktiv.\n\nDeine Basalrate ist programmiert und die Kanüle wurde gesetzt.\n\nBitte überprüfe, ob die Kanüle korrekt gesetzt wurde und ersetze den Pod, wenn Du das Gefühl hast, dass dies nicht erfolgreich war.
- Pod deaktivieren
- \nDrücke Weiter um den Pod zu deaktivieren.\n\nHinweis: Dies unterbricht die gesamte Insulinabgabe und deaktiviert den Pod.
- Deaktiviere den Pod
- Pod deaktiviert.\n\nBitte entferne den Pod von Deinem Körper und entsorge ihn.
- Pod verbinden
- Pod befüllen
- Pod deaktivieren
-
- Erinnerung Kopplung beendet
- Erinnerung Setup beendet
- Pod läuft in Kürze ab
- Pod läuft in Kürze ab
- Herunterfahren steht unmittelbar bevor
- Niedriger Reservoirstand
- Unbekannter Alarm
- Fehler
- Basalprofil, unverändert wird nicht erneut eingestellt.
- Aktualisieren
- Unterbrechungen
- RileyLink
- Andere
- Schließen
+ Pod initialisieren
+ Kanüle setzen
+ Pulse-Log lesen
+ Fake TBR gesetzt, da der Pod pausiert ist.
+ Abbruch der Fake TBR. Diese wurde eingestellt, da der Pod pausiert war.
+ Piep-Ton Konfiguration
+ Testton abspielen
+
+ Pod Management
+ Aktionen
+ Tools
+ Warte auf Verbindung mit RileyLink…
+ Pod aktivieren
+ Pod deaktivieren
+ Pod verwerfen
+ Pod Historie
+ RileyLink Statistik
+ RileyLink-Konfiguration zurücksetzen
+ Pulse-Log lesen
+ Lese Puls-Log...
+ Wenn Du den Pod verwirfst, kannst Du nicht mehr mit ihm kommunizieren. Mache das nur, wenn jede Kommunikation mit dem Pod dauerhaft fehlschlägt. Falls Du noch mit dem Pod kommunizieren kannst, verwende bitte die Option Pod deaktivieren.\n\nWenn Du fortfahren willst, entferne jetzt den Pod von Deinem Körper!
+ Testton abspielen
+ Spiele Testton ab....
+
+ Abbrechen
+ BeendenWeiter
- Beschreibung
- Datum
+ Erneut versuchen
+ Pod deaktivieren
+ Pod verwerfen
+ Du hast noch nicht alle Schritte abgeschlossen. Willst Du wirklich beenden?
+ Beenden
+
+ Pod füllen
+ Befülle den neuen Pod mit ausreichend Insulin für 3 Tage.\n\nAchte auch zwei Pieptöne vom Pod während des Füllens. Diese zeigen an, dass der Pod mit der Mindestmenge von 85 IE befüllt wurde. Leere die Spritze komplett, auch wenn Du die beiden Pieptöne gehört hast.\n\nKlicke Weiter nachdem Du den Pod befüllt hast.\n\nHinweis: Entferne den Nadelschutz des Pods noch nicht.\nHinweis: Bringe den RileyLink in eine aufrechte Position und platziere den Pod einige Zentimeter entfernt davon.
+ Pod initialisieren
+ Versuche, Dich mit dem neuen Pod zu verbinden und ihn zu befüllen.\n\nWenn der Initialisierungsprozess erfolgreich abgeschlossen ist, kannst Du Weiter drücken.\n\nHinweis: Bringe den RileyLink bitte in eine aufrechte Position und platziere den Pod einige Zentimeter entfernt davon.
+ Pod anlegen
+ Bereite die Infusionsstelle vor. Entferne den Nadelschutz des Pods und die Schutzfolie über dem Kleber. Klebe dann den Pod an die gewünschte Körperstelle.\n\nFalls die Kanüle herausragt, klicke Abbrechen und verwirf den Pod.\n\nKlicke Weiter; um die Kanüle zu setzen und die Insulinabgabe zu beginnen.
+ Nachdem Du OK gedrückt hast, wird die Kanüle eingeführt. Klebe den Pod vorher auf die gewünschte Infusionsstelle.
+ Kanüle setzen
+ Basalrate wird übertragen und Kanüle gesetzt.\n\nKlicke auf Weiter nachdem die Kanüle erfolgreich gesetzt wurde.
+ Pod aktiviert
+ \nDer neue Pod ist jetzt aktiv.\n\nDeine Basalrate ist programmiert und die Kanüle wurde gesetzt.\n\nBitte überprüfe, ob die Kanüle korrekt gesetzt wurde und ersetze den Pod, wenn Du das Gefühl hast, dass dies nicht erfolgreich war.
+
+ Pod deaktivieren
+ Drücke Weiter um den Pod zu deaktivieren.\n\nHinweis: Dies unterbricht die gesamte Insulinabgabe und deaktiviert den Pod.
+ Deaktiviere den Pod...
+ Deaktiviere den Pod.\n\nNachdem die Deaktivierung komplett abgeschlossen wurde, kannst Du Weiter drücken.
+ Pod deaktiviert
+ Pod wurde deaktiviert.\n\nBitte entferne den Pod von Deinem Körper und recycle ihn.
+ Pod verworfen
+ Der Pod-Status wurde verworfen. Die Insulinabgabe wurde nicht unterbrochen, weil der Pod nicht korrekt deaktiviert wurde!\n\nBitte entferne den Pod von Deinem Körper und recycele ihn.
+ Wenn Du den Pod verwirfst, kannst Du nicht mehr mit ihm kommunizieren. Mache das nur, wenn jede Kommunikation mit dem Pod dauerhaft fehlschlägt. Willst Du den Pod wirklich verwerfen?
+ Verwerfe Pod...
+
+ Zeit einstellen
+ Unterbrechen
+ Aktualisieren
+ Abgabe fortsetzen
+ Pod Mgmt.
+ Alarm bestätigen
+ Pod Status
+ Insgesamt abgegeben
+ %1$.2f IE
+ Pod Adresse
+ Pod läuft ab
+ Letzte Verbindung
+ Letzter Bolus:
+ Temporäre Basalrate
+ Basis-Basalrate
+ Reservoir
+ Aktive Pod-Warnungen
+ Firmware-Version
+ Zeit auf dem Pod
+ %1$.2fIE/h @%2$s (%3$d/%4$d min.)
+ %1$.2f IE verbleiben
+ Mehr als 50 IE verbleibend
+ Fehler
+
+ Um den Omnipod nutzen zu können, brauchst Du einen RileyLink (mind. Firmware 2.0).
+ unsicher
+ Pulse Log
+ Pulse Log (in Zwischenablage kopiert)
+ Ja
+ Nein
+ OK
+ Abbrechen
+
+ gerade eben
+ vor weniger als einer Minute
+ %1$s und %2$s
+ vor %1$s%1$d Minute%1$d Minuten
@@ -127,4 +233,8 @@
%1$d Tag%1$d Tage
+
+ Pod-Alarm: %1$s
+ Pod-Alarme: %1$s
+
diff --git a/omnipod/src/main/res/values-el-rGR/strings.xml b/omnipod/src/main/res/values-el-rGR/strings.xml
index 036e78a8a3..67511ccc70 100644
--- a/omnipod/src/main/res/values-el-rGR/strings.xml
+++ b/omnipod/src/main/res/values-el-rGR/strings.xml
@@ -1,11 +1,19 @@
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values-es-rES/strings.xml b/omnipod/src/main/res/values-es-rES/strings.xml
index 08e3ee13fd..c8d5ea3fad 100644
--- a/omnipod/src/main/res/values-es-rES/strings.xml
+++ b/omnipod/src/main/res/values-es-rES/strings.xml
@@ -1,37 +1,241 @@
-
-
- La integración de la bomba para Omnipod requiere el dispositivo RileyLink (con al menos 2,0 firmware).
-
-
- %1$.2f U restantes
- Más De 50 U
-
- Omnipod (433.91 MHz)
-
- Ilegal PodInitActionType: %1$s
- Error inesperado. Por favor, informe! (tipo: %1$s).
- La comunicación ha fallado: error inesperado. ¡Por favor, Informe!
-
- Iniciar Pod
- Desactivar Pod
- Historial del Pod no disponible en el momento.
- Llenar el Pod
- Cebado
- Adherir el Pod
- \nPreparar el sitio de infusión. Retire el capuchón de la aguja del Pod y el adhesivo y aplique el Pod al sitio de perfusión.\n\nSi la cánula se queda fuera, por favor presione Cancel y descarte su Pod.\n\nPress Next para insertar la cánula y comenzar la entrega basal.
- Insertar cánula
- Intentando establecer la programación basal inicial e insertar la cánula.\n\nCuando todos los elementos están marcados, puede pulsar Siguiente.
- \nEl Pod ahora está activo.\n\nSu horario basal ha sido programado y la cánula ha sido insertada.\n\nPor favor, verifique que la cánula ha sido insertada correctamente y reemplace su Pod si usted siente que no lo ha hecho.
- \nPulsa Siguiente para desactivar el Pod.\n\nNota: Esto suspenderá toda la entrega insulina y desactivará el Pod.
- Desactivando el Pod
- Pod desactivado.\n\nPor favor, retire el Pod de su cuerpo y desecharlo.
- Emparejar Pod
- Llenado de cánula del Pod
-
+
+
+
+ Pitidos de bolo habilitados
+ Pitidos de basales habilitados
+ Pitidos SMB habilitados
+ Aviso de TBR activado
+ Mostrar el botón Suspender entrega en la pestaña Omnipod
+ Mostrar botón de registro de pulso en el menú de gestión del pod
+ Mostrar botón de estadísticas de RileyLink en el menú de gestión del pod
+ Detección de zona DST/hora activada
+ Recordatorio de expiración activado
+ Horas antes del apagado
+ Alerta de depósito bajo habilitada
+ Número de Unidades
+ Sonido para notificaciones TBR inciertas habilitadas
+ Sonido para notificaciones SMB inciertas habilitadas
+ Sonido para notificaciones de bolo incierto activadas
+ Reconocer automáticamente alertas de Pod
+ RileyLink
+ Otros
+ Alertas
+ Pitidos de confirmación
+ Notificaciones
+
+ Ningún pod activo
+ Configuración en curso (a la espera de activación del Pod)
+ Configuración en curso (en espera de inserción de cánula)
+ Funcionando
+ Suspendido
+ Fallo del Pod
+ Tiempo de activación excedido
+ Inactivo
+ Error del Pod: %1$03d %2$s
+
+ Finalizar recordatorio de emparejamientoRecordatorio de configuración finalizado
+ Pod a punto de caducar
+ Pod a punto de caducarEl apagado es inminenteReservorio bajoAlerta desconocida
+
+ Historial de Pod
+ Descripción
+ Fuente
+ Fecha
+ Tipo:
+ %1$.2f U
+ %1$.2f U, CH=%2$.1f g
+ Tasa: %1$.2f U, duración: %2$d minutos
+
+ Alerta
+ Dirección de RileyLink no válida.
+ La operación no es posible.\n\nDebe configurar Omnipod primero, antes de poder usar esta operación.
+ Ningún pod activo
+ Error inesperado. Por favor, informe! (tipo: %1$s:%2$s).
+ Comunicación fallida: falló la verificación de integridad del mensaje
+ La comunicación ha fallado: se ha recibido una respuesta no válida del Pod
+ La comunicación ha fallado: el Pod está en un estado incorrecto
+ La comunicación ha fallado: se ha recibido una respuesta no válida del Pod
+ Ha fallado la comunicación: se ha recibido un mensaje con un número de secuencia no válido del Pod
+ La comunicación ha fallado: se ha recibido un mensaje con una dirección no válida desde el Pod
+ Comunicación fallida: no se pudo descifrar el mensaje del Pod
+ La comunicación ha fallado: nonce resync ha fallado
+ La comunicación ha fallado: nonce fuera de sincronización
+ La comunicación ha fallado: no se han recibido suficientes datos del Pod
+ Un error de Pod (%1$03d %2$s) se ha detectado. Por favor, desactive su Pod e inicie uno nuevo
+ Fallo en la comunicación: el Pod devolvió una respuesta de error
+ No hay respuesta de RileyLink
+ RileyLink interrumpido
+ Sin respuesta del Pod
+ Error al configurar el perfil basal. ¡La entrega podría suspenderse! Por favor, actualiza manualmente el estado de Pod desde la pestaña Omnipod y reanuda la entrega si es necesario.
+ Possible error al configurar el perfil basal. ¡La entrega puede haber suspendida! Por favor, actualiza manualmente el estado de Pod desde la pestaña Omnipod y reanuda la entrega si es necesario.
+ Error al establecer el perfil basal. ¡La entrega está suspendida! Reanude manualmente la entrega desde la pestaña Omnipod.
+ Error al establecer el perfil basal.
+ La cancelación de basal temporal puede haber fallado. Por favor, actualice manualmente el estado de Pod desde la pestaña Omnipod.
+ Error al establecer la basal temporal. Si anteriormente se estaba ejecutando un basal temporal, es posible que se haya cancelado. Renueve manualmente el estado de Pod en la pestaña Omnipod.
+ Posible error al establecer la basal temporal. Si anteriormente se estaba ejecutando un basal temporal, es posible que se haya cancelado. Renueve manualmente el estado de Pod en la pestaña Omnipod.
+ La duración de la TBR debe ser mayor que cero y múltiplo de %1$s minutos.
+ Possible error al establecer la hora. ¡La entrega puede haber suspendida! Por favor, actualiza manualmente el estado de Pod desde la pestaña Omnipod y reanuda la entrega si es necesario.
+ Error al establecer el tiempo. ¡La entrega está suspendida! Reanude manualmente la entrega desde la pestaña Omnipod.
+ No se ha podido establecer el perfil basal: se ha recibido un perfil vacío. Asegúrese de activar su perfil basal.
+ Ningún perfil basal está activo. Asegúrese de activar su perfil basal.
+ Comando personalizado desconocido: %1$s
+ Fallo al leer el registro de pulso
+ Error al actualizar el estado
+ Error al actualizar el estado al iniciar
+ Error al reconocer alertas
+ Error al suspender la entrega
+ Error al establecer la hora
+ Error al aceptar la entrega
+ No se pudo cambiar automáticamente la hora en el Pod. Debe sincronizar manualmente la hora en la pestaña Omnipod.
+ No se ha podido verificar si el bolo ha sido entregado. Por favor, verifique manualmente si su Pod está entregando escuchando los clics. Si está seguro de que el bolo no ha sido entregado debe eliminar manualmente la entrada en bolo de los tratamientos, incluso si hace clic en \'Cancelar bolo\' ahora!
+ No se puede verificar si el bolo SMB (%1$.2f U) ha sido entregado. Si está seguro de que el Bolus no ha tenido éxito, debe eliminar manualmente la entrada SMB de los Tratamientos.
+ Bolo no entregado.
+ Error al iniciar el Pod
+ Fallo al insertar cánula
+ Se ha excedido el tiempo de activación del Pod. Este Pod ya no se puede activar.
+ Error al verificar el progreso de activación. Vuelva a intentarlo.
+ Pod suspendido
+ Error al reproducir el pitido de prueba
+ Una base temporal se está ejecutando en el Pod, pero AAPS no está al tanto de esta base temporal. Por favor cancele su basal temporal manualmente.
+
+ Confirmación
+ Tiempo y/o zona horaria cambiados en el Pod.
+ La configuración de alerta ha sido actualizada en el Pod.
+ La hora del Pod se ha actualizado.
+ Se han suspendido todas las entregas de insulina.
+ Las alertas activas han sido reconocidas.
+ La entrega de insulina se ha reanudado.
+
+ Desactivar Pod
+ Descartar Pod
+ Configurar bolo
+ Cancelar Bolo
+ Establecer basal temporal
+ Cancelar basal temporal (internamente por controlador)
+ Cancelar basal temporal
+ Establecer programación basal
+ Obtener estado de Pod
+ Obtener información de Pod
+ Ajustar la hora
+ Configurar alertas
+ Confirmar Alertas
+ Suspender la entrega
+ Reanudar la entrega
+ Entrada desconocida
+ Activar Pod
+ Insertar Cánula
+ Leer registro pulso
+ Establece una base temporal falsa porque el Pod está suspendido
+ Cancelar la base temporal falsa que se ha creado porque el Pod se ha suspendido
+ Dividir basal temporal debido a un fallo incierto en la cancelación
+ Configuración Pitido
+ Reproducir pitido de prueba
+
+ Administración de Pod
+ Acciones
+ Herramientas
+ Esperando la conexión de RileyLink…
+ Activar Pod
+ Desactivar Pod
+ Descartar Pod
+ Historial de Pod
+ Estadísticas de RileyLink
+ Restablecer configuración de RileyLink
+ Leer registro pulso
+ Leyendo pulso de registro…
+ Si descartas el Pod, ya no podrás comunicarte con él. Sólo deberías hacer esto cuando toda la comunicación con el Pod falla continuamente. Si todavía puede comunicarse con el Pod, utilice la opción Desactivar Pod.\n\nSi desea continuar, por favor asegúrese de quitar el Pod de su cuerpo!
+ Reproducir pitido de prueba
+ Reproduciendo pitido de prueba…
+
+ Cancelar
+ Terminar
+ Siguiente
+ Reintentar
+ Desactivar Pod
+ Descartar Pod
+ Todavía no has completado todos los pasos. ¿Está seguro de que desea salir?
+ Salir
+
+ Llenar Pod
+ \nLlenar el nuevo Pod con suficiente insulina para 3 días.\n\nEscucha dos pitidos del Pod durante el proceso de llenado. Esto indica que se ha insertado la cantidad mínima de 85U. Asegúrese de vaciar completamente la jeringa, incluso después de escuchar los dos pitidos.\n\nDespués de llenar el Pod, por favor pulse siguiente.\n\nNota: no retire el capuchón de la aguja del Pod en este momento.\nNota: por favor coloque el RileyLink cerca del Pod y en posición vertical.
+ Activar Pod
+ Intentando emparejar con el nuevo Pod y llenarlo.\n\nCuando se ha inicializado con éxito, puedes pulsar Siguiente.\n\nNota: por favor mantenga el RileyLink muy cerca del Pod y en posición vertical en este momento.
+ Adherir el Pod
+ Prepara el sitio de infusión. Retire el tapón de agujas y el adhesivo del Pod y coloca el Pod al sitio de infusión.\n\nSi la cánula se queda fuera pulsa Cancelar y descartar tu Pod.\n\nPresione Siguiente para insertar la cánula y comenzar la entrega basal.
+ Al pulsar OK, se insertará la cánula. Asegúrese de que ha colocado el Pod al sitio de infusión.
+ Insertar cánula
+ Intentando establecer la programación basal inicial e insertar la cánula.\n\n si la cánula ha sido insertada correctamente puede pulsar Siguiente.
+ Pod activado
+ \nEl Pod nuevo ahora está activo.\n\nSu tasa basal ha sido programada y la cánula ha sido insertada.\n\nPor favor, verifique que la cánula ha sido insertada correctamente y reemplace su Pod si tiene dudas.
+
+ Desactivar Pod
+ \nPulsa Siguiente para desactivar el Pod.\n\nNota: Esto suspenderá toda la entrega de insulina y desactivará el Pod.
+ Desactivando el Pod
+ Desactivando el Pod.\n\nCuando la desactivación se haya completado correctamente, puede pulsar Next.
+ Pod desactivado
+ El Pod se ha desactivado.\n\nPor favor, retire el Pod de su cuerpo y recíclelo.
+ Pod descartado
+ El estado de Pod se ha descartado. La entrega de insulina no se ha suspendido porque el Pod no se ha desactivado correctamente!\n\nPor favor, elimine el Pod de su cuerpo y recíclelo.
+ Si descartas el Pod, ya no podrás comunicarte con él. Sólo deberías hacer esto cuando toda la comunicación con el Pod falla persistentemente. ¿Estás seguro de que quieres descartar el Pod?
+ Descartar Pod
+
+ Ajustar la hora
+ Suspender
+ Actualizar
+ Resumir la entrega
+ Pod mgmt
+ Ack alertas
+ Estado del Pod
+ Entrega total
+ %1$.2f U
+ Dirección del Pod
+ Pod caduca
+ Última conexión
+ Último bolo
+ Tasa basal temporal
+ Tasa basal básica
+ Depósito
+ Alertas del Pod activas
+ Versión Firmware
+ Hora en Pod
+ %1$.2fU/h @%2$s (%3$d/%4$d minutos)
+ %1$.2f U restantes
+ Más de 50 U restantes
+ Errores
+
+ La integración de la bomba para Omnipod requiere el dispositivo RileyLink (con al menos 2,0 firmware).
+ incierto
+ Registro de pulso
+ Registro de Pulso (copiado al portapapeles)
+ Si
+ No
+ Ok
+ Cancelar
+
+ Hace un momento
+ Hace menos de un minuto
+ %1$s y %2$s
+ hace %1$s
+
+ %1$d minuto
+ %1$d minutos
+
+
+ %1$d hora
+ %1$d horas
+
+
+ %1$d día
+ %1$d días
+
+
+ Alerta del pod: %1$s
+ Alerta del pod: %1$s
+
diff --git a/omnipod/src/main/res/values-fr-rFR/strings.xml b/omnipod/src/main/res/values-fr-rFR/strings.xml
index 45a8383d02..9e1d37754c 100644
--- a/omnipod/src/main/res/values-fr-rFR/strings.xml
+++ b/omnipod/src/main/res/values-fr-rFR/strings.xml
@@ -1,73 +1,118 @@
-
-
- L\'intégration de la pompe Omnipod nécessite un boitier RileyLink (avec au minimum un firmware 2.0).
-
+
+
+
Bips bolus activésBips basal activésBips SMB activésBips DBT activés
- Bouton Suspendre l\'injection activé
- Bouton Enreg. Pulse activé
+ Montrer le bouton Suspendre l\'injection dans l\'onglet Omnipod
+ Afficher le bouton Journal d\'impulsions dans le menu de gestion des podsChangement de Zone/Heure ActivéRappel d\'expiration activéHeures avant arrêtAlerte Réservoir bas activéeNombre d\'unités
-
- Il y a un moment
- Pod mngt
- État du Pod
- Total délivré
- %1$.2f U
- %1$.2f U restantes
- Plus de 50 U
- Adresse du Pod
- Pod expiré
- Attention
+ Son pour les notifications DBT incertains activé
+ Son pour les notifications SMB incertains activé
+ Son pour les notifications bolus incertains activé
+ Accepter automatiquement les alertes Pod
+ RileyLink
+ Autres
+ Alertes
+ Bips de confirmation
+ Notifications
+
Pas de Pod actif
- Configuration en cours (en attente d\'appairage et d\'amorçage)
+ Configuration en cours (en attente d\'activation du Pod)Configuration en cours (en attente d\'insertion de canule)En cours d\'exécutionSuspenduErreur PodDélai d\'activation dépasséInactif
- Défaut du Pod : %1$s %2$s
- Activer alertes Pod
- Valider Alertes
-
- Omnipod (433.91 MHz)
+ Défaut Pod : %1$03d %2$s
+
+ Rappel fin d\'appairage
+ Rappel fin de configuration
+ Le Pod expire bientôt
+ Le Pod expire bientôt
+ Arrêt imminent
+ Réservoir bas
+ Alerte inconnue
+
+ Historique du Pod
+ Description
+ Source
+ Date
+ Type :
+ %1$.2f U
+ %1$.2f U, Gluc=%2$.1f g
+ Débit : %1$.2f U, durée : %2$d minutes
+ AttentionAdresse RileyLink invalide.Operation impossible.\n\nVous devez d\'abord configurer l\'Omnipod pour pouvoir faire cette operation.
- Operation impossible.\n\nVous devez attendre quelques minutes, jusqu\'à ce que AAPS tente de définir le profil de basale pour la première fois.
- type d\'action d\'init Pod non autorisée : %1$sPas de Pod actif
- Échec de vérification de la commande
- Erreur inconnue. Veuillez signaler ! (type : %1$s).
- Échec de communication : paramètres d\'entrées reçus invalides
- Échec de communication : délai expiré
- Échec de communication : Erreur inconnue. Veuillez signaler !
- Échec de communication : vérification de l\'intégrité du message échouée
- Échec de communication : paquet reçu du Pod invalide
- Échec de communication : état du Pod incorrect
- Échec de communication : réponse invalide reçue du Pod
- Échec de communication : message reçu du Pod avec un numéro de séquence invalide
- Échec de communication : message reçu du Pod avec une adresse invalide
- Échec de communication : échec du décodage du message reçu du Pod
- Échec de communication : resynchro nonce échouée
- Échec de communication : nonce non synchro
- Échec de communication : pas assez de données reçues du Pod
- Un défaut du Pod a été détecté (%1$03d %2$s). Veuillez désactiver votre Pod et en démarrer un nouveau
- Échec de communication : le Pod a renvoyé un message d\'erreur
-
- Gestion Pod
- Init Pod
+ Erreur inconnue. Veuillez signaler ! (%1$s : %2$s).
+ Échec de communication : vérification de l\'intégrité du message échouée
+ Échec de communication : paquet reçu du Pod invalide
+ Échec de communication : état du Pod incorrect
+ Échec de communication : réponse invalide reçue du Pod
+ Échec de communication : message reçu du Pod avec un numéro de séquence invalide
+ Échec de communication : message reçu du Pod avec une adresse invalide
+ Échec de communication : échec du décodage du message reçu du Pod
+ Échec de communication : resynchro numéro unique échouée
+ Échec de communication : numéro unique non synchro
+ Échec de communication : pas assez de données reçues du Pod
+ Un défaut du Pod a été détecté (%1$03d %2$s). Veuillez désactiver votre Pod et en acttiver un nouveau
+ Échec de communication : le Pod a renvoyé un message d\'erreur
+ Aucune réponse du RileyLink
+ RileyLink interrompu
+ Pas de réponse du Pod
+ Le paramétrage du profil basal a échoué. L\'injection peut être suspendue ! Actualisez manuellement l\'état du Pod à partir de l\'onglet Omnipod et reprenez l\'injection si nécessaire.
+ Le paramétrage du profil basal a peut-être échoué. L\'injection peut être suspendue ! Actualisez manuellement l\'état du Pod à partir de l\'onglet Omnipod et reprenez l\'injection si nécessaire.
+ Le paramétrage du profil basal a échoué. L\'injection est suspendue ! Veuillez poursuivre manuellement l\'injection à partir de l\'onglet Omnipod.
+ Echec Paramétrage Profil Basal.
+ L\'annulation de la basale temporaire peut avoir échouée. Veuillez actualiser manuellement l\'état du Pod depuis l\'onglet Omnipod.
+ Le paramétrage de la basal temp a échoué. Si une basal temp était en cours d\'exécution, elle a peut-être été annulée. Veuillez actualiser manuellement l\'état du Pod à partir de l\'onglet Omnipod.
+ Le paramétrage de la basal temp a peut-être échoué. Si une basal temp était en cours d\'exécution, elle a été annulée. Veuillez actualiser manuellement l\'état du Pod à partir de l\'onglet Omnipod.
+ La durée du DBT doit être supérieure à zéro et un multiple de %1$s minutes.
+ Le paramétrage de l\'heure a peut-être échoué. L\'injection peut être suspendue ! Actualisez manuellement l\'état du Pod à partir de l\'onglet Omnipod et reprenez l\'injection si nécessaire.
+ Le paramétrage de l\'heure a échoué. L\'injection est suspendue ! Veuillez poursuivre manuellement l\'injection à partir de l\'onglet Omnipod.
+ Impossible de définir le profil Basal : profil vide reçu. Vérifiez que votre profil de basal est activé.
+ Aucun profil de basal n\'est actif. Assurez-vous d\'activer votre profil de basal.
+ Commande personnalisée inconnue : %1$s
+ Échec lecture Journal d\'impulsions
+ Échec pour rafraichir l\'état
+ Échec pour rafraichir l\'état au démarrage
+ Échec pour confirmer les alertes
+ Échec pour suspendre l\'injection
+ Échec pour définir l\'heure
+ Échec pour reprendre l\'injection
+ Échec pour changer automatiquement l\'heure sur le Pod. Vous devez synchroniser manuellement l\'heure dans l\'onglet Omnipod.
+ Impossible de vérifier si le bolus a réussi. Veuillez vérifier manuellement que votre Pod est en train de délivrer un bolus en écoutant des clics. Si vous êtes sûr que le bolus n\'a pas réussi, vous devez supprimer manuellement l\'entrée bolus des traitements, même si vous cliquez sur \'Annuler bolus\' maintenant !
+ Impossible de vérifier si le bolus SMB (%1$.2f U) a réussi. Si vous êtes certain que le bolus n\'a pas réussi, vous devez supprimer manuellement l\'entrée SMB des traitements.
+ Le bolus n\'a pas réussi.
+ Impossible d’initialiser le Pod
+ Impossible d\'insérer la canule
+ La durée d\'activation du Pod a été dépassée. Ce Pod ne peut plus être activé.
+ Échec de la vérification de l\'activation. Veuillez réessayer.
+ Pod suspendu
+ Échec du test des bips
+ Un basal temporaire est en cours d\'exécution sur le Pod, mais AAPS n\'est pas au courant de ce basal temporaire. Veuillez annuler votre basal temporaire manuellement.
+
+ Confirmation
+ Heure et/ou fuseau horaire changé sur le Pod.
+ Configuration des alertes mise à jour dans le Pod.
+ L\'heure du Pod a été mise à jour.
+ Toutes les injections d\'insuline ont été suspendues.
+ Les alertes actives ont été acceptées.
+ L\'injection de l\'insuline a été reprise.
+
Désactiver PodSupprimer le Pod
- Historique PodDéfinir bolusAnnuler bolusDéfinir basale temporaire
@@ -82,86 +127,95 @@
Suspendre l\'injectionPousuivre l\'injectionEntrée inconnue
- %1$.2f U
- %1$.2f U, Gluc=%2$.1f g
- Débit : %1$.2f U, durée : %2$d min
- Si vous appuyez sur OK, le Pod sera réinitialisé et vous ne pourrez plus communiquer avec lui. Ne le faite que si vous ne pouvez plus communiquer avec le Pod. Si vous pouvez toujours communiquer avec lui, veuillez utiliser l\'option Désactiver Pod.\n\n Si vous souhaitez le faire, assurez-vous de retirer également le Pod de votre corps.
- Historique Pod non disponible pour le moment.
- Remplir le Pod
- \nRemplir le nouveau Pod avec suffisamment d\'insuline pendant 3 jours.\n\nÉcoutez les deux bips du Pod pendant le processus de remplissage. Ils indiquent que la quantité minimale de 85U a été ajouté. Assurez-vous de vider complètement la seringue de remplissage, même après avoir entendu les deux bips.\n\nAprès avoir rempli le Pod, veuillez appuyer sur Suivant.\n\nRemarque : Ne retirez pas la protection de l\'aiguille du Pod pour le moment.\nRemarque :Veuillez placer le RileyLink en position verticale et placez le Pod quelques centimètres à côté.
- Amorçage
- Tentative d\'appairage et d\'amorçage du nouveau Pod.\n\nQuand tous les items sont cochées, appuyez sur Suivant.\n\nRemarque : Veuillez placer le RileyLink en position verticale et placez le Pod à quelques centimètres de lui.
- Collez le Pod
- \nPréparez le site d\'injection. Enlevez la protection de l\'aiguille et le support adhésif et collez le Pod sur le site d\'injection.\n\nSi la canule se colle, appuyez sur Annuler et jetez votre Pod.\n\nAppuyez sur Suivant pour insérer la canule et démarrer l\'injection de la basal.
- Insertion canule
- Tentative de définir le schéma de basal et d\'insertion de la canule.\n\nQuand tous les items sont cochés, appuyez sur Suivant.
- Infos Pod
- \nLe Pod est maintenant actif.\n\nVos débits de basal ont été programmés et la canule a été insérée.\n\nVeuillez verifier que la canule a été insérée correctement et remplacez votre Pod si vous pensez que ce n\'est pas le cas.
- Désactiver Pod
- \nAppuyez sur Suivant pour désactiver le Pod.\n\nRemarque : Cela suspendra l\'injection de l\'insuline et désactivera le Pod.
- Désactivation du Pod
- Désactivation du Pod.\n\nQuand tous les items sont cochés, appuyez sur Suivant.\n\nRemarque : Si la désactivation échoue en permanence, appuyez sur Annuler et utilisez l\'option Réinit. Pod pour réinitialiser l\'état du Pod.
- Pod désactivé.\n\nVeuillez enlever le Pod de votre corps et le jeter.
- Appairer le Pod
- Amorcer le Pod
- Remplir canule
- Définir profil de basale
- Annuler l\'injection
- Désactiver Pod
-
- Rappel fin d\'appairage
- Rappel fin de configuration
- Le Pod expire bientôt
- Le Pod expire bientôt
- Arrêt imminent
- Réservoir bas
- Alerte inconnue
- Le paramétrage du profil basal a échoué. L\'injection peut être suspendue ! Actualisez manuellement l\'état du Pod à partir de l\'onglet Omnipod et reprenez l\'injection si nécessaire.
- Le paramétrage du profil basal a peut-être échoué. L\'injection peut être suspendue ! Actualisez manuellement l\'état du Pod à partir de l\'onglet Omnipod et reprenez l\'injection si nécessaire.
- Le paramétrage du profil basal a échoué. L\'injection est suspendue ! Veuillez poursuivre manuellement l\'injection à partir de l\'onglet Omnipod.
- Le paramétrage de la basal temp a échoué. Si une basal temp était en cours d\'exécution, elle a peut-être été annulée. Veuillez actualiser manuellement l\'état du Pod à partir de l\'onglet Omnipod.
- Le paramétrage de la basal temp a peut-être échoué. Si une basal temp était en cours d\'exécution, elle a été annulée. Veuillez actualiser manuellement l\'état du Pod à partir de l\'onglet Omnipod.
- Le paramétrage de l\'heure a peut-être échoué. L\'injection peut être suspendue ! Actualisez manuellement l\'état du Pod à partir de l\'onglet Omnipod et reprenez l\'injection si nécessaire.
- Le paramétrage de l\'heure a échoué. L\'injection est suspendue ! Veuillez poursuivre manuellement l\'injection à partir de l\'onglet Omnipod.
- Impossible de vérifier si le bolus a réussi. Veuillez vérifier manuellement que votre Pod est en train de délivrer un bolus en écoutant des clics. Si vous êtes sûr que le bolus n\'a pas réussi, vous devez supprimer manuellement l\'entrée bolus des traitements, même si vous cliquez sur \'Annuler bolus\' maintenant !
- Impossible de vérifier si le bolus SMB (%1$.2f U) a réussi. Si vous êtes certain que le bolus n\'a pas réussi, vous devez supprimer manuellement l\'entrée SMB des traitements.
- Stats RL
- LOT
- TID
- Version du firmware
- Erreurs
- Le profil Basal est le même, donc il ne sera pas redéfini.
- Réinitialiser la config. RileyLink
- Heure et/ou fuseau horaire changé sur le Pod
- %1$s et %2$s
- il y a %1$s
- En attente de connexion RileyLink ...
- Le bolus n\'a pas réussi
- Actualiser
- Pousuivre l\'injection
- Pod suspendu
- Il y a moins d\'une minute
- Arrêter
- Appairer et amorcer
- Remplir la canule et définir le profil de basal
- Erreur inconnue
- Ancien débit de basal temporaire annulé, mais impossible de définir le nouveau débits de basal temporaire
+ Initialiser le Pod
+ Insérer la canule
+ Lire Journal d\'impulsionsDéfinir un faux débit de basal temporaire car le Pod est suspenduAnnuler le faux débit de basal temporaire créé à cause du Pod suspendu
- incertain
- Configuration des alertes mise à jour dans le Pod
- RileyLink
- Autres
- Alertes
- Bips de confirmation
- Quitter
- Précédent
- Suivant
+ Configuration des bips
+ Tester les bips
+
+ Gestion du Pod
+ En attente de connexion RileyLink...
+ Activer le Pod
+ Désactiver le Pod
+ Supprimer le Pod
+ Historique du Pod
+ Lire Journal d\'impulsions
+ Lecture journal d\'impulsion…
+ Si vous supprimez le Pod, vous ne pourrez plus communiquer avec lui. Vous ne devez le faire que lorsque toutes les communications avec le Pod échouent de manière permanente. Si vous pouvez toujours communiquer avec le Pod, veuillez utiliser l\'option Désactiver le Pod .\n\nSi vous souhaitez continuer, assurez-vous de retirer la Pod de votre corps !
+ Tester les bips
+ Test des bips…
+
+ AnnulerTerminer
- Description
- Source
- Date
- Type :
+ Suivant
+ Réessayer
+ Désactiver le Pod
+ Supprimer le Pod
+ Vous n\'avez pas encore terminé toutes les étapes. Êtes-vous sûr de vouloir quitter ?
+ Quitter
+
+ Remplir le Pod
+ Remplir le nouveau Pod avec suffisamment d\'insuline pendant 3 jours.\n\nÉcoutez les deux bips du Pod pendant le processus de remplissage. Ils indiquent que la quantité minimale de 85U a été ajouté. Assurez-vous de vider complètement la seringue de remplissage, même après avoir entendu les deux bips.\n\nAprès avoir rempli le Pod, veuillez appuyer sur Suivant.\n\nRemarque : Ne retirez pas la protection de l\'aiguille du Pod pour le moment.\nRemarque :Veuillez placer le RileyLink en position verticale et placez le Pod quelques centimètres à côté.
+ Initialiser le Pod
+ Tentative d\'appairage et d\'amorçage du nouveau Pod.\n\nUne fois le processus d\'initialisation terminé, appuyez sur Suivant.\n\nRemarque : Veuillez placer le RileyLink en position verticale et placez le Pod à quelques centimètres de lui.
+ Collez le Pod
+ Préparez le site d\'injection. Enlevez la protection de l\'aiguille et le support adhésif et collez le Pod sur le site d\'injection.\n\nSi la canule se colle, appuyez sur Annuler et jetez votre Pod.\n\nAppuyez sur Suivant pour insérer la canule et démarrer l\'injection de la basal.
+ Lorsque vous appuyez sur OK, la canule sera insérée. Assurez-vous d\'avoir collé le Pod sur le site de perfusion.
+ Insérer la canule
+ Tentative de définir le schéma de basal et d\'insertion de la canule.\n\nUne fois la canule correctement insérée, appuyez sur Suivant.
+ Pod activé
+ Le Pod est maintenant actif.\n\nVos débits de basal ont été programmés et la canule a été insérée.\n\nVeuillez verifier que la canule a été insérée correctement et remplacez le Pod si vous pensez que ce n\'est pas le cas.
+
+ Désactiver le Pod
+ Appuyez sur Suivant pour désactiver le Pod.\n\nRemarque : Cela suspendra l\'injection de l\'insuline et désactivera le Pod.
+ Désactivation du Pod
+ Désactivation du Pod.\n\nUne fois la désactivation terminée, vous pouvez appuyer sur Suivant.
+ Pod désactivé
+ Votre Pod a été désactivé.\n\nVeuillez enlever le Pod de votre corps et le jeter dans le recyclage.
+ Pod supprimé
+ L\'état du Pod a été supprimé. L\'injection d\'insuline n\'a pas été suspendue car le Pod n\'a pas été correctement désactivé !\n\nVeuillez retirer le Pod de votre corps et le jeter dans le recyclage.
+ Si vous supprimez le Pod, vous ne pourrez plus communiquer avec lui. Vous ne devez le faire que lorsque toutes les communications avec le Pod échouent de manière permanente. Êtes-vous sûr de vouloir supprimer le Pod ?
+ Supprimer le Pod
+
+ Définir l\'heure
+ Arrêter
+ Actualiser
+ Reprendre l\'injection
+ Gest. Pod
+ Accepter les alertes
+ État du Pod
+ Total injecté
+ %1$.2f U
+ Adresse du Pod
+ Pod expiré
+ Dernière connexion
+ Dernier bolus
+ Débit de Basal Temporaire
+ Débit de Basal
+ Réservoir
+ Activer alertes Pod
+ Version du firmware
+ Heure du Pod
+ %1$.2fU/h @%2$s (%3$d/%4$d minutes)
+ %1$.2f U restantes
+ Plus de 50 U restantes
+ Erreurs
+
+ L\'intégration de la pompe Omnipod nécessite un boitier RileyLink (avec au minimum un firmware 2.0).
+ incertain
+ Journal d\'impulsions
+ Journal d\'impulsions (copié dans presse-papiers)
+ Oui
+ Non
+ OK
+ Annuler
+
+ Il y a un moment
+ Il y a moins d\'une minute
+ %1$s et %2$s
+ il y a %1$s%1$d minute%1$d minutes
@@ -174,4 +228,8 @@
%1$d jour%1$d jours
+
+ Alerte Pod : %1$s
+ Alertes Pod : %1$s
+
diff --git a/omnipod/src/main/res/values-ga-rIE/strings.xml b/omnipod/src/main/res/values-ga-rIE/strings.xml
index 036e78a8a3..67511ccc70 100644
--- a/omnipod/src/main/res/values-ga-rIE/strings.xml
+++ b/omnipod/src/main/res/values-ga-rIE/strings.xml
@@ -1,11 +1,19 @@
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values-hr-rHR/strings.xml b/omnipod/src/main/res/values-hr-rHR/strings.xml
index 036e78a8a3..67511ccc70 100644
--- a/omnipod/src/main/res/values-hr-rHR/strings.xml
+++ b/omnipod/src/main/res/values-hr-rHR/strings.xml
@@ -1,11 +1,19 @@
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values-it-rIT/strings.xml b/omnipod/src/main/res/values-it-rIT/strings.xml
index a1cedcb4cd..1562477270 100644
--- a/omnipod/src/main/res/values-it-rIT/strings.xml
+++ b/omnipod/src/main/res/values-it-rIT/strings.xml
@@ -1,73 +1,119 @@
-
-
- Integrazione del microinfusore Omnipod, richiede un dispositivo RileyLink (con almeno il firmware 2.0).
-
+
+
+
BIP bolo abilitatoBIP basale abilitatoBIP SMB abilitatoBIP TBR abilitato
- Tasto \'sospendi erogazione\' abilitato
- Tasto \'log impulsi\' abilitato
+ Mostra tasto \"sospendi erogazione\" nella scheda Omnipod
+ Mostra tasto \"log impulsi\" nel menu gestione pod
+ Mostra tasto \"statistiche RileyLink\" nel menu gestione podRilevamento ora legale/fuso orario abilitatoPromemoria scadenza abilitatoOre prima dell\'arrestoAvviso livello serbatoio basso abilitatoNumero di unità
-
- Momenti fa
- GSTN pod
- Stato pod
- Totale erogato
- %1$.2f U
- %1$.2f U rimanenti
- Oltre 50 U
- Indirizzo pod
- Scadenza pod
- Avviso
+ Suono notifiche TBR incerto abilitato
+ Suono notifiche SMB incerto abilitato
+ Suono notifiche bolo incerto abilitato
+ Conferma automaticamente avvisi pod
+ RileyLink
+ Altro
+ Avvisi
+ Beep di conferma
+ Notifiche
+
Nessun pod attivo
- Configurazione in corso (attesa associazione e caricamento)
+ Configurazione in corso (attesa attivazione pod)Configurazione in corso (attesa inserimento cannula)In esecuzioneSospesoGuasto podTempo di attivazione superatoInattivo
- Guasto pod: %1$s %2$s
- Attiva avvisi pod
- Conferma avvisi
-
- Omnipod (433.91 MHz)
+ Guasto pod: %1$03d %2$s
+
+ Fine promemoria associazione
+ Fine promemoria configurazione
+ Il pod scadrà presto
+ Il pod scadrà presto
+ L\'arresto è imminente
+ Livello serbatoio basso
+ Avviso sconosciuto
+
+ Storico pod
+ Descrizione
+ Fonte
+ Data
+ Tipo:
+ %1$.2f U
+ %1$.2f U, CHO=%2$.1f g
+ Tasso: %1$.2f U, durata: %2$d minuti
+ AvvisoIndirizzo RileyLink non valido.Operazione non possibile.\n\nDevi prima configurare Omnipod.
- Operazione non possibile.\n\n Devi attendere qualche minuto che AAPS imposti il profilo basale per la prima volta.
- Illegal PodInitActionType: %1$sNessun pod attivo
- Verifica comando fallita
- Si è verificato un errore imprevisto. Segnalalo! (%1$s).
- Comunicazione fallita: ricevuti parametri di input non validi
- Comunicazione fallita: timeout
- Comunicazione fallita: si è verificato un errore imprevisto. Segnalalo!
- Comunicazione fallita: verifica dell\'integrità del messaggio fallita
- Comunicazione fallita: ricevuto un pacchetto non valido dal pod
- Comunicazione fallita: il pod è in uno stato non corretto
- Comunicazione fallita: ricevuta una risposta non valida dal pod
- Comunicazione fallita: ricevuto dal pod un messaggio con una sequenza numerica non valida
- Comunicazione fallita: ricevuto dal pod un messaggio con un indirizzo non valido
- Comunicazione fallita: non si è riuscito a decodificare il messaggio dal pod
- Comunicazione fallita: risincronizzazione \'nonce\' non riuscita
- Comunicazione fallita: \'nonce\' non sincronizzato
- Comunicazione fallita: non abbastanza dati ricevuti dal pod
- È stato rilevato un guasto al pod (%1$03d %2$s). Disattiva il tuo pod e avviane uno nuovo
- Comunicazione fallita: il pod ha restituito una risposta di errore
-
- Gestione pod
- Inizializza pod
+ Si è verificato un errore imprevisto. Segnalalo! (%1$s: %2$s).
+ Comunicazione fallita: verifica dell\'integrità del messaggio fallita
+ Comunicazione fallita: ricevuto un pacchetto non valido dal pod
+ Comunicazione fallita: il pod è in uno stato non corretto
+ Comunicazione fallita: ricevuta una risposta non valida dal pod
+ Comunicazione fallita: ricevuto dal pod un messaggio con una sequenza numerica non valida
+ Comunicazione fallita: ricevuto dal pod un messaggio con un indirizzo non valido
+ Comunicazione fallita: non si è riuscito a decodificare il messaggio dal pod
+ Comunicazione fallita: risincronizzazione \'nonce\' non riuscita
+ Comunicazione fallita: \'nonce\' non sincronizzato
+ Comunicazione fallita: non abbastanza dati ricevuti dal pod
+ È stato rilevato un guasto al pod (%1$03d %2$s). Disattiva il tuo pod e avviane uno nuovo
+ Comunicazione fallita: il pod ha restituito una risposta di errore
+ Nessuna risposta da RileyLink
+ RileyLink interrotto
+ Nessuna risposta dal pod
+ Impostazione profilo basale fallita. L\'erogazione potrebbe essere sospesa! Aggiorna manualmente lo stato del pod dalla scheda Omnipod e riprendi l\'erogazione se necessario.
+ L\'Impostazione del profilo basale potrebbe essere fallita. L\'erogazione potrebbe essere sospesa! Aggiorna manualmente lo stato del pod dalla scheda Omnipod e riprendi l\'erogazione se necessario.
+ Impostazione profilo basale fallita. L\'erogazione è sospesa! Riprendi manualmente l\'erogazione dalla scheda Omnipod.
+ Impostazione profilo basale fallita.
+ La cancellazione della basale temporanea potrebbe essere fallita. Aggiorna manualmente lo stato del pod dalla scheda Omnipod.
+ Impostazione basale temporanea fallita. Se una basale temporanea era precedentemente in esecuzione, potrebbe essere stata cancellata. Aggiorna manualmente lo stato del pod dalla scheda Omnipod.
+ Impostazione basale temporanea fallita. Se una basale temporanea era precedentemente in esecuzione, è stata cancellata. Aggiorna manualmente lo stato del pod dalla scheda Omnipod.
+ La durata del TBR deve essere maggiore di zero e un multiplo di %1$s minuti.
+ L\'Impostazione dell\'ora potrebbe essere fallita. L\'erogazione potrebbe essere sospesa! Aggiorna manualmente lo stato del pod dalla scheda Omnipod e riprendi l\'erogazione se necessario.
+ Impostazione ora fallita. L\'erogazione è sospesa! Riprendi manualmente l\'erogazione dalla scheda Omnipod.
+ Impossibile impostare il profilo basale: ricevuto un profilo vuoto. Assicurati di attivare il tuo profilo basale.
+ Nessun profilo basale è attivo. Assicurati di attivare il tuo profilo basale.
+ Comando personalizzato sconosciuto: %1$s
+ Impossibile leggere il log impulsi
+ Impossibile aggiornare lo stato
+ Impossibile aggiornare lo stato all\'avvio
+ Impossibile confermare gli avvisi
+ Impossibile sospendere l\'erogazione
+ Impossibile impostare l\'ora
+ Impossibile riprendere l\'erogazione
+ Impossibile cambiare automaticamente l\'ora nel pod. Dovresti sincronizzare manualmente l\'ora nella scheda Omnipod.
+ Impossibile verificare che il bolo sia riuscito. Verifica manualmente che il tuo pod stia erogando insulina ascoltando i click. Se sei sicuro che il bolo non sia riuscito, dovresti eliminare manualmente l\'inserimento del bolo dalla sezione Trattamenti, anche se fai click su \'Cancella bolo\' in questo momento!
+ Impossibile verificare che il bolo SMB (%1$.2f U) sia riuscito. Se sei sicuro che il bolo non sia riuscito, dovresti eliminare manualmente l\'inserimento dalla sezione Trattamenti.
+ Il bolo non è riuscito.
+ Inizializzazione pod fallita
+ Inserimento cannula fallito
+ Il tempo di attivazione del pod è stato superato. Questo pod non può più essere attivato.
+ Impossibile verificare l\'avanzamento dell\'attivazione. Riprova.
+ Pod sospeso
+ Impossibile eseguire BIP di test
+ Una basale temporanea è in esecuzione sul pod, ma AAPS non ne è a conoscenza. Cancella manualmente la tua basale temporanea.
+
+ Conferma
+ Ora e/o fuso orario cambiati nel pod.
+ La configurazione degli avvisi è stata aggiornata nel pod.
+ L\'ora nel pod è stata aggiornata.
+ Tutta l\'erogazione di insulina è stata sospesa.
+ Gli avvisi attivi sono stati confermati.
+ L\'erogazione di insulina è ripresa.
+
Disattiva podScarta pod
- Storico podImposta boloCancella boloImposta basale temporanea
@@ -82,88 +128,100 @@
Sospendi erogazioneRiprendi erogazioneInserimento sconosciuto
- %1$.2f U
- %1$.2f U, CHO=%2$.1f g
- Tasso: %1$.2f U, durata: %2$d min
- Se premi OK, lo stato del pod verrà resettato forzatamente e non sarai più in grado di comunicare con il pod. Fallo solo se non riesci più a comunicare con il pod. Se puoi ancora comunicare con il pod, utilizza l\'opzione Disattiva pod.\n\nSe desideri procedere, assicurati anche di rimuovere il pod dal tuo corpo.
- Storico pod non disponibile al momento.
- Riempi il pod
- \nRiempi il nuovo pod con abbastanza insulina per 3 giorni.\n\nResta in ascolto di due bip dal pod durante il processo di riempimento. Questi indicano che è stata inserita la quantità minima di 85U. Assicurati di svuotare completamente la siringa di riempimento, anche dopo aver sentito i due segnali acustici.\n\nDopo il riempimento del pod, premi Avanti.\n\nNota: non rimuovere la protezione dell\'ago del pod in questo momento.\nNota: colloca il RileyLink in posizione verticale e il pod a pochi centimetri di distanza.
- Caricamento
- Prova associazione nuovo pod e caricamento.\n\nQuando tutti gli elementi sono stati controllati, puoi premere Avanti.\n\nNota: colloca il RileyLink in posizione verticale e il pod a pochi centimetri di distanza.
- Attacca il pod
- \nPrepara il sito di infusione. Rimuovi la protezione dell\'ago del pod e il supporto adesivo e attacca il pod al sito di infusione.\n\nSe la cannula fuoriesce premi Annulla e cambia pod.\n\nPremi Avanti per inserire la cannula e iniziare l\'erogazione della basale.
- Inserimento cannula
- Prova impostazione piano basale iniziale e inserimento cannula.\n\nQuando tutti gli elementi sono stati controllati, puoi premere Avanti.
- Info pod
- \nIl pod è adesso attivo.\n\nIl tuo piano basale è stato programmato e la cannula è stata inserita.\n\nVerifica che la cannula sia stata inserita correttamente e sostituisci il tuo pod se avverti il contrario.
- Disattiva pod
- \nPremi Avanti per disattivare il pod.\n\nNota: Questo sospenderà tutta l\'erogazione di insulina e disattiverà il pod.
- Disattivazione del pod
- Disattivazione del pod.\n\nQuando tutti gli elementi sono stati controllati, puoi premere Avanti.\n\nNota: se la disattivazione fallisce di continuo, premi Annulla e usa l\'opzione Scarta pod per resettare forzatamente lo stato del pod.
- Pod disattivato.\n\nRimuovi il pod dal tuo corpo e gettalo.
- Associa pod
- Carica pod
- Riempi cannula
- Imposta profilo basale
- Cancella erogazione
- Disattiva pod
-
- Fine promemoria associazione
- Fine promemoria configurazione
- Il pod scadrà presto
- Il pod scadrà presto
- L\'arresto è imminente
- Livello serbatoio basso
- Avviso sconosciuto
- Impostazione profilo basale fallita. L\'erogazione potrebbe essere sospesa! Aggiorna manualmente lo stato del pod dalla scheda Omnipod e riprendi l\'erogazione se necessario.
- L\'Impostazione del profilo basale potrebbe essere fallita. L\'erogazione potrebbe essere sospesa! Aggiorna manualmente lo stato del pod dalla scheda Omnipod e riprendi l\'erogazione se necessario.
- Impostazione profilo basale fallita. L\'erogazione è sospesa! Riprendi manualmente l\'erogazione dalla scheda Omnipod.
- Impostazione basale temporanea fallita. Se una basale temporanea era precedentemente in esecuzione, potrebbe essere stata cancellata. Aggiorna manualmente lo stato del pod dalla scheda Omnipod.
- Impostazione basale temporanea fallita. Se una basale temporanea era precedentemente in esecuzione, è stata cancellata. Aggiorna manualmente lo stato del pod dalla scheda Omnipod.
- L\'Impostazione dell\'ora potrebbe essere fallita. L\'erogazione potrebbe essere sospesa! Aggiorna manualmente lo stato del pod dalla scheda Omnipod e riprendi l\'erogazione se necessario.
- Impostazione ora fallita. L\'erogazione è sospesa! Riprendi manualmente l\'erogazione dalla scheda Omnipod.
- Impossibile verificare se il bolo è riuscito. Verifica manualmente che il tuo pod stia erogando insulina ascoltando i click. Se sei sicuro che il bolo non sia riuscito, dovresti eliminare manualmente l\'inserimento del bolo dalla sezione Trattamenti, anche se fai click su \'Cancella bolo\' in questo momento!
- Impossibile verificare se il bolo SMB (%1$.2f U) è riuscito. Se sei sicuro che il bolo non sia riuscito, dovresti eliminare manualmente l\'inserimento dalla sezione Trattamenti.
- Statistiche RL
- Log impulsi
- LOT
- TID
- Versione firmware
- Errori
- Il profilo basale è lo stesso, non sarà impostato di nuovo.
- Reset config.ne RileyLink
- Ora e/o fuso orario cambiati nel pod
- %1$s e %2$s
- %1$s fa
- Attesa connessione RileyLink...
- Il bolo non è riuscito
- Aggiorna
- Riprendi erogazione
- Pod sospeso
- Meno di un minuto fa
- Sospendi
- Associa e carica
- Riempi cannula e imposta profilo basale
- Ottieni log impulsi
- Errore indeterminato
- Cancellata la vecchia basale temporanea, ma fallita l\'impostazione della nuova basale temporanea
+ Inizializza pod
+ Inserisci cannula
+ Leggi log impulsiImposta basale temporanea fittizia perché il pod è sospesoCancella basale temporanea fittizia creata perché il pod era sospeso
- indeterminato
- Configurazione avviso aggiornata nel pod
- RileyLink
- Altro
- Avvisi
- Beep di conferma
- Esci
- Indietro
- Avanti
+ Divisione basale temporanea a causa di un errore indeterminato nella cancellazione
+ Configurazione BIP
+ Esegui BIP di test
+
+ Gestione pod
+ Azioni
+ Strumenti
+ Attesa connessione RileyLink…
+ Attiva pod
+ Disattiva pod
+ Scarta pod
+ Storico pod
+ Statistiche RileyLink
+ Reset config.ne RileyLink
+ Leggi log impulsi
+ Lettura log impulsi…
+ Se scarti il pod, non sarai più in grado di comunicare con esso. Dovresti farlo solo quando tutte le comunicazioni col pod falliscono persistentemente. Se puoi ancora comunicare col pod, usa l\'opzione Disattiva pod.\n\nSe desideri procedere, assicurati di rimuovere il pod dal tuo corpo!
+ Esegui BIP di test
+ BIP di test in esecuzione…
+
+ AnnullaFine
- Descrizione
- Fonte
- Data
- Tipo:
+ Avanti
+ Riprova
+ Disattiva pod
+ Scarta pod
+ Non hai ancora completato tutti i passaggi. Sei sicuro di voler uscire?
+ Esci
+
+ Riempi pod
+ Riempi un nuovo pod con abbastanza insulina per 3 giorni.\n\nResta in ascolto di due bip dal pod durante il processo di riempimento. Questi indicano che è stata inserita la quantità minima di 85U. Assicurati di svuotare completamente la siringa di riempimento, anche dopo aver sentito i due segnali acustici.\n\nDopo il riempimento del pod, premi Avanti.\n\nNota: non rimuovere la protezione dell\'ago del pod in questo momento.\nNota: colloca il RileyLink in posizione verticale e il pod a pochi centimetri di distanza.
+ Inizializza pod
+ Tentativo di associazione nuovo pod e caricamento.\n\nQuando il processo di inizializzazione è stato completato con successo, puoi premere Avanti.\n\nNota: colloca il RileyLink in posizione verticale e il pod a pochi centimetri di distanza.
+ Collega pod
+ Prepara il sito di infusione. Rimuovi la protezione dell\'ago del pod e il supporto adesivo e collega il pod al sito di infusione.\n\nSe la cannula fuoriesce premi Annulla e scarta il pod.\n\nPremi Avanti per inserire la cannula e iniziare l\'erogazione della basale.
+ Quando premi OK, la cannula verrà inserita. Assicurati di aver collegato il pod al sito di infusione.
+ Inserisci cannula
+ Tentativo di impostare il piano basale iniziale e inserire la cannula.\n\nQuando la cannula è stata inserita con successo, puoi premere Avanti.
+ Pod attivato
+ Il nuovo pod è ora attivo.\n\nIl tuo piano basale è stato programmato e la cannula è stata inserita.\n\nVerifica che la cannula sia stata inserita correttamente e sostituisci il tuo pod se avverti il contrario.
+
+ Disattiva pod
+ Premi Avanti per disattivare il pod.\n\nNota: Questo sospenderà tutta l\'erogazione di insulina e disattiverà il pod.
+ Disattivazione pod
+ Disattivazione del pod.\n\nQuando la disattivazione è correttamente completata, puoi premere Avanti.
+ Pod disattivato
+ Il tuo pod è stato disattivato.\n\nRimuovi il pod dal tuo corpo e gettalo.
+ Pod scartato
+ Lo stato del pod è stato scartato. L\'erogazione di insulina non è stata sospesa perché il pod non è stato correttamente disattivato!\n\nRimuovi il pod dal tuo corpo e smaltiscilo.
+ Se scarti il pod, non sarai più in grado di comunicare con esso. Dovresti farlo solo quando tutte le comunicazioni col pod falliscono persistentemente. Se sicuro di voler scartare il pod?
+ Scarta pod
+
+ Imposta ora
+ Sospendi
+ Aggiorna
+ Riprendi erogazione
+ GSTN pod
+ Conferma avvisi
+ Stato pod
+ Totale erogato
+ %1$.2f U
+ Indirizzo pod
+ Scadenza pod
+ Ultima connessione
+ Ultimo bolo
+ Velocità basale temporanea
+ Velocità basale originale
+ Serbatoio
+ Attiva avvisi pod
+ Versione firmware
+ Ora nel pod
+ %1$.2fU/h @%2$s (%3$d/%4$d minuti)
+ %1$.2f U rimanenti
+ Oltre 50 U rimanenti
+ Errori
+
+ Integrazione del microinfusore Omnipod, richiede un dispositivo RileyLink (con almeno il firmware 2.0).
+ indeterminato
+ Log impulsi
+ Log impulsi (copiato negli appunti)
+ Sì
+ No
+ OK
+ Annulla
+
+ Momenti fa
+ Meno di un minuto fa
+ %1$s e %2$s
+ %1$s fa%1$d minuto%1$d minuti
@@ -176,4 +234,8 @@
%1$d giorno%1$d giorni
+
+ Avviso pod: %1$s
+ Avvisi pod: %1$s
+
diff --git a/omnipod/src/main/res/values-iw-rIL/strings.xml b/omnipod/src/main/res/values-iw-rIL/strings.xml
index 036e78a8a3..1a1df65e27 100644
--- a/omnipod/src/main/res/values-iw-rIL/strings.xml
+++ b/omnipod/src/main/res/values-iw-rIL/strings.xml
@@ -1,11 +1,250 @@
-
-
-
-
-
+
+
+
+ צפצופי בולוס מופעלים
+ צפצופי בזאלי מופעלים
+ צפצופי SMB מופעלים
+ צפצופי בזאלי זמני מופעלים
+ הצג לחצן \"השהיית מתן אינסולין\" בלשונית אומניפוד
+ הצג לחצן \"יומן פעימות\" בתפריט ניהול פוד
+ הצג לחצן \"סטטיסטיקת ריילילינק\" בתפריט ניהול פוד
+ זיהוי אזור זמן ושעון קיץ מופעל
+ תזכורת לתפוגה מופעלת
+ שעות לפני כיבוי
+ התראת מכל נמוך מופעלת
+ מספר יחידות
+ צליל של התראת בזאלי זמני לא ברור מאופשר
+ צליל של התראת SMB לא ברור מאופשר
+ צליל של התראת בולוס לא ברור מאופשר
+ קבל התראות מהפוד אוטומטית
+ ריילילינק
+ אחר
+ התראות
+ צפצופי אישור
+ התראות
+
+ אין פוד פעיל
+ התקנה בביצוע (בהמתנה להפעלת הפוד)
+ התקנה בביצוע (בהמתנה להכנסת הפרפרית)
+ פועל
+ מושהה
+ תקלה בפוד
+ חריגת זמן הפעלה
+ לא פעיל
+ תקלת פוד: %1$03d %2$s
+
+ תזכורת לסיום זיווג
+ תזכורת לסיום התקנה
+ תוקף הפוד יפוג בקרוב
+ תוקף הפוד יפוג בקרוב
+ כיבוי בלתי נמנע
+ מכל נמוך
+ התראה לא ידועה
+
+ היסטוריית הפוד
+ תיאור
+ מקור
+ תאריך
+ סוג:
+ %1$.2f יח\'
+ %1$.2f יח\', פחמ\'= %2$.1f גר\'
+ קצב: %1$.2f יח\', משך: %2$d דק\'
-
-
+ אזהרה
+ כתובת ריילילינק לא חוקית.
+ הפעולה אינה אפשרית.\n\nיש להגדיר קודם את אומניפוד על מנת לבצע פעולה זו.
+ אין פוד פעיל
+ אירעה שגיאה לא צפויה. נא לדווח! (%1$s: %2$s).
+ התקשורת נכשלה: אימות תקינות ההודעה נכשל
+ התקשורת נכשלה: התקבלה חבילת נתונים לא חוקית מהפוד
+ התקשורת נכשלה: הפוד במצב לא נכון
+ התקשורת נכשלה: התקבלה תגובה לא חוקית מהפוד
+ התקשורת נכשלה: התקבלה הודעה עם רצף מספרים לא חוקי מהפוד
+ התקשורת נכשלה: התקבלה הודעה עם כתובת לא חוקית מהפוד
+ התקשורת נכשלה: פענוח הודעה מהפוד נכשלה
+ התקשורת נכשלה: נכשל סינכרון מחדש של nonce
+ התקשורת נכשלה: nonce לא מסונכרן
+ התקשורת נכשלה: לא התקבלו מספיק נתונים מהפוד
+ נמצאה תקלת פוד (%1$03d %2$s) נא להשבית את הפוד ולהחליפו בחדש
+ התקשורת נכשלה: הפוד החזיר תגובת שגיאה
+ אין תגובה מריילילינק
+ רילילינק הופרע
+ אין תגובה מהפוד
+ הגדרת הפרופיל הבזאלי נכשלה. הזרקת האינסולין עלולה להעצר! נא לרענן ידנית את סטטוס הפוד בלשונית Omnipod ולחדש את ההזרקה במידת הצורך.
+ ייתכן שהגדרת הפרופיל הבזאלי נכשלה. הזרקת האינסולין עלולה להעצר! נא לרענן ידנית את סטטוס הפוד בלשונית Omnipod ולחדש את ההזרקה במידת הצורך.
+ הגדרת הפרופיל בזאלי נכשלה. ההזרקה מושהית! נא לחדש את ההזרקה ידנית בלשונית Omnipod.
+ הגדרת פרופיל בזאלי נכשלה.
+ ייתכן שביטול הבזאלי הזמני נכשל. נא לרענן באופן ידני את סטטוס הפוד מהלשונית Omnipod.
+ הגדרת בזאלי זמני נכשלה. אם בזאלי זמני הוחל קודם לכן, ייתכן שהוא בוטל. נא לרענן באופן ידני את סטטוס הפוד מהלשונית Omnipod.
+ הגדרת בזאלי זמני נכשלה. אם בזאלי זמני הוחל קודם לכן, הוא בוטל. נא לרענן באופן ידני את סטטוס הפוד מהלשונית Omnipod.
+ משך של בזאלי זמני חייב להיות גדול מאפס וכפולה של %1$s דקות.
+ ייתכן שהגדרת השעה נכשלה. הזרקת האינסולין עלולה להעצר! נא לרענן ידנית את סטטוס הפוד בלשונית Omnipod ולחדש את ההזרקה במידת הצורך.
+ הגדרת השעה נכשלה. הזרקת האינסולין עלולה להעצר! נא לרענן ידנית את סטטוס הפוד בלשונית Omnipod ולחדש את ההזרקה במידת הצורך.
+ כשל בהגדרת הפרופיל הבזאלי: התקבל פרופיל ריק. נא להפעיל את הפרופיל שלכם.
+ אין פרופיל בזאלי פעיל. נא להפעיל את הפרופיל הבזאלי שלכם.
+ פקודה מותאמת אישית לא ידועה: %1$s
+ קריאת יומן פעימות נכשלה
+ נסיון עדכון סטטוס נכשל
+ רענון סטטוס בזמן האתחול נכשל
+ לא ניתן להכיר בהתראות
+ השעיית ההזרקה נכשלה
+ הגדרת הזמן נכשלה
+ חידוש ההזרקה נכשל
+ לא ניתן לשנות את זמן הפוד באופן אוטומטי. יש לסנכרן באופן ידני את הזמן בלשונית Omnipod.
+ לא ניתן לאמת שהבולוס הצליח. נא לאמת את מתן האינסולין ע\"י הקשבה לקליקים. אם אתם בטוחים שהבולוס נכשל, עליכם למחוק את רשומת הבולוס מהטיפולים, גם אם לחצתם עכשיו על \'ביטול בולוס\'.
+ לא ניתן לאמת שבולוס SMB (%1$.2f יח\') הצליח. אם אתם בטוחים שהבולוס נכשל, עליכם למחוק את רשומת ה-SMB מהטיפולים.
+ הבולוס נכשל.
+ אתחול הפוד נכשל
+ הכנסת הצינורית נכשלה
+ זמן ההפעלה של הפוד חורג. לא ניתן להפעיל את פוד זה יותר.
+ אימות התקדמות ההפעלה נכשל. אנא נסו שנית.
+ הפוד מושהה
+ השמעת צפצוף בדיקה נכשלה
+ בזאלי זמני מופעל בפוד אבל AAPS אינו מודע לבזאלי זמני זה. יש לבטל את הבזאלי הזמני באופן ידני.
+
+ אימות
+ שעה ו/או אזור הזמן השתנו בפוד.
+ הגדרת ההתראות בפוד עודכנה.
+ שעון הפוד עודכן.
+ כל הזרקת אינסולין הושהתה.
+ התראות פעילות אושרו.
+ מתן האינסולין חודש.
+
+ השבת פוד
+ השלכת הפוד
+ הגדרת בולוס
+ ביטול בולוס
+ הגדרת בזאלי זמני
+ ביטול בזאלי זמני (פנימית על ידי הדרייבר)
+ ביטול בזאלי זמני
+ הגדרת לו\"ז בזאלי
+ קבלת סטטוס הפוד
+ קבלת מידע על הפוד
+ הגדרת שעה
+ הגדרת התראות
+ קבלת ההתראות
+ השהה הזרקה
+ חידוש הזרקה
+ רשומה לא ידועה
+ אתחול פוד
+ הכנסת צינורית
+ קרא יומן פעימות
+ הגדר בזאלי זמני מזויף כי הפוד מושהה
+ בטל בזאלי זמני מזויף שנוצר מפני שהפוד הושהה
+ פיצול הבזאלי הזמני עקב כשל לא ברור בביטול
+ הגדרות צפצוף
+ השמע צפצוף ניסיון
+
+ ניהול פוד
+ פעולות
+ כלים
+ ממתין לחיבור לריילילינק…
+ הפעלת פוד
+ השבת פוד
+ השלכת פוד
+ היסטוריית הפוד
+ סטטיסטיקת ריילילינק
+ איפוס תצורת ריילילינק
+ קרא יומן פעימות
+ קורא יומן פעימות…
+ אם הפוד יושבת, לא יהיה ניתן לתקשר איתו יותר. יש לבצע זאת רק כאשר כל ניסיונות ההתקשרות עם הפוד נכשלים. אם עדיין ניתן לתקשר עם הפוד, יש לבחור באפשרות השבת פוד.\n\n
+אם מעוניינים להמשיך, יש לוודא הסרה וניתוק הפוד מהגוף!
+ השמע צפצוף ניסיון
+ משמיע צפצוף ניסיון…
+
+ ביטול
+ סיום
+ הבא
+ נסה שנית
+ השבת פוד
+ השלכת הפוד
+ עוד לא סיימתם את כל הצעדים. אתם בטוחים שברצונכם לצאת?
+ יציאה
+
+ מילוי פוד
+ מלאו פוד חדש עם מספיק אינסולין לשלושה ימים.\n\nהקשיבו לשני צפצופים מהפוד במהלך המילוי. הם מציינים שהכמות המינימלית של 85 יח\' הוכנסה. הקפידו לרוקן לחלוטין את מזרק המילוי, גם לאחר שמיעת שני הצפצופים.\n\nלאחר מילוי הפוד, יש ללחוץ הבא.\n\nהערה: עוד לא להסיר את מכסה המחט.\n הערה: נא למקם את הריילילינק במצב עומד ובמרחק סנטימטרים בודדים מהפוד.
+ אתחול פוד
+ מנסה לזווג הפוד החדש ולאתחלו.\n\nכאשר תהליך האתחול יושלם, ניתן ללחוץ על הבא.\n\nשימו לב: נא למקם את הריילילנק במצב אנכי ולמקם את הפוד כמה סנטימטרים ממנו.
+ הצמד פוד
+ הכינו את אתר העירוי. הסירו את מכסה המחט של הפוד ואת כיסוי הדבק והדביקו את הפוד לאתר העירוי.\n\nאם הצינורית בולטת, לחצו על ביטול והיפטרו מהפוד.\n\nלחצו הבא כדי להכניס את הצינורית ולהתחיל מתן בזאלי.
+ בלחיצה על OK הצינורית תוכנס. יש לוודא שהפוד הוצמד לאתר העירוי.
+ הכנסת צינורית
+ מנסה להגדיר לו\"ז בזאלי התחלתי ולהכניס את הצינורית.\n\nכאשר הצינורית תוכנס בהצלחה, ניתן יהיה ללחוץ הבא.
+ הפוד הופעל
+ הפוד החדש פעיל כעת.\n\nהלו\"ז הבזאלי הוגדר והצינורית הוכנסה.\n\nאנא ודאו כי הצינורית הוכנסה כהלכה, אם לדעתכם היא לא, יש להחליף את הפוד.
+
+ השבת פוד
+ לחצו הבא כדי להשבית את הפוד.\n\nהערה: פעולה זו תשהה כל הזרקת אינסולין ותשבית את הפוד.
+ בתהליך כיבוי הפוד
+ משבית את הפוד.\n\nכאשר ההשבתה תושלם, תוכלו ללחוץ על הבא.
+ הפוד הושבת
+ הפוד שלכם כבר לא פעיל.\n\nכעת יש להסיר את הפוד ולמחזרו.
+ פוד נזרק
+ מצב הפוד נמחק. הזרקת האינסולין לא הושהתה כי הפוד לא הושבת כהלכה!\n\nנא להסיר את הפוד מהגוף ולמחזרו.
+ אם תזרקו את הפוד, לא תוכלו לתקשר איתו יותר. כדאי לעשות את זה רק כאשר כל תקשורת עם הפוד תמיד נכשלת. אתם בטוחים שברצונכם לזנוח את הפוד?
+ השלכת הפוד
+
+ הגדרת שעה
+ השהיה
+ רענן
+ חידוש הזרקה
+ ניהול הפוד
+ קבל התראות
+ סטטוס הפוד
+ סה\"כ שהוזרק
+ %1$.2f יח\'
+ כתובת הפוד
+ תפוגת הפוד
+ חיבור אחרון
+ בולוס אחרון
+ בזאלי זמני
+ בזאלי בסיסי
+ מכל
+ התראות פוד פעילות
+ גרסת קושחה
+ זמן פעילות הפוד
+ %1$.2f יח\'\ש\' @ %2$s (%3$d\%4$d דק\')
+ %1$.2f יח\' נותרו
+ נותרו יותר מ-50 יח\'
+ שגיאות
+
+ חיבור משאבת Omnipod, דרוש התקן ריילילינק (עם גרסת קושחה 2.0 לפחות).
+ לא בטוח
+ יומן פעימות
+ יומן פעימות (מועתק ללוח ההעתקה)
+ כן
+ לא
+ אישור
+ ביטול
+
+ לפני כמה רגעים
+ לפני פחות מדקה
+ %1$s ו-%2$s
+ לפני %1$s
+
+ %1$d דקה
+ %1$d דקות
+ %1$d דקות
+ %1$d דקות
+
+
+ %1$d שעה
+ %1$d שעות
+ %1$d שעות
+ %1$d שעות
+
+
+ %1$d יום
+ %1$d ימים
+ %1$d ימים
+ %1$d ימים
+
+
+ התראת פוד: %1$s
+ התראות פוד: %1$s
+ התראות פוד: %1$s
+ התראות פוד: %1$s
+
diff --git a/omnipod/src/main/res/values-ko-rKR/strings.xml b/omnipod/src/main/res/values-ko-rKR/strings.xml
index 036e78a8a3..67511ccc70 100644
--- a/omnipod/src/main/res/values-ko-rKR/strings.xml
+++ b/omnipod/src/main/res/values-ko-rKR/strings.xml
@@ -1,11 +1,19 @@
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values-lt-rLT/strings.xml b/omnipod/src/main/res/values-lt-rLT/strings.xml
index 0ff222e9a7..ee942d8b25 100644
--- a/omnipod/src/main/res/values-lt-rLT/strings.xml
+++ b/omnipod/src/main/res/values-lt-rLT/strings.xml
@@ -1,9 +1,8 @@
-
-
- Omnipod pompos integracijai reikalingas RileyLink (programinės įrangos versija ne mažiau 2.0).
-
+
+
+
Boluso signalai įjungtiBazės signalai įjungtiSMB signalai įjungti
@@ -11,34 +10,117 @@
Vasaros laiko/Laiko juostos aptikimas įgalintasGaliojimo pabaigos priminimasValandos prieš išsijungimą
-
- liko %1$.2f U
- Daugiau nei 50 U
-
- Omnipod (433.91 MHz)
-
- Neteisingas inicijavimo tipas:%1$s
- Įvyko netikėta klaida. Prašome pranešti! (tipas: %1$s).
- Ryšio klaida: įvyko netikėta klaida. Prašome pranešti!
-
- Inicijuoti POD
- Išjungti POD
- POD istorija šiuo metu nėra prieinama.
- Užpildyti POD
- Užpildymas
- Prijunkite POD
- \nParuoškite infuzijos vietą. Nuimkite adatos apsauginį dangtelį, pleistro apsaugą ir užklijuokite POD ant infuzijos vietos.\n\nJei kaniulė atšoks, paspauskite Atšaukti ir pakeiskite POD.\n\nSpauskite Kitas, norėdami įvesti kaniulę ir pradėti leisti insuliną.
- Įvedama kaniulė
- Mėginkite nustatyti pradinį bazės profilį ir įvesti kaniulę.\n\nKai visi elementai yra patikrinti, galite paspausti Kitas.
- \nPOD yra aktyvus.\n\nJūsų bazės profilis yra suprogramuotas ir kaniulė įvesta.\n\nPatikrinkite, ar kaniulė buvo tinkamai įvesta, ir, jei jaučiate, kad taip nėra, pakeiskite POD.
- \nSpustelėkiteKitas, kad išjungtumėte POD.\n\nPastaba: Tai sustabdys insulino leidimą ir išjungs POD.
- POD išjungimas
- POD išjungtas.\n\nNuimkite POD nuo odos ir jį išmeskite.
- POD suporavimas
- POD užpildymas
-
+ Įgalintas įspėjimas apie žemą rezervuaro lygį
+ Vienetų skaičius
+ RileyLink
+ Kiti
+ Perspėjimai
+ Patvirtinimo signalai
+ Pranešimai
+
+ Nėra aktyvaus Pod
+ Vykdomas nustatymas (laukiama Pod aktyvavimo)
+ Vykdomas nustatymas (laukiama kaniulės įvedimo)
+ Vykdoma
+ Sustabdyta
+ Pod klaida
+ Viršytas aktyvinimo laikas
+ Neaktyvus
+
+ Priminimas apie suporavimo pabaigąPriminimas apie sąrankos pabaigą
+ Pod galiojimas greitai baigsis
+ Pod galiojimas greitai baigsisIšjungimas yra neišvengiamasŽemas rezervuaro lygisNežinomas perspėjimas
+
+ Pod istorija
+ Aprašymas
+ Šaltinis
+ Data
+ Tipas:
+ %1$.2f vv
+ %1$.2f vv, AV=%2$.1f g
+ Kiekis: %1$.2f vv, trukmė: %2$d min
+
+ Perspėjimas
+ RileyLink adresas neteisingas.
+ Operacija negalima.\n\n Pirmiausia turite sukonfigūruoti Omnipod pompą prieš atliekant šią operaciją.
+ Nėra aktyvaus Pod
+ Įvyko netikėta klaida. Prašome pranešti! (%1$s: %2$s).
+ Ryšio klaida: pranešimo vientisumo patikra nepavyko
+ Ryšio klaida: netinkami įvesties iš Pod parametrai
+ Ryšio klaida: Pod būklė yra netinkama
+ Ryšio klaida: gautas netinkamas atsakymas iš Pod
+ Ryšio klaida: iš Pod gautas pranešimas su negaliojančiu serijos numeriu
+ Ryšio klaida: iš Pod gautas pranešimas su netinkamu adresu
+ Ryšio klaida: nepavyko iššifruoti pranešimo iš Pod
+ Ryšio klaida: nepavyko iš naujo sinchronizuoti unikalų kodą
+ Ryšio klaida: unikalus kodas nebuvo sinchronizuotas
+ Ryšio klaida: iš Pod gauta nepakankamai duomenų
+ Aptikta Pod klaida (%1$03d %2$s). Deaktyvuokite Pod ir aktyvuokite naują
+ Ryšio klaida: Pod pateikė klaidos atsakymą
+ Nėra atsakymo iš RileyLink
+ RileyLink ryšys pertrauktas
+ Nėra atsakymo iš Pod
+ Nepavyko nustatyti bazės profilio. Insulino leidimas gali būti nutrauktas! Rankiniu būdu atnaujinkite Pod būseną Omnipod skirtuke ir, jei reikia, atnaujinkite insulino leidimą.
+ Gali būti, kad bazės profilis nebuvo nustatytas. Insulino leidimas gali būti nutrauktas! Rankiniu būdu atnaujinkite Pod būseną Omnipod skirtuke ir, jei reikia, atnaujinkite insulino leidimą.
+ Nepavyko nustatyti bazės profilio. Insulino leidimas buvo sustabdytas! Rankiniu būdu iš Omnipod skirtuko atnaujinkite insulino leidimą.
+ Nepavyko nustatyti laikinos valandinės bazės. Jei laikina bazė buvo pradėta anksčiau, ji gali būti atšaukta. Rakiniu būdu atnaujinkite Pod būseną Omnipod skirtuke.
+ Gali būti, kad nepavyko nustatyti laikinos valandinės bazės. Jei laikina bazė buvo pradėta anksčiau, ji yra atšaukta. Rakiniu būdu atnaujinkite Pod būseną Omnipod skirtuke.
+ Gali būti, kad laikas nebuvo nustatytas. Insulino leidimas gali būti nutrauktas! Rankiniu būdu atnaujinkite Pod būseną Omnipod skirtuke ir, jei reikia, atnaujinkite insulino leidimą.
+ Nepavyko nustatyti laiko. Insulino leidimas sustabdytas! Rankiniu būdu atnaujinkite insulino leidimą iš Omnipod skirtuko.
+
+
+ Išjungti POD
+ Išmesti Pod
+ Nustatyti bolusą
+ Atšaukti bolusą
+ Nustatyti laikiną bazę
+ Atšaukti laikiną bazę (vidinis valdiklis)
+ Atšaukti laikiną bazę
+ Nustatyti bazės tvarkaraštį
+ Gauti Pod būseną
+ Gauti Pod informaciją
+ Nustatyti laiką
+ Konfigūruoti perspėjimus
+ Patvirtinti perspėjimus
+ Sustabdyti suleidimą
+ Atnaujinti suleidimą
+ Nežinomas Įrašas
+ Nustatykite netikrą laikiną bazę, nes Pod sustabdyta
+ Atšaukite netikrą laikiną bazę, kuri buvo nustatyta dėl to, kad Pod buvo sustabdyta
+
+
+ Užbaigti
+ Kitas
+
+
+
+
+ neaiški
+
+ Neseniai
+ Mažiau nei prieš minutę
+ %1$s ir %2$s
+ prieš %1$s
+
+ %1$d min.
+ %1$d min.
+ %1$d min.
+ %1$d min.
+
+
+ %1$d val.
+ %1$d val.
+ %1$d val.
+ %1$d val.
+
+
+ %1$d d.
+ %1$d d.
+ %1$d d.
+ %1$d d.
+
diff --git a/omnipod/src/main/res/values-nl-rNL/strings.xml b/omnipod/src/main/res/values-nl-rNL/strings.xml
index 9f4a584644..aaeaa8f5fa 100644
--- a/omnipod/src/main/res/values-nl-rNL/strings.xml
+++ b/omnipod/src/main/res/values-nl-rNL/strings.xml
@@ -1,37 +1,237 @@
-
-
- Pomp integratie voor Omnipod, vereist RileyLink (met firmware 2.0 of hoger).
-
-
- %1$.2f E over
- Meer dan 50 E
-
- Omnipod (433,91 MHz)
-
- Ongeldig PodInitActionType: %1$s
- Er is een onverwachte fout opgetreden. Rapporteer dit alsjeblieft! (type: %1$s).
- Communicatie mislukt: er is een onvoorziene fout opgetreden. Rapporteer dit alsjeblieft!
-
- Initialiseer Pod
- Deactiveer Pod
- Pod Historie momenteel niet beschikbaar.
- Vul de Pod
- Uitvullen
- Plaats de Pod
- \nBereid het plaatsen voor. Verwijder de beschermdop van de naald en haal de papiertjes van de sticker.\n\n(Mocht je zien dat de canule uitsteekt, druk dan op Annuleren en begin overnieuw met een andere Pod.)\n\nBevestig de Pod op de huid. Druk op Volgende om de canule te gaan inschieten en de insulinetoediening te laten starten.
- Canule inschieten
- De basaalstand wordt ingesteld en de canule wordt ingeschoten.\n\nWanneer alle onderdelen zijn afgerond, druk je op Volgende.
- \nDe Pod is nu actief.\n\nJouw basaalprofiel is ingeladen in de Pod en de canule is ingebracht.\n\nControleer of de canule correct is geplaatst en vervang de Pod als je denkt dat er iets is misgegaan.
- \nDruk op Volgende om de Pod te deactiveren.\n\nOpmerking: Hiermee wordt de insuline toediening gestopt en wordt de Pod gedeactiveerd.
- Deactiveren van de Pod
- Pod gedeactiveerd.\n\nVerwijder de Pod van je lichaam en gooi hem weg.
- Pod Koppelen
- Pod Uitvullen
-
+
+
+
+ Bolus pieptonen ingeschakeld
+ Basaal pieptonen ingeschakeld
+ SMB pieptonen ingeschakeld
+ Tijdelijk basaal pieptonen ingeschakeld
+ Knop voor het onderbreken van insulinetoediening weergeven in het Omnipod-tabblad
+ Knop voor het uitlezen van het Pulslog weergeven in het Podbeheer menu
+ Knop voor RileyLink statistieken weergeven in het Omnipod-tabblad
+ Zomertijd-/tijdzonedetectie ingeschakeld
+ Pieptonen voor uiterste gebruiksdatum ingeschakeld
+ Aantal uur voordat de Pod stopt
+ Pieptonen voor \"Reservoir bijna leeg\" ingeschakeld
+ Aantal eenheden
+ Geluid voor onzekere TBR notificaties ingeschakeld
+ Geluid voor onzekere SMB notificaties ingeschakeld
+ Geluid voor onzekere bolus notificaties ingeschakeld
+ Podwaarschuwingen automatisch bevestigen
+ RileyLink
+ Overige
+ Waarschuwingen
+ Pieptonen
+ Notificaties
+
+ Geen actieve Pod
+ Setup wordt uitgevoerd (in afwachting van Pod activering)
+ Setup wordt uitgevoerd (in afwachting van het inbrengen van de canule)
+ Actief
+ Onderbroken
+ Pod fout
+ Activatietijd overschreden
+ Inactief
+ Podfout: %1$03d %2$s
+
+ Herrinering om Pod initialisatie af te rondenHerinnering setup afronden
+ Pod verloopt binnenkort
+ Pod verloopt binnenkortSchakelt zeer binnenkort uitLaag reservoirOnbekend alarm
+
+ Pod historie
+ Beschrijving
+ Bron
+ Datum
+ Type:
+ %1$.2f E
+ %1$.2f E, KH=%2$.1f g
+ Basaal: %1$.2f E, Duur: %2$d min
+
+ Waarschuwing
+ RileyLink adres ongeldig.
+ Bewerking is niet mogelijk.\n\nJe moet eerst Omnipod ingesteld hebben, voordat je deze bewerking kunt gebruiken.
+ Geen actieve Pod
+ Er is een onverwachte fout opgetreden. A.u.b rapporteren! (%1$s: %2$s).
+ Communicatie mislukt: berichtintegriteit kon niet worden geverifieerd
+ Communicatie mislukt: ongeldige gegevens ontvangen van de Pod
+ Communicatie mislukt: de Pod bevindt zich in een verkeerde staat
+ Communicatie mislukt: ongeldig antwoord ontvangen van de Pod
+ Communicatie mislukt: bericht met ongeldig volgnummer ontvangen van de Pod
+ Communicatie mislukt: bericht met ongeldig adres ontvangen van de Pod
+ Communicatie is mislukt: kon bericht van de Pod niet decoderen
+ Communicatie mislukt: nonce resync is mislukt
+ Communicatie mislukt: nonce out of sync
+ Communicatie mislukt: onvoldoende gegevens ontvangen van de Pod
+ Een Podfout (%1$03d %2$s) is gedetecteerd. Deactiveer de Pod en activeer een nieuwe
+ Communicatie mislukt: de Pod heeft een foutrespons gegeven
+ Geen reactie van RileyLink
+ RileyLink onderbroken
+ Geen reactie van de Pod
+ Instellen van basaal profiel is mislukt. De insulinetoediening kan onderbroken zijn! Vernieuw de Pod-status handmatig in het Omnipod tabblad en hervat de toediening indien nodig.
+ Instellen van basaal profiel is misschien mislukt. De insulinetoediening kan onderbroken zijn! Vernieuw de Pod-status handmatig in het Omnipod-tabblad en hervat de toediening indien nodig.
+ Instellen van basaal profiel is mislukt. Insulinetoediening is onderbroken! Hervat de toediening handmatig vanaf het Omnipod tabblad.
+ Instellen van basaal profiel mislukt.
+ Het annuleren van de tijdelijk basaal is mogelijk mislukt. Vernieuw de Pod-status handmatig vanaf het Omnipod-tabblad.
+ Het instellen van een tijdelijke basaal is mislukt. Als een tijdelijk basaal eerder actief was, is deze mogelijk geannuleerd. Vernieuw de Pod-status handmatig vanaf het Omnipod tabblad.
+ Het instellen van tijdelijk basaal is misschien mislukt. Als een tijdelijke basaal eerder actief was, is deze geannuleerd. Vernieuw de Pod-status handmatig vanaf het Omnipod tabblad.
+ Tijdelijke basaal duur moet groter zijn dan nul en een veelvoud van %1$s minuten.
+ Instellen van de tijd is misschien mislukt. De insulinetoediening kan onderbroken zijn! Vernieuw de Pod-status handmatig in het Omnipod tabblad en hervat de toediening indien nodig.
+ Het instellen van de tijd is mislukt. Insulinetoediening is onderbroken! Hervat de toediening handmatig vanaf het Omnipod tabblad.
+ Het instellen van het basaal profiel is mislukt: geen profiel ontvangen. Controleer of je profiel geactiveerd is.
+ Er is geen basaal profiel actief. Activeer een profiel.
+ Onbekend commando: %1$s
+ Lezen van Pulslog is mislukt
+ Verversen van status is mislukt
+ Status vernieuwen mislukt bij opstarten
+ Bevestigen van waarschuwingen is mislukt
+ Onderbreken van insulinetoediening is mislukt
+ Instellen van de tijd mislukt
+ Hervatten van insulinetoediening is mislukt
+ Het automatisch wijzigen van de tijd op de Pod is mislukt. Synchroniseer de tijd handmatig via het Omnipod-tabblad.
+ Kan niet controleren of de bolus is geslaagd. Controleer handmatig of de Pod aan het bolussen is door te luisteren naar klik-geluidjes van de Pod. Als je zeker weet dat de bolus niet is geslaagd, moet je deze bolus handmatig uit \'Behandelingen\' verwijderen, zelfs als je nu op \'Annuleren\' drukt!
+ Kan niet controleren of SMB bolus (%1$.2f U) geslaagd is. Als je zeker weet dat de bolus niet geslaagd is, moet je deze handmatig verwijderen uit \'Behandelingen\'.
+ Bolus mislukt.
+ Het initialiseren van de Pod is mislukt
+ Het inbrengen van de canule is mislukt
+ De activeringstijd van de pod is overschreden. Deze Pod kan niet meer geactiveerd worden.
+ Controleren van activatiestatus is mislukt. Probeer het opnieuw.
+ Pod onderbroken
+ Testpiep afspelen mislukt
+ Er loopt een tijdelijk basaal op de Pod, maar AndroidAPS is zich niet bewust van deze tijdelijke basaal. Annuleer de tijdelijke basal handmatig.
+
+ Bevestiging
+ Tijd en/of tijdzone gewijzigd op de Pod.
+ De instellingen voor meldingen zijn bijgewerkt in de Pod.
+ De tijd in de Pod is geüpdatet.
+ Alle insulinetoediening is onderbroken.
+ Actieve meldingen zijn bevestigd.
+ Insulinetoediening is hervat.
+
+ Deactiveer Pod
+ Pod verwerpen
+ Bolus toedienen
+ Annuleer Bolus
+ Tijdelijke basaal instellen
+ Tijdelijke basaal annuleren (intern door driver)
+ Tijdelijk basaal annuleren
+ Basaalprofiel instellen
+ Pod status ophalen
+ Pod info ophalen
+ Tijd instellen
+ Meldingen configureren
+ Meldingen bevestigen
+ Insulinetoediening onderbreken
+ Insulinetoediening hervatten
+ Onbekende invoer
+ Pod initialiseren
+ Canule inbrengen
+ Pulslog lezen
+ Neppe tijdelijk basaal omdat insulinetoediening onderbroken is
+ Annuleren van vals tijdelijk basaal wat ontstaan is omdat de insulinetoediening onderbroken was
+ Pieptoonconfiguratie
+ Testpieptoon afspelen
+
+ Pod beheer
+ Wachten op verbinding met RileyLink…
+ Activeer Pod
+ Deactiveer Pod
+ Pod verwerpen
+ Pod historie
+ RileyLink statistieken
+ Pulslog uitlezen
+ Pulslog aan het uitlezen…
+ Als je de Pod verwerpt, kun je er niet meer mee communiceren. Doe dit alleen als communicatie met de Pod aanhoudend mislukt. Als je nog steeds kunt communiceren met de Pod, gebruik dan de Pod deactiveren optie.\n\nVerwijder de Pod van de huid als je ervoor kiest om door te gaan!
+ Testpieptoon afspelen
+ Testpieptoon aan het afspelen…
+
+ Annuleren
+ Voltooien
+ Volgende
+ Opnieuw proberen
+ Deactiveer Pod
+ Pod verwerpen
+ Je hebt nog niet alle stappen voltooid. Weet je zeker dat je wilt afsluiten?
+ Afsluiten
+
+ Pod vullen
+ \nVul de nieuwe Pod met voldoende insuline voor 3 dagen.\n\nLuister of je twee piepjes hoort tijdens het vullen. Deze geven aan dat de minimum hoeveelheid van 85 eenheden is bereikt. Ook als je de twee piepjes hebt gehoord ga je verder met vullen totdat de vulspuit volledig leeg is.\n\nNa het vullen van de Pod druk je op Volgende.\n\nOpmerking: verwijder de beschermkap van de naald nog niet!\nOpmerking: zet de RileyLink rechtop en leg de Pod er ongeveer 10 centimeter vandaan.
+ Pod initialiseren
+ Er wordt nu geprobeerd om de Pod te koppelen en uit te vullen.\n\nWanneer deze stap successvol is afgerond, kan er op Volgende worden gedrukt.\n\nOpmerking: zet de RileyLink rechtop en leg de Pod er ongeveer 10 centimeter vandaan.
+ Plaats de Pod
+ Bereid het plaatsen voor. Verwijder de beschermkap van de naald en haal de papiertjes van de sticker.\n\nMocht je zien dat de canule uitsteekt, druk dan op Annuleren en begin opnieuw met een andere Pod.\n\nBevestig de Pod op de huid. Druk op Volgende om de canule te gaan inschieten en de insulinetoediening te laten starten.
+ Als je op OKdrukt, wordt de canule ingebracht. Zorg ervoor dat de Pod op de huid geplakt is.
+ Canule inbrengen
+ De basaalstand wordt ingesteld en de canule wordt ingebracht.\n\nWanneer de canule succesvol is ingebracht, kun je op Volgende drukken.
+ Pod geactiveerd
+ De nieuwe Pod is nu actief.\n\nJe basaalprofiel is ingeladen in de Pod en de canule is ingebracht.\n\nControleer of de canule correct is geplaatst en vervang de Pod als je denkt dat er iets is misgegaan.
+
+ Deactiveer Pod
+ Druk op Volgende om de Pod te deactiveren.\n\nOpmerking: Hiermee wordt de insulinetoediening gestopt en wordt de Pod gedeactiveerd.
+ Pod wordt gedeactiveerd
+ De Pod wordt gedeactiveerd.\n\nWanneer de Pod succesvol gedeactiveerd is, kan er op Volgende worden gedrukt.
+ Pod gedeactiveerd
+ Pod gedeactiveerd.\n\nVerwijder de Pod van je lichaam en recycle deze.
+ Pod verworpen
+ De Pod is verworpen. De insulineverlevering is mogelijk niet onderbroken omdat de Pod niet correct gedeactiveerd is!\n\nVerwijder de Pod van de huid en recycle deze.
+ Als de Pod wordt verwerpt, kan er niet meer mee gecommuniceerd worden. Doe dit alleen indien alle communicatie met de Pod aanhoudend mislukt. Weet je zeker dat je de Pod wilt verwerpen?
+ Pod verwerpen
+
+ Tijd instellen
+ Onderbreken
+ Vernieuwen
+ Hervat toediening
+ Pod beheer
+ Alarmen bevestigen
+ Podstatus
+ Totaal toegediend
+ %1$.2f E
+ Podadres
+ Pod verloopt
+ Laatste verbinding
+ Laatste bolus
+ Tijdelijke basaalstand
+ Basis basaalstand
+ Reservoir
+ Actieve Pod alarmen
+ Firmwareversie
+ Tijd op Pod
+ %1$.2fE/u @%2$s (%3$d/%4$d minuten)
+ %1$.2f E over
+ Meer dan 50 E over
+ Foutmeldingen
+
+ Pompintegratie voor Omnipod, vereist RileyLink (met firmwareversie 2.0 of hoger).
+ onzeker
+ Pulslog
+ Pulselog (gekopieerd naar klembord)
+ Ja
+ Nee
+ OK
+ Annuleren
+
+ Zojuist
+ Minder dan een minuut geleden
+ %1$s en %2$s
+ %1$s geleden
+
+ %1$d minuut
+ %1$d minuten
+
+
+ %1$d uur
+ %1$d uren
+
+
+ %1$d dag
+ %1$d dagen
+
+
+ Pod waarschuwing: %1$s
+ Podwaarschuwing: %1$s
+
diff --git a/omnipod/src/main/res/values-no-rNO/strings.xml b/omnipod/src/main/res/values-no-rNO/strings.xml
index 036e78a8a3..13ead7dbd4 100644
--- a/omnipod/src/main/res/values-no-rNO/strings.xml
+++ b/omnipod/src/main/res/values-no-rNO/strings.xml
@@ -1,11 +1,241 @@
-
-
-
-
-
+
+
+
+ Bolus pip aktivert
+ Bolus pip aktivert
+ SMB pip aktivert
+ TBR pip aktivert
+ Vis Pause insulintilførsel knapp i Omnipod meny
+ Vis Puls logg knappen i Pod menyen
+ Vis RileyLink status knapp i Pod menyen
+ DST/Tidssone deteksjon aktivert
+ Utløpspåminnelse aktivert
+ Timer før nedstenging
+ Varsel om lavt reservoar aktivert
+ Antall enheter
+ Lydvarsel for usikre TBR er aktivert
+ Lydvarsel for usikre SMB er aktivert
+ Lydvarsel for usikre bolus er aktivert
+ Godkjenn automatisk Pod varsler
+ RileyLink
+ Annen
+ Varsler
+ Bekreftelse pip
+ Varsler
+
+ Ingen aktiv Pod
+ Oppsett pågår (venter på Pod aktivering)
+ Forberedelse av pod (venter på innskyting av kanyle)
+ Kjører
+ Pauset
+ Pod feil
+ Aktiveringstiden er overskredet
+ Inaktiv
+ Pod feil: %1$03d %2$s
+
+ Fullfør paringspåminnelse
+ Påminnelse om å sluttføre oppsett
+ Pod utløper snart
+ Pod utløper snart
+ Nedstenging er nært forestående
+ Lavt reservoar
+ Ukjent varsel
+
+ Pod historikk
+ Beskrivelse
+ Kildekode
+ Dato
+ Type:
+ %1$.2f E
+ %1$.2f E, KH=%2$.1f g
+ Dose: %1$.2f E, varighet: %2$d min
-
-
+ Advarsel
+ RileyLink adressen er ugyldig.
+ Operasjon ikke mulig.\n\n Du må konfigurere Medtronic pumpen før du kan bruke denne funksjonen.
+ Ingen aktiv Pod
+ En uventet feil oppstod. Vennligst rapporter (%1$s: %2$s).
+ Kommunikasjonsfeil: klarte ikke å verifisere meldingen
+ Kommunikasjonsfeil: mottok en ugyldig datapakke fra Pod
+ Kommunikasjonsfeil: Pod er i feil tilstand
+ Kommunikasjonsfeil: mottok en ugyldig respons fra Pod
+ Kommunikasjonsfeil: mottok en en melding med ugyldig sekvensnummer fra Pod
+ Kommunikasjonsfeil: mottok en melding fra Pod med ugyldig adresse
+ Kommunikasjonsfeil: klarte ikke å tolke meldingen fra Pod
+ Kommunikasjonsfeil: fornying av kommunikasjonsnøkkel (nounce) feilet
+ Kommunikasjonsfeil: kommunikasjonsnøkkel (nounce) er ikke synkronisert
+ Kommunikasjonsfeil: mottok ikke tilstrekkelig med data fra Pod
+ En Pod feil (%1$03d %2$s) er oppdaget. Vennligst deaktiver din Pod og start en ny
+ Kommunikasjonsfeil: Pod returnerte en feilmelding
+ Ingen respons fra RileyLink
+ Koblingen til RileyLink avbrutt
+ Ingen svar fra Pod
+ Endring av basalprofil mislyktes. Insulinlevering kan bli sperret! Vennligst velg oppdater fra Omnipod fanen og velg gjenoppta levering hvis nødvendig.
+ Endring av basalprofil mislyktes. Insulinlevering kan bli sperret! Vennligst velg oppdater fra Omnipod fanen og velg gjenoppta levering hvis nødvendig.
+ Endring av basal profil mislyktes. Insulinlevering er sperret! Velg gjenoppta levering manuelt fra Omnipod-fanen.
+ Feilet i å lagre basalprofilen.
+ Mislyktes trolig med å kansellere temp basal. Vennligst oppdater Pod status manuelt fra Omnipod menyen.
+ Endring av midlertidig basal var mislykket. En tidligere midlertidig basal kan ha blitt kansellert. Oppdater statusen på Pod manuelt fra Omnipod fanen.
+ Endring av midlertidig basal kan ha vært mislykket. En tidligere midlertidig basal kan ha blitt kansellert. Oppdater statusen på Pod manuelt fra Omnipod fanen.
+ TBR varighet må være større enn null og et multiplum av %1$s minutter.
+ Innstilling av tid kan ha mislyktes. Insulinlevering kan være kansellert! Oppdater statusen manuelt fra fanen Omnipod og gjenoppta levering hvis nødvendig.
+ Endring av tid mislyktes. Insulinlevering er sperret! Velg gjenoppta levering manuelt fra Omnipod-fanen.
+ Feilet i å lagre basal profil: mottok en tom profil. Kontroller at du har aktivert profilen.
+ Ingen basal profil er aktiv. Sørg for å aktivere din basal profil.
+ Ukjent kommando: %1$s
+ Feilet i å lese Pulsloggen
+ Feilet i å oppdatere status
+ Feilet i å oppdatere status ved oppstart
+ Feilet i å bekrefte varsler
+ Feilet i å stoppe leveranser
+ Feilet i å angi tid
+ Feilet i å gjenoppta leveransen
+ Feilet i å automatisk endre tid på Pod. Vennligst synkroniser tid manuelt ved å bruke Omnipod menyen.
+ Klarte ikke å kontrollere om bolusdosen ble gitt. Kontroller manuelt at Pod leverer bolus ved å lytte etter klikk. Dersom du er sikker på at bolusen ikke var vellykket, bør du manuelt slette bolusoppføring fra Behandlinger, selv om du trykker på \'Avbryt bolus\' nå!
+ Klarte ikke å bekrefte om SMB bolus (%1$.2f E) ble gitt. Hvis du er helt sikker på at Bolus ikke ble levert, da bør du manuelt slette SMB-oppføringen fra Behandlinger.
+ Bolus var mislykket.
+ Feilet i å initialisere Pod
+ Feilet ved innsetting av kanyle
+ Pod\'ens aktiveringstid er overskredet. Denne Pod kan ikke lenger aktiveres.
+ Klarte ikke å verifisere fremdrift i aktiveringen. Prøv på nytt.
+ Pod er pauset
+ Feilet i avspilling av test lyd
+ En midlertidig basal utføres på Pod, men AAPS har ingen informasjon om denne midlertidige basalen. Vennligst avbryt midlertidig basal manuelt.
+
+ Bekreftelse
+ Tid og/eller tidssone endret på Pod.
+ Varselinnstillinger har blitt oppdatert på Pod.
+ Tiden på Pod har blitt oppdatert.
+ All insulintilførsel har blitt pauset.
+ Aktive varsler har blitt bekreftet.
+ Insulintilførselen er gjenopptatt.
+
+ Deaktiviser Pod
+ Forkast Pod
+ Sett bolus
+ Avbryt bolus
+ Sett midlertidig basal
+ Avbryt midlertidig basal (internt av driver)
+ Avbryt midlertidig basal
+ Sett basal program
+ Hent Pod status
+ Hent Pod info
+ Angi tid
+ Konfigurer varsler
+ Bekreft varsel
+ Stopp levering
+ Gjenoppta levering
+ Ukjent valg
+ Initialiser Pod
+ Sett inn kanyle
+ Les pulslogg
+ Angi vilkårlig midlertidig basal fordi Pod er suspendert
+ Avbryt vilkårlig midlertidig basal som er opprettet fordi Pod var suspendert
+ Del midlertidig basal fordi en uavklart feil ble oppdaget ved kanselleringen
+ Oppsett lyd
+ Avspill test lyd
+
+ Pod administrasjon
+ Aksjoner
+ Verktøy
+ Venter på RileyLink tilkobling…
+ Aktiver Pod
+ Deaktiver Pod
+ Forkast Pod
+ Pod historikk
+ RileyLink statistikk
+ Tilbakestill RileyLink oppsett
+ Les Puls logg
+ Leser puls logg…
+ Hvis du forkaster Pod vil du ikke være i stand til å gjenopprette kommunikasjonen med den. Du skal bare gjøre dette hvis alle andre forsøk på å gjenopprette kommunikasjonen med Pod har feilet. Hvis du fortsatt kan kommunisere med Pod, vennligst bruk Deaktiver Pod valget.\n\nHvis du ønsker å fortsette, husk på å fjerne Pod fra kroppen din!
+ Avspill test lyd
+ Avspiller test lyd…
+
+ Avbryt
+ Fullfør
+ Neste
+ Prøv igjen
+ Deaktiver Pod
+ Forkast Pod
+ Du har ikke fullført alle trinn ennå. Er du sikker på at du vil avslutte?
+ Avslutt
+
+ Fyll Pod
+ Fyll en ny Pod med nok insulin for 3 dager.\n\nLytt etter to lydsignaler fra Pod under fyllingen. Disse indikerer at minimums volum på 85E er fylt opp. Vær nøye med å tømme fyllingssprøyten helt, selv etter at du har hørt de to lydsignalene.\n\nEtter fylling av Pod, vennligst trykk Neste.\n\nMerk: vent med å fjern kanylebeskyttelsen til Pod. \nMerk: plasser RileyLink i en stående posisjon og legg Pod kun noen cm unna denne.
+ Initialiser Pod
+ Prøver å koble opp mot den nye Pod og sette påfyllingsbolus.\n\nNår alle oppstartstrinn er utført, kan du trykke Neste.\n\nMerk: plasser RileyLink i en stående posisjon og plasser Pod maks noen centimeter unna den.
+ Fest Pod
+ Klargjør infusjonsstedet. Fjern Pod\'ens kanylebeskyttelse og papirfolien, og fest Pod til infusjonsstedet.\n\nHvis du oppdager feil med kanylen, trykk Avbryt og forkast Pod.\n\nTrykk Neste for å sette inn kanyle og starte påfyllingsbolus.
+ Når du trykker OKvil kanylen settes inn. Pass på at du har festet Pod\'en på infusjonsstedet.
+ Sett inn kanyle
+ Prøver å sette inn kanylen og tilføre en påfyllingsbolus.\n\nNår kanylen er vellykket på plass kan du trykke på Neste.
+ Pod aktivert
+ Den nye Pod\'en er nå aktiv.\n\nDin basalprofil har blitt lagret og kanelen er inne.\n\nVennligst kontroller at kanylen ble satt riktig inn og skift Pod hvis du tror det har oppstått feil med innsettingen.
+
+ Deaktiver Pod
+ Trykk på Neste for å deaktivere Pod.\n\nMerk: Dette vil stanse all insulintilførsel og deaktivere Pod.
+ Deaktiverer Pod
+ Deaktivering av Pod.\n\nNår deaktiveringen er vellykket utført, kan du trykke på Neste.
+ Pod deaktivert
+ Din Pod er deaktivert.\n\nVennligst fjern Pod\'en fra kroppen din og lever den inn for gjenvinning.
+ Pod forkastet
+ Pod\'ens tilstand er forkastet. Insulintilførsel har ikke blitt stanset fordi Pod ikke har blitt ordentlig deaktivert!\n\nVennligst fjern Pod fra kroppen og lever den inn for gjenvinning.
+ Dersom du forkaster Pod vil du ikke være i stand til å kommunisere med den lenger. Du skal bare gjøre dette når all kommunikasjon med Pod konsekvent feiler. Er du sikker på at du vil forkaste Pod?
+ Forkast Pod
+
+ Angi tid
+ Pause
+ Oppdater
+ Fortsett levering
+ Pod håndtering
+ Godkjenn varsler
+ Pod status
+ Totalt levert
+ %1$.2f E
+ Pod adresse
+ Pod utløper
+ Siste tilkobling
+ Siste bolus
+ Temp basal rate
+ Profilens basal dose
+ Reservoar
+ Aktive Pod varsler
+ Firmware versjon
+ Tid på Pod
+ %1$.2fE/t @%2$s (%3$d/%4$d minutter)
+ %1$.2f E igjen
+ Over 50 E igjen
+ Feil
+
+ Pumpetilkobling for Omnipod krever RileyLink enhet med firmwareversjon 2.0 eller høyere.
+ usikker
+ Puls logg
+ Puls logg (kopiert til utklippstavlen)
+ Ja
+ Nei
+ OK
+ Avbryt
+
+ For litt siden
+ Mindre enn ett minutt siden
+ %1$s og %2$s
+ %1$s siden
+
+ %1$d minutt
+ %1$d minutter
+
+
+ %1$d time
+ %1$d timer
+
+
+ %1$d dag
+ %1$d dager
+
+
+ Pod varsel: %1$s
+ Pod varsler: %1$s
+
diff --git a/omnipod/src/main/res/values-pl-rPL/strings.xml b/omnipod/src/main/res/values-pl-rPL/strings.xml
index 4a42a57b5f..8989186451 100644
--- a/omnipod/src/main/res/values-pl-rPL/strings.xml
+++ b/omnipod/src/main/res/values-pl-rPL/strings.xml
@@ -1,37 +1,53 @@
-
-
- Integracja pompy Omnipod, wymaga RileyLink (z firmwarem 2.0 lub wyższym).
-
-
- %1$.2f U zostało
- Ponad 50 U
-
- Omnipod (433,91 MHz)
-
- Niedozwolone działanie PodInitActionType: %1$s
- Wystąpił nieoczekiwany błąd. Proszę zgłosić! (typ: %1$s).
- Komunikacja nie powiodła się: wystąpił nieoczekiwany błąd. Proszę zgłosić!
-
- Uruchom Pod
- Odłącz Pod
- Historia Pod nie jest dostępna w tej chwili.
- Napełnij Pod
- Wypełnianie
- Przymocuj Poda
- \nPrzygotowanie miejsca do infuzji. Zdjąć osłonkę igły i zabezpieczenie plastra i przykleić Pod do skóry w miejscu wkłucia.\n\nJeśli kaniula odkleja się, proszę wcisnąć Anuluj i odczepić Pod.\n\nNaciśnij Następny w celu wprowadzenia kaniuli i rozpoczęcia podawania bazy.
- Wprowadzanie kaniuli
- Próba ustawienia początkowego planu bazowego i wprowadzeia kaniuli.\n\nKiedy wszystkie elementy są sprawdzane, można nacisnąć Następny.
- \nPod jest teraz aktywny.\n\nTwój plan dawki bazowej został zaprogramowany i wprowadzono kaniulę w miejsce wkłucia.\n\nSprawdź, czy kaniula została prawidłowo włożona i wymień swój Pod, jeśli czujesz, że nie.
- \nNaciśnij Następny w celu odłączenia Poda.\n\nUwaga: To spowoduje zawieszenie wszystkich dostaw insuliny i dezaktywację Poda.
- Odłączanie Poda
- Pod odłączony.\n\nProszę odkleić Pod od ciała i wyrzucić go.
- Sparuj Pod
- Wypełnij Pod
-
+
+
+
+ RileyLink
+ Inne
+
+ W działaniu
+
+ Przypomnienie o zakończeniu parowaniaZakończ przypomnienie o konfiguracji
+ Pod wkrótce straci ważność
+ Pod wkrótce straci ważnośćWyłączenie jest nieuchronneNiski poziom w zbiornikuNieznany alarm
+
+ Opis
+ Data
+
+ Ostrzeżenie
+ To działanie nie jest możliwe.\n\n Musisz skonfigurować Omnipod przed uruchomieniem tego działania.
+
+
+ Odłącz Pod
+
+
+ Dalej
+
+
+
+
+
+
+ %1$d minuta
+ %1$d minuty
+ %1$d minut
+ %1$d minut
+
+
+ %1$d godzina
+ %1$d godziny
+ %1$d godzin
+ %1$d godzin
+
+
+ %1$d dzień
+ %1$d dni
+ %1$d dni
+ %1$d dni
+
diff --git a/omnipod/src/main/res/values-pt-rBR/strings.xml b/omnipod/src/main/res/values-pt-rBR/strings.xml
index bc22bcf5e1..e68888839d 100644
--- a/omnipod/src/main/res/values-pt-rBR/strings.xml
+++ b/omnipod/src/main/res/values-pt-rBR/strings.xml
@@ -1,12 +1,20 @@
-
-
-
-
-
+
+
+
+
+
+
-
+
+
Desativado Pod
-
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values-pt-rPT/strings.xml b/omnipod/src/main/res/values-pt-rPT/strings.xml
index a697ec43c1..230d07897f 100644
--- a/omnipod/src/main/res/values-pt-rPT/strings.xml
+++ b/omnipod/src/main/res/values-pt-rPT/strings.xml
@@ -1,59 +1,19 @@
-
-
- Integração de bomba para Omnipod, requer RileyLink (com pelo menos firmware 2.0) dispositivo.
-
-
- %1$.2f U
- %1$.2f U restante
- Mais de 50 U
- Aviso
+
+
+
+ RileyLink
+ Outro
+ Alertas
+ Beeps de confirmação
+
+ Nenhum Pod ActivoA correr
-
- Omnipod (433.91 MHz)
-
- A operação não é possível.\n\nPrecisa configurar o Omnipod primeiro, antes de pode usar esta operação.
- PodInitActionType Ilegal: %1$s
- A verificação do comando falhou
- Ocorreu um erro inesperado. Por favor reporte! (digite: %1$s).
- Falha na comunicação: foram recebidos parâmetros de entrada inválidos
- Falha na comunicação: tempo limite
- Falha na comunicação: ocorreu um erro inesperado. Por favor, reporte!
- Falha na comunicação: mensagem de falha de verificação de integridade
- Falha na comunicação: recebeu um pacote inválido do Pod
- Falha na comunicação: o Pod está em um estado errado
- Falha na comunicação: recebeu uma resposta inválida do Pod
- Falha na comunicação: recebeu uma mensagem com número de sequência inválido do Pod
- Falha na comunicação: recebeu uma mensagem com um endereço inválido do Pod
- Falha na comunicação: falha ao descodificar a mensagem do Pod
- Falha na comunicação: nonce resync falhou
- Falha na comunicação: nonce fora de sincronização
- Falha na comunicação: não há dados suficientes recebidos do Pod
- Uma falha de Pod (%1$03d %2$s) foi detectada. Por favor, desactive o Pod e inicie um novo
- Falha na comunicação: o Pod devolveu uma resposta de erro
-
- Iniciar Pod
- Desactivar Pod
- %1$.2f U
- %1$.2f U, HC=%2$.1f g
- Histórico do Pod não disponível no momento.
- Encher o Pod
- A Purgar
- Anexar o Pod
- \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 Cancelar e descarte o seu Pod.\n\nPressione Próximo para inserir a canula e começar a administração da basal.
- A inserir canula
- A tentar definir um plano da basal inicial e inserir canula.\n\nQuando todos os itens estiverem verificados, pode pressionar Próximo.
- Info Pod
- \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.
- Desactivar Pod
- \nPressione Próximo para desactivar o Pod.\n\nNota: Isto irá suspender toda a administração de insulina e desactivar o Pod.
- A Desactivar Pod
- Pod desactivado.\n\nPor favor, remova o Pod do seu corpo e descarte-o.
- Emparelhar Pod
- Purgar Pod
- Desactivar Pod
-
+ Suspenso
+ Falha no Pod
+ Inactivo
+
Lembrete Concluir EmparelhamentoLembrete Terminar ConfiguraçãoPod vai expirar em breve
@@ -61,22 +21,45 @@
Encerramento iminenteReservatório baixoAlerta desconhecido
- Estatísticas RL
- Erros
- Perfil Basal é o mesmo, então não será definido novamente.
- Actualizar
- Suspender
- Falha incerta
- RileyLink
- Outro
- Alertas
- Sair
- Anterior
- Seguinte
+
DescriçãoFonteDataTipo:
+
+ Aviso
+ A operação não é possível.\n\nPrecisa configurar o Omnipod primeiro, antes de pode usar esta operação.
+ Nenhum Pod Activo
+
+
+ Desactivar Pod
+ Descartar Pod
+ Definir Bólus
+ Cancelar Bólus
+ Definir Basal Temporária
+ Cancelar Basal Temporária (intermanente pelo controlador)
+ Cancelar Basal Temporária
+ Definir Programação Basal
+ Obter Estado do Pod
+ Obter Info do Pod
+ Definir hora
+ Configurar Alertas
+ Reconhecer Alertas
+ Suspender Administração
+ Retomar Administração
+ Entrada Desconhecida
+
+
+ Terminar
+ Seguinte
+
+
+
+
+ incerto
+
+ %1$s e %2$s
+ %1$s atrás%1$d minuto%1$d minutos
diff --git a/omnipod/src/main/res/values-ro-rRO/strings.xml b/omnipod/src/main/res/values-ro-rRO/strings.xml
index c4072ea1f7..15ea8a9ea1 100644
--- a/omnipod/src/main/res/values-ro-rRO/strings.xml
+++ b/omnipod/src/main/res/values-ro-rRO/strings.xml
@@ -1,73 +1,58 @@
-
-
- Integrare pompa pentru Omnipod, necesită dispozitivul RileyLink (cu versiune firmware de cel puțin 2.0).
-
+
+
+
Bip pentru Bolus activatBip pentru Bazală activatBip pentru SMB activatBip pentru TBR activat
- Butonul \"Suspendare Livrare\" activat
- Butonul \"Pulse Log\" activatDetectare fusului orar activatăNotificare expirare activatNumar de ore înainte de oprireAlertă rezervor aproape gol activatăNumăr unități
-
- Acum câteva momente
- Managementul POD-ului
- Statusul POD-ului
- Total livrat
- %1$.2f U
- %1$.2f U rămase
- Peste 50 U
- Adresă Pod
- Pod-ul expiră
- Atenție
+ RileyLink
+ Altele
+ Alerte
+ Bip-uri de confirmare
+
Niciun Pod activ
- Inițializarea este în curs (se așteaptă împerecherea și amorsarea)Inițializarea este în curs (se așteaptă inserarea canulei)RuleazăSuspendatDefecțiune PodTimp de activare depăşitInactiv
- Pod defect: %1$s %2$s
- Alerte active Pod
- Confirmare alerte
-
- Omnipod (433.91 MHz)
+
+ Notificare Finalizare împerechere
+ Finalizare memento setare
+ Pod-ul va expira în curând
+ Pod-ul va expira în curând
+ Oprirea este iminentă
+ Nivel rezervor scăzut
+ Alertă necunoscută
+
+ Descriere
+ Sursă
+ Data
+ Tip:
+ AtențieAdresa RileyLink invalidă.Operațiunea nu este posibilă.\n\nTrebuie să configuraţi Omnipod înainte de a putea efectua această operațiune.
- Operaţiunea nu este posibilă.\n\n Trebuie să aşteptaţi câteva minute până când AAPS încearcă să seteze profilul bazal pentru prima dată.
- Acțiune PodInitActionType ilegala: %1$sNiciun Pod activ
- Verificarea comenzii a eşuat
- A apărut o eroare neașteptată. Vă rugăm să o raportați! (tip: %1$s).
- Comunicarea a eșuat: s-au primit parametri de intrare incorecți
- Comunicarea a eșuat: timpul a expirat
- Comunicarea a eşuat: a apărut o eroare neaşteptată. Vă rugăm să o raportaţi!
- Comunicarea a eşuat: verificarea integrităţii mesajului a eşuat
- Comunicarea a eşuat: a fost primit un pachet invalid de la Pod
- Comunicarea a eșuat: Pod-ul este într-o stare incorectă
- Comunicarea a eșuat: s-a primit un răspuns incorect de la Pod
- Comunicarea a eșuat: s-a primit un mesaj cu un număr de secvență invalid de la Pod
- Comunicarea a eșuat: s-a primit un mesaj cu o adresă invalidă de la Pod
- Comunicarea a eșuat: nu s-a reușit decodarea mesajului de la Pod
- Comunicarea a eșuat: resincronizarea cheii de securitate nu a reușit
- Comunicarea a eșuat: cheia de securitate nu poate fi sincronizată
- Comunicarea a eşuat: nu s-au primit suficiente date de la Pod
- A fost detectată o eroare a Pod-ului (%1$03d %2$s). Vă rugăm să îl dezactivați pe acesta și să activați unul nou
- Comunicarea a eșuat: Pod-ul a returnat un răspuns de eroare
-
- Management Pod
- Inițializare Pod
+ Setarea profilului bazal a eșuat. Livrarea ar putea fi suspendată! Vă rugăm să reîmprospătați manual starea Pod-ului din secțiunea Omnipod și să continuați livrarea dacă este necesar.
+ Setarea profilului bazal s-ar putea sa fi eșuat. Livrarea ar putea fi suspendată! Vă rugăm să reîmprospătați manual starea Pod-ului din secțiunea Omnipod și să continuați livrarea dacă este necesar.
+ Setarea profilului basal a eşuat. Livrarea este suspendată! Vă rugăm să reluați manual livrarea din secțiunea Omnipod.
+ Setarea bazalei temporare a eșuat. Dacă o bazală temporară era activă anterior, ar fi putut fi anulată. Reîmprospătați manual starea Pod-ului din secțiunea Omnipod.
+ Setarea bazalei temporare s-ar putea sa fi eșuat. Dacă o bazală temporară era activă anterior, a fost anulată. Reîmprospătați manual starea Pod-ului din secțiunea Omnipod.
+ Setarea timpului s-ar putea sa fi eșuat. Livrarea ar putea fi suspendată! Vă rugăm să reîmprospătați manual starea Pod-ului din secțiunea Omnipod și să continuați livrarea dacă este necesar.
+ Setarea timpului a eșuat. Livrarea este suspendată! Vă rugăm să reluați manual livrarea din secțiunea Omnipod.
+
+
Dezactivare PodBaandonare Pod
- Istoric PodSetează bolusAnulează bolusSetează bazala temporară
@@ -82,88 +67,22 @@
Suspendați livrareaReluați livrareaInregistrare nerecunoscută
- %1$.2f U
- %1$.2f U, CH=%2$.1f g
- Rata: %1$.2f U, Durata: %2$d min
- Dacă apăsați OK, statusul Pod-ului va fi resetat forțat și nu veți mai putea comunica cu Pod-ul. Faceți acest lucru numai dacă nu mai se poate comunica deloc cu Pod-ul. Dacă se mai poate comunica cu Pod-ul, va rugam sa folosiți opțiunea Dezactivare Pod.\n\nDacă doriți să continuați, vă rugăm să vă asigurați, de asemenea, ca îndepărtați Pod-ul de pe corpul dvs.
- Istoricul Pod-ului nu este disponibil momentan.
- Umpleţi Pod-ul
- \nUmpleți noul Pod cu suficientă insulină pentru 3 zile.\n\nAr trebui sa auziți două bipuri de la Pod în timpul procesului de umplere. Acestea indică faptul că, cantitatea minimă de 85U a fost introdusă. Asigurați-vă ca ați golit complet seringa de umplere, chiar și după ce ați auzit două bipuri.\n\nDupă umplerea Pod-ului, vă rugăm să apăsați Următorul.\n\nNotă: Nu scoateți capacul transparent al acului in acest moment.\nNotă: Va rugam sa puneți RileyLink în poziție verticala și plasați Pod-ul la o distanta de câțiva centimetri.
- Amorsare
- Încercare de împerechere cu noul Pod și amorsare.\n\nAtunci când toate etapele sunt gata, puteți apăsa Următorul.\n\nNotă: Vă rugăm sa puneți RileyLInk in poziție verticala si sa plasați Pod-ul la câțiva centimetri distanta.
- Atașați Pod-ul
- \nPregătiți setul de infuzie. Scoateți capacul acului și suport adeziv și atașați Pod-ul la locul de infuzie.\n\nDacă, canula pare in neregulă, apăsați Anulare și aruncați Pod-ul.\n\nApăsați Următorul pentru a introduce canula și a începe livrarea bazalei.
- Inserare canulă
- Încercare de programare inițială a ratelor bazale si de insertie a canulei.\n\nCând toate elementele sunt gata, puteți apăsa Următorul.
- Informații Pod
- \nPod-ul este acum activ.\n\nRatele bazale au fost programate și canula a fost introdusă.\n\nVă rugăm să verificați că acul a fost introdus corect. Dacă considerați ca nu, înlocuiți Pod-ul.
- Dezactivare Pod
- \nApăsați Următorul pentru a dezactiva Pod-ul.\n\nNotă: Acest lucru va suspenda orice livrare de insulină și va dezactiva Pod-ul.
- Dezactivare Pod
- Dezactivare Pod.\n\nAtunci când toate elementele sunt gata, puteți apăsa Următorul.\n\nNotă: Dacă dezactivarea eșuează continuu, vă rugăm să apăsați Anulează și folosiți opțiunea Resetare Pod pentru a forța resetarea Pod-ului.
- Pod dezactivat.\n\nScoateți Pod-ul și aruncați-l.
- Împerechere Pod
- Amorsare Pod
- Umplere canulă
- Setare profil bazala
- Anulare livrare
- Dezactivare Pod
-
- Notificare Finalizare împerechere
- Finalizare memento setare
- Pod-ul va expira în curând
- Pod-ul va expira în curând
- Oprirea este iminentă
- Nivel rezervor scăzut
- Alertă necunoscută
- Setarea profilului bazal a eșuat. Livrarea ar putea fi suspendată! Vă rugăm să reîmprospătați manual starea Pod-ului din secțiunea Omnipod și să continuați livrarea dacă este necesar.
- Setarea profilului bazal s-ar putea sa fi eșuat. Livrarea ar putea fi suspendată! Vă rugăm să reîmprospătați manual starea Pod-ului din secțiunea Omnipod și să continuați livrarea dacă este necesar.
- Setarea profilului basal a eşuat. Livrarea este suspendată! Vă rugăm să reluați manual livrarea din secțiunea Omnipod.
- Setarea bazalei temporare a eșuat. Dacă o bazală temporară era activă anterior, ar fi putut fi anulată. Reîmprospătați manual starea Pod-ului din secțiunea Omnipod.
- Setarea bazalei temporare s-ar putea sa fi eșuat. Dacă o bazală temporară era activă anterior, a fost anulată. Reîmprospătați manual starea Pod-ului din secțiunea Omnipod.
- Setarea timpului s-ar putea sa fi eșuat. Livrarea ar putea fi suspendată! Vă rugăm să reîmprospătați manual starea Pod-ului din secțiunea Omnipod și să continuați livrarea dacă este necesar.
- Setarea timpului a eșuat. Livrarea este suspendată! Vă rugăm să reluați manual livrarea din secțiunea Omnipod.
- Nu se poate verifica dacă bolusul a reuşit. Vă rugăm să verificați manual că Pod-ul poate bolusa ascultand click-urile. Daca ești sigur ca bolus nu a reusit, ar trebui să stergi manual intrarea bolus din Tratamente, chiar dacă dai click pe \'Oprește bolus\' acum!
- Nu s-a putut verifica dacă bolusul SMB (%1$.2f U) a reușit. Daca ești sigur ca bolusul nu a reușit, ar trebui să ștergi manual intrarea SMB din Tratamente.
- Statistici RL
- Jurnal Pulsuri
- LOT
- TID
- Versiune firmware
- Erori
- Profilul bazal este la fel cu cel existent și nu va fi reincărcat.
- Resetează configurația RileyLink
- Schimbare oră și/sau fus orar în Pod
- %1$s și %2$s
- %1$s în urmă
- Aşteptare conexiune RileyLink...
- Bolusul nu a reușit
- Actualizează
- Reluați livrarea
- Pod suspendat
- Mai puțin de un minut în urmă
- Suspendare
- Împerechere și amorsare
- Umpleţi canula şi setaţi profilul bazal
- Obțineți jurnalul pulsurilor
- Eroare necunoscută
- S-a anulat vechea bazală temporară, dar nu s-a putut seta o nouă bazală temporarăSe setează o bazală temporară falsă deoarece Pod-ul este suspendatAnulează bazala temporară falsă creată pentru că Pod-ul a fost suspendat
- incert
- Setarile de alertă actualizate în Pod
- RileyLink
- Altele
- Alerte
- Bip-uri de confirmare
- Ieșire
- Precedent
- Următor
+
+
Finalizare
- Descriere
- Sursă
- Data
- Tip:
+ Următor
+
+
+
+
+ incert
+
+ Acum câteva momente
+ Mai puțin de un minut în urmă
+ %1$s și %2$s
+ %1$s în urmă%1$d minut%1$d minute
diff --git a/omnipod/src/main/res/values-ru-rRU/strings.xml b/omnipod/src/main/res/values-ru-rRU/strings.xml
index a15a682ac9..8557a7df6d 100644
--- a/omnipod/src/main/res/values-ru-rRU/strings.xml
+++ b/omnipod/src/main/res/values-ru-rRU/strings.xml
@@ -1,73 +1,119 @@
-
-
- Для интеграции с помпой Omnipod требуется устройство RileyLink (с прошивкой 2.0 и выше).
-
+
+
+
Звуковой сигнал болюса включенЗвуковой сигнал базала включенЗвуковой сигнал микроболюса SMB включенЗвуковой сигнал временного базала TBR включен
- Кнопка приостановки подачи инсулина активирована
- Кнопка журнала событий активирована
+ Показывать кнопку Приостановить подачу на вкладке Omnipod
+ Показывать кнопку Pulse Log в меню управления Pod
+ Показывать кнопку статистики RileyLink в меню управления подомВключено обнаружение часового поясаВключено напоминание об истечении срока действияЧасов до выключенияПредупреждение о низком уровне в резервуаре включеноК-во единиц
-
- Только что
- Управление помпой
- Статус помпы
- Всего подано
- %1$.2f ед
- %1$.2f ед. осталось
- Более 50 ед.
- Адрес Пода
- Срок Пода истекает
- Внимание
+ Звук для неопределенных TBR уведомлений включен
+ Звук для неопределенных SMB уведомлений включен
+ Звук для неопределенных уведомлений болюса включен
+ Автоматически подтверждать оповещения Pod
+ RileyLink
+ Другое
+ Оповещения
+ Звуковые сигналы подтверждения
+ Уведомления
+
Активная помпа не выбрана
- Выполняется настройка (ожидание сопряжения и заполнения)
+ Выполняется настройка (ожидание активации Pod)Выполняется настройка (ожидание ввода катетера)ВыполняетсяПриостановленоСбой ПодаПревышено время активацииНеактивирован
- Ошибка Пода: %1$s %2$s
- Активные оповещения помпы
- Оповещения активны
-
- Omnipod (433.91 МГц)
+ Ошибка Pod: %1$03d %2$s
+
+ Напоминание о завершении сопряжения
+ Напоминание о завершении настройки
+ Срок работы Pod\'a истекает
+ Срок Pod\'a истекает в ближайшее время
+ Остановка неизбежна
+ В резервуаре мало инсулина
+ Неизвестное оповещение
+
+ Журнал Pod
+ Описание
+ Источник
+ дата
+ Тип:
+ %1$.2f ед
+ %1$.2f ед, г у =%2$.1f г
+ Баз Скорость: %1$.2f ед, Продолжительность: %2$d мин
+ ВниманиеНедопустимый адрес RileyLink.Операция невозможна.\n\n Сначала нужно настроить помпу Omnipod.
- Операция невозможна.\n\n Подождите несколько минут, пока AAPS пытается задать профиль.
- Недопустимый тип инициализации: %1$sАктивная помпа не включена
- Командная верификация не состоялась
- Произошла непредвиденная ошибка. Пожалуйста, сообщите об ошибке! (сообщить:: %1$s).
- Ошибка связи: недопустимые входные параметры
- Ошибка связи: время ожидания истекло
- Ошибка связи: возникла непредвиденная ошибка. Пожалуйста, сообщите!
- Ошибка связи: проверка целостности сообщения завершилась неудачно
- Ошибка связи: получен недопустимый пакет от Pod
- Ошибка связи: Pod находится в неверном состоянии
- Ошибка связи: недопустимый ответ от помпы
- Ошибка связи: получено сообщение с недопустимым порядковым номером от Pod
- Ошибка связи: получено сообщение с некорректным адресом от Pod
- Ошибка связи: не удалось декодировать сообщение от Pod
- Ошибка связи: не удалось выполнить повторную синхронизацию nonce
- Ошибка соединения: вне синхронизации
- Ошибка связи: недостаточно данных от Pod
- Обнаружена ошибка Pod (%1$03d %2$s). Деактивируйте Pod и запустите новый
- Ошибка связи: Pod ответил ошибкой
-
- Управление помпой Omnipod
- Инициализировать Pod
+ Непредвиденная ошибка. Сообщите об ошибке! (%1$s:%2$s).
+ Ошибка связи: не удалось проверить целостность сообщения
+ Ошибка связи: получен недопустимый пакет от Pod
+ Ошибка связи: неверное состояние Pod
+ Ошибка связи: недопустимый ответ от Pod
+ Ошибка связи: получено сообщение с недопустимым порядковым номером от Pod
+ Ошибка связи: получено сообщение с некорректным адресом от Pod
+ Ошибка связи: не удалось декодировать сообщение от Pod
+ Ошибка связи: не удалось выполнить контрольную синхронизацию
+ Ошибка соединения: вне синхронизации
+ Ошибка связи: недостаточно данных от Pod
+ Обнаружена ошибка Pod (%1$03d %2$s). Деактивируйте Pod и запустите новый
+ Ошибка связи: Pod ответил ошибкой
+ Нет ответа от RileyLink
+ RileyLink прерван
+ Нет ответа от Pod
+ Не удалось задать базовый профиль. Подача инсулина может быть приостановлена! Обновите вручную состояние Pod на вкладке Omnipod и при необходимости возобновите процесс подачи.
+ Возможно не удалось задать базовый профиль. Подача инсулина может быть приостановлена! Обновите вручную состояние Pod на вкладке Omnipod и при необходимости возобновите процесс подачи.
+ Не удалось задать базовый профиль. Подача инсулина приостановлена! Вручную возобновите подачу с вкладки Omnipod.
+ Настройка базального профиля не состоялась.
+ Возможно, отмена временного базала завершилась неудачно. Обновите вручную состояние Pod на вкладке Omnipod.
+ Не удалось задать временный базал. Если ранее был запущен временный базал, он мог быть отменен. Обновите вручную состояние Pod на вкладке Omnipod.
+ Не удалось задать временный базал. Если ранее был запущен временный базал, он мог быть отменен. Обновите вручную состояние Pod на вкладке Omnipod.
+ Продолжительность TBR должна быть больше нуля и кратной %1$s минутам.
+ Возможно, не удалось задать время. Подача инсулина может быть приостановлена! Обновите вручную состояние Pod на вкладке Omnipod и при необходимости возобновите подачу.
+ Не удалось задать время. Подача инсулина приостановлена! Вручную возобновите подачу с вкладки Omnipod.
+ Не удалось задать базальный профиль: получен пустой профиль. Активируйте профиль базала.
+ Базальный профиль не активен. Активируйте профиль базала.
+ Неизвестная кастомная команда: %1$s
+ Не удалось прочитать журнал pulse
+ Не удалось обновить статус
+ Не удалось обновить статус при запуске
+ Не удалось подтвердить оповещения
+ Не удалось приостановить подачу
+ Не удалось задать время
+ Не удалось возобновить подачу
+ Не удалось автоматически изменить время в Pod. Следует вручную синхронизировать время на вкладке Omnipod.
+ Не удалось проверить, подан ли болюс. Проверьте, издаются ли звуки подачи болюса. Если вы уверены, что болюс не подан, следует вручную удалить запись болюса из Назначений, даже если была нажата \'Отмена болюса\'!
+ Не удалось проверить, успешно ли подан микроболюс SMB (%1$.2f ед). Если вы уверены, что болюс не подан, следует вручную удалить запись SMB из Назначений.
+ Болюс не подан.
+ Не удалось инициализировать Pod
+ Не удалось установить канюлю
+ Превышено время активации Pod. Этот Pod больше не может быть активирован.
+ Не удалось проверить ход активации. Повторите попытку.
+ Omnipod остановлен
+ Не удалось воспроизвести тестовый звуковой сигнал
+ На Поде работает временный базал, но ААПС ничего не знает об этом временном базале. Отмените временный базал вручную.
+
+ Подтверждение
+ Время и/или часовой пояс изменены на Pod.
+ Конфигурация оповещений обновлена в Pod.
+ Время на Pod обновлено.
+ Все подачи инсулина приостановлены.
+ Подтверждены активные оповещения.
+ Подача инсулина возобновлена.
+
Деактивировать PodВыбросить помпу
- Журнал помпыНастроить болюсОтменить болюсУстановить временный базал
@@ -82,88 +128,96 @@
Приостановить подачуВозобновить подачуНеизвестная запись
- %1$.2f ед
- %1$.2f ед, CH=%2$.1f г
- Скорость: %1$.2f ед, Продолжительность: %2$d мин
- Если нажать OK, состояние помпы будет принудительно сброшено, и вы больше не сможете обмениваться командами с Pod. Сделайте это только в том случае, если вы не можете связаться с помпой. Если связь с Pod еще возможна, воспользуйтесь опцией Деактивировать Pod.\n\nЕсли хотите продолжить, также снимите помпу с тела.
- В настоящее время история помпы недоступна.
- Заполнить Pod
- \nЗаполните новый Pod запасом инсулина на 3 дня.\n\nПоступят два звуковых сигнала от помпы во время заправки. Это означает, что минимальное количество 85U заправлено. Не забудьте опустошить заправочный шприц даже после того, как услышите два звуковых сигнала.\n\nПосле заполнения Pod нажмите Next.\n\nПримечание: Пока не снимайте с помпы колпачок с иглой.\nПримечание:поставьте RileyLink вертикально рядом с Pod.
- Первичное заполнение инфузионной секции пода
- Попытка сопряжения с новым Podом и первичного заполнения инфузионного отсека..\n\n После проверки всех \'nfgjd можно нажать Далее.\n\nПримечание: В это время RileyLink должен находиться в вертикальном положении рядом с Pod.
- Подключить Под
- \nПодготовьте место инфузии. Удалите колпачок с иглы и защиту липкого слоя, Установите Pod на тело.\n\nесли канюля выступает, нажмите отменить и утилизируйте Pod.\n\Нажмите Далее чтобы вставить канюлю и начать подачу базала.
- Установка канюли (катетера)
- Определение графика подачи базала и установка канюли. \n\n Когда проверены все шаги, нажмите Далее.
- Информация о Pod
- \nПомпа сейчас активна.\n\nБазальный график запрограммирован и катетер установлен.\n\nУбедитесь в том, что канюля установлена правильно и замените Pod, если такой уверенности нет.
- Деактивировать Pod
- \nНажмите Далее для деактивации Пода\n\nПримечание: Это Приостановит всякую подачу инсулина и деактивирует помпу.
- Деактивация помпы
- Деактивация помпы.\n\n, Когда проверены все элементы, нажмите Далее.\n\nПримечание: Если деактивация постоянно завершается ошибкой, нажмите Отменить и примените Сброс помпы чтобы принудительно сбросить состояние Pod\'a.
- Pod деактивирован.\n\nУдалите и утилизируйте Pod.
- Сопряжение Pod
- Заполнение инфузионной секции Pod\'a
- Заполнение катетера
- Установка базального профиля
- Отмена подачи инсулина
- Деактивировать Pod
-
- Напоминание о завершении сопряжения
- Напоминание о завершении настройки
- Срок работы Pod\'a истекает
- Срок Pod\'a истекает в ближайшее время
- Остановка неизбежна
- В резервуаре мало инсулина
- Неизвестное оповещение
- Не удалось задать базовый профиль. Подача инсулина может быть приостановлена! Обновите вручную состояние Pod на вкладке Omnipod и при необходимости возобновите процесс подачи.
- Возможно не удалось задать базовый профиль. Подача инсулина может быть приостановлена! Обновите вручную состояние Pod на вкладке Omnipod и при необходимости возобновите процесс подачи.
- Не удалось задать базовый профиль. Подача инсулина приостановлена! Вручную возобновите подачу с вкладки Omnipod.
- Не удалось задать временный базал. Если ранее был запущен временный базал, он мог быть отменен. Обновите вручную состояние Pod на вкладке Omnipod.
- Не удалось задать временный базал. Если ранее был запущен временный базал, он мог быть отменен. Обновите вручную состояние Pod на вкладке Omnipod.
- Возможно, не удалось задать время. Подача инсулина может быть приостановлена! Обновите вручную состояние Pod на вкладке Omnipod и при необходимости возобновите подачу.
- Не удалось задать время. Подача инсулина приостановлена! Вручную возобновите подачу с вкладки Omnipod.
- Не удалось проверить, подан ли болюс. Проверьте, издаются ли звуки подачи болюса. Если вы уверены, что болюс не подан, следует вручную удалить запись болюса из Treatments, даже если вы нажмете \'Cancel bolus\' сейчас!
- Не удалось проверить, успешно ли выполнен микроболюс SMB (%1$.2f ед). Если вы уверены, что болюс не подан, следует вручную удалить запись SMB из Treatments.
- Статистика RL
- Журнал Pulse
- LOT
- TID
- Версия прошивки
- ошибки
- Базовый профиль идентичен, он не будет задан повторно.
- Сбросить конфигурацию RileyLink
- Время и/или часовой пояс изменены на Pod
- %1$s и %2$s
- %1$s назад
- Ожидание соединения RileyLink...
- Болюс не подан
- Обновить
- Возобновить подачу
- Omnipod остановлен
- Менее минуты назад
- Останов
- Выполнить сопряжение и заполнить
- Заполнить катетер и установить базовый профиль
- Получить журнал импульсов
- Неизвестная ошибка
- Старый временный базал отменен, но не удалось установить новый
+ Инициализировать Pod
+ Вставить катетер
+ Читать журнал импульсовУстановить фейковый временный базал, так как Pod остановленОтменить фейковый временный базал, который был создан из-за приостановки действия Pod
- не подтверждено
- Конфигурация оповещений обновлена в Pod
- RileyLink
- Другое
- Оповещения
- Звуковые сигналы подтверждения
- Выход
- Предыдущие
- Далее
+ Конфигурация звукового сигнала
+ Воспроизвести тестовый звуковой сигнал
+
+ Управление помпой Omnipod
+ Ожидание соединения RileyLink…
+ Активировать Pod
+ Деактивировать Pod
+ Утилизировать Pod
+ Журнал Pod
+ Статистика RileyLink
+ Читать журнал импульсов
+ Чтение журнала импульсов…
+ Если нажать Утилизировать Pod, вы больше не сможете обмениваться командами с Pod. Сделайте это только в том случае, если связь с помпой постоянно отсутствует. Если связь с Pod еще возможна, воспользуйтесь опцией Деактивировать Pod.\n\n Если все же хотите продолжить, снимите помпу с тела!
+ Воспроизвести тестовый звуковой сигнал
+ Воспроизведение тестового звукового сигнала…
+
+ ОтменитьЗавершить
- Описание
- Источник
- дата
- Тип:
+ Далее
+ Повторить
+ Деактивировать Pod
+ Утилизировать Pod
+ Вы еще не выполнили все шаги. Действительно хотите выйти?
+ Выход
+
+ Заполнить Pod
+ Заполните новый Pod инсулином на 3 дня.\n\nПоступят два звуковых сигнала от помпы во время заправки. Это означает, что минимальное количество 85U заправлено. Не забудьте опустошить заправочный шприц даже после того, как услышите два звуковых сигнала.\n\nПосле заполнения Pod нажмите Next.\n\nПримечание: Пока не снимайте с помпы колпачок с иглой.\nПримечание:поставьте RileyLink вертикально рядом с Pod.
+ Инициализировать Pod
+ Попытка сопряжения с новым Podом и первичного заполнения инфузионного отсека..\n\n После успешного процесса инициализации можно нажать Далее.\n\nПримечание: В это время RileyLink должен находиться в вертикальном положении рядом с Pod.
+ Подключить Pod
+ Подготовьте место инфузии. Удалите колпачок с иглы и защиту липкого слоя, Установите Pod на тело.\n\nесли канюля выступает, нажмите Отмена и утилизируйте Pod.\n\nНажмите Далее чтобы установить катетер и начать подачу базала.
+ При нажатии OKбудет установлен катетер. Убедитесь, что вы подключили Pod к инфузионному отсеку.
+ Вставить катетер
+ Определение графика подачи базала и установка катетера. \n\n После установки катетера нажмите Далее.
+ Pod активирован
+ Новый Pod активирован.\n\nБазальный график запрограммирован и катетер установлен.\n\nУбедитесь в том, что катетер установлен правильно и замените Pod, если такой уверенности нет.
+
+ Деактивировать Pod
+ \nНажмите Далее для деактивации Pod \n\nПримечание: Это Приостановит любую подачу инсулина и деактивирует помпу.
+ Деактивировать Pod
+ Деактивация Pod.\n\nПри успешной деактивации можно нажать Далее.
+ Pod деактивирован
+ Pod деактивирован.\n\nУдалите и утилизируйте Pod.
+ Pod сброшен
+ Состояние Pod cброшено. Подача инсулина не была приостановлена, так как Pod не был правильно деактивирован!\n\nУдалите Pod с тела и утилизируйте его.
+ Если сбросить Pod, дальнейшая коммуникация с ним невозможна. Делайте это только тогда, когда все попытки связи с Pod неудачны. Вы уверены, что хотите cбросить Pod?
+ Утилизировать Pod
+
+ Установить время
+ Останов
+ Обновить
+ Возобновить подачу
+ Управление помпой
+ Оповещения активны
+ Статус Pod
+ Всего подано
+ %1$.2f ед
+ Адрес Pod
+ Pod действителен до
+ Прошлое соединение
+ Предыдущий болюс
+ Временная базальная скорость
+ Базовая базальная скорость
+ Резервуар
+ Активные оповещения помпы
+ Версия прошивки
+ Время на Pod
+ %1$.2fед/ч @%2$s (%3$d/%4$d мин)
+ %1$.2f ед. осталось
+ Осталось свыше 50 ед
+ Ошибки
+
+ Для интеграции с помпой Omnipod требуется устройство RileyLink (с прошивкой 2.0 и выше).
+ не подтверждено
+ Журнал Pulse
+ Журнал отладки из буфера обмена
+ Да
+ Нет
+ OK
+ Отменить
+
+ Только что
+ Менее минуты назад
+ %1$s и %2$s
+ %1$s назад%1$d минута%1$d мин
@@ -182,4 +236,10 @@
%1$d дней%1$d дн
+
+ Оповещение Pod: %1$s
+ Оповещений Pod: %1$s
+ Оповещений Pod: %1$s
+ Оповещений Pod: %1$s
+
diff --git a/omnipod/src/main/res/values-sk-rSK/strings.xml b/omnipod/src/main/res/values-sk-rSK/strings.xml
index d508f9e153..8df0105181 100644
--- a/omnipod/src/main/res/values-sk-rSK/strings.xml
+++ b/omnipod/src/main/res/values-sk-rSK/strings.xml
@@ -1,73 +1,119 @@
-
-
- Integrácia pumpy pre Omnipod, vyžaduje zariadenie RileyLink (s firmwarom aspoň 2.0).
-
+
+
+
Pípnutie pri boluse povolenéPípnutie pri bazále povolenéPípnutie pri SMB povolenéPípnutie pri TBR povolené
- Tlačidlo pozastaviť podávanie je povolené
- Tlačítko Pulse Log je zapnuté
+ Zobraziť tlačítko \"Pozastaviť podávanie\" na záložke Omnipod
+ Zobraziť tlačítko Pulzný Log v menu Správa Podu
+ Zobraziť tlačítko Štatistika RileyLink v menu Správa PoduLetný čas / Detekcia časového pásma povolenáPripomenutie vypršania platnosti povolenéHodiny pred vypnutímUpozornenie na nízký stav zásobníka povolenéPočet jednotiek
-
- Pred chvíľou
- Správa Podu
- Stav Podu
- Celkovo podané
- %1$.2f JI
- Zostáva %1$.2f JI
- Viac ako 50 JI
- Adresa Podu
- Expirácia Podu
- Upozornenie
+ Zvuk upozornenia pre neistý dočasný bazál povolený
+ Zvuk upozornenia pre neistý SMB povolený
+ Zvuk upozornenia pre neistý bolus povolený
+ Automaticky potvrzovať výstrahy Podu
+ RileyLink
+ Iné
+ Výstrahy
+ Potvrdzujúce pípnutie
+ Upozornenia
+
Žiadny aktívny Pod
- Inštalácia prebieha (čakanie na párovanie a plnenie)
+ Prebieha inštalácia (čaká sa na aktiváciu Podu)Inštalácia prebieha (čaká sa na vloženie kanyly)V prevádzkePozastavenéChyba PoduBol prekročený čas aktivácieNeaktívny
- Chyba Podu: %1$s %2$s
- Výstrahy aktívneho Podu
- Potvrdiť upozornenie
-
- Omnipod (433,91 MHz)
+ Chyba Podu: %1$03d %2$s
+
+ Pripomienka ukončenia párovania
+ Pripomienka ukončenia nastavenia
+ Pod čoskoro expiruje
+ Pod čoskoro expiruje
+ Vypnutie je bezprostredné
+ Nízka hladina zásobníka
+ Neznáma výstraha
+
+ História Podu
+ Popis
+ Zdroj
+ Dátum
+ Typ:
+ %1$.2f JI
+ %1$.2f JI, SACH=%2$.1f g
+ Rýchlosť: %1$.2f JI, Doba trvania: %2$d minút
+ UpozornenieNeplatná adresa RileyLinku.Operácia nie je možná.\n\nNajskôr je nutné nakonfigurovať Omnipod, kým bude možné túto funkciu použiť.
- Operácia nie je možná.\n\n Je potrebné niekoľko minút počkať, pokiaľ sa AAPS nepokúsi prvý krát nastaviť bazálny profil.
- Neplatný atribút PodInitActionType: %1$sŽiadny aktívny Pod
- Overenie príkazu zlyhalo
- Došlo k neočakávanej chybe. Nahláste ju! (typ: %1$s).
- Komunikácia zlyhala: boli prijaté neplatné vstupné parametre
- Komunikácia zlyhala: časový limit vypršal
- Komunikácia zlyhala: vyskytla sa neočakávaná chyba. Prosím, nahláste to!
- Komunikácia zlyhala: overenie integrity správy zlyhalo
- Komunikácia zlyhala: boli prijaté neplatné pakety z Podu
- Komunikácia zlyhala: Pod je v chybnom stave
- Komunikácia zlyhala: bola prijatá neplatná odozva z Podu
- Komunikácia zlyhala: bola prijatá správa s neplatným poradovým číslom z Podu
- Komunikácia zlyhala: bola prijatá správa s neplatnou adresou z Podu
- Komunikácia zlyhala: nepodarilo se dekódovať správu z Podu
- Komunikácia zlyhala: opakovaná synchronizácia Nonce hodnoty zlyhala
- Komunikácia zlyhala: hodnota Nonce nebola synchronizovaná
- Komunikácia zlyhala: nedostatok dát prijatých z Podu
- Bola zistená chyba Podu (%1$03d %2$s). Deaktivujte Pod a spustite nový
- Komunikácia zlyhala: Pod vrátil chybovú odozvu
-
- Správa Podu
- Inicializovať Pod
+ Došlo k neočakávanej chybe. Prosíme o jej nahlásenie! (%1$s: %2$s).
+ Komunikácia zlyhala: overenie integrity správy zlyhalo
+ Komunikácia zlyhala: boli prijaté neplatné pakety z Podu
+ Komunikácia zlyhala: Pod je v chybnom stave
+ Komunikácia zlyhala: bola prijatá neplatná odozva z Podu
+ Komunikácia zlyhala: bola prijatá správa s neplatným poradovým číslom z Podu
+ Komunikácia zlyhala: bola prijatá správa s neplatnou adresou z Podu
+ Komunikácia zlyhala: nepodarilo se dekódovať správu z Podu
+ Komunikácia zlyhala: opakovaná synchronizácia Nonce hodnoty zlyhala
+ Komunikácia zlyhala: hodnota Nonce nebola synchronizovaná
+ Komunikácia zlyhala: nedostatok dát prijatých z Podu
+ Bola zistená chyba Podu (%1$03d %2$s). Deaktivujte Pod a spustite nový
+ Komunikácia zlyhala: Pod vrátil chybovú odozvu
+ Žiadna odpoveď od RileyLinku
+ RileyLink prerušený
+ Žiadna odpoveď z Podu
+ Nastavenie bazálneho profilu zlyhalo. Podávanie môže byť pozastavené! Manuálne obnovte stav Podu zo záložky Omnipod a pokračujte v podávaní, ak je to potrebné.
+ Nastavenie bazálneho profilu zlyhalo. Podávanie môže byť pozastavené! Manuálne obnovte stav Podu zo záložky Omnipod a pokračujte v podávaní, ak je to potrebné.
+ Nastavenie bazálneho profilu zlyhalo. Podávanie je pozastavené! Manuálne obnovte podávanie zo záložky Omnipod.
+ Nastavenie bazálneho profilu zlyhalo.
+ Zrušenie dočasného bazalu mohlo zlyhať. Manuálne obnovte stav Podu zo záložky Omnipod.
+ Nastavenie dočasného bazálu zlyhalo. Ak bol predtým spustený dočasný bazál, mohol byť zrušený. Manuálne obnovte stav Podu zo záložky Omnipod.
+ Nastavenie dočasného bazálu zlyhalo. Ak bol predtým spustený dočasný bazál, mohol byť zrušený. Manuálne obnovte stav Podu zo záložky Omnipod.
+ Doba trvania TBR musí byť väčšia ako nula, a musí byť násobkom %1$s minút.
+ Nastavenie času, pravdepodobne zlyhalo. Podávanie môže byť pozastavené! Manuálne obnovte stav Podu zo záložky Omnipod a pokračujte v podávaní, ak je to potrebné.
+ Nastavenie času zlyhalo. Podávanie je pozastavené! Manuálne obnovte podávanie zo záložky Omnipod.
+ Nepodarilo sa nastaviť bazálny profil: bol prijatý prázdny profil. Uistite sa, že ste aktivovali svoj bazálny profil.
+ Žiadny bazálny profil nie je aktívny. Uistite sa, že ste aktivovali svoj bazálny profil.
+ Neznámy vlastný príkaz: %1$s
+ Zlyhalo načítanie Pulse Log
+ Nepodarilo sa obnoviť stav
+ Nepodarilo se aktualizovať stav pri spustení
+ Nepodarilo sa potvrdiť výstrahy
+ Nepodarilo sa pozastaviť podávanie inzulínu
+ Nepodarilo sa nastaviť čas
+ Podávanie inzulínu sa nepodarilo spustiť
+ Nepodarilo sa automaticky zmeniť čas na Pode. Mali by ste ručne synchronizovať čas na záložke Omnipod.
+ Nedá sa overiť, či bolus prebehol úspešne. Overte prosím manuálne, či je podávaný bolus, počúvaním klikov z Podu. Pokiaľ ste si istý, že bolus nebol úspešný, mali by ste ručne odstrániť položku bolusu z ošetrení, aj keď kliknete na tlačítko \'Zrušiť bolus\' teraz!
+ Nedá sa overiť, či bol bolus SMB (%1$.2f JI) úspešne podaný. Pokiaľ ste si istý, že bolus nebol podaný, mali by ste ručne odstrániť položku SMB z Ošetrení.
+ Podanie bolusu nebolo úspešné.
+ Nepodarilo sa inicializovať Pod
+ Nepodarilo sa vložiť kanylu
+ Bol prekročený čas aktivácie Podu. Tento Pod sa už nedá aktivovať.
+ Nepodarilo sa overiť priebeh aktivácie. Skúste to znova.
+ Pod pozastavený
+ Nepodarilo se prehrať testovacie pípnutie
+ Dočasný bazál na Pode prebieha, ale AAPS o tomto dočasnom bazále nevie. Prosím zrušte svoj dočasný bazál ručne.
+
+ Potvrdenie
+ Čas a/alebo časová zóna zmenená na Pode.
+ Nastavenie výstrahy bolo v Pode aktualizované.
+ Čas na Pode bol aktualizovaný.
+ Všetko podávanie inzulínu bolo pozastavené.
+ Aktívne výstrahy boli potvrdené.
+ Podávanie inzulínu bolo obnovené.
+
Deaktivovať PodVyradiť Pod
- História PoduNastaviť bolusZrušiť bolusNastaviť dočasný bazál
@@ -82,88 +128,96 @@
Pozastaviť dodávanie inzulínuPokračovať v dodávaní inzulínuNeznáma položka
- %1$.2f JI
- %1$.2f JI, CH=%2$.1f g
- Rýchlosť: %1$.2f JI, Doba trvania: %2$d min
- Keď stlačíte OK, bude pripojenie na Pod nútene prerušené a nebudete sa môcť k nemu už viac pripojiť. Urob tak iba vtedy, ak AAPS nemôže viac komunikovať s Podom. Ak stále môžete komunikovať s Podom, prosím použite možnosť Deaktivovať Pod.\n\nPokiaľ chcete pokračovať, uistite sa, že je Pod odstránený z tela.
- História Podu momentálne nie je dostupná.
- Naplňte Pod
- \nNaplňte nový Pod dostatočným množstvom inzulínu na 3 dni.\n\nSledujte dve pípnutia z Podu v priebehu procesu plnenia. Tieto ukazujú, že minimálne množstvo 85JI bolo naplnené. Uistite sa, že striekačka je úplne vyprázdnená a to i po vypočutí dvoch pípnutí.\n\nPo naplnení Podu, prosím, stlačte Další.\n\nPoznámka: zatiaľ nedávajte dole kryt ihly.\nPoznámka:prosím umiestnite RileyLink vo zvislej pozícii blízko Podu.
- Plnenie
- Pokúste sa spárovať s novým Podom a naplňte ho.\n\nKeď sú všetky položky zaškrtnuté, môžete stlačiť Ďalej.\n\nPoznámka: prosím držte teraz Pod veľmi blízko RileyLinku.
- Pripevni Pod
- \nPripravte infúzny set. Odstráňte krytku ihly na Pode a ochranu samolepky a pripojte Pod k infúznemu setu. \n\nAk sa kanyla odlepí, prosím stlačte Zrušiť a zahoďte Váš Pod.\n\nStlačte Ďalšia na zavedenie kanyly a začiatok podávania bazálu.
- Zavedenie kanyly
- Pokúšam sa nastaviť počiatočnú bazálnu dávku a zaviesť kanylu.\n\nAk sú všetky položky označené, môžete stlačiť Ďalší.
- Informácie o Pode
- \nPod je teraz aktívny.\n\nVaša bazálna dávka je nastavená a kanyla bola zavedená.\n\nProsím skontrolujte, či bola kanyla zavedená správne a ak máte pocit, že nie, tak vymeňte Pod.
- Deaktivovať Pod
- \nStlačte Ďalej pre deaktiváciu Podu.\n\nPoznámka: Toto preruší celkovo podávanie inzulínu a deaktivuje Pod.
- Deaktivácia Podu
- Deaktivujem Pod.\n\nKeď sú všetky položky zaškrtnuté, môžete stlačiť Ďalej.\n\nPoznámka: Ak deaktivácia neustále zlyháva, stlačte prosím Zrušiť a použite možnosť Resetovať Pod, na nútené obnovenie stavu Podu.
- Pod deaktivovaný.\n\nProsím odstráňte Pod z Vášho tela a zlikvidujte ho.
- Spárujte Pod
- Naplňte Pod
- Naplňte kanylu
- Nastavte bazálny profil
- Zrušte podávanie
- Deaktivujte Pod
-
- Pripomienka ukončenia párovania
- Pripomienka ukončenia nastavenia
- Pod čoskoro expiruje
- Pod čoskoro expiruje
- Vypnutie je bezprostredné
- Nízka hladina zásobníka
- Neznáma výstraha
- Nastavenie bazálneho profilu zlyhalo. Podávanie môže byť pozastavené! Manuálne obnovte stav Podu zo záložky Omnipod a pokračujte v podávaní, ak je to potrebné.
- Nastavenie bazálneho profilu zlyhalo. Podávanie môže byť pozastavené! Manuálne obnovte stav Podu zo záložky Omnipod a pokračujte v podávaní, ak je to potrebné.
- Nastavenie bazálneho profilu zlyhalo. Podávanie je pozastavené! Manuálne obnovte podávanie zo záložky Omnipod.
- Nastavenie dočasného bazálu zlyhalo. Ak bol predtým spustený dočasný bazál, mohol byť zrušený. Manuálne obnovte stav Podu zo záložky Omnipod.
- Nastavenie dočasného bazálu zlyhalo. Ak bol predtým spustený dočasný bazál, mohol byť zrušený. Manuálne obnovte stav Podu zo záložky Omnipod.
- Nastavenie času, pravdepodobne zlyhalo. Podávanie môže byť pozastavené! Manuálne obnovte stav Podu zo záložky Omnipod a pokračujte v podávaní, ak je to potrebné.
- Nastavenie času zlyhalo. Podávanie je pozastavené! Manuálne obnovte podávanie zo záložky Omnipod.
- Nedá sa overiť, či bol bolus úspešný. Prosím manuálne overte, či Váš Pod podáva bolus počúvaním klikania. Ak ste si istý, že bolus nebol úspešný, mali by ste ručne odstrániť záznam o boluse z ošetrení, aj keď kliknete na \'Zrušiť bolus\' teraz!
- Nedá sa overiť, či bol bolus SMB (%1$.2f JI) úspešný. Ak ste si istí, že bolus nebol úspešný, mali by ste ručne vymazať záznam SMB z ošetrení.
- Štatistiky RL
- Pulse Log
- LOT
- TID
- Verzia firmvéru
- Chyby
- Bazálny profil je rovnaký, takže nebude znovu nastavený.
- Resetovať konfiguráciu RileyLinku
- Zmena času a/alebo časovej zóny na Pode
- %1$s a %2$s
- pred %1$s min
- Čaká sa na pripojenie RileyLinku...
- Bolus nebol úspešný
- Aktualizovať
- Pokračovať v podávaní inzulínu
- Pod pozastavený
- Pred menej ako minútou
- Pozastavenia
- Spáruj a naplň
- Naplňte kanylu a nastavte bazálny profil
- Získaj pulse log
- Neznáma chyba
- Bol zrušený starý dočasný bazál, ale nový dočasný bazál sa nepodarilo nastaviť
+ Inicializovať Pod
+ Vložiť kanylu
+ Čítať protokol pulzovNastaviť falošný dočasný bazál, pretože Pod je pozastavenýZrušiť falošný dočasný bazál ktorý bol vytvorený, pretože Pod bol pozastavený
- neznáme
- Nastavenie výstrahy bolo v Pode aktualizované
- RileyLink
- Iné
- Výstrahy
- Potvrdzujúce pípnutie
- Ukončiť
- Predošlá
- Ďalšia
+ Nastavenie pípnutia
+ Prehrať testovacie pípnutie
+
+ Správa Podu
+ Čakám na pripojenie RileyLink…
+ Aktivovať Pod
+ Deaktivovať Pod
+ Vyradiť Pod
+ História Podu
+ Štatistika RileyLink
+ Čítať protokol pulzov
+ Čítanie protokolu pulzov…
+ Pokiaľ zahodíte Pod, už s ním nebudete môcť komunikovať. Mali by ste to urobiť iba vtedy, pokiaľ celá komunikácia s Podom trvalo zlyháva. Pokiaľ stále môžete komunikovať s Podom, použite možnosť Deaktivovať Pod.\n\nPokiaľ si prajete pokračovať, uistite sa prosím, že odstránite Pod z tela!
+ Prehrať testovacie pípnutie
+ Prehrávanie testovacieho pípnutia…
+
+ ZrušiťDokončiť
- Popis
- Zdroj
- Dátum
- Typ:
+ Ďalšia
+ Opakovať
+ Deaktivovať Pod
+ Vyradiť Pod
+ Doposiaľ ste nedokončili všetky kroky. Ste si istý, že chcete ukončiť prácu?
+ Koniec
+
+ Naplniť Pod
+ Naplňte nový Pod dostatkom inzulínu na 3 dni.\n\nSledujte dve pípnutia z Podu v priebehu procesu plnenia. Tieto ukazujú, že minimálne množstvo 85U bolo naplnené. Uistite sa, že striekačka je úplne vyprázdnená a to aj po vypočutí dvoch pípnutí.\n\nPo naplnení Podu, prosím, stlačte Ďalšia.\n\nPoznámka: zatiaľ nesnímajte kryt z ihly.\nPoznámka:prosím umiestnite RileyLink vo zvislej polohe blízko Podu.
+ Inicializovať Pod
+ Snažíte sa spárovať nový Pod a naplniť ho.\n\nKeď bol úspešne dokončený inicializačný proces, môžete stlačiť tlačítko Ďalšia.\n\nPoznámka: položte RileyLink vo vzpriamenej polohe a umiestnite ho pár centimetrov od Podu.
+ Nasaďte Pod
+ Pripravte infúzne miesto. Odstráňte krytku ihly a náplasti a nalepte Pod.\n\nPokiaľ sa kanyla odlepí, stlačíte Zrušiť a zahoďte Pod.\n\nStlačte Ďalšia pre vloženie kanyly a spustenie bazálu.
+ Keď stlačíte OK, kanyla se vloží. Uistite sa, že ste pripojili Pod k infuznemu miestu.
+ Vložiť kanylu
+ Snažím sa nastaviť počiatočný základný bazál a vložiť kanylu.\n\nPo úspešnom vložení kanyly môžete stlačiť tlačítko Ďalšia.
+ Pod aktivovaný
+ Pod je teraz aktívny.\n\nVáš bazál bol naprogramovaný a kanyla bola vložená.\n\nOverte prosím, že kanyla bola vložená správne a prípadne vymeňte Pod.
+
+ Deaktivovať Pod
+ StlačteĎalšia pre deaktiváciu Podu.\n\nPoznámka: Úplne zastavíte podávanie inzulínu a deaktivujete Pod.
+ Deaktivácia Podu
+ Deaktivácia Podu.\n\nPo úspešnom dokončení deaktivácie môžete stlačiť Ďalšia.
+ Pod deaktivovaný
+ Pod deaktivovaný.\n\nOdstráňte Pod z tela a znehodnoťte ho.
+ Pod vyradený
+ Stav Podu bol vyradený. Podávanie inzulínu nebolo pozastavené, pretože Pod nebol riadne deaktivovaný!\n\nOdstráňte Pod z vašeho tela a recyklujte ho.
+ Pokiaľ tento Pod vyradíte, nebudete s ním už mocť komunikovať. Túto operáciu by ste mali urobiť iba v prípade, že celá komunikácia s týmto Podom trvale zlyháva. Naozaj chcete vyradiť Pod?
+ Vyradiť Pod
+
+ Nastavenie času
+ Pozastaviť
+ Obnoviť
+ Obnoviť podávanie inzulínu
+ Správa Podu
+ Potvrdiť výstrahy
+ Stav Podu
+ Celkovo podané
+ %1$.2f JI
+ Adresa Podu
+ Pod expiruje
+ Posledné spojenie
+ Posledný bolus
+ Dočasná bazálna dávka
+ Základná hodnota bazálu
+ Zásobník
+ Výstrahy aktívneho Podu
+ Verzia firmwaru
+ Čas na Pode
+ %1$.2fJI/h @%2$s (%3$d/%4$d minút)
+ Zostáva %1$.2f JI
+ Zostáva viac ako 50 JI
+ Chyby
+
+ Integrácia pumpy pre Omnipod, vyžaduje zariadenie RileyLink (s firmwarom aspoň 2.0).
+ neznáme
+ Protokol pulzov
+ Protokol pulzov (skopírované do schránky)
+ Áno
+ Nie
+ OK
+ Zrušiť
+
+ Pred chvíľou
+ Pred menej ako minútou
+ %1$s a %2$s
+ pred %1$s min%1$d minúta%1$d minút
@@ -182,4 +236,10 @@
%1$d dní%1$d dní
+
+ Výstraha Podu: %1$s
+ Výstrahy Podu: %1$s
+ Výstrahy Podu: %1$s
+ Výstrahy Podu: %1$s
+
diff --git a/omnipod/src/main/res/values-sl-rSI/strings.xml b/omnipod/src/main/res/values-sl-rSI/strings.xml
index 036e78a8a3..67511ccc70 100644
--- a/omnipod/src/main/res/values-sl-rSI/strings.xml
+++ b/omnipod/src/main/res/values-sl-rSI/strings.xml
@@ -1,11 +1,19 @@
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values-sv-rSE/strings.xml b/omnipod/src/main/res/values-sv-rSE/strings.xml
index 5d2cf34499..c7eea9a972 100644
--- a/omnipod/src/main/res/values-sv-rSE/strings.xml
+++ b/omnipod/src/main/res/values-sv-rSE/strings.xml
@@ -1,39 +1,26 @@
-
-
- Pumpintegrering för Omnipod. Kräver Riley Link med minst v2-firmware.
-
-
- %1$.2f U återstår
- Över 50 U
-
- Omnipod (433.91 MHz)
-
- Ogiltig PodInitActionType: %1$s
- Ett oväntat fel uppstod. Vänligen rapportera! (typ: %1$s).
- Kommunikationsfel: Ett oväntat fel inträffade. Rapportera!
-
- Initiera pod
- Inaktivera pod
- Pod-historik är inte tillgänglig för tillfället.
- Fyll pod
- Förfyllning
- Fäst podden
- \nFörbered infusionsplatsen. Ta bort poddens nålskydd och fäst podden på infusionsplatsen.\n\nOm kanylen sticker ut, tryck på Avbryt och kasta din pod.\n\nTryck Nästa för att skjuta in kanylen och påbörja basaldoseringen.
- Skjuter in kanylen
- Försöker att ställa in basaldoser och skjuta in kanylen.\n\nNär alla steg är slutförda, kan du trycka på Nästa.
- \nPodden är nu aktiverad.\n\nDina basaldoser har programmerats och kanylen har skjutits in in.\n\nKontrollera att kanylen sitter på rätt sätt och byt pod om den inte gjort det.
- \nTryck på Nästa för att inaktivera podden.\n\nOBS! Det här stoppar all insulintillförsel och inaktiverar podden.
- Inaktiverar pod
- Pod inaktiverad.\n\nTa bort podden och kasta den.
- Parkoppla pod
- Förfyll pod
-
+
+
+
+
+
Påminnelse att slutföra installationPod löper snart utPod kommer att gå ut inom kortPod kommer snart att stängas avLåg reservoarOkänd varning
+
+
+
+
+ Inaktivera pod
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values-tr-rTR/strings.xml b/omnipod/src/main/res/values-tr-rTR/strings.xml
index 036e78a8a3..67511ccc70 100644
--- a/omnipod/src/main/res/values-tr-rTR/strings.xml
+++ b/omnipod/src/main/res/values-tr-rTR/strings.xml
@@ -1,11 +1,19 @@
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values-zh-rCN/strings.xml b/omnipod/src/main/res/values-zh-rCN/strings.xml
index 036e78a8a3..67511ccc70 100644
--- a/omnipod/src/main/res/values-zh-rCN/strings.xml
+++ b/omnipod/src/main/res/values-zh-rCN/strings.xml
@@ -1,11 +1,19 @@
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
diff --git a/omnipod/src/main/res/values/colors.xml b/omnipod/src/main/res/values/colors.xml
index 456448446a..8df323920f 100644
--- a/omnipod/src/main/res/values/colors.xml
+++ b/omnipod/src/main/res/values/colors.xml
@@ -1,5 +1,49 @@
- #66000000
- #f4d700
+
+ #0099CC
+ #ff669900
+ #77DD77
+
+
+ #9E9E9E
+ #b9d2d2
+ #66BB6A
+ #FF7043
+
+
+ @color/rl_board_shape
+ @color/rl_icon_outline
+
+
+ #FF4444
+ @color/pod_icon_outline
+ #4CAF50
+ @color/pod_icon_outline
+ @color/pod_icon_outline
+ #42A5F5
+ @color/pod_icon_outline
+ #67E86A
+ @color/pod_icon_outline
+ #B39DDB
+ @color/pod_icon_outline
+ #ffbf00
+ @color/pod_icon_outline
+
+
+ #67E86A
+ @color/pod_icon_outline
+ #FF4444
+ @color/pod_icon_outline
+ #85F803
+ @color/pod_icon_outline
+ #ffbf00
+ @color/pod_icon_outline
+ #4DD0E1
+ @color/pod_icon_outline
+ #FB8C00
+ @color/pod_icon_outline
+ @color/rl_board_shape
+ @color/rl_icon_outline
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/values/dimens.xml b/omnipod/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..62deaa8023
--- /dev/null
+++ b/omnipod/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 10dp
+ 4dp
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/values/strings.xml b/omnipod/src/main/res/values/strings.xml
index 73b3871bae..1dde9ce781 100644
--- a/omnipod/src/main/res/values/strings.xml
+++ b/omnipod/src/main/res/values/strings.xml
@@ -1,97 +1,158 @@
-
-
-
- Omnipod
- Pod
- Pump integration for Omnipod, requires RileyLink (with at least 2.0 firmware) device.
-
-
+
+ AAPS.Omnipod.pod_state
+ AAPS.Omnipod.current_bolusAAPS.Omnipod.bolus_beeps_enabledAAPS.Omnipod.basal_beeps_enabledAAPS.Omnipod.smb_beeps_enabledAAPS.Omnipod.tbr_beeps_enabledAAPS.Omnipod.suspend_delivery_button_enabledAAPS.Omnipod.pulse_log_button_enabled
+ AAPS.Omnipod.rileylink_stats_button_enabledAAPS.Omnipod.time_change_enabledAAPS.Omnipod.expiration_reminder_enabledAAPS.Omnipod.expiration_reminder_hours_before_shutdownAAPS.Omnipod.low_reservoir_alert_enabledAAPS.Omnipod.low_reservoir_alert_units
+ AAPS.Omnipod.automatically_acknowledge_alerts_enabled
+ AAPS.Omnipod.notification_uncertain_tbr_sound_enabled
+ AAPS.Omnipod.notification_uncertain_smb_sound_enabled
+ AAPS.Omnipod.notification_uncertain_bolus_sound_enabled
+ AAPS.Omnipod.tbrs_set
+ AAPS.Omnipod.std_boluses_delivered
+ AAPS.Omnipod.smb_boluses_delivered
+
+
+ Omnipod
+ Pod
+ Omnipod (433.91 MHz)
+ LOT
+ TID
+ PM %1$s / PI %2$s
+ %1$s (%2$s)
+ %1$s: %2$s
+ %1$.2f %2$s (%3$s)
+
+
Bolus beeps enabledBasal beeps enabledSMB beeps enabledTBR beeps enabled
- Suspend Delivery button enabled
- Pulse Log button enabled
+ Show Suspend Delivery button in Omnipod tab
+ Show Pulse Log button in Pod Management menu
+ Show RileyLink Stats button in Pod Management menuDST/Time zone detection enabledExpiration reminder enabledHours before shutdownLow reservoir alert enabledNumber of units
+ Sound for uncertain TBR notifications enabled
+ Sound for uncertain SMB notifications enabled
+ Sound for uncertain bolus notifications enabled
+ Automatically acknowledge Pod alerts
+ RileyLink
+ Other
+ Alerts
+ Confirmation beeps
+ Notifications
-
- Moments ago
- Pod mgmt
- Pod status
- Total delivered
- %1$.2f U
- %1$.2f U left
- Over 50 U
- Pod address
- Pod expires
- Warning
+
No active Pod
- Setup in progress (waiting for pair and prime)
+ Setup in progress (waiting for Pod activation)Setup in progress (waiting for cannula insertion)RunningSuspendedPod faultActivation time exceededInactive
- Pod fault: %1$s %2$s
- Active Pod alerts
- Ack alerts
- %1$.2f %2$s (%3$s)
- %1$.2fU/h @%2$s (%3$d/%4$d minutes)
+ Pod fault: %1$03d %2$s
+
+ Finish pairing reminder
+ Finish setup reminder
+ Pod will expire soon
+ Pod will expire soon
+ Shutdown is imminent
+ Low reservoir
+ Unknown alert
-
- Omnipod (433.91 MHz)
-
+
+ Pod history
+ Description
+ Source
+ Date
+ Type:
+ %1$.2f U
+ %1$.2f U, CH=%2$.1f g
+ Rate: %1$.2f U, duration: %2$d minutes
+ WarningRileyLink address invalid.Operation is not possible.\n\nYou need to configure Omnipod first, before you can use this operation.
- Operation is not possible.\n\n You need to wait a few minutes, until AAPS tries to set basal profile for first time.
- Illegal PodInitActionType: %1$sNo active Pod
- Command verification failed
- An unexpected error occurred. Please report! (type: %1$s).
- Communication failed: received invalid input parameters
- Communication failed: timeout
- Communication failed: an unexpected error occurred. Please report!
- Communication failed: message integrity verification failed
- Communication failed: received an invalid packet from the Pod
- Communication failed: the Pod is in a wrong state
- Communication failed: received an invalid response from the Pod
- Communication failed: received a message with an invalid sequence number from the Pod
- Communication failed: received a message with an invalid address from the Pod
- Communication failed: failed to decode message from the Pod
- Communication failed: nonce resync failed
- Communication failed: nonce out of sync
- Communication failed: not enough data received from the Pod
- A Pod fault (%1$03d %2$s) has been detected. Please deactivate your Pod and start a new one
- Communication failed: the Pod returned an error response
+ An unexpected error occurred. Please report! (%1$s: %2$s).
+ Communication failed: message integrity verification failed
+ Communication failed: received an invalid packet from the Pod
+ Communication failed: the Pod is in a wrong state
+ Communication failed: received an invalid response from the Pod
+ Communication failed: received a message with an invalid sequence number from the Pod
+ Communication failed: received a message with an invalid address from the Pod
+ Communication failed: failed to decode message from the Pod
+ Communication failed: nonce resync failed
+ Communication failed: nonce out of sync
+ Communication failed: not enough data received from the Pod
+ A Pod fault (%1$03d %2$s) has been detected. Please deactivate your Pod and activate a new one
+ Communication failed: the Pod returned an error response
+ No response from RileyLink
+ RileyLink interrupted
+ No response from Pod
+ Setting basal profile failed. Delivery might be suspended! Please manually refresh the Pod status from the Omnipod tab and resume delivery if needed.
+ Setting basal profile might have failed. Delivery might be suspended! Please manually refresh the Pod status from the Omnipod tab and resume delivery if needed.
+ Setting basal profile failed. Delivery is suspended! Please manually resume delivery from the Omnipod tab.
+ Setting basal profile failed.
+ Cancelling temp basal might have failed. Please manually refresh the Pod status from the Omnipod tab.
+ Setting temp basal failed. If a temp basal was previously running, it might have been cancelled. Please manually refresh the Pod status from the Omnipod tab.
+ Setting temp might have basal failed. If a temp basal was previously running, it has been cancelled. Please manually refresh the Pod status from the Omnipod tab.
+ TBR duration must be greater than zero and a multiple of %1$s minutes.
+ Setting time might have failed. Delivery might be suspended! Please manually refresh the Pod status from the Omnipod tab and resume delivery if needed.
+ Setting time failed. Delivery is suspended! Please manually resume delivery from the Omnipod tab.
+ Failed to set basal profile: received an empty profile. Make sure to activate your basal profile.
+ No basal profile is active. Make sure to activate your basal profile.
+ Unknown custom command: %1$s
+ Failed to read Pulse Log
+ Failed to refresh status
+ Failed to refresh status on startup
+ Failed to acknowledge alerts
+ Failed to suspend delivery
+ Failed to set time
+ Failed to resume delivery
+ Failed to automatically change time on the Pod. You should manually synchronise the time on the Omnipod tab.
+ Unable to verify whether the bolus succeeded. Please manually verify that your Pod is bolusing by listening to clicks. If you are sure that the bolus didn\'t succeed, you should manually delete the bolus entry from Treatments, even if you click \'Cancel bolus\' now!
+ Unable to verify whether SMB bolus (%1$.2f U) succeeded. If you are sure that the Bolus didn\'t succeed, you should manually delete the SMB entry from Treatments.
+ Bolus did not succeed.
+ Failed to initialize the Pod
+ Failed to insert cannula
+ The Pod\'s activation time has been exceeded. This Pod can no longer be activated.
+ Failed to verify activation progress. Please retry.
+ Pod suspended
+ Failed to play test beep
+ A temporary basal is running on the Pod, but AAPS is unaware of this temporary basal. Please cancel your temporary basal manually.
-
- Pod management
- Init Pod
+
+ Confirmation
+ Time and/or time zone changed on the Pod.
+ Alert configuration has been updated in the Pod.
+ The time on the Pod has been updated.
+ All insulin delivery has been suspended.
+ Active alerts have been acknowledged.
+ Insulin delivery has been resumed.
+
+
Deactivate PodDiscard Pod
- Pod historySet bolusCancel bolusSet temporary basal
@@ -106,91 +167,107 @@
Suspend deliveryResume deliveryUnknown entry
- %1$.2f U
- %1$.2f U, CH=%2$.1f g
- Rate: %1$.2f U, duration: %2$d min
- If you press OK, the Pod state will be forcibly reset and you will not be able to communicate with the Pod anymore. Do this only if you can not communicate with the Pod anymore. If you can still communicate with the Pod, please use the Deactivate Pod option.\n\nIf you wish to proceed, please make sure to also remove the Pod from your body.
- Pod History not available at the moment.
- Fill the Pod
- \nFill the new Pod with enough insulin for 3 days.\n\nListen for two beeps from the Pod during the filling process. These indicate that the minimum amount of 85U has been inserted. Be sure to completely empty the fill syringe, even after hearing the two beeps.\n\nAfter filling the Pod, please press Next.\n\nNote: do not remove the Pod\'s needle cap at this time.\nNote: please place the RileyLink in an upright position and place the Pod a few inches away.
- Priming
- Trying to pair with the new Pod and prime it.\n\nWhen all items are checked, you can press Next.\n\nNote: please place the RileyLink in an upright position and place the Pod a few inches away it.
- Attach the Pod
- \nPrepare the infusion site. Remove the Pod\'s needle cap and adhesive backing and attach the Pod to the infusion site.\n\nIf the cannula sticks out, please press Cancel and discard your Pod.\n\nPress Next to insert the cannula and begin basal delivery.
- Inserting cannula
- Trying to set initial basal schedule and insert the cannula.\n\nWhen all items are checked, you can press Next.
- Pod info
- \nThe Pod is now active.\n\nYour basal schedule has been programmed and the cannula has been inserted.\n\nPlease verify that the cannula has been inserted correctly and replace your Pod if you feel hasn\'t.
- Deactivate Pod
- \nPress Next to deactivate the Pod.\n\nNote: This will suspend all insulin delivery and deactivate the Pod.
- Deactivating the Pod
- Deactivating the Pod.\n\nWhen all items are checked, you can press Next.\n\nNote: If deactivating continuously fails, please press Cancel and use the Discard Pod option to forcibly reset the Pod state.
- Pod deactivated.\n\nPlease remove the Pod from your body and discard it.
- Pair Pod
- Prime Pod
- Fill cannula
- Set basal profile
- Cancel delivery
- Deactivate Pod
-
-
- Finish pairing reminder
- Finish setup reminder
- Pod will expire soon
- Pod will expire soon
- Shutdown is imminent
- Low reservoir
- Unknown alert
- Setting basal profile failed. Delivery might be suspended! Please manually refresh the Pod status from the Omnipod tab and resume delivery if needed.
- Setting basal profile might have failed. Delivery might be suspended! Please manually refresh the Pod status from the Omnipod tab and resume delivery if needed.
- Setting basal profile failed. Delivery is suspended! Please manually resume delivery from the Omnipod tab.
- Setting temp basal failed. If a temp basal was previously running, it might have been cancelled. Please manually refresh the Pod status from the Omnipod tab.
- Setting temp might have basal failed. If a temp basal was previously running, it has been cancelled. Please manually refresh the Pod status from the Omnipod tab.
- Setting time might have failed. Delivery might be suspended! Please manually refresh the Pod status from the Omnipod tab and resume delivery if needed.
- Setting time failed. Delivery is suspended! Please manually resume delivery from the Omnipod tab.
- Unable to verify whether the bolus succeeded. Please manually verify that your Pod is bolusing by listening to clicks. If you are sure that the bolus didn\'t succeed, you should manually delete the bolus entry from Treatments, even if you click \'Cancel bolus\' now!
- Unable to verify whether SMB bolus (%1$.2f U) succeeded. If you are sure that the Bolus didn\'t succeed, you should manually delete the SMB entry from Treatments.
- RL stats
- Pulse log
- LOT
- TID
- Firmware version
- PM %1$s / PI %2$s
- Errors
- Basal profile is the same, so it will not be set again.
- Reset RileyLink config
- Time and/or time zone changed on the Pod
- %1$s and %2$s
- %1$s ago
- Waiting for RileyLink connection...
- Bolus did not succeed
- Refresh
- Resume delivery
- Pod suspended
- Less than a minute ago
- Suspend
- Pair and prime
- Fill cannula and set basal profile
- Get pulse log
- Uncertain failure
- Cancelled the old temporary basal, but failed to set new temporary basal
+ Initialize Pod
+ Insert cannula
+ Read pulse logSet fake temporary basal because the Pod is suspendedCancel fake temporary basal that was created because the Pod was suspended
- uncertain
- Alert configuration updated in Pod
- RileyLink
- Other
- Alerts
- Confirmation beeps
- Exit
- Previous
- Next
- Finish
- Description
- Source
- Date
- Type:
+ Split temporary basal because of uncertain failure in cancellation
+ Beep config
+ Play test beep
+
+ Pod management
+ Actions
+ Tools
+ Waiting for RileyLink connection…
+ Activate Pod
+ Deactivate Pod
+ Discard Pod
+ Pod history
+ RileyLink stats
+ Reset RileyLink Config
+ Read pulse log
+ Reading pulse log…
+ If you discard the Pod, you will not be able to communicate with it anymore. You should only do this when all communication with the Pod persistently fails. If you can still communicate with the Pod, please use the Deactivate Pod option.\n\nIf you wish to proceed, please make sure to remove the Pod from your body!
+ Play test beep
+ Playing test beep…
+
+
+ Cancel
+ Finish
+ Next
+ Retry
+ Deactivate Pod
+ Discard Pod
+ You haven\'t completed all steps yet. Are you sure you want to exit?
+ Exit
+
+
+ Fill Pod
+ Fill a new Pod with enough insulin for 3 days.\n\nListen for two beeps from the Pod during the filling process. These indicate that the minimum amount of 85U has been inserted. Be sure to completely empty the fill syringe, even after hearing the two beeps.\n\nAfter filling the Pod, please press Next.\n\nNote: do not remove the Pod\'s needle cap at this time.\nNote: please place the RileyLink in an upright position and place the Pod a few inches away from it.
+ Initialize Pod
+ Trying to pair with the new Pod and prime it.\n\nWhen the initialization process has successfully been completed, you can press Next.\n\nNote: please place the RileyLink in an upright position and place the Pod a few inches away from it.
+ Attach Pod
+ Prepare the infusion site. Remove the Pod\'s needle cap and adhesive backing and attach the Pod to the infusion site.\n\nIf the cannula sticks out, please press Cancel and discard your Pod.\n\nPress Next to insert the cannula and begin basal delivery.
+ When you press OK, the cannula will be inserted. Make sure that you have attached the Pod to the infusion site.
+ Insert cannula
+ Trying to set initial basal schedule and insert the cannula.\n\nWhen the cannula has successfully been inserted, you can press Next.
+ Pod activated
+ The new Pod is now active.\n\nYour basal schedule has been programmed and the cannula has been inserted.\n\nPlease verify that the cannula has been inserted correctly and change your Pod if you think it has not.
+
+
+ Deactivate Pod
+ Press Next to deactivate the Pod.\n\nNote: This will suspend all insulin delivery and deactivate the Pod.
+ Deactivating Pod
+ Deactivating the Pod.\n\nWhen deactivation has completed successfully, you can press Next.
+ Pod deactivated
+ Your Pod has been deactivated.\n\nPlease remove the Pod from your body and recycle it.
+ Pod discarded
+ The Pod state has been discarded. Insulin delivery has not been suspended because the Pod has not been properly deactivated!\n\nPlease remove the Pod from your body and recycle it.
+ If you discard the Pod, you will not be able to communicate with it anymore. You should only do this when all communication with the Pod persistently fails. Are you sure you want to discard the Pod?
+ Discard Pod
+
+
+ Set time
+ Suspend
+ Refresh
+ Resume delivery
+ Pod mgmt
+ Ack alerts
+ Pod status
+ Total delivered
+ %1$.2f U
+ Pod address
+ Pod expires
+ Last connection
+ Last bolus
+ Temp basal rate
+ Base basal rate
+ Reservoir
+ Active Pod alerts
+ Firmware version
+ Time on Pod
+ %1$.2fU/h @%2$s (%3$d/%4$d minutes)
+ %1$.2f U left
+ Over 50 U left
+ Errors
+
+
+ Pump integration for Omnipod, requires RileyLink (with at least 2.0 firmware) device.
+ uncertain
+ Pulse log
+ Pulse Log (copied to clipboard)
+ Yes
+ No
+ OK
+ Cancel
+
+
+ Moments ago
+ Less than a minute ago
+ %1$s and %2$s
+ %1$s ago%1$d minute%1$d minutes
@@ -203,4 +280,9 @@
%1$d day%1$d days
+
+ Pod alert: %1$s
+ Pod alerts: %1$s
+
+
\ No newline at end of file
diff --git a/omnipod/src/main/res/values/styles.xml b/omnipod/src/main/res/values/styles.xml
index 99ceef6b8d..1e590c64d8 100644
--- a/omnipod/src/main/res/values/styles.xml
+++ b/omnipod/src/main/res/values/styles.xml
@@ -1,30 +1,17 @@
-
+
+
-
-
-
\ No newline at end of file
diff --git a/omnipod/src/main/res/xml/pref_omnipod.xml b/omnipod/src/main/res/xml/pref_omnipod.xml
index 5e0ce96ea4..d0135d82a1 100644
--- a/omnipod/src/main/res/xml/pref_omnipod.xml
+++ b/omnipod/src/main/res/xml/pref_omnipod.xml
@@ -32,7 +32,7 @@
android:title="@string/omnipod_config_smb_beeps_enabled" />
@@ -72,6 +72,30 @@
validate:minNumber="5"
validate:testType="numericRange" />
+
+
+
+
+
+
+
+
+
+
+
+
@@ -86,6 +110,11 @@
android:key="@string/key_omnipod_pulse_log_button_enabled"
android:title="@string/omnipod_config_pulse_log_button_enabled" />
+
+
void testSetTempBasalPercent() {
+
+ DateTimeZone.setProvider(new UTCProvider());
+
+ // mock all the things
+ PowerMockito.mockStatic(Looper.class);
+ OmnipodPumpPlugin plugin = new OmnipodPumpPlugin(injector, aapsLogger, rxBusWrapper, null,
+ resourceHelper, activePluginProvider, null, null, aapsOmnipodManager, commandQueueProvider,
+ null, null, null, null,
+ rileyLinkUtil, null, null, null
+ );
+ when(activePluginProvider.getActiveTreatments().getTempBasalFromHistory(anyLong())).thenReturn(null);
+ when(rileyLinkUtil.getRileyLinkHistory()).thenReturn(new ArrayList<>());
+ when(injector.androidInjector()).thenReturn(new AndroidInjector
diff --git a/rileylink/src/main/res/values-no-rNO/strings.xml b/rileylink/src/main/res/values-no-rNO/strings.xml
index eb781f84f2..9f08520eac 100644
--- a/rileylink/src/main/res/values-no-rNO/strings.xml
+++ b/rileylink/src/main/res/values-no-rNO/strings.xml
@@ -1,8 +1,61 @@
+ SØK
+ STOPP
+ Valgt
+ RileyLink Søk
+ Aktiver
+ Nei
+ Søker
+ Søk fullført
+ Søk feilet: %1$d
+ Aldri
+ Innstillinger
+ Historikk
+ RileyLink Status
+ Pumpe Status
+ RileyLink Innstillinger
+ RileyLink
+ Konfigurert adresse
+ Tilkoblet enhet
+ Tilkoblingsstatus
+ Tilkoblings feil
+ Enhet
+ Enhets type
+ Enhets modell
+ Sist brukte frekvens
+ Siste enhetstilkobling
+ RL firmware
+ Bluetooth initialiserer…
+ Bluetooth feil
+ Bluetooth klar
+ Ikke startet
+ RileyLink initialisering…
+ RileyLink feil
+ Tuning av RileyLink og pumpe
+ Problemer med tilkobling til pumpe
+ Tilkoblet
+ RileyLink er klar
+ Enheten er ikke RileyLink
+ RileyLink utilgjengelig
+ Bluetooth deaktivert
+ Ingen Bluetooth adapter
+ TuneUp mislyktes
+ Pumpe utilgjengelig
+ Pod utilgjengelig
+ Medtronic pumpe
+ Omnipod
+
+ %1$d dag
+ %1$d dager
+
+
+ %1$d time
+ %1$d timer
+
diff --git a/rileylink/src/main/res/values-pl-rPL/strings.xml b/rileylink/src/main/res/values-pl-rPL/strings.xml
index ce592e20a6..427f51496d 100644
--- a/rileylink/src/main/res/values-pl-rPL/strings.xml
+++ b/rileylink/src/main/res/values-pl-rPL/strings.xml
@@ -6,9 +6,11 @@
WybranySkan RileyLinkUruchom
+ NieSkanowanieSkanowanie zakończonoBłąd skanowania: %1$d
+ NigdyUstawieniaHistoria
@@ -35,14 +37,29 @@
Błąd RileyLinkDostrojenie RileyLink i pompyProblem z połączeniem z pompą
+ Połączono
+ RileyLink gotowyUrządzenie to nie RileyLinkRileyLink nie osiągalnyBluetooth wyłączonyBrak modułu BluetoothDostrojenie nie powiodło się
+ Pompa nieosiągalnaPod nieosiągalnyPompa MedtronicOmnipod
+
+ %1$d dzień
+ %1$d dni
+ %1$d dni
+ %1$d dni
+
+
+ %1$d godzina
+ %1$d godziny
+ %1$d godzin
+ %1$d godzin
+
diff --git a/runtests.bat b/runtests.bat
new file mode 100644
index 0000000000..2f01464545
--- /dev/null
+++ b/runtests.bat
@@ -0,0 +1 @@
+gradlew -Pcoverage -PfirebaseDisable testFullDebugUnitTest
\ No newline at end of file
diff --git a/wear/build.gradle b/wear/build.gradle
index 2443fd17c8..a1cab4f14c 100644
--- a/wear/build.gradle
+++ b/wear/build.gradle
@@ -20,7 +20,6 @@ jacoco {
ext {
wearableVersion = "2.4.0"
playServicesWearable = "17.0.0"
- powermockVersion = "1.7.3"
}
def generateGitBuild = { ->
@@ -49,7 +48,7 @@ android {
defaultConfig {
applicationId "info.nightscout.androidaps"
- minSdkVersion 24
+ minSdkVersion 23
targetSdkVersion 28
versionCode 1
versionName "1.0.2"
@@ -113,7 +112,7 @@ dependencies {
//implementation files("libs/hellocharts-library-1.5.5.jar")
//compile "com.ustwo.android:clockwise-wearable:1.0.2"
- implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation "androidx.appcompat:appcompat:$appcompat_verison"
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
compileOnly "com.google.android.wearable:wearable:${wearableVersion}"
@@ -122,11 +121,11 @@ dependencies {
implementation(name: 'ustwo-clockwise-debug', ext: 'aar')
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.percentlayout:percentlayout:1.0.0'
- implementation 'androidx.wear:wear:1.0.0'
+ implementation 'androidx.wear:wear:1.1.0'
implementation('me.denley.wearpreferenceactivity:wearpreferenceactivity:0.5.0')
implementation('com.github.lecho:hellocharts-library:1.5.8@aar')
- testImplementation 'junit:junit:4.13'
+ testImplementation "junit:junit:$junit_version"
testImplementation 'org.json:json:20200518'
testImplementation("org.mockito:mockito-core:2.8.47") {
exclude group: 'net.bytebuddy', module: 'byte-buddy'
@@ -134,9 +133,9 @@ dependencies {
exclude group: 'net.bytebuddy', module: 'byte-buddy-agent'
}
// to fix org.mockito:mockito-core dependency issues, fixed in mockito 3+
- testImplementation 'net.bytebuddy:byte-buddy:1.8.22'
- testImplementation 'net.bytebuddy:byte-buddy-android:1.8.22'
- testImplementation 'net.bytebuddy:byte-buddy-agent:1.8.22'
+ testImplementation 'net.bytebuddy:byte-buddy:1.10.17'
+ testImplementation 'net.bytebuddy:byte-buddy-android:1.10.17'
+ testImplementation 'net.bytebuddy:byte-buddy-agent:1.10.17'
testImplementation "org.powermock:powermock-api-mockito2:${powermockVersion}"
testImplementation "org.powermock:powermock-module-junit4-rule-agent:${powermockVersion}"
diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml
index 4d197c5bd8..7bee0811ec 100644
--- a/wear/src/main/AndroidManifest.xml
+++ b/wear/src/main/AndroidManifest.xml
@@ -6,7 +6,7 @@
-
+
+
-
@@ -49,10 +51,12 @@
+
-
@@ -68,10 +72,12 @@
+
-
@@ -79,7 +85,7 @@
+
-
@@ -98,7 +106,7 @@
+
-
@@ -117,7 +127,7 @@
+
-
@@ -144,10 +156,12 @@
+
-
@@ -162,10 +176,33 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -178,57 +215,57 @@
+ android:pathPrefix="/nightscout_watch_data"
+ android:scheme="wear" />
+ android:pathPrefix="/nightscout_watch_data_resend"
+ android:scheme="wear" />
+ android:pathPrefix="/nightscout_watch_cancel_bolus"
+ android:scheme="wear" />
+ android:pathPrefix="/nightscout_watch_confirmactionstring"
+ android:scheme="wear" />
+ android:pathPrefix="/nightscout_watch_initiateactionstring"
+ android:scheme="wear" />
+ android:pathPrefix="/openwearsettings"
+ android:scheme="wear" />
+ android:pathPrefix="/sendstatustowear"
+ android:scheme="wear" />
+ android:pathPrefix="/sendpreferencestowear"
+ android:scheme="wear" />
+ android:pathPrefix="/nightscout_watch_basal"
+ android:scheme="wear" />
+ android:pathPrefix="/nightscout_watch_bolusprogress"
+ android:scheme="wear" />
+ android:pathPrefix="/nightscout_watch_actionconfirmationrequest"
+ android:scheme="wear" />
+ android:pathPrefix="/nightscout_watch_changeconfirmationrequest"
+ android:scheme="wear" />
+ android:pathPrefix="/nightscout_watch_cancelnotificationrequest"
+ android:scheme="wear" />
@@ -237,16 +274,16 @@
android:icon="@drawable/ic_aaps_full"
android:label="Full Status"
android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER">
-
-
-
+
+
+
-
-
+
+
+ android:value="LARGE_IMAGE" />
+ android:value="0" />
+ android:value="LARGE_IMAGE" />
+ android:value="0" />
+ android:value="LARGE_IMAGE" />
+ android:value="0" />
-
+
-
+ android:label="@string/menu_settings" />
-
+ android:label="@string/menu_wizard" />
-
+ android:label="@string/menu_prime_fill" />
-
+ android:label="@string/menu_status" />
-
+ android:label="@string/action_bolus" />
-
+ android:label="@string/status_cpp" />
-
+ android:label="@string/action_confirm"
+ android:launchMode="singleInstance" />
-
+ android:label="@string/menu_prime_fill" />
-
+ android:label="@string/action_carbs" />
+ android:label="@string/menu_tempt" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wear/src/main/java/info/nightscout/androidaps/complications/BaseComplicationProviderService.java b/wear/src/main/java/info/nightscout/androidaps/complications/BaseComplicationProviderService.java
index 49f8f82837..00a7f915b5 100644
--- a/wear/src/main/java/info/nightscout/androidaps/complications/BaseComplicationProviderService.java
+++ b/wear/src/main/java/info/nightscout/androidaps/complications/BaseComplicationProviderService.java
@@ -59,7 +59,7 @@ public abstract class BaseComplicationProviderService extends ComplicationProvid
public abstract ComplicationData buildComplicationData(int dataType, RawDisplayData raw, PendingIntent complicationPendingIntent);
public abstract String getProviderCanonicalName();
- public ComplicationAction getComplicationAction() { return ComplicationAction.MENU; };
+ public ComplicationAction getComplicationAction() { return ComplicationAction.MENU; }
//----------------------------------------------------------------------------------------------
// DEFAULT BEHAVIOURS
diff --git a/wear/src/main/java/info/nightscout/androidaps/complications/CobDetailedComplication.java b/wear/src/main/java/info/nightscout/androidaps/complications/CobDetailedComplication.java
index 350ec9b0ec..5daf7141fc 100644
--- a/wear/src/main/java/info/nightscout/androidaps/complications/CobDetailedComplication.java
+++ b/wear/src/main/java/info/nightscout/androidaps/complications/CobDetailedComplication.java
@@ -48,5 +48,5 @@ public class CobDetailedComplication extends BaseComplicationProviderService {
@Override
public ComplicationAction getComplicationAction() {
return ComplicationAction.WIZARD;
- };
+ }
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/complications/CobIconComplication.java b/wear/src/main/java/info/nightscout/androidaps/complications/CobIconComplication.java
index e42f46e3a4..d7f3085e25 100644
--- a/wear/src/main/java/info/nightscout/androidaps/complications/CobIconComplication.java
+++ b/wear/src/main/java/info/nightscout/androidaps/complications/CobIconComplication.java
@@ -47,5 +47,5 @@ public class CobIconComplication extends BaseComplicationProviderService {
public ComplicationAction getComplicationAction() {
return ComplicationAction.WIZARD;
- };
+ }
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/complications/IobDetailedComplication.java b/wear/src/main/java/info/nightscout/androidaps/complications/IobDetailedComplication.java
index db1d67a66c..9cdfb1d611 100644
--- a/wear/src/main/java/info/nightscout/androidaps/complications/IobDetailedComplication.java
+++ b/wear/src/main/java/info/nightscout/androidaps/complications/IobDetailedComplication.java
@@ -48,5 +48,5 @@ public class IobDetailedComplication extends BaseComplicationProviderService {
@Override
public ComplicationAction getComplicationAction() {
return ComplicationAction.BOLUS;
- };
+ }
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/complications/IobIconComplication.java b/wear/src/main/java/info/nightscout/androidaps/complications/IobIconComplication.java
index 1dca0f2e4d..c9e274fbd3 100644
--- a/wear/src/main/java/info/nightscout/androidaps/complications/IobIconComplication.java
+++ b/wear/src/main/java/info/nightscout/androidaps/complications/IobIconComplication.java
@@ -52,5 +52,5 @@ public class IobIconComplication extends BaseComplicationProviderService {
@Override
public ComplicationAction getComplicationAction() {
return ComplicationAction.BOLUS;
- };
+ }
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/complications/UploaderBattery.java b/wear/src/main/java/info/nightscout/androidaps/complications/UploaderBattery.java
index a5fcedacdd..a1948fa2bc 100644
--- a/wear/src/main/java/info/nightscout/androidaps/complications/UploaderBattery.java
+++ b/wear/src/main/java/info/nightscout/androidaps/complications/UploaderBattery.java
@@ -110,5 +110,5 @@ public class UploaderBattery extends BaseComplicationProviderService {
@Override
public ComplicationAction getComplicationAction() {
return ComplicationAction.STATUS;
- };
+ }
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperDarkComplication.java b/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperDarkComplication.java
index 8c84e1d8c3..a45beb8a1e 100644
--- a/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperDarkComplication.java
+++ b/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperDarkComplication.java
@@ -18,5 +18,5 @@ public class WallpaperDarkComplication extends WallpaperComplication {
@Override
public ComplicationAction getComplicationAction() {
return ComplicationAction.NONE;
- };
+ }
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperGrayComplication.java b/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperGrayComplication.java
index bec047f323..5c06550ef2 100644
--- a/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperGrayComplication.java
+++ b/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperGrayComplication.java
@@ -18,5 +18,5 @@ public class WallpaperGrayComplication extends WallpaperComplication {
@Override
public ComplicationAction getComplicationAction() {
return ComplicationAction.NONE;
- };
+ }
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperLightComplication.java b/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperLightComplication.java
index 2d2bbf6f14..04bdf5fd95 100644
--- a/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperLightComplication.java
+++ b/wear/src/main/java/info/nightscout/androidaps/complications/WallpaperLightComplication.java
@@ -18,5 +18,5 @@ public class WallpaperLightComplication extends WallpaperComplication {
@Override
public ComplicationAction getComplicationAction() {
return ComplicationAction.NONE;
- };
+ }
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/data/ListenerService.java b/wear/src/main/java/info/nightscout/androidaps/data/ListenerService.java
index 67c743c38b..dd97e1b6cc 100644
--- a/wear/src/main/java/info/nightscout/androidaps/data/ListenerService.java
+++ b/wear/src/main/java/info/nightscout/androidaps/data/ListenerService.java
@@ -97,9 +97,9 @@ public class ListenerService extends WearableListenerService implements GoogleAp
// Wear
private static final String CAPABILITY_WEAR_APP = "wear_app_sync_bgs";
private static final String MESSAGE_PATH_WEAR = "/wear_message_path";
- private String mPhoneNodeId = null;
+ private final String mPhoneNodeId = null;
private String localnode = null;
- private String logPrefix = ""; // "WR: "
+ private final String logPrefix = ""; // "WR: "
public class DataRequester extends AsyncTask {
Context mContext;
@@ -403,7 +403,7 @@ public class ListenerService extends WearableListenerService implements GoogleAp
private void forceGoogleApiConnect() {
- if ((googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) || googleApiClient == null) {
+ if (googleApiClient == null || (!googleApiClient.isConnected() && !googleApiClient.isConnecting())) {
try {
Log.d(TAG, "forceGoogleApiConnect: forcing google api reconnection");
googleApiConnect();
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/ConfigurationActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/ConfigurationActivity.java
new file mode 100644
index 0000000000..d1d8d71cc5
--- /dev/null
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/ConfigurationActivity.java
@@ -0,0 +1,44 @@
+package info.nightscout.androidaps.interaction;
+
+import android.content.res.XmlResourceParser;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import info.nightscout.androidaps.R;
+import preference.WearPreferenceActivity;
+
+public class ConfigurationActivity extends WearPreferenceActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setTitle("Watchface");
+ String configFileName=getIntent().getAction();
+ int resXmlId = getResources().getIdentifier(configFileName, "xml", getApplicationContext().getPackageName());
+ Log.d("ConfigurationActivity::onCreate --->> getIntent().getAction()",configFileName);
+ Log.d("ConfigurationActivity::onCreate --->> resXmlId",String.valueOf(resXmlId));
+ addPreferencesFromResource(resXmlId);
+ ViewGroup view = (ViewGroup) getWindow().getDecorView();
+ removeBackgroundRecursively(view);
+ view.setBackground(getResources().getDrawable(R.drawable.settings_background));
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ finish();
+ }
+
+ void removeBackgroundRecursively(View parent) {
+ if (parent instanceof ViewGroup) {
+ ViewGroup group = (ViewGroup) parent;
+ for (int i = 0; i < group.getChildCount(); i++) {
+ removeBackgroundRecursively(group.getChildAt(i));
+ }
+ }
+ parent.setBackground(null);
+ }
+
+
+}
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/AcceptActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/AcceptActivity.java
index 07e4bf02b3..6a5b9b5f9a 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/AcceptActivity.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/AcceptActivity.java
@@ -51,10 +51,10 @@ public class AcceptActivity extends ViewSelectorActivity {
setContentView(R.layout.grid_layout);
final Resources res = getResources();
- final GridViewPager pager = (GridViewPager) findViewById(R.id.pager);
+ final GridViewPager pager = findViewById(R.id.pager);
pager.setAdapter(new MyGridViewPagerAdapter());
- DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.page_indicator);
+ DotsPageIndicator dotsPageIndicator = findViewById(R.id.page_indicator);
dotsPageIndicator.setPager(pager);
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
@@ -86,15 +86,15 @@ public class AcceptActivity extends ViewSelectorActivity {
if(col == 0){
final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_confirm_text, container, false);
- final TextView headingView = (TextView) view.findViewById(R.id.title);
+ final TextView headingView = view.findViewById(R.id.title);
headingView.setText(title);
- final TextView textView = (TextView) view.findViewById(R.id.message);
+ final TextView textView = view.findViewById(R.id.message);
textView.setText(message);
container.addView(view);
return view;
} else {
final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_send_item, container, false);
- final ImageView confirmbutton = (ImageView) view.findViewById(R.id.confirmbutton);
+ final ImageView confirmbutton = view.findViewById(R.id.confirmbutton);
confirmbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.java
index 95dea79d47..1b38bc8a9e 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.java
@@ -36,10 +36,10 @@ public class BolusActivity extends ViewSelectorActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid_layout);
final Resources res = getResources();
- final GridViewPager pager = (GridViewPager) findViewById(R.id.pager);
+ final GridViewPager pager = findViewById(R.id.pager);
pager.setAdapter(new MyGridViewPagerAdapter());
- DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.page_indicator);
+ DotsPageIndicator dotsPageIndicator = findViewById(R.id.page_indicator);
dotsPageIndicator.setPager(pager);
}
@@ -88,7 +88,7 @@ public class BolusActivity extends ViewSelectorActivity {
} else {
final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_send_item, container, false);
- final ImageView confirmbutton = (ImageView) view.findViewById(R.id.confirmbutton);
+ final ImageView confirmbutton = view.findViewById(R.id.confirmbutton);
confirmbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CPPActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CPPActivity.java
index b9626b47da..ab8647bcde 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CPPActivity.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CPPActivity.java
@@ -48,10 +48,10 @@ public class CPPActivity extends ViewSelectorActivity {
setContentView(R.layout.grid_layout);
final Resources res = getResources();
- final GridViewPager pager = (GridViewPager) findViewById(R.id.pager);
+ final GridViewPager pager = findViewById(R.id.pager);
pager.setAdapter(new MyGridViewPagerAdapter());
- DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.page_indicator);
+ DotsPageIndicator dotsPageIndicator = findViewById(R.id.page_indicator);
dotsPageIndicator.setPager(pager);
}
@@ -100,7 +100,7 @@ public class CPPActivity extends ViewSelectorActivity {
} else {
final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_send_item, container, false);
- final ImageView confirmbutton = (ImageView) view.findViewById(R.id.confirmbutton);
+ final ImageView confirmbutton = view.findViewById(R.id.confirmbutton);
confirmbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java
index cae69b34a5..994557e307 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java
@@ -36,10 +36,10 @@ public class ECarbActivity extends ViewSelectorActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid_layout);
final Resources res = getResources();
- final GridViewPager pager = (GridViewPager) findViewById(R.id.pager);
+ final GridViewPager pager = findViewById(R.id.pager);
pager.setAdapter(new MyGridViewPagerAdapter());
- DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.page_indicator);
+ DotsPageIndicator dotsPageIndicator = findViewById(R.id.page_indicator);
dotsPageIndicator.setPager(pager);
}
@@ -98,7 +98,7 @@ public class ECarbActivity extends ViewSelectorActivity {
} else {
final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_send_item, container, false);
- final ImageView confirmbutton = (ImageView) view.findViewById(R.id.confirmbutton);
+ final ImageView confirmbutton = view.findViewById(R.id.confirmbutton);
confirmbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.java
index 3f9eac6475..b9269f3829 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.java
@@ -35,10 +35,10 @@ public class FillActivity extends ViewSelectorActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid_layout);
final Resources res = getResources();
- final GridViewPager pager = (GridViewPager) findViewById(R.id.pager);
+ final GridViewPager pager = findViewById(R.id.pager);
pager.setAdapter(new MyGridViewPagerAdapter());
- DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.page_indicator);
+ DotsPageIndicator dotsPageIndicator = findViewById(R.id.page_indicator);
dotsPageIndicator.setPager(pager);
}
@@ -77,7 +77,7 @@ public class FillActivity extends ViewSelectorActivity {
} else {
final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_send_item, container, false);
- final ImageView confirmbutton = (ImageView) view.findViewById(R.id.confirmbutton);
+ final ImageView confirmbutton = view.findViewById(R.id.confirmbutton);
confirmbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.java
index 3ef2622a0d..fcb4bd2b92 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.java
@@ -40,10 +40,10 @@ public class TempTargetActivity extends ViewSelectorActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid_layout);
final Resources res = getResources();
- final GridViewPager pager = (GridViewPager) findViewById(R.id.pager);
+ final GridViewPager pager = findViewById(R.id.pager);
pager.setAdapter(new MyGridViewPagerAdapter());
- DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.page_indicator);
+ DotsPageIndicator dotsPageIndicator = findViewById(R.id.page_indicator);
dotsPageIndicator.setPager(pager);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
@@ -75,7 +75,7 @@ public class TempTargetActivity extends ViewSelectorActivity {
if(col == 0){
final View view = getInflatedPlusMinusView(container);
- final TextView textView = (TextView) view.findViewById(R.id.label);
+ final TextView textView = view.findViewById(R.id.label);
textView.setText("duration");
if (time == null) {
time = new PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, 60d, 0d, 24 * 60d, 5d, new DecimalFormat("0"), false);
@@ -130,7 +130,7 @@ public class TempTargetActivity extends ViewSelectorActivity {
}else {
final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_send_item, container, false);
- final ImageView confirmbutton = (ImageView) view.findViewById(R.id.confirmbutton);
+ final ImageView confirmbutton = view.findViewById(R.id.confirmbutton);
confirmbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.java
index c5100d5a03..24796dfeca 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.java
@@ -40,10 +40,10 @@ public class ViewSelectorActivity extends Activity {
if (design == 4){
//@LadyViktoria: Here the label can be set differently, if you like.
- final TextView textView = (TextView) view.findViewById(R.id.label);
+ final TextView textView = view.findViewById(R.id.label);
textView.setText(labelText);
} else {
- final TextView textView = (TextView) view.findViewById(R.id.label);
+ final TextView textView = view.findViewById(R.id.label);
textView.setText(labelText);
}
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java
index a3a10ae03d..c47ba6f5b3 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java
@@ -41,10 +41,10 @@ public class WizardActivity extends ViewSelectorActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid_layout);
final Resources res = getResources();
- final GridViewPager pager = (GridViewPager) findViewById(R.id.pager);
+ final GridViewPager pager = findViewById(R.id.pager);
pager.setAdapter(new MyGridViewPagerAdapter());
- DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.page_indicator);
+ DotsPageIndicator dotsPageIndicator = findViewById(R.id.page_indicator);
dotsPageIndicator.setPager(pager);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
hasPercentage = sp.getBoolean("wizardpercentage", false);
@@ -98,7 +98,7 @@ public class WizardActivity extends ViewSelectorActivity {
} else {
final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_send_item, container, false);
- final ImageView confirmbutton = (ImageView) view.findViewById(R.id.confirmbutton);
+ final ImageView confirmbutton = view.findViewById(R.id.confirmbutton);
confirmbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/MenuListActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/MenuListActivity.java
index 9d6fd51126..af606db583 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/MenuListActivity.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/MenuListActivity.java
@@ -38,7 +38,7 @@ public abstract class MenuListActivity extends Activity
// Get the list component from the layout of the activity
WearableListView listView =
- (WearableListView) findViewById(R.id.wearable_list);
+ findViewById(R.id.wearable_list);
// Assign an adapter to the list
listView.setAdapter(new Adapter(this, elements));
@@ -62,7 +62,7 @@ public abstract class MenuListActivity extends Activity
private static final class Adapter extends WearableListView.Adapter {
- private String[] mDataset;
+ private final String[] mDataset;
private final Context mContext;
private final LayoutInflater mInflater;
@@ -75,12 +75,12 @@ public abstract class MenuListActivity extends Activity
// Provide a reference to the type of views you're using
public static class ItemViewHolder extends WearableListView.ViewHolder {
- private TextView textView;
+ private final TextView textView;
public ItemViewHolder(View itemView) {
super(itemView);
// find the text view within the custom item's layout
- textView = (TextView) itemView.findViewById(R.id.actionitem);
+ textView = itemView.findViewById(R.id.actionitem);
}
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.java b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.java
index 5af013c042..26d85ea0fc 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.java
@@ -33,11 +33,11 @@ public class PlusMinusEditText implements View.OnKeyListener,
boolean allowZero = false;
boolean roundRobin;
- private Handler mHandler;
+ private final Handler mHandler;
private ScheduledExecutorService mUpdater;
private class UpdateCounterTask implements Runnable {
- private boolean mInc;
+ private final boolean mInc;
private int repeated = 0;
private int multiplier = 1;
@@ -70,9 +70,9 @@ public class PlusMinusEditText implements View.OnKeyListener,
}
public PlusMinusEditText(View view, int editTextID, int plusID, int minusID, Double initValue, Double minValue, Double maxValue, Double step, NumberFormat formater, boolean allowZero, boolean roundRobin) {
- editText = (TextView) view.findViewById(editTextID);
- minusImage = (ImageView) view.findViewById(minusID);
- plusImage = (ImageView) view.findViewById(plusID);
+ editText = view.findViewById(editTextID);
+ minusImage = view.findViewById(minusID);
+ plusImage = view.findViewById(plusID);
this.value = initValue;
this.minValue = minValue;
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/SmallestDoubleString.java b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/SmallestDoubleString.java
index 8361478976..be59dbc127 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/SmallestDoubleString.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/SmallestDoubleString.java
@@ -28,7 +28,7 @@ public class SmallestDoubleString {
USE
}
- private static Pattern pattern = Pattern.compile("^([+-]?)([0-9]*)([,.]?)([0-9]*)(\\([^)]*\\))?(.*?)$", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE );
+ private static final Pattern pattern = Pattern.compile("^([+-]?)([0-9]*)([,.]?)([0-9]*)(\\([^)]*\\))?(.*?)$", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE );
public SmallestDoubleString(String inputString) {
this(inputString, Units.SKIP);
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WatchfaceSettingsPreference.java b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WatchfaceSettingsPreference.java
new file mode 100644
index 0000000000..eba3b79033
--- /dev/null
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WatchfaceSettingsPreference.java
@@ -0,0 +1,33 @@
+package info.nightscout.androidaps.interaction.utils;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+
+import preference.WearListPreference;
+
+
+public class WatchfaceSettingsPreference extends WearListPreference {
+ private final String pref_moreWatchfaceSettings;
+ private final String pref_lookInYourWatchfaceConfiguration;
+
+ public WatchfaceSettingsPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ this.pref_moreWatchfaceSettings =context.getResources().getString(context.getResources().getIdentifier("pref_moreWatchfaceSettings", "string", context.getApplicationContext().getPackageName()));
+ this.pref_lookInYourWatchfaceConfiguration=context.getResources().getString(context.getResources().getIdentifier("pref_lookInYourWatchfaceConfiguration", "string", context.getApplicationContext().getPackageName()));
+
+ entries = new CharSequence[]{pref_moreWatchfaceSettings};
+ entryValues = new CharSequence[]{""};
+ }
+
+ @Override public CharSequence getSummary(@NonNull final Context context) {
+ return "";
+ }
+ @Override
+ public void onPreferenceClick(@NonNull Context context) {
+ Toast.makeText(context, pref_lookInYourWatchfaceConfiguration, Toast.LENGTH_LONG).show();
+ }
+}
diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WearableListItemLayout.java b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WearableListItemLayout.java
index 89925cc9b8..6bfe3ae0f2 100644
--- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WearableListItemLayout.java
+++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WearableListItemLayout.java
@@ -46,7 +46,7 @@ public class WearableListItemLayout extends LinearLayout
protected void onFinishInflate() {
super.onFinishInflate();
//mCircle = (ImageView) findViewById(R.id.circle);
- mName = (TextView) findViewById(R.id.actionitem);
+ mName = findViewById(R.id.actionitem);
}
@Override
diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java
index 7f46ba2fdf..492e77cd05 100644
--- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java
+++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java
@@ -133,7 +133,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre
}
public void performViewSetup() {
- final WatchViewStub stub = (WatchViewStub) layoutView.findViewById(R.id.watch_view_stub);
+ final WatchViewStub stub = layoutView.findViewById(R.id.watch_view_stub);
IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
messageReceiver = new MessageReceiver();
@@ -143,14 +143,14 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
- mTime = (TextView) stub.findViewById(R.id.watch_time);
- mSgv = (TextView) stub.findViewById(R.id.sgv);
- mTimestamp = (TextView) stub.findViewById(R.id.timestamp);
- mDelta = (TextView) stub.findViewById(R.id.delta);
- mAvgDelta = (TextView) stub.findViewById(R.id.avgdelta);
- mRelativeLayout = (RelativeLayout) stub.findViewById(R.id.main_layout);
- chart = (LineChartView) stub.findViewById(R.id.chart);
- statusView = (TextView) stub.findViewById(R.id.aps_status);
+ mTime = stub.findViewById(R.id.watch_time);
+ mSgv = stub.findViewById(R.id.sgv);
+ mTimestamp = stub.findViewById(R.id.timestamp);
+ mDelta = stub.findViewById(R.id.delta);
+ mAvgDelta = stub.findViewById(R.id.avgdelta);
+ mRelativeLayout = stub.findViewById(R.id.main_layout);
+ chart = stub.findViewById(R.id.chart);
+ statusView = stub.findViewById(R.id.aps_status);
layoutSet = true;
showAgeAndStatus();
mRelativeLayout.measure(specW, specH);
diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java
index 51faedeb4b..4255263e02 100644
--- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java
+++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java
@@ -11,6 +11,7 @@ import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.PowerManager;
+import android.os.Vibrator;
import android.preference.PreferenceManager;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.support.wearable.view.WatchViewStub;
@@ -50,7 +51,7 @@ import lecho.lib.hellocharts.view.LineChartView;
public abstract class BaseWatchFace extends WatchFace implements SharedPreferences.OnSharedPreferenceChangeListener {
public final static IntentFilter INTENT_FILTER;
public static final long[] vibratePattern = {0,400,300,400,300,400};
- public TextView mTime, mSgv, mDirection, mTimestamp, mUploaderBattery, mRigBattery, mDelta, mAvgDelta, mStatus, mBasalRate, mIOB1, mIOB2, mCOB1, mCOB2, mBgi, mLoop, mDay, mMonth, isAAPSv2, mHighLight, mLowLight;
+ public TextView mTime, mHour, mMinute,mSgv, mDirection, mTimestamp, mUploaderBattery, mRigBattery, mDelta, mAvgDelta, mStatus, mBasalRate, mIOB1, mIOB2, mCOB1, mCOB2, mBgi, mLoop, mDay, mDayName, mMonth, isAAPSv2, mHighLight, mLowLight;
public ImageView mGlucoseDial, mDeltaGauge, mHourHand, mMinuteHand;
public RelativeLayout mRelativeLayout;
public LinearLayout mLinearLayout, mLinearLayout2, mDate, mChartTap, mMainMenuTap;
@@ -115,7 +116,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen
}
public void performViewSetup() {
- final WatchViewStub stub = (WatchViewStub) layoutView.findViewById(R.id.watch_view_stub);
+ final WatchViewStub stub = layoutView.findViewById(R.id.watch_view_stub);
IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
messageReceiver = new MessageReceiver();
@@ -125,38 +126,41 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
- mTime = (TextView) stub.findViewById(R.id.watch_time);
- mDay = (TextView) stub.findViewById(R.id.day);
- mMonth = (TextView) stub.findViewById(R.id.month);
- mDate = (LinearLayout) stub.findViewById(R.id.date_time);
- mLoop = (TextView) stub.findViewById(R.id.loop);
- mSgv = (TextView) stub.findViewById(R.id.sgv);
- mDirection = (TextView) stub.findViewById(R.id.direction);
- mTimestamp = (TextView) stub.findViewById(R.id.timestamp);
- mIOB1 = (TextView) stub.findViewById(R.id.iob_text);
- mIOB2 = (TextView) stub.findViewById(R.id.iobView);
- mCOB1 = (TextView) stub.findViewById(R.id.cob_text);
- mCOB2 = (TextView) stub.findViewById(R.id.cobView);
- mBgi = (TextView) stub.findViewById(R.id.bgiView);
- mStatus = (TextView) stub.findViewById(R.id.externaltstatus);
- mBasalRate = (TextView) stub.findViewById(R.id.tmpBasal);
- mUploaderBattery = (TextView) stub.findViewById(R.id.uploader_battery);
- mRigBattery = (TextView) stub.findViewById(R.id.rig_battery);
- mDelta = (TextView) stub.findViewById(R.id.delta);
- mAvgDelta = (TextView) stub.findViewById(R.id.avgdelta);
- isAAPSv2 = (TextView) stub.findViewById(R.id.AAPSv2);
- mHighLight = (TextView) stub.findViewById(R.id.highLight);
- mLowLight = (TextView) stub.findViewById(R.id.lowLight);
- mRelativeLayout = (RelativeLayout) stub.findViewById(R.id.main_layout);
- mLinearLayout = (LinearLayout) stub.findViewById(R.id.secondary_layout);
- mLinearLayout2 = (LinearLayout) stub.findViewById(R.id.tertiary_layout);
- mGlucoseDial = (ImageView) stub.findViewById(R.id.glucose_dial);
- mDeltaGauge = (ImageView) stub.findViewById(R.id.delta_pointer);
- mHourHand = (ImageView) stub.findViewById(R.id.hour_hand);
- mMinuteHand = (ImageView) stub.findViewById(R.id.minute_hand);
- mChartTap = (LinearLayout) stub.findViewById(R.id.chart_zoom_tap);
- mMainMenuTap = (LinearLayout) stub.findViewById(R.id.main_menu_tap);
- chart = (LineChartView) stub.findViewById(R.id.chart);
+ mTime = stub.findViewById(R.id.watch_time);
+ mHour = stub.findViewById(R.id.hour);
+ mMinute = stub.findViewById(R.id.minute);
+ mDay = stub.findViewById(R.id.day);
+ mDayName= stub.findViewById(R.id.dayname);
+ mMonth = stub.findViewById(R.id.month);
+ mDate = stub.findViewById(R.id.date_time);
+ mLoop = stub.findViewById(R.id.loop);
+ mSgv = stub.findViewById(R.id.sgv);
+ mDirection = stub.findViewById(R.id.direction);
+ mTimestamp = stub.findViewById(R.id.timestamp);
+ mIOB1 = stub.findViewById(R.id.iob_text);
+ mIOB2 = stub.findViewById(R.id.iobView);
+ mCOB1 = stub.findViewById(R.id.cob_text);
+ mCOB2 = stub.findViewById(R.id.cobView);
+ mBgi = stub.findViewById(R.id.bgiView);
+ mStatus = stub.findViewById(R.id.externaltstatus);
+ mBasalRate = stub.findViewById(R.id.tmpBasal);
+ mUploaderBattery = stub.findViewById(R.id.uploader_battery);
+ mRigBattery = stub.findViewById(R.id.rig_battery);
+ mDelta = stub.findViewById(R.id.delta);
+ mAvgDelta = stub.findViewById(R.id.avgdelta);
+ isAAPSv2 = stub.findViewById(R.id.AAPSv2);
+ mHighLight = stub.findViewById(R.id.highLight);
+ mLowLight = stub.findViewById(R.id.lowLight);
+ mRelativeLayout = stub.findViewById(R.id.main_layout);
+ mLinearLayout = stub.findViewById(R.id.secondary_layout);
+ mLinearLayout2 = stub.findViewById(R.id.tertiary_layout);
+ mGlucoseDial = stub.findViewById(R.id.glucose_dial);
+ mDeltaGauge = stub.findViewById(R.id.delta_pointer);
+ mHourHand = stub.findViewById(R.id.hour_hand);
+ mMinuteHand = stub.findViewById(R.id.minute_hand);
+ mChartTap = stub.findViewById(R.id.chart_zoom_tap);
+ mMainMenuTap = stub.findViewById(R.id.main_menu_tap);
+ chart = stub.findViewById(R.id.chart);
layoutSet = true;
setDataFields();
@@ -230,6 +234,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen
setDataFields();
setColor();
missedReadingAlert();
+ checkVibrateHourly(oldTime,newTime);
mRelativeLayout.measure(specW, specH);
if (forceSquareCanvas) {
@@ -241,6 +246,16 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen
}
}
+ private void checkVibrateHourly(WatchFaceTime oldTime, WatchFaceTime newTime){
+ Boolean hourlyVibratePref = sharedPrefs.getBoolean("vibrate_Hourly", false);
+ if (hourlyVibratePref && layoutSet && newTime.hasHourChanged(oldTime)) {
+ Log.i("hourlyVibratePref", "true --> " + newTime.toString());
+ Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
+ long[] vibrationPattern = {0, 150, 125, 100};
+ vibrator.vibrate(vibrationPattern, -1);
+ }
+ }
+
public class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@@ -468,8 +483,18 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen
sHour = sdfHour.format(now);
sMinute = sdfMinute.format(now);
+ if (mHour != null && mMinute != null ) {
+ mHour.setText(sHour);
+ mMinute.setText(sMinute);
+ }
+
if (mDate != null && mDay != null && mMonth != null) {
if (sharedPrefs.getBoolean("show_date", false)) {
+ if (mDayName != null ) {
+ SimpleDateFormat sdfDayName = new SimpleDateFormat("E");
+ mDayName.setText(sdfDayName.format(now));
+ }
+
SimpleDateFormat sdfDay = new SimpleDateFormat("dd");
SimpleDateFormat sdfMonth = new SimpleDateFormat("MMM");
mDay.setText(sdfDay.format(now));
diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java
index 90a3ea81d5..7666dcd907 100644
--- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java
+++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java
@@ -31,12 +31,12 @@ import lecho.lib.hellocharts.model.Viewport;
*/
public class BgGraphBuilder {
public static final double MAX_PREDICTION__TIME_RATIO = (3d / 5);
- private long predictionEndTime;
- private List predictionsList;
- private ArrayList bolusWatchDataList;
- private ArrayList basalWatchDataList;
+ private final long predictionEndTime;
+ private final List predictionsList;
+ private final ArrayList bolusWatchDataList;
+ private final ArrayList basalWatchDataList;
public List tempWatchDataList;
- private int timespan;
+ private final int timespan;
public long end_time;
public long start_time;
public double fuzzyTimeDenom = (1000 * 60 * 1);
@@ -52,14 +52,14 @@ public class BgGraphBuilder {
public int gridColour;
public int basalCenterColor;
public int basalBackgroundColor;
- private int bolusInvalidColor;
- private int carbsColor;
+ private final int bolusInvalidColor;
+ private final int carbsColor;
public boolean singleLine = false;
- private List inRangeValues = new ArrayList();
- private List highValues = new ArrayList();
- private List lowValues = new ArrayList();
+ private final List inRangeValues = new ArrayList();
+ private final List highValues = new ArrayList();
+ private final List lowValues = new ArrayList();
public Viewport viewport;
@@ -227,7 +227,7 @@ public class BgGraphBuilder {
for (BasalWatchData bwd: basalWatchDataList) {
if(bwd.endTime > start_time) {
- long begin = (long) Math.max(start_time, bwd.startTime);
+ long begin = Math.max(start_time, bwd.startTime);
pointValues.add(new PointValue(fuzz(begin), offset + (float) (factor * bwd.amount)));
pointValues.add(new PointValue(fuzz(bwd.endTime), offset + (float) (factor * bwd.amount)));
}
@@ -249,7 +249,7 @@ public class BgGraphBuilder {
for (BolusWatchData bwd: bolusWatchDataList) {
if(bwd.date > start_time && bwd.date <= end_time && !bwd.isSMB && bwd.isValid && bwd.bolus > 0) {
- pointValues.add(new PointValue(fuzz(bwd.date), (float) offset-2));
+ pointValues.add(new PointValue(fuzz(bwd.date), offset -2));
}
}
Line line = new Line(pointValues);
@@ -266,7 +266,7 @@ public class BgGraphBuilder {
for (BolusWatchData bwd: bolusWatchDataList) {
if(bwd.date > start_time && bwd.date <= end_time && bwd.isSMB && bwd.isValid && bwd.bolus > 0) {
- pointValues.add(new PointValue(fuzz(bwd.date), (float) offset-2));
+ pointValues.add(new PointValue(fuzz(bwd.date), offset -2));
}
}
Line line = new Line(pointValues);
@@ -283,7 +283,7 @@ public class BgGraphBuilder {
for (BolusWatchData bwd: bolusWatchDataList) {
if(bwd.date > start_time && bwd.date <= end_time && !(bwd.isValid && (bwd.bolus > 0 || bwd.carbs > 0))) {
- pointValues.add(new PointValue(fuzz(bwd.date), (float) offset-2));
+ pointValues.add(new PointValue(fuzz(bwd.date), offset -2));
}
}
Line line = new Line(pointValues);
@@ -300,7 +300,7 @@ public class BgGraphBuilder {
for (BolusWatchData bwd: bolusWatchDataList) {
if(bwd.date > start_time && bwd.date <= end_time && !bwd.isSMB && bwd.isValid && bwd.carbs > 0) {
- pointValues.add(new PointValue(fuzz(bwd.date), (float) offset+2));
+ pointValues.add(new PointValue(fuzz(bwd.date), offset +2));
}
}
Line line = new Line(pointValues);
@@ -372,7 +372,7 @@ public class BgGraphBuilder {
public Line tempValuesLine(TempWatchData twd, float offset, double factor, boolean isHighlightLine, int strokeWidth) {
List lineValues = new ArrayList();
- long begin = (long) Math.max(start_time, twd.startTime);
+ long begin = Math.max(start_time, twd.startTime);
lineValues.add(new PointValue(fuzz(begin), offset + (float) (factor * twd.startBasal)));
lineValues.add(new PointValue(fuzz(begin), offset + (float) (factor * twd.amount)));
lineValues.add(new PointValue(fuzz(twd.endTime), offset + (float) (factor * twd.amount)));
diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java
index 4813942e1f..f4c7d18a90 100644
--- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java
+++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java
@@ -54,8 +54,8 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh
private float angleSMALL = 0f;
private int hour, minute;
private int color;
- private Paint circlePaint = new Paint();
- private Paint removePaint = new Paint();
+ private final Paint circlePaint = new Paint();
+ private final Paint removePaint = new Paint();
private RectF rect, rectDelete;
private boolean overlapping;
@@ -64,7 +64,7 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh
public Point displaySize = new Point();
- private MessageReceiver messageReceiver = new MessageReceiver();
+ private final MessageReceiver messageReceiver = new MessageReceiver();
private int sgvLevel = 0;
private String sgvString = "999";
@@ -150,8 +150,8 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh
// prepare fields
TextView textView;
- mSgv = (TextView) myLayout.findViewById(R.id.sgvString);
- textView = (TextView) myLayout.findViewById(R.id.sgvString);
+ mSgv = myLayout.findViewById(R.id.sgvString);
+ textView = myLayout.findViewById(R.id.sgvString);
if (sharedPrefs.getBoolean("showBG", true)) {
textView.setVisibility(View.VISIBLE);
textView.setText(getSgvString());
@@ -162,7 +162,7 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh
textView.setVisibility(View.INVISIBLE);
}
- textView = (TextView) myLayout.findViewById(R.id.statusString);
+ textView = myLayout.findViewById(R.id.statusString);
if (sharedPrefs.getBoolean("showExternalStatus", true)) {
textView.setVisibility(View.VISIBLE);
textView.setText(getStatusString());
@@ -173,7 +173,7 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh
textView.setVisibility(View.GONE);
}
- textView = (TextView) myLayout.findViewById(R.id.agoString);
+ textView = myLayout.findViewById(R.id.agoString);
if (sharedPrefs.getBoolean("showAgo", true)) {
textView.setVisibility(View.VISIBLE);
@@ -189,7 +189,7 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh
textView.setVisibility(View.INVISIBLE);
}
- textView = (TextView) myLayout.findViewById(R.id.deltaString);
+ textView = myLayout.findViewById(R.id.deltaString);
if (sharedPrefs.getBoolean("showDelta", true)) {
textView.setVisibility(View.VISIBLE);
textView.setText(getDelta());
@@ -214,9 +214,9 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh
}
public String getMinutes() {
- String minutes = "--\'";
+ String minutes = "--'";
if (getDatetime() != 0) {
- minutes = ((int) Math.floor((System.currentTimeMillis() - getDatetime()) / 60000.0)) + "\'";
+ minutes = ((int) Math.floor((System.currentTimeMillis() - getDatetime()) / 60000.0)) + "'";
}
return minutes;
}
diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/DigitalStyle.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/DigitalStyle.java
new file mode 100644
index 0000000000..2b3975e949
--- /dev/null
+++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/DigitalStyle.java
@@ -0,0 +1,171 @@
+package info.nightscout.androidaps.watchfaces;
+
+import android.content.Intent;
+import android.content.res.ColorStateList;
+import android.support.wearable.watchface.WatchFaceStyle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.core.content.ContextCompat;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.interaction.menus.MainMenuActivity;
+
+public class DigitalStyle extends BaseWatchFace {
+ private static final long TIME_TAP_THRESHOLD = 800;
+ private final long chartTapTime = 0;
+ private long sgvTapTime = 0;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
+ layoutView = inflater.inflate(R.layout.activity_digitalstyle, null);
+ performViewSetup();
+ }
+
+
+ @Override
+ protected void onTapCommand(int tapType, int x, int y, long eventTime) {
+ //tapType = TAP_TYPE_TAP;
+ Log.d("onTapCommand: DeviceWidth x DeviceHeight /// x , y, TapType >> ", getWidth() + " x " + getHeight() + " /// " + x + " , " + y + " , " + tapType);
+
+ if (tapType == TAP_TYPE_TAP) {
+ if (eventTime - sgvTapTime < TIME_TAP_THRESHOLD) {
+ Intent intent = new Intent(this, MainMenuActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+ }
+ sgvTapTime = eventTime;
+ }
+ }
+
+
+ @Override
+ protected WatchFaceStyle getWatchFaceStyle() {
+ return new WatchFaceStyle.Builder(this)
+ .setAcceptsTapEvents(true)
+ .setHideNotificationIndicator(false)
+ .setShowUnreadCountIndicator(true)
+ .build();
+ }
+
+ protected void setColorDark() {
+ if (rawData.sgvLevel == 1) {
+ mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor));
+ mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor));
+ } else if (rawData.sgvLevel == 0) {
+ mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
+ mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
+ } else if (rawData.sgvLevel == -1) {
+ mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_lowColor));
+ mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_lowColor));
+ }
+
+ if (ageLevel == 1) {
+ mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
+ } else {
+ mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_TimestampOld));
+ }
+
+ if (rawData.batteryLevel == 1) {
+ mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
+ } else {
+ mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBatteryEmpty));
+ }
+
+
+ if (chart != null) {
+ highColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor);
+ lowColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_lowColor);
+ midColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor);
+ gridColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_gridColor);
+ basalBackgroundColor = ContextCompat.getColor(getApplicationContext(), R.color.basal_dark);
+ basalCenterColor = ContextCompat.getColor(getApplicationContext(), R.color.basal_light);
+ pointSize = 1;
+ setupCharts();
+ setWatchfaceStyle();
+ }
+ }
+
+ private void setWatchfaceStyle(){
+ /* frame styles*/
+ LinearLayout mShapesElements = layoutView.findViewById(R.id.shapes_elements);
+ if (mShapesElements != null) {
+ String displayFormatType = (mShapesElements.getContentDescription().toString().startsWith("round") ? "round" : "rect");
+ String displayStyle=sharedPrefs.getString("digitalstyle_frameStyle", "full");
+ String displayFrameColor=sharedPrefs.getString("digitalstyle_frameColor", "red");
+ String displayFrameColorSaturation=sharedPrefs.getString("digitalstyle_frameColorSaturation", "500");
+ String displayFrameColorOpacity=sharedPrefs.getString("digitalstyle_frameColorOpacity", "1");
+
+ // Load image with shapes
+ String styleDrawableName = "digitalstyle_bg_" + displayStyle + "_" + displayFormatType;
+ try {
+ mShapesElements.setBackground(getResources().getDrawable(getResources().getIdentifier(styleDrawableName, "drawable", getApplicationContext().getPackageName())));
+ } catch (Exception e) {
+ Log.e("digitalstyle_frameStyle", "RESOURCE NOT FOUND >> " + styleDrawableName);
+ }
+
+ // set background-tint-color
+ if (displayFrameColor.equalsIgnoreCase("multicolor") || displayStyle.equalsIgnoreCase("none")) {
+ mShapesElements.setBackgroundTintList(null);
+ } else {
+ String strColorName =(( displayFrameColor.equals("white") || displayFrameColor.equals("black") )?displayFrameColor:displayFrameColor+"_"+displayFrameColorSaturation);
+ Log.v("digitalstyle_strColorName",strColorName);
+ try {
+ ColorStateList colorStateList = ContextCompat.getColorStateList(getApplicationContext(), getResources().getIdentifier(strColorName, "color", getApplicationContext().getPackageName()));
+ mShapesElements.setBackgroundTintList(colorStateList);
+ } catch (Exception e) {
+ mShapesElements.setBackgroundTintList(null);
+ Log.e("digitalstyle_colorName", "COLOR NOT FOUND >> " + strColorName);
+ }
+ }
+
+ // set opacity of shapes
+ mShapesElements.setAlpha(Float.parseFloat(displayFrameColorOpacity));
+
+ }
+
+ /* optimize font-size --> when date is off then increase font-size of time */
+ Boolean isShowDate = sharedPrefs.getBoolean("show_date", false);
+ if (!isShowDate) {
+ layoutView.findViewById(R.id.date_time).setVisibility(View.GONE);
+ mHour.setTextSize(62);
+ mMinute.setTextSize(40);
+ mHour.setLetterSpacing((float) -0.066);
+ mMinute.setLetterSpacing((float) -0.066);
+ } else {
+ layoutView.findViewById(R.id.date_time).setVisibility(View.VISIBLE);
+ mHour.setTextSize(40);
+ mMinute.setTextSize(26);
+ mHour.setLetterSpacing((float) 0);
+ mMinute.setLetterSpacing((float) 0);
+
+ /* display week number */
+ Boolean isShowWeekNumber = sharedPrefs.getBoolean("show_weeknumber", false);
+ Log.i("---------------------------------","weeknumber refresh ");
+ TextView mWeekNumber= layoutView.findViewById(R.id.weeknumber);
+ if (isShowWeekNumber) {
+ mWeekNumber.setVisibility(View.VISIBLE);
+ mWeekNumber.setText("(" + (new SimpleDateFormat("ww")).format(new Date()) + ")");
+ } else {
+ mWeekNumber.setVisibility(View.GONE);
+ mWeekNumber.setText("");
+ }
+ }
+
+
+ }
+
+ protected void setColorLowRes() {
+ setColorDark();
+ }
+ protected void setColorBright() { setColorDark(); /* getCurrentWatchMode() == WatchMode.AMBIENT or WatchMode.INTERACTIVE */}
+
+}
diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/NOChart.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/NOChart.java
index 0686c91bd9..f879701661 100644
--- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/NOChart.java
+++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/NOChart.java
@@ -113,7 +113,7 @@ public class NOChart extends WatchFace implements SharedPreferences.OnSharedPref
}
public void performViewSetup() {
- final WatchViewStub stub = (WatchViewStub) layoutView.findViewById(R.id.watch_view_stub);
+ final WatchViewStub stub = layoutView.findViewById(R.id.watch_view_stub);
IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
messageReceiver = new MessageReceiver();
@@ -123,13 +123,13 @@ public class NOChart extends WatchFace implements SharedPreferences.OnSharedPref
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
- mTime = (TextView) stub.findViewById(R.id.watch_time);
- mSgv = (TextView) stub.findViewById(R.id.sgv);
- mTimestamp = (TextView) stub.findViewById(R.id.timestamp);
- mDelta = (TextView) stub.findViewById(R.id.delta);
- mAvgDelta = (TextView) stub.findViewById(R.id.avgdelta);
- mRelativeLayout = (RelativeLayout) stub.findViewById(R.id.main_layout);
- statusView = (TextView) stub.findViewById(R.id.aps_status);
+ mTime = stub.findViewById(R.id.watch_time);
+ mSgv = stub.findViewById(R.id.sgv);
+ mTimestamp = stub.findViewById(R.id.timestamp);
+ mDelta = stub.findViewById(R.id.delta);
+ mAvgDelta = stub.findViewById(R.id.avgdelta);
+ mRelativeLayout = stub.findViewById(R.id.main_layout);
+ statusView = stub.findViewById(R.id.aps_status);
layoutSet = true;
showAgeAndStatus();
mRelativeLayout.measure(specW, specH);
diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/Steampunk.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/Steampunk.java
index 48f7a4e792..809a9ce850 100644
--- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/Steampunk.java
+++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/Steampunk.java
@@ -123,7 +123,7 @@ public class Steampunk extends BaseWatchFace {
//set the delta gauge and rotate the delta pointer
float deltaIsNegative = 1f; //by default go clockwise
if (!rawData.sAvgDelta.equals("--")) { //if a legitimate delta value is received, then...
- if (rawData.sAvgDelta.substring(0,1).equals("-")) deltaIsNegative = -1f; //if the delta is negative, go counter-clockwise
+ if (rawData.sAvgDelta.charAt(0) == '-') deltaIsNegative = -1f; //if the delta is negative, go counter-clockwise
Float AbssAvgDelta = SafeParse.stringToFloat(rawData.sAvgDelta.substring(1)) ; //get rid of the sign so it can be converted to float.
String autogranularity = "0" ; //autogranularity off
//ensure the delta gauge is the right units and granularity
diff --git a/wear/src/main/res/drawable-hdpi/ic_toggle_off.png b/wear/src/main/res/drawable-hdpi/ic_toggle_off.png
deleted file mode 100644
index ea0e7e636e..0000000000
Binary files a/wear/src/main/res/drawable-hdpi/ic_toggle_off.png and /dev/null differ
diff --git a/wear/src/main/res/drawable-hdpi/ic_toggle_on.png b/wear/src/main/res/drawable-hdpi/ic_toggle_on.png
deleted file mode 100644
index dfde503b59..0000000000
Binary files a/wear/src/main/res/drawable-hdpi/ic_toggle_on.png and /dev/null differ
diff --git a/wear/src/main/res/drawable-mdpi/ic_toggle_off.png b/wear/src/main/res/drawable-mdpi/ic_toggle_off.png
deleted file mode 100644
index a7598b03ba..0000000000
Binary files a/wear/src/main/res/drawable-mdpi/ic_toggle_off.png and /dev/null differ
diff --git a/wear/src/main/res/drawable-mdpi/ic_toggle_on.png b/wear/src/main/res/drawable-mdpi/ic_toggle_on.png
deleted file mode 100644
index ad595bcc8f..0000000000
Binary files a/wear/src/main/res/drawable-mdpi/ic_toggle_on.png and /dev/null differ
diff --git a/wear/src/main/res/drawable-xhdpi/ic_toggle_off.png b/wear/src/main/res/drawable-xhdpi/ic_toggle_off.png
deleted file mode 100644
index 20ed7755db..0000000000
Binary files a/wear/src/main/res/drawable-xhdpi/ic_toggle_off.png and /dev/null differ
diff --git a/wear/src/main/res/drawable-xhdpi/ic_toggle_on.png b/wear/src/main/res/drawable-xhdpi/ic_toggle_on.png
deleted file mode 100644
index b1bc44307f..0000000000
Binary files a/wear/src/main/res/drawable-xhdpi/ic_toggle_on.png and /dev/null differ
diff --git a/wear/src/main/res/drawable-xxhdpi/ic_toggle_off.png b/wear/src/main/res/drawable-xxhdpi/ic_toggle_off.png
deleted file mode 100644
index 8d34740c21..0000000000
Binary files a/wear/src/main/res/drawable-xxhdpi/ic_toggle_off.png and /dev/null differ
diff --git a/wear/src/main/res/drawable-xxhdpi/ic_toggle_on.png b/wear/src/main/res/drawable-xxhdpi/ic_toggle_on.png
deleted file mode 100644
index 5529859ed0..0000000000
Binary files a/wear/src/main/res/drawable-xxhdpi/ic_toggle_on.png and /dev/null differ
diff --git a/wear/src/main/res/drawable/digitalstyle_bg_full_rect.png b/wear/src/main/res/drawable/digitalstyle_bg_full_rect.png
new file mode 100644
index 0000000000..e917a354b8
Binary files /dev/null and b/wear/src/main/res/drawable/digitalstyle_bg_full_rect.png differ
diff --git a/wear/src/main/res/drawable/digitalstyle_bg_full_round.png b/wear/src/main/res/drawable/digitalstyle_bg_full_round.png
new file mode 100644
index 0000000000..98fbbb1701
Binary files /dev/null and b/wear/src/main/res/drawable/digitalstyle_bg_full_round.png differ
diff --git a/wear/src/main/res/drawable/ic_battery_outline.xml b/wear/src/main/res/drawable/ic_battery_outline.xml
deleted file mode 100644
index c066289e18..0000000000
--- a/wear/src/main/res/drawable/ic_battery_outline.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/wear/src/main/res/drawable/watchface_digitalstyle.png b/wear/src/main/res/drawable/watchface_digitalstyle.png
new file mode 100644
index 0000000000..e5fc1b4438
Binary files /dev/null and b/wear/src/main/res/drawable/watchface_digitalstyle.png differ
diff --git a/wear/src/main/res/drawable/wl_circle.xml b/wear/src/main/res/drawable/wl_circle.xml
deleted file mode 100644
index 07c2ad61d3..0000000000
--- a/wear/src/main/res/drawable/wl_circle.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/wear/src/main/res/font/roboto_condensed_bold.ttf b/wear/src/main/res/font/roboto_condensed_bold.ttf
new file mode 100644
index 0000000000..8c7a08be0b
Binary files /dev/null and b/wear/src/main/res/font/roboto_condensed_bold.ttf differ
diff --git a/wear/src/main/res/font/roboto_condensed_light.ttf b/wear/src/main/res/font/roboto_condensed_light.ttf
new file mode 100644
index 0000000000..67e84089e8
Binary files /dev/null and b/wear/src/main/res/font/roboto_condensed_light.ttf differ
diff --git a/wear/src/main/res/font/roboto_condensed_regular.ttf b/wear/src/main/res/font/roboto_condensed_regular.ttf
new file mode 100644
index 0000000000..533e3999cd
Binary files /dev/null and b/wear/src/main/res/font/roboto_condensed_regular.ttf differ
diff --git a/wear/src/main/res/font/roboto_slab_light.ttf b/wear/src/main/res/font/roboto_slab_light.ttf
new file mode 100644
index 0000000000..ccb99cd02b
Binary files /dev/null and b/wear/src/main/res/font/roboto_slab_light.ttf differ
diff --git a/wear/src/main/res/layout/action_editplusminus_item_below.xml b/wear/src/main/res/layout/action_editplusminus_item_below.xml
deleted file mode 100644
index 3b0ca0d835..0000000000
--- a/wear/src/main/res/layout/action_editplusminus_item_below.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/wear/src/main/res/layout/action_toggle_item.xml b/wear/src/main/res/layout/action_toggle_item.xml
deleted file mode 100644
index 622ee30d64..0000000000
--- a/wear/src/main/res/layout/action_toggle_item.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/wear/src/main/res/layout/activity_digitalstyle.xml b/wear/src/main/res/layout/activity_digitalstyle.xml
new file mode 100644
index 0000000000..5fd23a86b7
--- /dev/null
+++ b/wear/src/main/res/layout/activity_digitalstyle.xml
@@ -0,0 +1,13 @@
+
+
+
\ No newline at end of file
diff --git a/wear/src/main/res/layout/rect_activity_digitalstyle.xml b/wear/src/main/res/layout/rect_activity_digitalstyle.xml
new file mode 100644
index 0000000000..8d22bc8e3d
--- /dev/null
+++ b/wear/src/main/res/layout/rect_activity_digitalstyle.xml
@@ -0,0 +1,555 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wear/src/main/res/layout/round_activity_digitalstyle.xml b/wear/src/main/res/layout/round_activity_digitalstyle.xml
new file mode 100644
index 0000000000..02a638d6ab
--- /dev/null
+++ b/wear/src/main/res/layout/round_activity_digitalstyle.xml
@@ -0,0 +1,555 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wear/src/main/res/values-bg-rBG/strings.xml b/wear/src/main/res/values-bg-rBG/strings.xml
index 0e633049af..745e92da73 100644
--- a/wear/src/main/res/values-bg-rBG/strings.xml
+++ b/wear/src/main/res/values-bg-rBG/strings.xml
@@ -10,14 +10,13 @@
AAPSv2AAPS(Самолет)AAPS(Steampunk)
+ AAPS (DigitalStyle)Няма данни!Стари данни!От %1$sСвържи с AAPS!Няма данни от %1$s! Проверете дали AAPS на телефона изпраща данни до часовникаДанните са %1$s стари! Проверете сензора, xDrip+, HС, AAPS конфигурацията и други!
- Вкл
- ИзклВибрация при болусЕдиници за ДействиеПокажи дата
@@ -62,6 +61,8 @@
Допълнителни действия при почукванеUnicode кодиранеВерсия:
+ Настройки на Watchface
+ Погледнете в конфигурацията, моля.Врем целКалкулаторБолус
@@ -86,10 +87,7 @@
Шаблон 3Неограничено колПОТВЪРДИ
- ПОМПА СТАТУС
- СТАТУС НА ЦИКЪЛАотместване
- ОДД средноболусПомпаРежим на APS - Loop
@@ -98,12 +96,36 @@
ВХIOBняма Статус
- мг/дл
- ммол/л
- гр.
- Е
- Е/ч
- ч
- д
- с
+ червен
+ розово
+ лилаво
+ тъмно лилаво
+ индиго
+ синьо
+ светло синьо
+ синьозелено
+ металик
+ зелен
+ светло зелено
+ лимоненозелено
+ жълто
+ кехлибарено
+ оранжево
+ тъмно оранжево
+ кафяво
+ сиво
+ син сив
+ бяло
+ черно
+ многоцветно
+ Вибрира почасово
+ Показване на номер седмица
+ Вашият стил:
+ Няма избран стил
+ минимален стил
+ форма на стил
+ пълен стил
+ Вашият цвят:
+ Насищане на цвета:
+ Вашата цветна прозрачност:
diff --git a/wear/src/main/res/values-cs-rCZ/strings.xml b/wear/src/main/res/values-cs-rCZ/strings.xml
index 6548d1ac9c..289eb398e5 100644
--- a/wear/src/main/res/values-cs-rCZ/strings.xml
+++ b/wear/src/main/res/values-cs-rCZ/strings.xml
@@ -10,14 +10,13 @@
AAPSv2AAPS (Cockpit)AAPS (Steampunk)
+ AAPS (DigitalStyle)Žádná data!Stará data!Od %1$sSynchronizovat s AAPS!Od %1$s nebyla obdržena žádná data! Zkontrolujte, zda AAPS na telefonu odesílá data ke sledováníAAPS data jsou %1$s stará! Zkontrolujte svůj senzor, xDrip +, NS, AAPS konfigurace nebo ostatní!
- Zap.
- Vyp.Vibrovat při bolusuJednotky pro akceZobrazit datum
@@ -62,6 +61,8 @@
Akce po klepnutí na komplikaciZnaky Unicode v komplikacíchVerze:
+ další nastavení Watchface
+ Podívejte se na konfiguraci hodinek prosím.TempTKalkulačkaBolus
@@ -86,10 +87,7 @@
Předvolba 3Libovolné množstvíPOTVRDIT
- STAV PUMPY
- STAV SMYČKYposun času
- TDD váženýbolusPumpaSmyčka
@@ -98,12 +96,36 @@
SacharidyIOBžádný stav
- mg/dl
- mmol/l
- g
- U
- U/h
- h
- d
- t
+ červená
+ růžová
+ fialová
+ tmavě fialová
+ indigo
+ modrá
+ světle modrá
+ tyrkysová
+ šedozelená
+ zelená
+ světle zelená
+ limetková
+ žlutá
+ jantarová
+ oranžová
+ tmavě oranžová
+ hnědá
+ šedá
+ modrošedá
+ bílá
+ černá
+ multicolor
+ Vibrovat každou hodinu
+ Zobrazit číslo týdne
+ Váš styl:
+ bez stylu
+ minimalistický styl
+ tvar stylu
+ úplný styl
+ Vaše barva:
+ Vaše nasycení barvy:
+ Průhlednost barvy:
diff --git a/wear/src/main/res/values-de-rDE/strings.xml b/wear/src/main/res/values-de-rDE/strings.xml
index d7937a17e2..ba21d88477 100644
--- a/wear/src/main/res/values-de-rDE/strings.xml
+++ b/wear/src/main/res/values-de-rDE/strings.xml
@@ -10,14 +10,13 @@
AAPSv2AAPS(Cockpit)AAPS(Steampunk)
+ AAPS(DigitalStyle)Keine Daten!Veraltete Daten!Seit %1$sSynchronisiere mit AAPS!Keine Daten seit %1$s! Prüfe, ob AAPS auf dem Smartphone Daten an die Uhr sendet.AAPS Daten sind %1$s alt! Prüfe Deinen Sensor, xDrip+, NS, AAPS Einstellungen etc!
- Ein
- AusBei Bolus vibrierenEinheit (mg/dl od. mmol/l)Datum anzeigen
@@ -62,6 +61,8 @@
Tipp KomplikationUnicode in KomplikationenVersion:
+ weitere Watchface Einstellungen
+ Schaue Dir bitte die Watchface-Konfiguration an.Temp. ZielRechnerBolus
@@ -86,10 +87,7 @@
Voreinstellung 3Freie MengeBESTÄTIGEN
- PUMPEN-STATUS
- LOOP-STATUSZeitverschiebung
- TDD gewichtetBolusPumpeLoop
@@ -98,12 +96,36 @@
KHIOBKein Status
- mg/dl
- mmol/l
- g
- IE
- IE/h
- h
- d
- w
+ rot
+ pink
+ lila
+ dunkelviolett
+ indigoblau
+ blau
+ hellblau
+ cyan
+ grünblau
+ grün
+ hellgrün
+ neongrün
+ gelb
+ bernstein
+ orange
+ dunkelorange
+ braun
+ grau
+ blaugrau
+ weiß
+ schwarz
+ mehrfarbig
+ stündlich vibrieren
+ Kalenderwoche anzeigen
+ Ihr Stil:
+ ohne Stil
+ minimalistisches Stil
+ schattierter Stil
+ vollständiger Stil
+ Ihre Farbe:
+ Ihre Farbsättigung:
+ Deine Farbtransparenz:
diff --git a/wear/src/main/res/values-es-rES/strings.xml b/wear/src/main/res/values-es-rES/strings.xml
index 6e65157335..a27ae18bd5 100644
--- a/wear/src/main/res/values-es-rES/strings.xml
+++ b/wear/src/main/res/values-es-rES/strings.xml
@@ -8,16 +8,15 @@
AAPS (NoChart)AAPS (Círculo)AAPSv2
- AAPS (Cockpit)
- AAPS (Steampunk)
+ AAPS(Cockpit)
+ AAPS(Steampunk)
+ AAPS(DigitalStyle)¡Sin datos!¡Viejos datos!Desde %1$s¡Sincronización con AAPS!No se han recibido datos desde %1$s. Comprobar si AAPS en el teléfono envía los datos al reloj¡Los datos de AAPS son %1$s antiguos! ¡Compruebe su sensor, xDrip+, NS, configuración AAPS u otro!
- Activado
- DesactivadoVibrar con bolosUnidades para AccionesMostrar fecha
@@ -62,6 +61,8 @@
Acción de Toque ComplicaciónUnicode en complicacionesVersión:
+ más ajustes de Watchface
+ Mire en la configuración de Watchface, por favor.TempTAsistenteBolo
@@ -86,10 +87,7 @@
Predefinido 3Importe gratuitoConfirmar
- ESTADO DE LA BOMBA
- Estado del loopintervalo de tiempo
- TDD ponderadaboloBombaLazo
@@ -98,12 +96,36 @@
CarbohidratosIOBsin estado
- mg/dl
- mmol/l
- g
- U
- U/h
- h
- d
- s
+ rojo
+ rosado
+ morado
+ morado oscuro
+ indigo
+ azul
+ celeste
+ cian
+ verde azulado
+ verde
+ verde lima
+ lima
+ amarillo
+ ámbar
+ naranja
+ naranja oscuro
+ marrón
+ gris
+ gris azul
+ blanco
+ negro
+ multicolor
+ Vibrar cada hora
+ Mostrar número de semana
+ Tu estilo:
+ sin estilo
+ estilo mínimo
+ estilo forma
+ estilo completo
+ Tu color:
+ Tu saturación de colores:
+ Tu opacidad de colores:
diff --git a/wear/src/main/res/values-fr-rFR/strings.xml b/wear/src/main/res/values-fr-rFR/strings.xml
index 6faedb8361..3bd101d371 100644
--- a/wear/src/main/res/values-fr-rFR/strings.xml
+++ b/wear/src/main/res/values-fr-rFR/strings.xml
@@ -10,14 +10,13 @@
AAPSv2AAPS (Cockpit)AAPS (Steampunk)
+ AAPS (Digital)Pas de données !Données anciennes!Depuis %1$sSynchro avec AAPS !Aucune donnée deçues depuis %1$s! Vérifez sur le téléphone si AAPS envoie les données à la montreDonnées AAPS anciennes de %1$s ! Vérifiez votre capteur, les configurations xDrip+, NS, AAPS ou autre !
- Oui
- NonVibrer sur BolusUnités pour les ActionsAfficher Date
@@ -86,10 +85,7 @@
Quantité 3Quantité libreCONFIRMER
- ÉTAT POMPE
- ÉTAT BOUCLEdécalage
- DTI pondérébolusPompeBoucle
@@ -98,12 +94,36 @@
GAIAaucun statut
- mg/dl
- mmol/l
- g
- U
- U/h
- h
- j
- s
+ rouge
+ rose
+ violet
+ violet foncé
+ indigo
+ bleu
+ bleu clair
+ cyan
+ turquoise
+ vert
+ vert clair
+ vert citron
+ jaune
+ ambre
+ orange
+ orange foncé
+ marron
+ gris
+ gris bleu
+ white
+ noir
+ multicolor
+ Vibrer à l\'heure
+ Afficher numéro semaine
+ Style :
+ aucun
+ minimal
+ forme
+ complet
+ Couleur :
+ Saturation :
+ Opacité :
diff --git a/wear/src/main/res/values-it-rIT/strings.xml b/wear/src/main/res/values-it-rIT/strings.xml
index e843401e23..010ca78e1b 100644
--- a/wear/src/main/res/values-it-rIT/strings.xml
+++ b/wear/src/main/res/values-it-rIT/strings.xml
@@ -10,14 +10,13 @@
AAPSv2AAPS(Cockpit)AAPS(Steampunk)
+ AAPS(DigitalStyle)No dati!Dati vecchi!Da %1$sSincro con AAPS!Nessun dato ricevuto da %1$s! Controlla se AAPS sul telefono invia i dati allo smartwatchI dati di AAPS sono vecchi di %1$s ! Controlla il tuo sensore, xDrip+, NS, la configurazione di AAPS o altro!
- On
- OffVibra durante boloUnità per azioniMostra data
@@ -62,6 +61,8 @@
Complication Tap ActionUnicode in ComplicationsVersione:
+ più impostazioni watchface
+ Controlla configurazione watchface.TempTWizardBolo
@@ -86,10 +87,7 @@
Preset 3Quantità liberaCONFERMA
- STATO MICRO
- STATO LOOPtimeshift
- TDD ponderatoboloMicroLoop
@@ -98,12 +96,36 @@
CHOIOBno status
- mg/dl
- mmol/l
- g
- U
- U/h
- h
- d
- w
+ rosso
+ rosa
+ porpora
+ viola
+ indaco
+ blu
+ azzurro
+ ciano
+ verde acqua
+ verde
+ verde chiaro
+ lime
+ giallo
+ ambra
+ arancione
+ arancione scuro
+ marrone
+ grigio
+ grigio-azzurro
+ bianco
+ nero
+ multicolore
+ Vibra a ogni ora
+ Mostra numero settimana
+ Il tuo stile:
+ nessuno stile
+ stile minimale
+ stile shape
+ stile completo
+ Il tuo colore:
+ Saturazione del tuo colore:
+ Opacità del tuo colore:
diff --git a/wear/src/main/res/values-iw-rIL/strings.xml b/wear/src/main/res/values-iw-rIL/strings.xml
index 3ea04e700d..e81180348a 100644
--- a/wear/src/main/res/values-iw-rIL/strings.xml
+++ b/wear/src/main/res/values-iw-rIL/strings.xml
@@ -1,2 +1,131 @@
-
+
+ AAPS
+ AAPS
+ AAPS
+ AAPS (גדול)
+ AAPS (תרשים גדול)
+ AAPS (ללא תרשים)
+ AAPS (עיגול)
+ AAPSv2
+ AAPS (קוקפיט)
+ AAPS (סטימפאנק)
+ AAPS (דיגיטלי)
+ אין נתונים!
+ נתונים ישנים!
+ מאז %1$s
+ סנכרנו עם AAPS!
+ לא התקבלו נתונים מאז %1$s! בדקו אם AAPS בטלפון שולח נתונים לשעון
+ נתוני AAPS מלפני %1$s! בדקו את החיישן, הגדרות xDrip, NS, AAPS או אחר!
+ רטט במתן בולוס
+ יחידות עבור פעולות
+ הצג תאריך
+ הצג אינסולין IOB
+ הצג COB
+ הצג דלתא
+ הצגת דלתא ממוצעת
+ הצג את סוללת הטלפון
+ הצג את סוללת ה-Rig
+ הצג קצב בזאלי
+ הצג סטטוס לולאה
+ הצג רמת סוכר
+ הצג חץ כיוון
+ הצג עבר
+ כהה
+ הדגש בזאלים
+ מחיצות מותאמות
+ מסגרת זמן התרשים
+ שעה
+ שעתיים
+ 3 שעות
+ 4 שעות
+ 5 שעות
+ עיצוב קלט
+ ברירת מחדל
+ ימני מהיר
+ שמאלי מהיר
+ מינימלי מודרני
+ מפורט (סטימפאנק)
+ נמוך
+ בינוני
+ גבוה
+ אוטומטי
+ מספרים גדולים
+ היסטוריית צלצולים
+ היסטוריה של טבעת אור
+ אנימציות
+ אשף בתפריט
+ מילוי בתפריט
+ מטרה יחידה
+ אחוז אשף
+ פעולת הקשה על סיבוך
+ יוניקוד בסיבוכים
+ גירסה:
+ עוד הגדרות פני שעון
+ עיינו בהגדרות פני השעון בבקשה.
+ מטרה זמנית
+ אשף
+ בולוס
+ פחמימות ממושכות
+ הגדרות
+ סטטוס
+ מילוי
+ ללא
+ ברירת מחדל
+ תפריט
+ משך
+ מטרה
+ נמוך
+ גבוה
+ פחמימות
+ אחוז
+ התחלה [min]
+ משך [h]
+ אינסולין
+ הגדרה מראש 1
+ הגדרה מראש 2
+ הגדרה מראש 3
+ כמות חופשית
+ אישור
+ היסט זמן
+ בולוס
+ משאבה
+ לולאה
+ CPP
+ סה\"כ מינון אינסולין יומי TDD
+ פחמימות
+ כמות אינסולין פעילה
+ אין סטטוס
+ אדום
+ ורוד
+ סגול
+ סגול עמוק
+ כחול אינדיגו
+ כחול
+ כחול בהיר
+ ציאן
+ כחול-ירקרק
+ ירוק
+ ירוק בהיר
+ ירוק ליים
+ צהוב
+ ענבר
+ כתום
+ כתום עמוק
+ חום
+ אפור
+ כחול-אפור
+ לבן
+ שחור
+ צבעוני
+ רטט אחת לשעה
+ הצג מס\' שבוע
+ הסגנון שלכם:
+ ללא סגנון
+ סגנון מינימלי
+ סגנון הצורה
+ סגנון מלא
+ הצבע שלך:
+ רווית הצבע שלך:
+ אטימות הצבע שלכם:
+
diff --git a/wear/src/main/res/values-ko-rKR/strings.xml b/wear/src/main/res/values-ko-rKR/strings.xml
index 0d2d2be505..c487c8dbdf 100644
--- a/wear/src/main/res/values-ko-rKR/strings.xml
+++ b/wear/src/main/res/values-ko-rKR/strings.xml
@@ -7,17 +7,12 @@
AAPS(큰차트)AAPS(차트없음)AAPS(원형)
- AAPSv2
- AAPS(조종석)
- AAPS(스팀펑크)데이터없음!오래된 데이터!%1$s 이후AAPS와 연결!%1$s 이후 받은 데이터가 없습니다! 폰에서 AAPS가 워치로 데이터를 보냈는지 확인하세요AAPS 데이터가 %1$s 오래되었습니다! 센서, xDrip+, NS, AAPS 설정 또는 기타사항을 확인하세요!
- 켜기
- 끄기Bolus 주입시 진동단위날짜 표시
@@ -86,10 +81,7 @@
프리셋 3양 제한없음확인
- 상태 펌프
- 상태 LOOP시간이동
- TDD 가중Bolus펌프Loop
@@ -98,12 +90,4 @@
CarbIOB상태 없음
- mg/dl
- mmol/l
- g
- U
- U/h
- h
- d
- w
diff --git a/wear/src/main/res/values-lt-rLT/strings.xml b/wear/src/main/res/values-lt-rLT/strings.xml
index 7fb7d68629..4c74aa0d2d 100644
--- a/wear/src/main/res/values-lt-rLT/strings.xml
+++ b/wear/src/main/res/values-lt-rLT/strings.xml
@@ -8,16 +8,14 @@
AAPS(BeGrafiko)AAPS(Apvalus)AAPSv2
- AAPS(Cockpit)AAPS(Steampunk)
+ AAPS(DigitalStyle)Nėra duomenų!Seni duomenys!Nuo %1$sSinchronizavimas su AAPS!Nėra duomenų nuo %1$s! Patikrinkite, ar AAPS telefone siunčia duomenis laikrodžiuiAAPS duomenys yra %1$s senumo! Patikrinkite sensorių, xDrip+, NS, AAPS konfigūratorių ar kt.!
- Įjungti
- IšjungtiVibruoti, kai leidžiamas bolusasVeiksmų vienetaiRodyti datą
@@ -62,6 +60,8 @@
Elementų skirtuko veiksmaiUnikodas elementuoseVersija:
+ Daugiau laikrodžio ekrano nustatymų
+ Prašom žiūrėti Watchface konfigūraciją.LaikinasTikslasVedlysBolusas
@@ -86,10 +86,7 @@
Ruošinys 3Užpildymo kiekisPATVIRTINTI
- POMPOS BŪKLĖ
- CIKLO STATUSASlaiko postūmis
- BPD įvertintabolusasPompaCiklas
@@ -98,12 +95,36 @@
AVAIOnėra statuso
- mg/dl
- mmol/l
- g
- vv
- Vv/val
- val
- d.
- s
+ raudona
+ rožinė
+ violetinė
+ tamsiai violetinė
+ indigo
+ mėlyna
+ žydra
+ ciano
+ žalsvai mėlyna
+ žalia
+ šviesiai žalia
+ gelsvai žalsva
+ geltona
+ gintaro spalvos
+ oranžinė
+ tamsiai oranžinė
+ ruda
+ pilka
+ mėlynai pilka
+ balta
+ juoda
+ daug spalvų
+ Vibruoti kas valandą
+ Rodyti savaitės numerį
+ Jūsų stilius:
+ jokio stiliaus
+ minimalus stilius
+ formos stilius
+ pilnas stilius
+ Jūsų spalva:
+ Jūsų spalvų sodrumas:
+ Jūsų spalvų nepermatomumas:
diff --git a/wear/src/main/res/values-nl-rNL/strings.xml b/wear/src/main/res/values-nl-rNL/strings.xml
index 784fdb2f19..4d1a82540a 100644
--- a/wear/src/main/res/values-nl-rNL/strings.xml
+++ b/wear/src/main/res/values-nl-rNL/strings.xml
@@ -10,14 +10,13 @@
AAPSv2AAPS(Cockpit)AAPS(Steampunk)
+ AAPS (DigitalStyle)Geen gegevens!Oude gegevens!Sinds %1$sSynchroniseer met AAPS!Geen gegevens ontvangen sinds %1$s! Controleer of AAPS op de telefoon gegevens verstuurt naar horlogeAAPS gegevens zijn %1$s oud! Controleer je sensor, xDrip+, NS, AAPS instellingen of andere!
- Aan
- UitTrillen bij bolusEenheden voor actiesToon datum
@@ -86,10 +85,7 @@
Voorinstelling 3Vrije hoeveelheidBEVESTIGEN
- STATUS POMP
- STATUS LOOPtijdsverschuiving
- Gewogen TDDbolusPompLoop
@@ -98,12 +94,36 @@
KhdIOBgeen status
- mg/dl
- mmol/l
- g
- E
- E/u
- u
- d
- w
+ rood
+ roze
+ paars
+ donkerpaars
+ indigo
+ blauw
+ lichtblauw
+ cyaan
+ groenblauw
+ groen
+ lichtgroen
+ lichtgroen
+ geel
+ geelbruin
+ oranje
+ diep oranje
+ bruin
+ grijs
+ blauwgrijs
+ wit
+ zwart
+ multicolor
+ Tril ieder uur
+ Weeknummer weergeven
+ Jouw stijl:
+ geen stijl
+ minimale stijl
+ vormstijl
+ volledige stijl
+ Jouw kleur:
+ Jouw kleurverzadiging:
+ Jouw kleurendoorzichtigheid:
diff --git a/wear/src/main/res/values-no-rNO/strings.xml b/wear/src/main/res/values-no-rNO/strings.xml
index 3ea04e700d..ae2050a473 100644
--- a/wear/src/main/res/values-no-rNO/strings.xml
+++ b/wear/src/main/res/values-no-rNO/strings.xml
@@ -1,2 +1,131 @@
-
+
+ AAPS
+ AAPS
+ AAPS
+ AAPS (Large)
+ AAPS (BigChart)
+ AAPS (NoChart)
+ AAPS (Circle)
+ AAPSv2
+ AAPS(Cockpit)
+ AAPS(Steampunk)
+ AAPS(DigitalStyle)
+ Ingen data!
+ Gamle data!
+ Siden %1$s
+ Synk med AAPS!
+ Ingen data mottatt siden %1$s. Sjekk om AAPS på telefonen sender data
+ AAPS-data er %1$s gamle! Sjekk din sensor, xDrip+, NS, AAPS konfigurasjon eller annet!
+ Vibrer ved bolus
+ Enheter for handlinger
+ Vis dato
+ Vis IOB
+ Vis COB
+ Vis Delta
+ Vis Gj.snittDelta
+ Vis telefonbatteri
+ Vis riggens batteri
+ Vis basalrate
+ Vis loop status
+ Vis BS
+ Vis retningspil
+ Vis siden
+ Mørkt
+ Marker basaler
+ Matchende avdeler
+ Tidsspenn for diagram
+ 1 time
+ 2 timer
+ 3 timer
+ 4 timer
+ 5 timer
+ Innlesing design
+ Standard
+ Raskt høyre
+ Raskt venstre
+ Modern Sparse
+ Delta granularitet (Steampunk)
+ Lav
+ Middels
+ Høy
+ Auto
+ Store sifre
+ Ringe historikk
+ Lys ringe historikk
+ Animasjoner
+ Veiviser i meny
+ Prime i menyen
+ Enkel måleverdi
+ Veiviser prosent
+ Komplikasjon trykk handling
+ Unicode ikomplikasjoner
+ Versjon:
+ flere urskive innstillinger
+ Vennligst sjekk urskive innstillinger.
+ TempT
+ Veiviser
+ Bolus
+ eKarbo
+ Innstillinger
+ Status
+ Prime/fylling
+ Ingen
+ Standard
+ Meny
+ varighet
+ målverdi
+ lav
+ høy
+ karbo
+ prosent
+ start [min]
+ varighet [h]
+ insulin
+ Forhåndsinnstilling 1
+ Forhåndsinnstilling 2
+ Forhåndsinnstilling 3
+ Valgfri mengde
+ BEKREFT
+ tidsforskyving
+ bolus
+ Pumpe
+ Loop
+ CPP
+ TDD
+ Karbo
+ IOB
+ ingen status
+ rød
+ rosa
+ lilla
+ mørkelilla
+ indigo
+ blå
+ lyseblå
+ turkis
+ blågrønn
+ grønn
+ lysegrønn
+ gulgrønn
+ gul
+ rødbrun
+ oransje
+ mørkeoransje
+ brun
+ grå
+ blågrå
+ hvit
+ svart
+ flerfarget
+ Vibrer hver time
+ Vis ukenummer
+ Din stil:
+ ingen stil
+ minimal palette
+ definert palette
+ full palette
+ Dine farger:
+ Din fargemetning:
+ Din farge gjennomsiktighet:
+
diff --git a/wear/src/main/res/values-pl-rPL/strings.xml b/wear/src/main/res/values-pl-rPL/strings.xml
index 27cdfebbe2..6c4740daac 100644
--- a/wear/src/main/res/values-pl-rPL/strings.xml
+++ b/wear/src/main/res/values-pl-rPL/strings.xml
@@ -10,14 +10,13 @@
AAPSv2AAPS(Kokpit)AAPS(Steampunk)
+ AAPS(StylCyfrowy)Brak danych!Stare dane!Od %1$sSynchronizuj z AAPS!Nie otrzymano danych od %1$s! Sprawdź czy AAPS na telefonie wysyła dane do zegarkaDane z AAPS są %1$s stare! Sprawdź swój sensor, xDrip+, NS, konfigurację AAPS i inne ustawienia!
- Włącz
- WyłączWibruj przy BolusieJednostki dla akcjiPokaż Datę
@@ -86,10 +85,7 @@
Ustawienie 3Podana wartośćPOTWIERDŹ
- STATUS POMPY
- STATUS PĘTLIprzesunięcie czasu
- Ważone TDDbolusPompaPętla
@@ -98,12 +94,36 @@
Węgl.IOBbrak statusu
- mg/dl
- mmol/l
- g
- U
- U/g
- g
- d
- t
+ czerwony
+ różowy
+ fioletowy
+ ciemnofioletowy
+ indygo
+ niebieski
+ jasnoniebieski
+ turkusowy
+ morski
+ zielony
+ jasnozielony
+ limonkowy
+ żółty
+ bursztynowy
+ pomarańczowy
+ ciemnopomarańczowy
+ brązowy
+ szary
+ niebiesko-szary
+ biały
+ czarny
+ wielokolorowy
+ Wibruj co godzinę
+ Pokaż numer tygodnia
+ Styl:
+ brak stylu
+ minimalistyczny
+ kształtny
+ pełny
+ Kolor:
+ Nasycenie koloru:
+ Nieprzezroczystość:
diff --git a/wear/src/main/res/values-pt-rBR/strings.xml b/wear/src/main/res/values-pt-rBR/strings.xml
index 1390a92cc7..8af3cc439c 100644
--- a/wear/src/main/res/values-pt-rBR/strings.xml
+++ b/wear/src/main/res/values-pt-rBR/strings.xml
@@ -7,17 +7,12 @@
AAPS(GrafGrande)AAPS(SemGraf)AAPS(Círculo)
- AAPSv2
- AAPS(Cockpit)
- AAPS(Steampunk)Sem dados!Dados antigos!Desde %1$sSincronizar com AAPS!Nenhum dado recebido desde %1$s! Confira se o AAPS no telefone envia dados para o relógioDados AAPS são %1$s antigos! Verifique sensor, xDrip+, NS, configuração AAPS ou outra!
- Lig.
- Desl.Vibrar no BólusUnidades para AçõesMostrar Data
@@ -86,10 +81,7 @@
Predefinição 3Valor livreCONFIRMAR
- ESTADO BOMBA
- ESTADO LOOPalteração turno
- TDD ponderadabólusBombaLoop
@@ -98,12 +90,4 @@
HidratosIOBsem estado
- mg/dL
- mmol/L
- g
- U
- U/h
- h
- d
- s
diff --git a/wear/src/main/res/values-pt-rPT/strings.xml b/wear/src/main/res/values-pt-rPT/strings.xml
index 28339639d6..4367efdadf 100644
--- a/wear/src/main/res/values-pt-rPT/strings.xml
+++ b/wear/src/main/res/values-pt-rPT/strings.xml
@@ -10,14 +10,13 @@
AAPSv2AAPS(Cockpit)AAPS(Steampunk)
+ AAPS(DigitalStyle)Sem dados!Dados antigos!Desde %1$sSincronizar com AAPS!Nenhum dado recebido desde %1$s! Confira se o AAPS no telefone envia dados para o relógioDados AAPS são %1$s antigos! Verifique sensor, xDrip+, NS, configuração AAPS ou outra!
- Lig.
- Desl.Vibrar no BólusUnidades para AcçõesMostrar Data
@@ -86,10 +85,7 @@
Predefinição 3Valor livreCONFIRMAR
- ESTADO BOMBA
- ESTADO LOOPalteração turno
- TDD ponderadabólusBombaLoop
@@ -98,12 +94,36 @@
HidratosIOBsem estado
- mg/dL
- mmol/L
- g
- U
- U/h
- h
- d
- s
+ vermelho
+ rosa
+ roxo
+ roxo escuro
+ azul índigo
+ azul
+ azul claro
+ ciano
+ azul esverdeado
+ verde
+ verde claro
+ lima
+ amarelo
+ âmbar
+ laranja
+ laranja escuro
+ castanho
+ cinzento
+ cinza azul
+ branco
+ preto
+ multicolor
+ Vibrar por hora
+ Mostrar número da Semana
+ Seu estilo:
+ sem estilo
+ estilo minimalista
+ estilo de forma
+ estilo completo
+ Sua cor:
+ Sua saturação de cor:
+ Sua opacidade de cor:
diff --git a/wear/src/main/res/values-ro-rRO/strings.xml b/wear/src/main/res/values-ro-rRO/strings.xml
index b4b847865f..80e93e265c 100644
--- a/wear/src/main/res/values-ro-rRO/strings.xml
+++ b/wear/src/main/res/values-ro-rRO/strings.xml
@@ -7,17 +7,12 @@
AAPS(GraficMare)AAPS(FărăGrafic)AAPS(Cerc)
- AAPSv2
- AAPS(Bord)
- AAPS (Steampunk)Nu există date!Date vechi!De acum %1$sSincronizare cu AAPS!Nu au fost primite date de acum %1$s! Verificați că AAPS pe telefon trimite date către ceasDatele AAPS sunt vechi de %1$s! Verificați senzorul, xDrip+, NS, configurația AAPS sau altele!
- Pornit
- OpritVibrare la BolusUnităţi pentru AcţiuniArată data
@@ -86,10 +81,7 @@
Presetare 3Cantitate liberăCONFIRMARE
- STARE POMPĂ
- STARE BUCLĂ ÎNCHISĂtimp
- TDD ponderatbolusPompăBuclă
@@ -98,12 +90,4 @@
CarbohidrațiIOBniciun status
- mg/dl
- mmol/l
- g
- U
- U/h
- h
- z
- s
diff --git a/wear/src/main/res/values-ru-rRU/strings.xml b/wear/src/main/res/values-ru-rRU/strings.xml
index 6e668dbb11..ae1a770e9a 100644
--- a/wear/src/main/res/values-ru-rRU/strings.xml
+++ b/wear/src/main/res/values-ru-rRU/strings.xml
@@ -10,14 +10,13 @@
AAPSv2AAPS (кабина пилота)AAPS (Стимпанк)
+ AAPS (DigitalStyle)Данные не поступают!Старые данные!Длится с: %1$sСинхронизация с ААПС!Нет данных начиная с %1$s! Убедитесь, что AAPS на телефоне отправляет данные на часы
- Старые данные AAPS от %1$s! Проверьте сенсор, xDrip +, NS, конфигурацию AAPS, другое!
- Вкл.
- Выкл.
+ Данные AAPS отстают на %1$s! Проверьте сенсор, xDrip+, NS, конфигурацию AAPS, другое!Вибрировать при болюсеЕдиницы для начала действийПоказать дату
@@ -86,10 +85,7 @@
Предустановка 3Произвольное количествоПОДТВЕРДИТЬ
- СОСТОЯНИЕ ПОМПЫ
- СОСТОЯНИЕ ЦИКЛАсдвиг по времени
- Суммарная суточная доза TDD-взвешеннаяболюсПомпаЗамкнутый цикл
@@ -98,12 +94,36 @@
УглеводыIOBстатус отсутствует
- мг/дл
- ммоль/л
- г
- Ед
- Ед/ч
- ч
- д
- н
+ красный
+ розовый
+ фиолетовый
+ тёмно-фиолетовый
+ индиго
+ синий
+ голубой
+ бирюзовый
+ бирюзовый
+ зеленый
+ светло-зеленый
+ лайм
+ желтый
+ янтарный
+ оранжевый
+ темно-оранжевый
+ коричневый
+ серый
+ сине-серый
+ белый
+ black
+ полихром
+ Почасовая вибрация
+ Показывать номер недели
+ Ваш стиль:
+ без стиля
+ минималистский
+ стиль формы
+ полный стиль
+ Ваш цвет:
+ Ваша цветовая насыщенность:
+ Непрозрачность вашего цвета:
diff --git a/wear/src/main/res/values-sk-rSK/strings.xml b/wear/src/main/res/values-sk-rSK/strings.xml
index a5a16e43ab..8a21ef4fdb 100644
--- a/wear/src/main/res/values-sk-rSK/strings.xml
+++ b/wear/src/main/res/values-sk-rSK/strings.xml
@@ -8,16 +8,15 @@
AAPS(ŽiadnyGraf)AAPS(Kruh)AAPSv2
- AAPS (Cockpit)
+ AAPS(Cockpit)AAPS (Steampunk)
+ AAPS(DigitalStyle)Žiadne dáta!Zastaralé dáta!Od %1$sSynchronizácia s AAPS!Žiadne dáta od %1$s! Skontroluj, či AAPS na telefóne posiela dáta na hodinkyAAPS dáta sú %1$s staré! Skontroluj tvoj senzor, xDrip+, NS, AAPS nastavenia atď.!
- Zap
- VypZavibrovať pri boluseJednotky (mmol/l alebo mg/dl)Zobraziť dátum
@@ -62,6 +61,8 @@
Zadaj komplikáciuUnicode v komplikáciachVerzia:
+ ďalšie nastavenia Watchface
+ Pozrite sa prosím do konfigurácie Watchface.TempTSprievodcaBolus
@@ -86,10 +87,7 @@
Predvoľba 3Ľubovoľné množstvoPOTVRDIŤ
- STAV PUMPY
- STAV UZAVRETÉHO OKRUHUčasový posun
- TDD váženýbolusPumpaUzavretý okruh
@@ -98,12 +96,36 @@
SacharidyIOBžiadny stav
- mg/dL
- mmol/l
- g
- JI
- JI/h
- h
- d
- t
+ červená
+ ružová
+ fialová
+ tmavofialová
+ indigová
+ modrá
+ svetlomodrá
+ azúrová
+ tyrkysová
+ zelená
+ svetlo zelená
+ limetková
+ žltá
+ jantárová
+ oranžová
+ tmavooranžová
+ hnedá
+ sivá
+ modrosivá
+ biela
+ čierna
+ viacfarebná
+ Vibrovať každú hodinu
+ Zobraziť číslo týždňa
+ Váš štýl:
+ žiadny štýl
+ minimálny štýl
+ tvar štýlu
+ úplný štýl
+ Vaša farba:
+ Vaše nasýtenie farby:
+ Priehľadnosť farby:
diff --git a/wear/src/main/res/values-sv-rSE/strings.xml b/wear/src/main/res/values-sv-rSE/strings.xml
index 047c2aab46..5cae177b2b 100644
--- a/wear/src/main/res/values-sv-rSE/strings.xml
+++ b/wear/src/main/res/values-sv-rSE/strings.xml
@@ -10,14 +10,13 @@
AAPS v2AAPS (Cockpit)AAPS (Steampunk)
+ AAPS (DigitalStyle)Inga data!Gamla data!Sedan %1$sSynka med AAPS!Inga data har tagits emot sedan %1$s! Kontrollera om AAPS i telefonen skickar data till klockanAAPS-data är %1$s gammal. Kontrollera sensorn, xDrip+, NS, AAPS-inställning eller något annat!
- På
- AvVibrera vid bolusEnheter för åtgärderVisa datum
@@ -86,10 +85,7 @@
Förinställning 3Valfri mängdBEKRÄFTA
- STATUS PUMP
- STATUS LOOPtidsförskjutning
- TDD viktadbolusPumpAPS
@@ -98,12 +94,36 @@
KHIOBIngen Status
- mg/dL
- mmol/L
- g
- U
- U/h
- t
- d
- v
+ röd
+ rosa
+ lila
+ mörklila
+ indigo
+ blå
+ ljusblå
+ cyan
+ tegelbrun
+ grön
+ ljusgrön
+ lime
+ gul
+ bärnsten
+ orange
+ mörkorange
+ brun
+ grå
+ blågrå
+ vit
+ svart
+ flerfärgad
+ Vibrera varje timme
+ Visa veckonummer
+ Din stil:
+ ingen stil
+ minimal stil
+ formstil
+ full stil
+ Färg:
+ Färgmättnad:
+ Opacitet:
diff --git a/wear/src/main/res/values/colors.xml b/wear/src/main/res/values/colors.xml
index 2280e772d3..8a6c892c1a 100644
--- a/wear/src/main/res/values/colors.xml
+++ b/wear/src/main/res/values/colors.xml
@@ -1,9 +1,6 @@
- #2878ff
- #c1c1c1
- #434343#779ECB
@@ -42,37 +39,138 @@
@color/grey_500
+
+
+
+
+
+
+ #FFCDD2
+ #F44336#E53935
+ #D32F2F
+ #B71C1C#FF0000
-
+
+
+ #F8BBD0
+ #E91E63
+ #C2185B
+ #880E4F
+
+
+ #E1BEE7
+ #9C27B0
+ #7B1FA2
+ #4A148C
+
+
+ #D1C4E9
+ #673AB7
+ #512DA8
+ #311B92
+
+
+ #C5CAE9
+ #3F51B5
+ #303F9F
+ #1A237E
+ #BBDEFB#64B5F6
-
+ #2196F3
+ #1976D2
+ #0D47A1
+ #0000FF
+
+
+ #B3E5FC
+ #03A9F4
+ #0288D1
+ #01579B
+
+
+ #B2EBF2
+ #00BCD4
+ #0097A7
+ #006064
+
+
+ #B2DFDB
+ #009688
+ #00796B
+ #004D40
+
+
+ #C8E6C9
+ #4CAF50
+ #388E3C
+ #1B5E20
+
+
+ #DCEDC8
+ #8BC34A
+ #689F38
+ #33691E
+
+
+ #F0F4C3
+ #CDDC39
+ #AFB42B
+ #827717
+ #FFF9C4
+ #FFEB3B#FBC02D
+ #F57F17#FFFF00
-
-
+
+ #FFECB3
+ #FFC107
+ #FFA000
+ #FF6F00
+
+
+ #FFE0B2
+ #FF9800
+ #F57C00
+ #E65100
+
+
+ #FFCCBC
+ #FF5722
+ #E64A19
+ #BF360C
+
+
+ #D7CCC8
+ #795548
+ #5D4037
+ #3E2723
+
+
+
#FAFAFA
+ #F5F5F5#E0E0E0#9E9E9E
+ #9E9E9E
+ #616161
+ #212121#333333
-
-
- #0000FF
-
+
+ #CFD8DC
+ #607D8B
+ #455A64
+ #263238
-
+
#000000
-
-
-
#FFFFFF
-
\ No newline at end of file
diff --git a/wear/src/main/res/values/digitalstyle_arrays.xml b/wear/src/main/res/values/digitalstyle_arrays.xml
new file mode 100644
index 0000000000..25f16564fe
--- /dev/null
+++ b/wear/src/main/res/values/digitalstyle_arrays.xml
@@ -0,0 +1,98 @@
+
+
+
+ @string/digitalstyle_style_none
+ @string/digitalstyle_style_minimal
+ @string/digitalstyle_style_shape
+ @string/digitalstyle_style_full
+
+
+ none
+ minimal
+ shape
+ full
+
+
+
+ @string/color_name_red
+ @string/color_name_pink
+ @string/color_name_purple
+ @string/color_name_deeppurple
+ @string/color_name_indigo
+ @string/color_name_blue
+ @string/color_name_lightblue
+ @string/color_name_cyan
+ @string/color_name_teal
+ @string/color_name_green
+ @string/color_name_lightgreen
+ @string/color_name_lime
+ @string/color_name_yellow
+ @string/color_name_amber
+ @string/color_name_orange
+ @string/color_name_deeporange
+ @string/color_name_brown
+ @string/color_name_gray
+ @string/color_name_bluegray
+ @string/color_name_white
+ @string/color_name_multicolor
+
+
+ red
+ pink
+ purple
+ deeppurple
+ indigo
+ blue
+ lightblue
+ cyan
+ teal
+ green
+ lightgreen
+ lime
+ yellow
+ amber
+ orange
+ deeporange
+ brown
+ gray
+ bluegray
+ white
+ multicolor
+
+
+
+
+ 100
+ 500
+ 700
+ 900
+
+
+
+
+ 10%
+ 20%
+ 30%
+ 40%
+ 50%
+ 60%
+ 70%
+ 80%
+ 90%
+ 100%
+
+
+ 0.1
+ 0.2
+ 0.3
+ 0.4
+ 0.5
+ 0.6
+ 0.7
+ 0.8
+ 0.9
+ 1
+
+
+
+
\ No newline at end of file
diff --git a/wear/src/main/res/values/strings.xml b/wear/src/main/res/values/strings.xml
index d003d24a18..4685ce2a08 100644
--- a/wear/src/main/res/values/strings.xml
+++ b/wear/src/main/res/values/strings.xml
@@ -12,6 +12,8 @@
AAPSv2AAPS(Cockpit)AAPS(Steampunk)
+ AAPS(DigitalStyle)
+
No data!Old data!
@@ -21,8 +23,6 @@
No data received since %1$s! Check if AAPS on the phone sends data to watchAAPS data is %1$s old! Check your sensor, xDrip+, NS, AAPS config or other!
- On
- OffVibrate on BolusUnits for ActionsShow Date
@@ -67,6 +67,9 @@
Complication Tap ActionUnicode in ComplicationsVersion:
+ more Watchface settings
+ Look into Watchface configuration, please.
+
TempTWizard
@@ -93,10 +96,7 @@
Preset 3Free amountCONFIRM
- STATUS PUMP
- STATUS LOOPtimeshift
- TDD weightedbolus
@@ -109,14 +109,44 @@
IOBno status
- mg/dl
- mmol/l
- g
- U
- U/h
- h
- d
- w
+
+ red
+ pink
+ purple
+ deep purple
+ indigo
+ blue
+ light blue
+ cyan
+ teal
+ green
+ light green
+ lime
+ yellow
+ amber
+ orange
+ deep orange
+ brown
+ gray
+ blue gray
+ white
+ black
+ multicolor
+
+
+ Vibrate hourly
+ Show Week number
+
+ Your style:
+ no style
+ minimal style
+ shape style
+ full style
+
+ Your color:
+ Your color saturation:
+ Your color opacity:
+
diff --git a/wear/src/main/res/xml/preferences.xml b/wear/src/main/res/xml/preferences.xml
index 3c114cb59c..528d8bf00a 100644
--- a/wear/src/main/res/xml/preferences.xml
+++ b/wear/src/main/res/xml/preferences.xml
@@ -2,29 +2,6 @@
-
-
-
-
-
-
+
+
@@ -56,6 +41,21 @@
android:title="@string/pref_show_avgdelta"
app:wear_iconOff="@drawable/settings_off"
app:wear_iconOn="@drawable/settings_on"/>
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/wear/src/main/res/xml/watch_face_configuration_bigchart.xml b/wear/src/main/res/xml/watch_face_configuration_bigchart.xml
new file mode 100644
index 0000000000..7953823134
--- /dev/null
+++ b/wear/src/main/res/xml/watch_face_configuration_bigchart.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/wear/src/main/res/xml/watch_face_configuration_circle.xml b/wear/src/main/res/xml/watch_face_configuration_circle.xml
new file mode 100644
index 0000000000..440b527bfa
--- /dev/null
+++ b/wear/src/main/res/xml/watch_face_configuration_circle.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wear/src/main/res/xml/watch_face_configuration_cockpit.xml b/wear/src/main/res/xml/watch_face_configuration_cockpit.xml
new file mode 100644
index 0000000000..2e45811780
--- /dev/null
+++ b/wear/src/main/res/xml/watch_face_configuration_cockpit.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/wear/src/main/res/xml/watch_face_configuration_digitalstyle.xml b/wear/src/main/res/xml/watch_face_configuration_digitalstyle.xml
new file mode 100644
index 0000000000..5a29f508fa
--- /dev/null
+++ b/wear/src/main/res/xml/watch_face_configuration_digitalstyle.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wear/src/main/res/xml/watch_face_configuration_home.xml b/wear/src/main/res/xml/watch_face_configuration_home.xml
new file mode 100644
index 0000000000..6aae7b88eb
--- /dev/null
+++ b/wear/src/main/res/xml/watch_face_configuration_home.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
diff --git a/wear/src/main/res/xml/watch_face_configuration_home2.xml b/wear/src/main/res/xml/watch_face_configuration_home2.xml
new file mode 100644
index 0000000000..76379ba9dd
--- /dev/null
+++ b/wear/src/main/res/xml/watch_face_configuration_home2.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wear/src/main/res/xml/watch_face_configuration_largehome.xml b/wear/src/main/res/xml/watch_face_configuration_largehome.xml
new file mode 100644
index 0000000000..6aae7b88eb
--- /dev/null
+++ b/wear/src/main/res/xml/watch_face_configuration_largehome.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
diff --git a/wear/src/main/res/xml/watch_face_configuration_nochart.xml b/wear/src/main/res/xml/watch_face_configuration_nochart.xml
new file mode 100644
index 0000000000..dc5b99cf8c
--- /dev/null
+++ b/wear/src/main/res/xml/watch_face_configuration_nochart.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/wear/src/main/res/xml/watch_face_configuration_steampunk.xml b/wear/src/main/res/xml/watch_face_configuration_steampunk.xml
new file mode 100644
index 0000000000..fea4e8f192
--- /dev/null
+++ b/wear/src/main/res/xml/watch_face_configuration_steampunk.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+