diff --git a/app/build.gradle b/app/build.gradle index 07139638fc..c5fee5f48c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -128,7 +128,7 @@ android { targetSdkVersion 28 multiDexEnabled true versionCode 1500 - version "2.7.0-dev" + version "2.7.1-dev" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"' buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"' 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 705c377afa..235447a2fd 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt @@ -61,6 +61,7 @@ import javax.inject.Inject class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListener, HasAndroidInjector { private var pluginId = -1 + private var filter = "" @Inject lateinit var rxBus: RxBusWrapper @Inject lateinit var resourceHelper: ResourceHelper @@ -115,11 +116,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() { @@ -148,7 +151,10 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { (savedInstanceState ?: arguments)?.let { bundle -> if (bundle.containsKey("id")) { - pluginId = bundle.getInt("id") + pluginId = bundle.getInt("id") ?: -1 + } + if (bundle.containsKey("filter")) { + filter = bundle.getString("filter") ?: "" } } if (pluginId != -1) { @@ -191,6 +197,7 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang } initSummary(preferenceScreen, pluginId != -1) preprocessPreferences() + if (filter != "") updateFilterVisibility(filter, preferenceScreen) } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { @@ -288,6 +295,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) @@ -391,4 +425,9 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang } return super.onPreferenceTreeClick(preference) } + + public 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..42deb79742 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,15 @@ 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 kotlinx.android.synthetic.main.local_insight_status_item.view.* import javax.inject.Inject class PreferencesActivity : NoSplashAppCompatActivity(), PreferenceFragmentCompat.OnPreferenceStartScreenCallback { @@ -14,18 +18,35 @@ 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) {} + }) + + pref_filter_clear.setOnClickListener() { + pref_filter.setText(""); + } + 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 +65,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/dependencyInjection/PluginsModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt index 892c9c36a8..b28073a055 100644 --- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt @@ -42,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 @@ -155,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/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/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..a4b96354fd 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 @@ -551,6 +551,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/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/OpenAPSSMBPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.java index b952a6a909..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; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt index 900b15bde6..86e4212def 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt @@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.general.actions import android.content.Intent import android.os.Bundle +import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -9,6 +10,7 @@ import android.widget.LinearLayout import androidx.core.content.ContextCompat import dagger.android.support.DaggerFragment import info.nightscout.androidaps.Config +import info.nightscout.androidaps.Constants import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.R import info.nightscout.androidaps.activities.ErrorHelperActivity @@ -24,6 +26,7 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction import info.nightscout.androidaps.plugins.general.overview.StatusLightHandler import info.nightscout.androidaps.queue.Callback +import info.nightscout.androidaps.skins.SkinProvider import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.buildHelper.BuildHelper @@ -54,16 +57,30 @@ class ActionsFragment : DaggerFragment() { @Inject lateinit var commandQueue: CommandQueueProvider @Inject lateinit var buildHelper: BuildHelper @Inject lateinit var protectionCheck: ProtectionCheck + @Inject lateinit var skinProvider: SkinProvider @Inject lateinit var config: Config private var disposable: CompositeDisposable = CompositeDisposable() private val pumpCustomActions = HashMap() private val pumpCustomButtons = ArrayList() + private var smallWidth = false + private var smallHeight = false + private lateinit var dm: DisplayMetrics override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.actions_fragment, container, false) + //check screen width + dm = DisplayMetrics() + activity?.windowManager?.defaultDisplay?.getMetrics(dm) + + val screenWidth = dm.widthPixels + val screenHeight = dm.heightPixels + smallWidth = screenWidth <= Constants.SMALL_WIDTH + smallHeight = screenHeight <= Constants.SMALL_HEIGHT + val landscape = screenHeight < screenWidth + + return inflater.inflate(skinProvider.activeSkin().actionsLayout(landscape, smallWidth), container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -233,15 +250,24 @@ class ActionsFragment : DaggerFragment() { actions_canceltempbasal?.visibility = View.GONE } } - + val activeBgSource = activePlugin.activeBgSource actions_historybrowser.visibility = (profile != null).toVisibility() actions_fill?.visibility = (pump.pumpDescription.isRefillingCapable && pump.isInitialized && !pump.isSuspended).toVisibility() actions_pumpbatterychange?.visibility = pump.pumpDescription.isBatteryReplaceable.toVisibility() actions_temptarget?.visibility = (profile != null && config.APS).toVisibility() actions_tddstats?.visibility = pump.pumpDescription.supportsTDDs.toVisibility() - statusLightHandler.updateStatusLights(careportal_canulaage, careportal_insulinage, null, careportal_sensorage, careportal_pbage, null) + if (!config.NSCLIENT) { + statusLightHandler.updateStatusLights(careportal_canulaage, careportal_insulinage, careportal_reservoirlevel, careportal_sensorage, careportal_sensorlevel, careportal_pbage, careportal_batterylevel) + careportal_senslevellabel?.text = if (activeBgSource.sensorBatteryLevel == -1) "" else resourceHelper.gs(R.string.careportal_level_label) + } else { + statusLightHandler.updateStatusLights(careportal_canulaage, careportal_insulinage, null, careportal_sensorage, null, careportal_pbage, null) + careportal_senslevellabel?.text = "" + careportal_inslevellabel?.text = "" + careportal_pblevellabel?.text = "" + } checkPumpCustomActions() + } private fun checkPumpCustomActions() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt index 5c5d9c843f..661dc3a2bb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt @@ -72,13 +72,15 @@ class ImportExportPrefs @Inject constructor( f.activity?.let { exportSharedPreferences(it) } } - fun verifyStoragePermissions(fragment: Fragment) { + fun verifyStoragePermissions(fragment: Fragment, onGranted: Runnable) { fragment.context?.let { val permission = ContextCompat.checkSelfPermission(it, Manifest.permission.WRITE_EXTERNAL_STORAGE) if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user fragment.requestPermissions(PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE) + } else { + onGranted.run() } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenanceFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenanceFragment.kt index c233b6d721..a0ca451fee 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenanceFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenanceFragment.kt @@ -46,13 +46,15 @@ class MaintenanceFragment : DaggerFragment() { } nav_export.setOnClickListener { // start activity for checking permissions... - importExportPrefs.verifyStoragePermissions(this) - importExportPrefs.exportSharedPreferences(this) + importExportPrefs.verifyStoragePermissions(this) { + importExportPrefs.exportSharedPreferences(this) + } } nav_import.setOnClickListener { // start activity for checking permissions... - importExportPrefs.verifyStoragePermissions(this) - importExportPrefs.importSharedPreferences(this) + importExportPrefs.verifyStoragePermissions(this) { + importExportPrefs.importSharedPreferences(this) + } } nav_logsettings.setOnClickListener { startActivity(Intent(activity, LogSettingActivity::class.java)) } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt index 1760ea45d0..2797b43967 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt @@ -56,6 +56,7 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress +import info.nightscout.androidaps.plugins.pump.common.defs.PumpType import info.nightscout.androidaps.plugins.source.DexcomPlugin import info.nightscout.androidaps.plugins.source.XdripPlugin import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin @@ -80,7 +81,7 @@ import kotlinx.android.synthetic.main.overview_buttons_layout.overview_quickwiza import kotlinx.android.synthetic.main.overview_buttons_layout.overview_treatmentbutton import kotlinx.android.synthetic.main.overview_buttons_layout.overview_wizardbutton import kotlinx.android.synthetic.main.overview_fragment.overview_notifications -import kotlinx.android.synthetic.main.overview_fragment_nsclient_tablet.* +import kotlinx.android.synthetic.main.overview_fragment_nsclient.* import kotlinx.android.synthetic.main.overview_graphs_layout.overview_bggraph import kotlinx.android.synthetic.main.overview_graphs_layout.overview_chartMenuButton import kotlinx.android.synthetic.main.overview_graphs_layout.overview_iobcalculationprogess @@ -93,6 +94,8 @@ import kotlinx.android.synthetic.main.overview_info_layout.overview_cob import kotlinx.android.synthetic.main.overview_info_layout.overview_extendedbolus import kotlinx.android.synthetic.main.overview_info_layout.overview_iob import kotlinx.android.synthetic.main.overview_info_layout.overview_sensitivity +import kotlinx.android.synthetic.main.overview_info_layout.overview_time +import kotlinx.android.synthetic.main.overview_info_layout.overview_timeagoshort import kotlinx.android.synthetic.main.overview_loop_pumpstatus_layout.* import kotlinx.android.synthetic.main.overview_statuslights_layout.* import kotlinx.coroutines.Dispatchers @@ -181,6 +184,9 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + // pre-process landscape mode + skinProvider.activeSkin().preProcessLandscapeOverviewLayout(dm, view, resourceHelper.gb(R.bool.isTablet)) + overview_pumpstatus?.setBackgroundColor(resourceHelper.gc(R.color.colorInitializingBorder)) overview_notifications?.setHasFixedSize(false) @@ -318,11 +324,11 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList if (childFragmentManager.isStateSaved) return activity?.let { activity -> when (v.id) { - R.id.overview_treatmentbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable(Runnable { TreatmentDialog().show(childFragmentManager, "Overview") })) - R.id.overview_wizardbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable(Runnable { WizardDialog().show(childFragmentManager, "Overview") })) - R.id.overview_insulinbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable(Runnable { InsulinDialog().show(childFragmentManager, "Overview") })) - R.id.overview_quickwizardbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable(Runnable { onClickQuickWizard() })) - R.id.overview_carbsbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable(Runnable { CarbsDialog().show(childFragmentManager, "Overview") })) + R.id.overview_treatmentbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { TreatmentDialog().show(childFragmentManager, "Overview") }) + R.id.overview_wizardbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { WizardDialog().show(childFragmentManager, "Overview") }) + R.id.overview_insulinbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { InsulinDialog().show(childFragmentManager, "Overview") }) + R.id.overview_quickwizardbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { onClickQuickWizard() }) + R.id.overview_carbsbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { CarbsDialog().show(childFragmentManager, "Overview") }) R.id.overview_cgmbutton -> { if (xdripPlugin.isEnabled(PluginType.BGSOURCE)) @@ -357,7 +363,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList loopPlugin.invoke("Accept temp button", false) if (lastRun?.lastAPSRun != null && lastRun.constraintsProcessed?.isChangeRequested == true) { OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.tempbasal_label), lastRun.constraintsProcessed?.toSpanned() - ?: "".toSpanned(), Runnable { + ?: "".toSpanned(), { aapsLogger.debug("USER ENTRY: ACCEPT TEMP BASAL") overview_accepttempbutton?.visibility = View.GONE (context?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).cancel(Constants.notificationID) @@ -574,11 +580,9 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList val glucoseStatus = GlucoseStatus(injector).glucoseStatusData if (glucoseStatus != null) { overview_delta?.text = Profile.toSignedUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units) - overview_deltashort?.text = Profile.toSignedUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units) overview_avgdelta?.text = "${Profile.toSignedUnitsString(glucoseStatus.short_avgdelta, glucoseStatus.short_avgdelta * Constants.MGDL_TO_MMOLL, units)}\n${Profile.toSignedUnitsString(glucoseStatus.long_avgdelta, glucoseStatus.long_avgdelta * Constants.MGDL_TO_MMOLL, units)}" } else { overview_delta?.text = "Δ " + resourceHelper.gs(R.string.notavailable) - overview_deltashort?.text = "---" overview_avgdelta?.text = "" } @@ -596,9 +600,10 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList } val closedLoopEnabled = constraintChecker.isClosedLoopAllowed() - // open loop mode + // aps mode if (config.APS && pump.pumpDescription.isTempBasalCapable) { overview_apsmode?.visibility = View.VISIBLE + overview_time_llayout?.visibility = View.GONE when { loopPlugin.isEnabled() && loopPlugin.isSuperBolus -> { overview_apsmode?.setImageResource(R.drawable.ic_loop_superbolus) @@ -616,7 +621,13 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList } pump.isSuspended -> { - overview_apsmode?.setImageResource(R.drawable.ic_loop_paused) + overview_apsmode?.setImageResource(if (pump.pumpDescription.pumpType == PumpType.Insulet_Omnipod) { + // For Omnipod, indicate the pump as disconnected when it's suspended. + // The only way to 'reconnect' it, is through the Omnipod tab + R.drawable.ic_loop_disconnected + } else { + R.drawable.ic_loop_paused + }) overview_apsmode_text?.text = "" } @@ -641,8 +652,10 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList } } } else { + //nsclient overview_apsmode?.visibility = View.GONE overview_apsmode_text?.visibility = View.GONE + overview_time_llayout?.visibility = View.VISIBLE } val lastRun = loopPlugin.lastRun val predictionsAvailable = if (config.APS) lastRun?.request?.hasPredictions == true else config.NSCLIENT @@ -671,7 +684,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList // Basal, TBR val activeTemp = treatmentsPlugin.getTempBasalFromHistory(System.currentTimeMillis()) - overview_basebasal?.text = activeTemp?.let { if (resourceHelper.shortTextMode()) "T:" + activeTemp.toStringVeryShort() else activeTemp.toStringFull() } + overview_basebasal?.text = activeTemp?.let { "T:" + activeTemp.toStringVeryShort() } ?: resourceHelper.gs(R.string.pump_basebasalrate, profile.basal) overview_basal_llayout?.setOnClickListener { var fullText = "${resourceHelper.gs(R.string.basebasalrate_label)}: ${resourceHelper.gs(R.string.pump_basebasalrate, profile.basal)}" @@ -692,10 +705,10 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList // Extended bolus val extendedBolus = treatmentsPlugin.getExtendedBolusFromHistory(System.currentTimeMillis()) - overview_extendedbolus?.text = if (extendedBolus != null && !pump.isFakingTempsByExtendedBoluses) { - if (resourceHelper.shortTextMode()) resourceHelper.gs(R.string.pump_basebasalrate, extendedBolus.absoluteRate()) - else extendedBolus.toStringMedium() - } else "" + overview_extendedbolus?.text = + if (extendedBolus != null && !pump.isFakingTempsByExtendedBoluses) + resourceHelper.gs(R.string.pump_basebasalrate, extendedBolus.absoluteRate()) + else "" overview_extendedbolus?.setOnClickListener { if (extendedBolus != null) activity?.let { OKDialog.show(it, resourceHelper.gs(R.string.extended_bolus), extendedBolus.toString()) @@ -720,15 +733,8 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList treatmentsPlugin.updateTotalIOBTempBasals() val bolusIob = treatmentsPlugin.lastCalculationTreatments.round() val basalIob = treatmentsPlugin.lastCalculationTempBasals.round() - overview_iob?.text = when { - resourceHelper.shortTextMode() -> - resourceHelper.gs(R.string.formatinsulinunits, bolusIob.iob + basalIob.basaliob) + overview_iob?.text = resourceHelper.gs(R.string.formatinsulinunits, bolusIob.iob + basalIob.basaliob) - else -> - resourceHelper.gs(R.string.formatinsulinunits, bolusIob.iob + basalIob.basaliob) + " (" + - resourceHelper.gs(R.string.formatinsulinunits, bolusIob.iob) + "/" + - resourceHelper.gs(R.string.formatinsulinunits, basalIob.basaliob) + ")" - } overview_iob_llayout?.setOnClickListener { activity?.let { OKDialog.show(it, resourceHelper.gs(R.string.iob), @@ -741,7 +747,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList // Status lights overview_statuslights?.visibility = (sp.getBoolean(R.string.key_show_statuslights, true) || config.NSCLIENT).toVisibility() - statusLightHandler.updateStatusLights(careportal_canulaage, careportal_insulinage, careportal_reservoirlevel, careportal_sensorage, careportal_pbage, careportal_batterylevel) + statusLightHandler.updateStatusLights(careportal_canulaage, careportal_insulinage, careportal_reservoirlevel, careportal_sensorage, null, careportal_pbage, careportal_batterylevel) // cob var cobText: String = resourceHelper.gs(R.string.value_unavailable_short) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt index f5e3c656dc..4e996717c8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt @@ -28,12 +28,12 @@ import info.nightscout.androidaps.events.EventRefreshOverview import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.interfaces.CommandQueueProvider import info.nightscout.androidaps.interfaces.PluginType +import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.interfaces.PumpDescription import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin -import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DefaultValueHelper diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/StatusLightHandler.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/StatusLightHandler.kt index 8a95e34e1e..af361236fa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/StatusLightHandler.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/StatusLightHandler.kt @@ -27,14 +27,20 @@ class StatusLightHandler @Inject constructor( /** * applies the extended statusLight subview on the overview fragment */ - fun updateStatusLights(careportal_canulaage: TextView?, careportal_insulinage: TextView?, careportal_reservoirlevel: TextView?, careportal_sensorage: TextView?, careportal_pbage: TextView?, careportal_batterylevel: TextView?) { + fun updateStatusLights(careportal_canulaage: TextView?, careportal_insulinage: TextView?, careportal_reservoirlevel: TextView?, careportal_sensorage: TextView?, careportal_sensorbatterylevel: TextView?, careportal_pbage: TextView?, careportal_batterylevel: TextView?) { val pump = activePlugin.activePump + val bgSource = activePlugin.activeBgSource handleAge(careportal_canulaage, CareportalEvent.SITECHANGE, R.string.key_statuslights_cage_warning, 48.0, R.string.key_statuslights_cage_critical, 72.0) handleAge(careportal_insulinage, CareportalEvent.INSULINCHANGE, R.string.key_statuslights_iage_warning, 72.0, R.string.key_statuslights_iage_critical, 144.0) handleAge(careportal_sensorage, CareportalEvent.SENSORCHANGE, R.string.key_statuslights_sage_warning, 216.0, R.string.key_statuslights_sage_critical, 240.0) handleAge(careportal_pbage, CareportalEvent.PUMPBATTERYCHANGE, R.string.key_statuslights_bage_warning, 216.0, R.string.key_statuslights_bage_critical, 240.0) - if (!config.NSCLIENT) + if (!config.NSCLIENT) { handleLevel(careportal_reservoirlevel, R.string.key_statuslights_res_critical, 10.0, R.string.key_statuslights_res_warning, 80.0, pump.reservoirLevel, "U") + if (bgSource.sensorBatteryLevel != -1) + handleLevel(careportal_sensorbatterylevel, R.string.key_statuslights_sbat_critical, 5.0, R.string.key_statuslights_sbat_warning, 20.0, bgSource.sensorBatteryLevel.toDouble(), "%") + else + careportal_sensorbatterylevel?.text = "" + } if (!config.NSCLIENT && pump.model() != PumpType.AccuChekCombo) handleLevel(careportal_batterylevel, R.string.key_statuslights_bat_critical, 26.0, R.string.key_statuslights_bat_warning, 51.0, pump.batteryLevel.toDouble(), "%") } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPlugin.kt index 9beccc7ccd..a5794fbc25 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPlugin.kt @@ -23,7 +23,6 @@ import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker -import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification import info.nightscout.androidaps.plugins.general.overview.notifications.Notification @@ -314,6 +313,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS LOOP DISABLE") loopPlugin.setPluginEnabled(PluginType.LOOP, false) commandQueue.cancelTempBasal(true, object : Callback() { override fun run() { @@ -337,6 +337,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS LOOP ENABLE") loopPlugin.setPluginEnabled(PluginType.LOOP, true) sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_loophasbeenenabled))) rxBus.send(EventRefreshOverview("SMS_LOOP_START")) @@ -363,7 +364,18 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS LOOP RESUME") + loopPlugin.suspendTo(0L) rxBus.send(EventRefreshOverview("SMS_LOOP_RESUME")) + commandQueue.cancelTempBasal(true, object : Callback() { + override fun run() { + if (!result.success) { + var replyText = resourceHelper.gs(R.string.smscommunicator_tempbasalfailed) + replyText += "\n" + activePlugin.activePump.shortStatus(true) + sendSMS(Sms(receivedSms.phoneNumber, replyText)) + } + } + }) loopPlugin.createOfflineEvent(0) sendSMSToAllNumbers(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_loopresumed))) } @@ -385,6 +397,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction(duration) { override fun run() { + aapsLogger.debug("USER ENTRY: SMS LOOP SUSPEND") commandQueue.cancelTempBasal(true, object : Callback() { override fun run() { if (result.success) { @@ -463,6 +476,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS PUMP CONNECT") commandQueue.cancelTempBasal(true, object : Callback() { override fun run() { if (!result.success) { @@ -491,6 +505,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS PUMP DISCONNECT") val profile = profileFunction.getProfile() loopPlugin.disconnectPump(duration, profile) rxBus.send(EventRefreshOverview("SMS_PUMP_DISCONNECT")) @@ -544,6 +559,7 @@ class SmsCommunicatorPlugin @Inject constructor( val finalPercentage = percentage messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction(list[pindex - 1] as String, finalPercentage) { override fun run() { + aapsLogger.debug("USER ENTRY: SMS PROFILE $reply") activePlugin.activeTreatments.doProfileSwitch(store, list[pindex - 1] as String, 0, finalPercentage, 0, DateUtil.now()) sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.profileswitchcreated))) } @@ -561,6 +577,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS BASAL $reply") commandQueue.cancelTempBasal(true, object : Callback() { override fun run() { if (result.success) { @@ -578,7 +595,7 @@ class SmsCommunicatorPlugin @Inject constructor( }) } else if (splitted[1].endsWith("%")) { var tempBasalPct = SafeParse.stringToInt(StringUtils.removeEnd(splitted[1], "%")) - var durationStep = activePlugin.activePump.model().tbrSettings.durationStep + val durationStep = activePlugin.activePump.model().tbrSettings.durationStep var duration = 30 if (splitted.size > 2) duration = SafeParse.stringToInt(splitted[2]) val profile = profileFunction.getProfile() @@ -592,6 +609,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction(tempBasalPct, duration) { override fun run() { + aapsLogger.debug("USER ENTRY: SMS BASAL $reply") commandQueue.tempBasalPercent(anInteger(), secondInteger(), true, profile, object : Callback() { override fun run() { if (result.success) { @@ -611,7 +629,7 @@ class SmsCommunicatorPlugin @Inject constructor( } } else { var tempBasal = SafeParse.stringToDouble(splitted[1]) - var durationStep = activePlugin.activePump.model().tbrSettings.durationStep + val durationStep = activePlugin.activePump.model().tbrSettings.durationStep var duration = 30 if (splitted.size > 2) duration = SafeParse.stringToInt(splitted[2]) val profile = profileFunction.getProfile() @@ -625,6 +643,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction(tempBasal, duration) { override fun run() { + aapsLogger.debug("USER ENTRY: SMS BASAL $reply") commandQueue.tempBasalAbsolute(aDouble(), secondInteger(), true, profile, object : Callback() { override fun run() { if (result.success) { @@ -652,6 +671,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS EXTENDED $reply") commandQueue.cancelExtended(object : Callback() { override fun run() { if (result.success) { @@ -680,6 +700,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction(extended, duration) { override fun run() { + aapsLogger.debug("USER ENTRY: SMS EXTENDED $reply") commandQueue.extendedBolus(aDouble(), secondInteger(), object : Callback() { override fun run() { if (result.success) { @@ -715,6 +736,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction(bolus) { override fun run() { + aapsLogger.debug("USER ENTRY: SMS BOLUS $reply") val detailedBolusInfo = DetailedBolusInfo() detailedBolusInfo.insulin = aDouble() detailedBolusInfo.source = Source.USER @@ -789,6 +811,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction(grams, time) { override fun run() { + aapsLogger.debug("USER ENTRY: SMS CARBS $reply") val detailedBolusInfo = DetailedBolusInfo() detailedBolusInfo.carbs = anInteger().toDouble() detailedBolusInfo.source = Source.USER @@ -829,6 +852,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS TARGET $reply") val units = profileFunction.getUnits() var keyDuration = 0 var defaultTargetDuration = 0 @@ -884,6 +908,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS TARGET $reply") val tempTarget = TempTarget() .source(Source.USER) .date(DateUtil.now()) @@ -908,6 +933,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() { override fun run() { + aapsLogger.debug("USER ENTRY: SMS SMS $reply") sp.putBoolean(R.string.key_smscommunicator_remotecommandsallowed, false) val replyText = String.format(resourceHelper.gs(R.string.smscommunicator_stoppedsms)) sendSMSToAllNumbers(Sms(receivedSms.phoneNumber, replyText)) @@ -924,6 +950,7 @@ class SmsCommunicatorPlugin @Inject constructor( receivedSms.processed = true messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction(cal) { override fun run() { + aapsLogger.debug("USER ENTRY: SMS CAL $reply") val result = xdripCalibrations.sendIntent(aDouble!!) if (result) sendSMSToAllNumbers(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_calibrationsent))) else sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_calibrationfailed))) } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/profile/local/LocalProfileFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/profile/local/LocalProfileFragment.kt index b0a1203170..b8bcd244ea 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/profile/local/LocalProfileFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/profile/local/LocalProfileFragment.kt @@ -106,9 +106,9 @@ class LocalProfileFragment : DaggerFragment() { localprofile_name.removeTextChangedListener(textWatch) localprofile_name.setText(currentProfile.name) localprofile_name.addTextChangedListener(textWatch) - localprofile_dia.setParams(currentProfile.dia, hardLimits.MINDIA, hardLimits.MAXDIA, 0.1, DecimalFormat("0.0"), false, localprofile_save, textWatch) + localprofile_dia.setParams(currentProfile.dia, hardLimits.minDia(), hardLimits.maxDia(), 0.1, DecimalFormat("0.0"), false, localprofile_save, textWatch) localprofile_dia.tag = "LP_DIA" - TimeListEdit(context, aapsLogger, dateUtil, view, R.id.localprofile_ic, "IC", resourceHelper.gs(R.string.ic_label), currentProfile.ic, null, hardLimits.MINIC, hardLimits.MAXIC, 0.1, DecimalFormat("0.0"), save) + TimeListEdit(context, aapsLogger, dateUtil, view, R.id.localprofile_ic, "IC", resourceHelper.gs(R.string.ic_label), currentProfile.ic, null, hardLimits.minIC(), hardLimits.maxIC(), 0.1, DecimalFormat("0.0"), save) basalView = TimeListEdit(context, aapsLogger, dateUtil, view, R.id.localprofile_basal, "BASAL", resourceHelper.gs(R.string.basal_label) + ": " + sumLabel(), currentProfile.basal, null, pumpDescription.basalMinimumRate, 10.0, 0.01, DecimalFormat("0.00"), save) if (units == Constants.MGDL) { TimeListEdit(context, aapsLogger, dateUtil, view, R.id.localprofile_isf, "ISF", resourceHelper.gs(R.string.isf_label), currentProfile.isf, null, hardLimits.MINISF, hardLimits.MAXISF, 1.0, DecimalFormat("0"), save) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/EversensePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/EversensePlugin.kt index 9141d57214..ff28aa3f2a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/source/EversensePlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/EversensePlugin.kt @@ -41,6 +41,8 @@ class EversensePlugin @Inject constructor( aapsLogger, resourceHelper, injector ), BgSourceInterface { + private var sensorBatteryLevel = -1 + override fun advancedFilteringSupported(): Boolean { return false } @@ -53,7 +55,10 @@ class EversensePlugin @Inject constructor( if (bundle.containsKey("glucoseLevel")) aapsLogger.debug(LTag.BGSOURCE, "glucoseLevel: " + bundle.getInt("glucoseLevel")) if (bundle.containsKey("glucoseTrendDirection")) aapsLogger.debug(LTag.BGSOURCE, "glucoseTrendDirection: " + bundle.getString("glucoseTrendDirection")) if (bundle.containsKey("glucoseTimestamp")) aapsLogger.debug(LTag.BGSOURCE, "glucoseTimestamp: " + dateUtil.dateAndTimeString(bundle.getLong("glucoseTimestamp"))) - if (bundle.containsKey("batteryLevel")) aapsLogger.debug(LTag.BGSOURCE, "batteryLevel: " + bundle.getString("batteryLevel")) + if (bundle.containsKey("batteryLevel")) { + aapsLogger.debug(LTag.BGSOURCE, "batteryLevel: " + bundle.getString("batteryLevel")) + //sensorBatteryLevel = bundle.getString("batteryLevel").toInt() // TODO: Philoul: Line to check I don't have eversens so I don't know what kind of information is sent... + } if (bundle.containsKey("signalStrength")) aapsLogger.debug(LTag.BGSOURCE, "signalStrength: " + bundle.getString("signalStrength")) if (bundle.containsKey("transmitterVersionNumber")) aapsLogger.debug(LTag.BGSOURCE, "transmitterVersionNumber: " + bundle.getString("transmitterVersionNumber")) if (bundle.containsKey("isXLVersion")) aapsLogger.debug(LTag.BGSOURCE, "isXLVersion: " + bundle.getBoolean("isXLVersion")) @@ -113,4 +118,8 @@ class EversensePlugin @Inject constructor( } } } + + override fun getSensorBatteryLevel(): Int { + return sensorBatteryLevel + } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/XdripPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/XdripPlugin.kt index aaf38b93b6..bc27489da6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/source/XdripPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/XdripPlugin.kt @@ -31,6 +31,7 @@ class XdripPlugin @Inject constructor( ), BgSourceInterface { private var advancedFiltering = false + private var sensorBatteryLevel = -1 override fun advancedFilteringSupported(): Boolean { return advancedFiltering @@ -45,6 +46,7 @@ class XdripPlugin @Inject constructor( bgReading.direction = bundle.getString(Intents.EXTRA_BG_SLOPE_NAME) bgReading.date = bundle.getLong(Intents.EXTRA_TIMESTAMP) bgReading.raw = bundle.getDouble(Intents.EXTRA_RAW) + //if (bundle.containsKey(Intents.EXTRA_SENSOR_BATTERY)) sensorBatteryLevel = bundle.getInt(Intents.EXTRA_SENSOR_BATTERY) val source = bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION, "no Source specified") setSource(source) MainApp.getDbHelper().createIfNotExists(bgReading, "XDRIP") @@ -53,4 +55,8 @@ class XdripPlugin @Inject constructor( private fun setSource(source: String) { advancedFiltering = source.contains("G5 Native") || source.contains("G6 Native") } + + override fun getSensorBatteryLevel(): Int { + return sensorBatteryLevel + } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPlugin.java index 01ae2f9dcd..a957fbe57a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPlugin.java @@ -30,13 +30,12 @@ import info.nightscout.androidaps.data.NonOverlappingIntervals; import info.nightscout.androidaps.data.OverlappingIntervals; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.ProfileIntervals; -import info.nightscout.androidaps.db.Treatment; -import info.nightscout.androidaps.interfaces.ProfileStore; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.ProfileSwitch; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventReloadProfileSwitchData; import info.nightscout.androidaps.events.EventReloadTempBasalData; import info.nightscout.androidaps.events.EventReloadTreatmentData; @@ -45,13 +44,15 @@ import info.nightscout.androidaps.interfaces.ActivePluginProvider; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; +import info.nightscout.androidaps.interfaces.ProfileFunction; +import info.nightscout.androidaps.interfaces.ProfileStore; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.plugins.bus.RxBusWrapper; -import info.nightscout.androidaps.interfaces.ProfileFunction; import info.nightscout.androidaps.plugins.general.nsclient.NSUpload; +import info.nightscout.androidaps.plugins.general.nsclient.UploadQueue; import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.general.overview.notifications.Notification; import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult; @@ -75,6 +76,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface private final ProfileFunction profileFunction; private final ActivePluginProvider activePlugin; private final NSUpload nsUpload; + private final UploadQueue uploadQueue; private final FabricPrivacy fabricPrivacy; private final DateUtil dateUtil; @@ -103,7 +105,8 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface ActivePluginProvider activePlugin, NSUpload nsUpload, FabricPrivacy fabricPrivacy, - DateUtil dateUtil + DateUtil dateUtil, + UploadQueue uploadQueue ) { super(new PluginDescription() .mainType(PluginType.TREATMENT) @@ -124,6 +127,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface this.fabricPrivacy = fabricPrivacy; this.dateUtil = dateUtil; this.nsUpload = nsUpload; + this.uploadQueue = uploadQueue; } @Override @@ -338,8 +342,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface if (last == null) { getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: NOTHING FOUND"); return 0; - } - else { + } else { getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: " + dateUtil.dateAndTimeString(last.date)); return last.date; } @@ -350,8 +353,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface if (last == null) { getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: NOTHING FOUND"); return 0; - } - else { + } else { getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: " + dateUtil.dateAndTimeString(last.date)); return last.date; } @@ -362,8 +364,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface if (last == null) { getAapsLogger().debug(LTag.DATATREATMENTS, "Last Carb time: NOTHING FOUND"); return 0; - } - else { + } else { getAapsLogger().debug(LTag.DATATREATMENTS, "Last Carb time: " + dateUtil.dateAndTimeString(last.date)); return last.date; } @@ -387,6 +388,16 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface return getTempBasalFromHistory(System.currentTimeMillis()) != null; } + @Override public void removeTempBasal(TemporaryBasal tempBasal) { + String tempBasalId = tempBasal._id; + if (NSUpload.isIdValid(tempBasalId)) { + nsUpload.removeCareportalEntryFromNS(tempBasalId); + } else { + uploadQueue.removeID("dbAdd", tempBasalId); + } + MainApp.getDbHelper().delete(tempBasal); + } + @Override public boolean isInHistoryExtendedBoluslInProgress() { return getExtendedBolusFromHistory(System.currentTimeMillis()) != null; //TODO: crosscheck here diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/fragments/TreatmentsTemporaryBasalsFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/fragments/TreatmentsTemporaryBasalsFragment.kt index fed0ba1137..dd98dbf381 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/fragments/TreatmentsTemporaryBasalsFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/fragments/TreatmentsTemporaryBasalsFragment.kt @@ -11,7 +11,6 @@ import androidx.cardview.widget.CardView import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import dagger.android.support.DaggerFragment -import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.R import info.nightscout.androidaps.data.Intervals import info.nightscout.androidaps.data.IobTotal @@ -19,33 +18,29 @@ import info.nightscout.androidaps.db.Source import info.nightscout.androidaps.db.TemporaryBasal import info.nightscout.androidaps.events.EventTempBasalChange import info.nightscout.androidaps.interfaces.ActivePluginProvider -import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.interfaces.ProfileFunction +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.iob.iobCobCalculator.events.EventAutosensCalculationFinished import info.nightscout.androidaps.plugins.treatments.fragments.TreatmentsTemporaryBasalsFragment.RecyclerViewAdapter.TempBasalsViewHolder import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.alertDialogs.OKDialog.showConfirmation 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.treatments_tempbasals_fragment.* import javax.inject.Inject class TreatmentsTemporaryBasalsFragment : DaggerFragment() { + private val disposable = CompositeDisposable() @Inject lateinit var rxBus: RxBusWrapper - @Inject lateinit var sp: SP @Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var fabricPrivacy: FabricPrivacy @Inject lateinit var activePlugin: ActivePluginProvider @Inject lateinit var profileFunction: ProfileFunction - @Inject lateinit var nsUpload: NSUpload - @Inject lateinit var uploadQueue: UploadQueue @Inject lateinit var dateUtil: DateUtil override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, @@ -81,6 +76,7 @@ class TreatmentsTemporaryBasalsFragment : DaggerFragment() { } inner class RecyclerViewAdapter internal constructor(private var tempBasalList: Intervals) : RecyclerView.Adapter() { + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): TempBasalsViewHolder { val v = LayoutInflater.from(viewGroup.context).inflate(R.layout.treatments_tempbasals_item, viewGroup, false) return TempBasalsViewHolder(v) @@ -142,6 +138,7 @@ class TreatmentsTemporaryBasalsFragment : DaggerFragment() { } inner class TempBasalsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var cv: CardView = itemView.findViewById(R.id.tempbasals_cardview) var date: TextView = itemView.findViewById(R.id.tempbasals_date) var duration: TextView = itemView.findViewById(R.id.tempbasals_duration) @@ -166,10 +163,7 @@ class TreatmentsTemporaryBasalsFragment : DaggerFragment() { ${resourceHelper.gs(R.string.date)}: ${dateUtil.dateAndTimeString(tempBasal.date)} """.trimIndent(), DialogInterface.OnClickListener { _: DialogInterface?, _: Int -> - val id = tempBasal._id - if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id) - else uploadQueue.removeID("dbAdd", id) - MainApp.getDbHelper().delete(tempBasal) + activePlugin.activeTreatments.removeTempBasal(tempBasal) }, null) } } diff --git a/app/src/main/java/info/nightscout/androidaps/skins/SkinButtonsOn.kt b/app/src/main/java/info/nightscout/androidaps/skins/SkinButtonsOn.kt index 9584ce2f4b..1f1b742374 100644 --- a/app/src/main/java/info/nightscout/androidaps/skins/SkinButtonsOn.kt +++ b/app/src/main/java/info/nightscout/androidaps/skins/SkinButtonsOn.kt @@ -14,7 +14,6 @@ class SkinButtonsOn @Inject constructor(private val config: Config) : SkinInterf override fun overviewLayout(isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean): Int = when { - config.NSCLIENT && isTablet -> R.layout.overview_fragment_nsclient_tablet config.NSCLIENT -> R.layout.overview_fragment_nsclient else -> R.layout.overview_fragment } diff --git a/app/src/main/java/info/nightscout/androidaps/skins/SkinClassic.kt b/app/src/main/java/info/nightscout/androidaps/skins/SkinClassic.kt index 9388843db8..a95e50cb18 100644 --- a/app/src/main/java/info/nightscout/androidaps/skins/SkinClassic.kt +++ b/app/src/main/java/info/nightscout/androidaps/skins/SkinClassic.kt @@ -14,7 +14,6 @@ class SkinClassic @Inject constructor(private val config: Config): SkinInterface override fun overviewLayout(isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean): Int = when { - config.NSCLIENT && isTablet -> R.layout.overview_fragment_nsclient_tablet config.NSCLIENT -> R.layout.overview_fragment_nsclient isSmallHeight || isLandscape -> R.layout.overview_fragment_landscape else -> R.layout.overview_fragment diff --git a/app/src/main/java/info/nightscout/androidaps/skins/SkinInterface.kt b/app/src/main/java/info/nightscout/androidaps/skins/SkinInterface.kt index 73c047d100..e40fe7031d 100644 --- a/app/src/main/java/info/nightscout/androidaps/skins/SkinInterface.kt +++ b/app/src/main/java/info/nightscout/androidaps/skins/SkinInterface.kt @@ -1,12 +1,73 @@ package info.nightscout.androidaps.skins +import android.util.DisplayMetrics +import android.util.TypedValue.COMPLEX_UNIT_PX +import android.view.View +import android.widget.LinearLayout +import android.widget.TextView import androidx.annotation.LayoutRes import androidx.annotation.StringRes +import androidx.constraintlayout.widget.ConstraintLayout +import info.nightscout.androidaps.R +import kotlinx.android.synthetic.main.overview_fragment_nsclient.view.* +import kotlinx.android.synthetic.main.overview_info_layout.view.* +import kotlinx.android.synthetic.main.overview_statuslights_layout.view.* interface SkinInterface { - @get:StringRes val description : Int - val mainGraphHeight : Int // in dp - val secondaryGraphHeight : Int // in dp - @LayoutRes fun overviewLayout(isLandscape : Boolean, isTablet : Boolean, isSmallHeight : Boolean): Int + @get:StringRes val description: Int + + val mainGraphHeight: Int // in dp + val secondaryGraphHeight: Int // in dp + + @LayoutRes + fun overviewLayout(isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean): Int + + @LayoutRes + fun actionsLayout(isLandscape: Boolean, isSmallWidth: Boolean): Int = R.layout.actions_fragment + + fun preProcessLandscapeOverviewLayout(dm: DisplayMetrics, view: View, isTablet: Boolean) { + // pre-process landscape mode + val screenWidth = dm.widthPixels + val screenHeight = dm.heightPixels + val landscape = screenHeight < screenWidth + + if (landscape) { + val iobLayoutParams = view.overview_iob_llayout.layoutParams as ConstraintLayout.LayoutParams + iobLayoutParams.startToStart = ConstraintLayout.LayoutParams.UNSET + iobLayoutParams.startToEnd = view.overview_time_llayout.id + iobLayoutParams.topToBottom = ConstraintLayout.LayoutParams.UNSET + iobLayoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID + val timeLayoutParams = view.overview_time_llayout.layoutParams as ConstraintLayout.LayoutParams + timeLayoutParams.endToEnd = ConstraintLayout.LayoutParams.UNSET + timeLayoutParams.endToStart = view.overview_iob_llayout.id + + if (isTablet) { + for (v in listOf( + view.overview_bg, + view.overview_time, + view.overview_timeagoshort, + view.overview_iob, + view.overview_cob, + view.overview_basebasal, + view.overview_extendedbolus, + view.overview_sensitivity + )) v.setTextSize(COMPLEX_UNIT_PX, v.textSize * 1.5f) + for (v in listOf( + view.overview_pump, + view.overview_openaps, + view.overview_uploader, + view.careportal_canulaage, + view.careportal_insulinage, + view.careportal_reservoirlevel, + view.careportal_reservoirlevel, + view.careportal_sensorage, + view.careportal_pbage, + view.careportal_batterylevel + )) v.setTextSize(COMPLEX_UNIT_PX, v.textSize * 1.3f) + view.overview_time_llayout.orientation = LinearLayout.HORIZONTAL + view.overview_timeagoshort.setTextSize(COMPLEX_UNIT_PX, view.overview_time.textSize) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/skins/SkinLargeDisplay.kt b/app/src/main/java/info/nightscout/androidaps/skins/SkinLargeDisplay.kt index b28a0e3e0a..6e0e54294f 100644 --- a/app/src/main/java/info/nightscout/androidaps/skins/SkinLargeDisplay.kt +++ b/app/src/main/java/info/nightscout/androidaps/skins/SkinLargeDisplay.kt @@ -14,7 +14,6 @@ class SkinLargeDisplay @Inject constructor(private val config: Config): SkinInte override fun overviewLayout(isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean): Int = when { - config.NSCLIENT && isTablet -> R.layout.overview_fragment_nsclient_tablet config.NSCLIENT -> R.layout.overview_fragment_nsclient isSmallHeight || isLandscape -> R.layout.overview_fragment_landscape else -> R.layout.overview_fragment diff --git a/app/src/main/java/info/nightscout/androidaps/skins/SkinLowRes.kt b/app/src/main/java/info/nightscout/androidaps/skins/SkinLowRes.kt new file mode 100644 index 0000000000..609c324cee --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/skins/SkinLowRes.kt @@ -0,0 +1,31 @@ +package info.nightscout.androidaps.skins + +import android.util.DisplayMetrics +import android.view.View +import info.nightscout.androidaps.Config +import info.nightscout.androidaps.R +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class SkinLowRes @Inject constructor(private val config: Config) : SkinInterface { + + override val description: Int get() = R.string.lowres_description + override val mainGraphHeight: Int get() = 200 + override val secondaryGraphHeight: Int get() = 100 + + override fun overviewLayout(isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean): Int = + when { + config.NSCLIENT -> R.layout.overview_fragment_nsclient + isSmallHeight || isLandscape -> R.layout.overview_fragment_landscape + else -> R.layout.overview_fragment + } + + override fun actionsLayout(isLandscape: Boolean, isSmallWidth: Boolean): Int = + when { + isLandscape || !isSmallWidth -> R.layout.actions_fragment + else -> R.layout.actions_fragment_lowres + } + + override fun preProcessLandscapeOverviewLayout(dm: DisplayMetrics, view: View, isTablet: Boolean) {} +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/utils/HardLimits.kt b/app/src/main/java/info/nightscout/androidaps/utils/HardLimits.kt index 37b0c0beb6..61839a8bf4 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/HardLimits.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/HardLimits.kt @@ -24,7 +24,8 @@ class HardLimits @Inject constructor( val TEENAGE = 1 val ADULT = 2 val RESISTANTADULT = 3 - val MAXBOLUS = doubleArrayOf(5.0, 10.0, 17.0, 25.0) + val PREGNANT = 4 + val MAXBOLUS = doubleArrayOf(5.0, 10.0, 17.0, 25.0, 60.0) // Very Hard Limits Ranges // First value is the Lowest and second value is the Highest a Limit can define @@ -36,15 +37,15 @@ class HardLimits @Inject constructor( val VERY_HARD_LIMIT_TEMP_MIN_BG = intArrayOf(72, 180) val VERY_HARD_LIMIT_TEMP_MAX_BG = intArrayOf(72, 270) val VERY_HARD_LIMIT_TEMP_TARGET_BG = intArrayOf(72, 200) - val MINDIA = 5.0 - val MAXDIA = 7.0 - val MINIC = 2.0 - val MAXIC = 100.0 + val MINDIA = doubleArrayOf(5.0, 5.0, 5.0, 5.0, 5.0) + val MAXDIA = doubleArrayOf(7.0, 7.0, 7.0, 7.0, 10.0) + val MINIC = doubleArrayOf(2.0, 2.0, 2.0, 2.0, 0.3) + val MAXIC = doubleArrayOf(100.0, 100.0, 100.0, 100.0, 100.0) val MINISF = 2.0 // mgdl val MAXISF = 720.0 // mgdl - val MAXIOB_AMA = doubleArrayOf(3.0, 5.0, 7.0, 12.0) - val MAXIOB_SMB = doubleArrayOf(3.0, 7.0, 12.0, 25.0) - val MAXBASAL = doubleArrayOf(2.0, 5.0, 10.0, 12.0) + val MAXIOB_AMA = doubleArrayOf(3.0, 5.0, 7.0, 12.0, 25.0) + val MAXIOB_SMB = doubleArrayOf(3.0, 7.0, 12.0, 25.0, 40.0) + val MAXBASAL = doubleArrayOf(2.0, 5.0, 10.0, 12.0, 25.0) //LGS Hard limits //No IOB at all @@ -57,6 +58,7 @@ class HardLimits @Inject constructor( else if (sp_age == resourceHelper.gs(R.string.key_teenage)) TEENAGE else if (sp_age == resourceHelper.gs(R.string.key_adult)) ADULT else if (sp_age == resourceHelper.gs(R.string.key_resistantadult)) RESISTANTADULT + else if (sp_age == resourceHelper.gs(R.string.key_pregnant)) PREGNANT else ADULT return age } @@ -77,6 +79,22 @@ class HardLimits @Inject constructor( return MAXBASAL[loadAge()] } + fun minDia(): Double { + return MINDIA[loadAge()] + } + + fun maxDia(): Double { + return MAXDIA[loadAge()] + } + + fun minIC(): Double { + return MINIC[loadAge()] + } + + fun maxIC(): Double { + return MAXIC[loadAge()] + } + // safety checks fun checkOnlyHardLimits(value: Double, valueName: String?, lowLimit: Double, highLimit: Double): Boolean { return value == verifyHardLimits(value, valueName, lowLimit, highLimit) @@ -96,4 +114,4 @@ class HardLimits @Inject constructor( } return newvalue } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/utils/stats/TddCalculator.kt b/app/src/main/java/info/nightscout/androidaps/utils/stats/TddCalculator.kt index 6cecfa4f73..78cbaf4a9d 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/stats/TddCalculator.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/stats/TddCalculator.kt @@ -7,11 +7,12 @@ import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.R import info.nightscout.androidaps.db.TDD import info.nightscout.androidaps.interfaces.ActivePluginProvider +import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.bus.RxBusWrapper -import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.plugins.general.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 @@ -34,8 +35,9 @@ class TddCalculator @Inject constructor( val profileFunction: ProfileFunction, fabricPrivacy: FabricPrivacy, nsUpload: NSUpload, - private val dateUtil: DateUtil -) : TreatmentsPlugin(injector, aapsLogger, rxBus, resourceHelper, mainApp, sp, profileFunction, activePlugin, nsUpload, fabricPrivacy, dateUtil) { + private val dateUtil: DateUtil, + uploadQueue: UploadQueue +) : TreatmentsPlugin(injector, aapsLogger, rxBus, resourceHelper, mainApp, sp, profileFunction, activePlugin, nsUpload, fabricPrivacy, dateUtil, uploadQueue) { init { service = TreatmentService(injector) // plugin is not started @@ -62,7 +64,7 @@ class TddCalculator @Inject constructor( val midnight = MidnightTime.calc(t) val tdd = result[midnight] ?: TDD(midnight, 0.0, 0.0, 0.0) val tbr = getTempBasalFromHistory(t) - val profile = profileFunction.getProfile(t) ?: continue + val profile = profileFunction.getProfile(t, this) ?: continue val absoluteRate = tbr?.tempBasalConvertedToAbsolute(t, profile) ?: profile.getBasal(t) tdd.basal += absoluteRate / 60.0 * 5.0 diff --git a/app/src/main/res/layout/actions_fragment_lowres.xml b/app/src/main/res/layout/actions_fragment_lowres.xml new file mode 100644 index 0000000000..dc7a4fc204 --- /dev/null +++ b/app/src/main/res/layout/actions_fragment_lowres.xml @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_preferences.xml b/app/src/main/res/layout/activity_preferences.xml new file mode 100644 index 0000000000..042c7515b2 --- /dev/null +++ b/app/src/main/res/layout/activity_preferences.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/careportal_fragment.xml b/app/src/main/res/layout/careportal_fragment.xml index ec0bd04bc7..f926492f62 100644 --- a/app/src/main/res/layout/careportal_fragment.xml +++ b/app/src/main/res/layout/careportal_fragment.xml @@ -4,7 +4,7 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingTop="5dp" - tools:context=".plugins.general.careportal.CareportalFragment"> + tools:context=".plugins.general.actions.ActionsFragment"> + tools:context=".plugins.general.actions.ActionsFragment"> - - + android:stretchColumns="0,2,4"> - + + - - - - - + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + - + - + + + + + android:layout_height="wrap_content"> - + + + + + diff --git a/app/src/main/res/layout/careportal_stats_fragment_lowres.xml b/app/src/main/res/layout/careportal_stats_fragment_lowres.xml new file mode 100644 index 0000000000..eb6a1dc8ed --- /dev/null +++ b/app/src/main/res/layout/careportal_stats_fragment_lowres.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/overview_fragment_nsclient.xml b/app/src/main/res/layout/overview_fragment_nsclient.xml index c4ce063e29..7f0235d8b9 100644 --- a/app/src/main/res/layout/overview_fragment_nsclient.xml +++ b/app/src/main/res/layout/overview_fragment_nsclient.xml @@ -8,11 +8,11 @@ + android:layout_height="0dp" + android:layout_weight="1"> - @@ -28,37 +28,49 @@ - + android:background="?attr/colorControlHighlight" + app:alignContent="stretch" + app:alignItems="stretch" + app:flexDirection="row" + app:flexWrap="wrap" + app:justifyContent="center"> - + - + + + + + diff --git a/app/src/main/res/layout/overview_fragment_nsclient_tablet.xml b/app/src/main/res/layout/overview_fragment_nsclient_tablet.xml deleted file mode 100644 index 22b87fb6f7..0000000000 --- a/app/src/main/res/layout/overview_fragment_nsclient_tablet.xml +++ /dev/null @@ -1,553 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/overview_info_layout.xml b/app/src/main/res/layout/overview_info_layout.xml index d71a249d0f..147b468ff9 100644 --- a/app/src/main/res/layout/overview_info_layout.xml +++ b/app/src/main/res/layout/overview_info_layout.xml @@ -35,6 +35,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" + app:layout_constraintBottom_toBottomOf="@+id/overview_bg" app:layout_constraintEnd_toStartOf="@+id/overview_apsmode_llayout" app:layout_constraintStart_toEndOf="@+id/overview_arrow" app:layout_constraintTop_toTopOf="parent"> @@ -111,7 +112,8 @@ android:layout_marginTop="5dp" android:gravity="center_horizontal" android:orientation="vertical" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="@+id/overview_bg" + app:layout_constraintEnd_toStartOf="@id/overview_time_llayout" app:layout_constraintStart_toEndOf="@id/overview_deltas_llayout" app:layout_constraintTop_toTopOf="parent"> @@ -135,6 +137,43 @@ android:textStyle="bold" /> + + + + + + + + @@ -170,15 +210,16 @@ android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/overview_basal_llayout" app:layout_constraintStart_toEndOf="@+id/overview_iob_llayout" - app:layout_constraintTop_toBottomOf="@+id/overview_bg"> + app:layout_constraintTop_toTopOf="@+id/overview_iob_llayout"> + app:layout_constraintTop_toTopOf="@+id/overview_iob_llayout"> + app:layout_constraintTop_toTopOf="@+id/overview_iob_llayout"> + app:layout_constraintTop_toTopOf="@+id/overview_iob_llayout"> Wys gedetailleerde IAB Breek af IAB in bolus en basale IAB op die watchface nie suksesvol - Kontroleer asseblief foon - Pasiënt ouderdom Kind Tiener Volwassene Insulien weerstandige volwasse - Kies asseblief pasiënt ouderdom om veiligheids limiete te stel Glimp %1$s benodig battery optimisering bemagtiging vir beter werksverrigting Lus opgeskort diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index 053a1a1f44..8723c5e3d4 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -261,7 +261,7 @@ Стойността %1$s е извън ограниченията За свързване с помпа отговорете с код %1$s Връзката с помпата е неуспешна - За да спрете помпата за %1d минути отговорете с код %2$s + За да спрете помпата за %1$d минути отговорете с код %2$s Помпата е разкачена Връзката с помпа е възстановена Отдалеченото управление е забранено @@ -405,12 +405,11 @@ Раздели IOB от болус и от базал на часовника неуспешно - моля проверете телефона --- - Възраст на потребителя Дете Тийнейджър Възрастен Възрастни с голяма инсулинова резистентност - Изберете възраст за определяне лимитите на безопасност + Бременност Име на пациента Моля, посочете име на пациента или измислено име, за да се различават Потребител @@ -454,6 +453,8 @@ Праг за критична инсулинова възраст [часа] Праг за възраст на сензор [часа] Праг за критична възраст на сензор [часа] + Аларма при заряд на батерия под [%] + Критично ниво на сензорната батерия под [%] Аларма при възраст на батерия над [часа] Праг за критична възраст на батерията над [часа] Ниво за аларма за останал инсулин в резервоара [Е] @@ -484,6 +485,12 @@ Възраст на инсулина Смени профил Възраст на батерията на помпата + Сензор + Канюла + Инсулин + Батерия на помпата + възраст: + ниво: Опции за аларми Известяване при NS аларми Създаване на известия от NS съобщения @@ -990,6 +997,7 @@ Ограничение поради липса на памет Освободете поне %1$d Мб в паметта на телефона! Loop изключен! Грешен формат + Продължителността на временния база; трябва да бъде кратна на %1$d минути и по-голяма от 0. Грешен код. Командата не е изпълнена. Не е конфигуриран Създаден запис - Промяна на профил @@ -1155,6 +1163,9 @@ Нулиране на ключва Сигурни ли сте, че ще анулирате ключа на Authenticator? Той ще направи всички конфигурирани в момента аудиентикатори невалидни, и вие ще трябва да ги настроите отново. Генериран е нов ключ! Моля, използвайте актуализирания QRCode. + Експортиране на OTP парола + Сигурни ли сте, че искате да копирате OTP паролата в клипборда?\n\nВие може да се нуждаете само от това, ако вашето приложение за автентичност има проблеми със сканирането на QRCode, искате да го въведете ръчно или искате да конфигурирате хардуерен OTP токен чрез специално приложение. + OTP парола (във Base32 формат) е експортирана и копирана в клипборда. Поставете го в автентикатор или хардуерен OTP! 1. Инсталиране на удостоверител 2. Сканиране на кода за настройка на AndroidAPS OTP 3. Тест на еднократна парола @@ -1174,6 +1185,7 @@ Копиране на настройки от NS Копиране на профил от NS (ако има)? Оригинален изглед + Скин за ниска резолюция Бутоните винаги се показват на дъното на екрана. Голям екран Тема @@ -1218,4 +1230,5 @@ Статус: %s Качени данни Следните данни ще бъдат качвани във вашия Open Humans акаунт: Глюкозни стойности, болуси, въглехидрати, удължени болуси, профилни смени, общи дневни дози, временни базали, временни цели, предпочитания, версия на AAPS, модел на телефона и размери на екрана. Тайна или лична информация, като например вашия адрес на Nightscout или API, няма да бъдат качени. + RileyLink статус: diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index ad90411bb0..85a132a6df 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -261,7 +261,7 @@ Hodnota %1$s je mimo přednastavený rozsah Chcete-li připojit pumpu, odpovězte pomocí SMS s kódem %1$s Připojení k pumpě selhalo - Chcete-li odpojit pumpu na %1d minut, odpovězte pomocí SMS s kódem %2$s + Chcete-li odpojit pumpu na %1$d minut, odpovězte pomocí SMS s kódem %2$s Pumpa odpojena Pumpa byla znovu připojena Vzdálený příkaz není povolen @@ -405,12 +405,13 @@ Rozepsat IOB do bolusového a bazálního na hodinkách neúspěšně - zkontrolujte mobil n/a - Stáří pacienta + Typ pacienta Dítě Dospívající Dospělý Dospělý s nízkou citlivostí - Vyberte věk pacienta pro nastavení bezpečnostních limitů + Těhotenství + Prosím vyberte typ pacienta pro nastavení bezpečnostních limitů Jméno pacienta Zadejte jméno pacienta nebo přezdívku pro rozlišení mezi více nastaveními Uživatel @@ -454,6 +455,8 @@ Úroveň kritického stáří inzulínu [h] Úroveň varování stáří senzoru [h] Úroveň kritického stáří senzoru [h] + Úroveň varování stavu baterie senzoru [%] + Úroveň kritického varování stavu baterie senzoru [%] Úroveň varování stáří baterie [h] Úroveň kritického varování stáří baterie [h] Úroveň varování stavu zásobníku [U] @@ -484,6 +487,12 @@ Stáří inzulínu Proveďte přepnutí profilu Stáří baterie v pumpě + Senzor + Kanyla + Inzulín + Baterie pumpy + věk: + úroveň: Nastavení alarmů Vytvořit oznámení z alarmů NS Vytvořit oznámení z NS upozornění @@ -1156,6 +1165,9 @@ Resetovat klíč pro autentikátory Opravdu chcete obnovit ověřovací klíč? Vyresetujete všechny aktuálně nakonfigurované autentikátory a budete je muset znovu nastavit. Byl vygenerován nový klíč autentikátoru! Prosím, použijte aktualizovaný QR kód pro nastavení autentikátorů. + Export OTP tajného klíče + Jste si jisti, že chcete zkopírovat tajný OTP klíč do schránky?\n\nPravděpodobně to budete potřebovat pouze v případě, když bude mít vaše ověřovací aplikace problém se skenováním QR kodu, chcete ho zadat ručně, nebo chcete nakonfigurovat hardwarový OTP token pomocí specializované aplikace. + Tajné OTP heslo (ve formátu Base32) bylo vyexportováno a zkopírováno do schránky. Vložte ho do autentikátoru nebo programátoru OTP hardwaru! 1. Nainstalujte Autentikátor 2. Naskenujte kód pro nastavení kódů OTP AndroidAPS 3. Otestujte jednorázové heslo @@ -1175,6 +1187,7 @@ Zkopírovat nastavení z NS Zkopírovat nastavení NS (existuje-li)? Původní vzhled + Vzhled pro nízké rozlišení Tlačítka jsou vždy zobrazena v dolní části obrazovky Velký displej Vzhled diff --git a/app/src/main/res/values-de-rDE/exam.xml b/app/src/main/res/values-de-rDE/exam.xml index 4a963701f2..958981e67a 100644 --- a/app/src/main/res/values-de-rDE/exam.xml +++ b/app/src/main/res/values-de-rDE/exam.xml @@ -134,8 +134,8 @@ Ein höheres IC-Verhältnis bedeutet, dass weniger Insulin für die selbe Menge an KH abgegeben wird. Ein niedrigeres IC-Verhältnis bedeutet, dass weniger Insulin für die selbe Menge an KH abgegeben wird. Das Ändern des IC-Verhältnisses bedeutet, dass bei 0 COB eine andere Menge an Insulin zur Korrektur eines vorgegebenen BZ-Wertes abgegeben wird. - Der IC-Wert muss sich unterscheiden, je nachdem, ob Du eine BE mit 10g oder mit 12g berechnest. - IC bedeutet: Wie viele BE werden durch eine Einheit Insulin abgedeckt? + Der IC-Wert wird sich unterscheiden, je nachdem, ob Du eine Broteinheit (BE) mit 10g oder mit 12g berechnest. + IC bedeutet: Anzahl BE, die durch eine Einheit Insulin abgedeckt werden https://androidaps.readthedocs.io/en/latest/CROWDIN/de/Getting-Started/FAQ.html#kh-faktor-carbohydrate-to-insulin-ratio-cr-g-ie Thema: Profilwechsel Durch einen Profilwechsel auf 90%… diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 681776e204..7071cfa7eb 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -261,7 +261,7 @@ Wert %1$s ist außerhalb des festen Limits. Um die Pumpe zu verbinden, antworte mit dem Code %1$s Verbindung zur Pumpe fehlgeschlagen - Um die Verbindung zur Pumpe für %1d Minuten zu trennen, antworte mit dem Code %2$s + Um die Verbindung zur Pumpe für %1$d Minuten zu trennen, antworte mit dem Code %2$s Verbindung zur Pumpe getrennt Verbindung zur Pumpe wiederhergestellt Ferngesteuerte Befehle sind nicht erlaubt. @@ -405,12 +405,13 @@ Differenziere IOB in Bolus- und Basal-IOB auf dem Watchface Nicht erfolgreich - bitte Telefon prüfen n/a - Patientenalter + Patiententyp Kind Teenager Erwachsener Insulinresistenter Erwachsener - Bitte wähle das Patientenalter, um die Sicherheits-Limits festzulegen + Schwangerschaft + Bitte wähle den Patiententyp, um die Sicherheits-Limits festzulegen Name des Patienten Bitte gib den Namen des Patienten oder einen Spitznamen an, um mehrere Setups unterscheiden zu können. Nutzer @@ -454,6 +455,8 @@ Warnschwelle kritisches Insulinalter [h] Warnschwelle Sensoralter [h] Warnschwelle kritisches Sensoralter [h] + Warnschwelle Sensor-Batteriestand [%] + Warnschwelle kritischer Sensor-Batteriestand [%] Warnschwelle Batteriealter [h] Warnschwelle kritisches Batteriealter [h] Warnschwelle Reservoirstand [IE] @@ -484,6 +487,12 @@ Insulinalter Profilwechsel durchführen Batteriealter + Sensor + Kanüle + Insulin + Pumpenbatterie + Alter: + Level: Alarm-Optionen Benachrichtigungen über NS-Alarme Benachrichtigungen über NS-Ankündigungen @@ -1179,6 +1188,7 @@ Unerwartetes Verhalten. Einstellung aus NS kopieren NS-Einstellungen kopieren (falls vorhanden)? Ursprüngliches Erscheinungsbild + Darstellung niedrige Auflösung Schaltflächen werden immer am unteren Rand des Bildschirms angezeigt Großer Bildschirm Erscheinungsbild diff --git a/app/src/main/res/values-el-rGR/exam.xml b/app/src/main/res/values-el-rGR/exam.xml index b65ee7b54a..1faa33ed47 100644 --- a/app/src/main/res/values-el-rGR/exam.xml +++ b/app/src/main/res/values-el-rGR/exam.xml @@ -131,8 +131,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/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index cd6f51b85b..af6acbc6a9 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -311,12 +311,10 @@ Δείξε αναλυτικά IOB Χώρισε την IOB σε bolus και βασικό στο ρολόι αποτυχία - ελέγξτε τηλέφωνο - Ηλικία χρήστη Παιδί Έφηβος Ενήλικας Αντίσταση ινσουλίνης ενηλίκων - Παρακαλώ επιλέξτε ηλικία χρήστη για να ορισθούν όρια ασφαλείας Glimp %1$s χρειάζεται λίστα βελτιστοποίησης μπαταρίας για σωστή απόδοση Κύκλωμα σε αναστολή diff --git a/app/src/main/res/values-es-rES/exam.xml b/app/src/main/res/values-es-rES/exam.xml index d10c0449d3..ceff4518c5 100644 --- a/app/src/main/res/values-es-rES/exam.xml +++ b/app/src/main/res/values-es-rES/exam.xml @@ -134,8 +134,6 @@ 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. https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-u Tema: Cambio de perfil Especificando el 90% en el cambio de perfil… diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 8b89da173b..279cf0d00a 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -257,7 +257,6 @@ El valor %1$s está fuera de límites Para conectar la infusora responder con el código %1$s Error al conectar a la bomba - Para desconectar la bomba durante %1dminutos responde con el código %2$s Bomba desconectada Bomba reconectada Comando remoto no permitido @@ -401,12 +400,10 @@ Separar IOB en bolo y base en el reloj sin efecto - por favor verificar en móvil n/a - Edad paciente Menor de edad Adolescente Adulto Adulto resistente a la insulina - Por favor elige la edad del paciente para ajustar los límites de seguridad Nombre del paciente Proporcione el nombre de paciente o el apodo para diferenciar entre varias configuraciones Usuario diff --git a/app/src/main/res/values-fr-rFR/exam.xml b/app/src/main/res/values-fr-rFR/exam.xml index 3111898534..8b4891a733 100644 --- a/app/src/main/res/values-fr-rFR/exam.xml +++ b/app/src/main/res/values-fr-rFR/exam.xml @@ -134,8 +134,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-u Rubrique : Changement de profil Quand on renseigne 90% dans le changement de profil… diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index a7c32d6c78..fc30f34133 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -262,7 +262,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S La valeur %1$s est en dehors des limites Pour connecter la pompe, renvoyez le code %1$s Echec de la connexion pompe - Pour déconnecter la pompe pendant %1d min, renvoyez le code %2$s + Pour déconnecter la pompe pendant %1$d min, renvoyez le code %2$s Pompe déconnectée Pompe reconnectée La commande à distance n\'est pas autorisée @@ -406,12 +406,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 basal Sans succès - vérifiez votre téléphone s/o - Age du patient + Type de patient Enfant Adolescent Adulte Adulte 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 patient Veuillez indiquer un nom ou pseudo du patient pour différencier plusieurs configurations Patient @@ -455,6 +456,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] @@ -485,6 +488,12 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Age Insuline Changer de profil Age Pile Pompe + Capteur + Canule + Insuline + Pile pompe + Âge: + Niveau: Options d\'alarme Créer des notifications à partir des alarmes NS Créer des notifications à partir des notifications NS @@ -1157,6 +1166,9 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Réinitialiser la clé de l\'Authentificateur Voulez-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\'Authentificateur 2. Scan du code pour configurer les codes OTP AndroidAPS 3. Test Mot-de-Passe-Unique (OTP) @@ -1176,6 +1188,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Copier les paramètres depuis NS Copier les paramètres NS (s\'ils existent)? Thème d\'origine + Basse résolution Boutons toujours en bas Grand écran Thème diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 52741e95f6..18d0c81039 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -261,7 +261,7 @@ Il valore %1$s è fuori limite massimo Per connettere il micro rispondi col codice %1$s Connessione 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$s Micro disconnesso Micro riconnesso Il comando da remoto non è permesso @@ -405,12 +405,13 @@ Dividi IOB in bolo e basale sulla watchface non riuscito - controlla il telefono n/a - Età del paziente + Tipo paziente Bambino Adolescente Adulto Adulto insulino-resistente - Seleziona l\'età del paziente per impostare i limiti di sicurezza + Gravidanza + Seleziona il tipo di paziente per configurare i limiti di sicurezza Nome paziente Fornisci il nome del paziente o il nickname per distinguere questa configurazione tra altre Utente @@ -454,6 +455,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] @@ -484,6 +487,12 @@ Età insulina Cambia profilo Età batteria micro + Sensore + Cannula + Insulina + Batteria micro + età: + livello: Opzioni allarme Crea notifiche da allarmi NS Crea notifiche da avvisi NS @@ -1156,6 +1165,9 @@ Resetta chiave autenticatore Sei 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\'autenticatore 2. Scansione il codice per configurare i codici OTP di AndroidAPS 3. Testa OTP @@ -1175,6 +1187,7 @@ Copia impostazioni da NS Copiare impostazioni NS (se esiste)? Tema originale + Tema a bassa risoluzione I tasti vengono sempre visualizzati nella parte inferiore dello schermo Visualizzazione ampia Tema diff --git a/app/src/main/res/values-iw-rIL/exam.xml b/app/src/main/res/values-iw-rIL/exam.xml index 3ea04e700d..aa6f830f3d 100644 --- a/app/src/main/res/values-iw-rIL/exam.xml +++ b/app/src/main/res/values-iw-rIL/exam.xml @@ -1,2 +1,168 @@ - + + מה נכון לגבי משך פעילות אינסולין (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..f357b2fe0f 100644 --- a/app/src/main/res/values-iw-rIL/objectives.xml +++ b/app/src/main/res/values-iw-rIL/objectives.xml @@ -1,2 +1,75 @@ - + + חזרה + התחל + אמת + %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..9517173acd 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -4,12 +4,1233 @@ + בטיחות טיפולים + בולוס מקסימלי מותר [U] + מקסימום פחמימות מותר [g] + העדפות רענן טיפול מ-Nightscout - בבקשה אתחל את הסמרטפון שלך או תרענן את אפלקצית AndroidAPS בהגדרות המערכת -אחרת AndroidAPS לא יוכל לבצע רישום (חשוב לעקוב אחר ולוודא כי האלגוריתמים פועלים כראוי)! + איפוס מסדי נתונים + אתם בטוחים שאתם רוצים לאפס את מסדי הנתונים? + יציאה + השתמש תמיד בערכים בזאלים מוחלטים + בבקשה אתחל את הסמרטפון שלך או תרענן את אפלקצית AndroidAPS בהגדרות המערכת \nאחרת AndroidAPS לא יוכל לבצע רישום (חשוב לעקוב אחר ולוודא כי האלגוריתמים פועלים כראוי)! + נראה שמכשיר זה אינו תומך ברשימת היתרים למיטוב הסוללה - ייתכן שתיתקל בבעיות ביצועים. + לחצנים לגישה מהירה לפונקציות שימושיות + משמש לקביעת תצורה של תוספים פעילים + תוכנית הלימוד מציג את ההגדרות הקבועות מראש עבור מזון המוגדר ב-Nightscout - להפעיל או לכבות את הלולאה. - מסנכרן את הנתונים שלך עם Nightscout + הגדרת אינסולין ל-Humalog ו- NovoRapid / Novolog + הגדרת אינסולין ל-Fiasp + הגדרת אינסולין ל-Lyumjev + מאפשר לכם להגדיר את שיא פעילות האינסולין, לשימוש על ידי משתמשים מתקדמים בלבד + הפעלת או השבתת הלולאה. + מסנכרן את נתוניכם עם Nightscout + מצב האלגוריתם ב-2016 + מצב האלגוריתם ב-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 + הגדרות פרופיל משאבת DanaR + משך פעילות אינסולין [h] + משך פעילות אינסולין + מעלה + בולוס עצר + עצירת בולוס + הלולאה הושבתה + הלולאה הופעלה + לולאה מושבתת + לולאה פעילה + %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 + לולאה + SP + 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 לא תקין + כיול + לשלוח כיול %1$.1f לxdrip? + 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 דק\') + סופר בולוס (%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 + מעלה + זיהוי רגישות + באיזה אלגוריתם זיהוי רגישות להשתמש? + רגישות + רגישות Oref0 + רגישות Oref1 + רגישות AAPS + הגדרות ספיגה + זמן ספיגה מקסימלי של הארוחה [h] + מספר השעות בהן צפוי שכל הפחמימות מארוחה ייספגו + גיל סנס\' + גיל אינס\' + גיל צינ\' + גיל סול\' + OAPS + מעלה + בזאלי + EXT + השאר את המסך דולק + מניעת כיבוי המסך. הדבר צורך הרבה כח סוללה. + בהפעלת פונקציית ה-Autosens יש לזכור שחייבים להזין למערכת את כל הפחמימות שנאכלו. אחרת פחמימות לא יזוהו נכון כשינוי ברגישות! + רגישות משוקללת ממוצעת + אישור + ביטול + לא כל הפרופילים נטענו! + הערכים לא נשמרו + אפשר שידורים לאפליקציות אחרות (כגון xDrip). אין להפעיל אם מותקן לכם יותר ממופע אחד של AAPS או NSClient! + אפשר שידורים מקומיים. + פעילות & משוב + פחמימות & בולוס + סנסור & OPENAPS + משאבה + משך [min] + OpenAPS SMB + הפעלת UAM + אפשר SMB + השתמש בסופר מיקרו בולוסים במקום בבזאלי זמני לפעילות מהירה יותר + זיהוי של ארוחות לא מוכרזות + שעת שיא של עקומת IOB + זמן שיא [min] + Oref שיא חופשי + Oref אינסולין מהיר + Oref אינסולין אולטרה מהיר + Lyumjev + DIA במשך %1$f הוא קצר מדי - משתמש ב-%2$f במקום! + הפעלת פרופיל + לא חוקי + אחוזים + קיזוז זמנים + ברירות מחדל ערכי מטרה + משך אוכלים בקרוב + ערך מטרת אוכלים בקרוב + משך פעילות + ערך מטרת פעילות + משך היפו + ערך מטרת היפו + שימוש חוזר + שליטה מהשעון + הגדירו ערכי מטרה זמניים וציינו טיפולים מהשעון. + מזון + גר\' + ]]> + kJ + אנרגיה + חלבון + שומן + ]]> + הפקודה מבוצעת כעת + המשאבה אינה זמינה + לא התקבלו קריאות סוכר + שימוש בהודעות מערכת עבור התראות ודיווחים + הגבר את עוצמת הקול בהדרגה להתראות ולהודעות + התראות מקומיות + התראה אם לא התקבלו נתוני סוכר בדם + התראה אם המשאבה בלתי נגישה + סף משאבה בלתי נגישה [min] + התראה אם יש צורך בפחמימות + התרעה דחופה + מידע + אפליקלציית Eversense (עם פאץ\') + טעינת נתוני סוכר ל-Nightscout + הגדרות העלאת ערכי סוכר בדם + הצגת דלתא מפורטת + הצגת דלתא עם עוד נק\' עשרונית אחת + תדירות מתן SMB בדקות + מקסימום דקות עבור 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\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de) + הבולוס האחרון נרשם לפני 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 אינו פעיל במצב לולאה פתוחה + מזון + איפוס + מנותק (%1$d דק\') + מינון אינסולין פעיל מרבי ממנו 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 להציע\לבצע שינויים במינון הבזאלי + הגדרת תוסף APS + הגדר את תוסף הרגישות + תוסף רגישות משמש לזיהוי רגישות וחישוב הפחמ\' הפעילות. לקבלת מידע נוסף, בקרו בכתובת: + 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 מחדש. + AS + גרסה %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%%]]> + ממוצע + זמן בטווח + מוניטור פעילות + האם ברצונכם לאפס את הסטטיסטיקות הפעילות? + סטטיסטיקה + רמת גלוקוז אקראית + הפקת נתוני גלוקוז אקראיים (מצב הדגמה בלבד) + ערכי גלוקוז בדם + כלים + הצג חישוב + אירוע אוטומציה + כבר מוגדר + לנקות את התור? כל הנתונים בתור יאבדו! + שימוש בבולוס ממושך יפסיק את מצב הלולאה הסגורה לזמן פעילות הבולוס. אתם בטוחים שאתם רוצים להמשיך? + הלולאה הסגורה מופסקת עקב מתן בולוס ממושך + EB + \"בודק טלפון\" + תפריט תרשים + רגישות + זמן בקשת SMB + זמן ביצוע SMB + זמן בקשת בזאלי זמני + זמן הפעלת בזאלי זמני + התראות משאבת Insight + מיישום מאמת עבור: %1$s ואחריו PIN + אפשר מאמת + אמת פקודות באמצעות סיסמאות חד פעמיות שהופקו ע\"י מאמת Google או יישומי 2FA אחרים. + תוספת PIN חובה בסוף האסימון + ספרות נוספות שיש לשנן ולהדביק בסוף כל אחת מהסיסמאות החד פעמיות + הגדרת מאמת + קוד לבדיקה: + OTP + PIN + קוד האימות מורכב מ-6 ספרות המוצגות על ידי יישום מאמת (הידוע בתור OTP) ואחריו 3 או יותר ספרות של PIN הכרחי. + OTP לבדיקה: + איפוס מאמתים + איפוס מפתח אימות + האם אתם בטוחים שברצונכם לאפס את מפתח האימות? איפוס יהפוך את כל המאמתים המוגדרים כעת לבלתי תקפים, ותצטרכו להגדיר אותם מחדש. + מפתח אימות חדש הופק! נא להשתמש בקוד 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 + אסור לשתף את קוד זה באינטרנט!\nהשתמשו בו אך ורק להתקנת אפליקציית האימות על טלפונים עוקבים. + אתחול המאמת גורם למאמתים שסופקו לכם להפסיק להיות חוקיים ויהיה צורך להגדירם שוב! + בחיבור + בניתוק + חיזוי + שיפוע הסטייה + ההרשאה נכשלה + אינסולין מוחלט + הסיסמה הראשית משמשת להצפנת גיבוי וכדי לעקוף את האבטחה ביישום. זכרו אותה או שמרו אותה במקום בטוח. + סיסמה ראשית נוכחית + אורות חיווי + העתקת הגדרות מ-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..ce40bcd380 100644 --- a/app/src/main/res/values-ko-rKR/exam.xml +++ b/app/src/main/res/values-ko-rKR/exam.xml @@ -131,8 +131,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/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index afbaedee45..3fda4cdd20 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -330,12 +330,10 @@ IOB 자세하게 보여주기 워치페이스에 IOB를 Bolus IOB와 Basal IOB로 나누어서 보여줍니다. 성공하지 못했습니다. 폰을 확인하세요 - 나이 어린이 청소년 성인 인슐린 저항성 높은 성인 - 안전제한을 설정하기 위해 당뇨인의 나이를 선택하세요 Glimp 최적의 성능을 위해 %1$s에서 배터리 최적화를 해제해야합니다. Loop 일시중지 diff --git a/app/src/main/res/values-lt-rLT/exam.xml b/app/src/main/res/values-lt-rLT/exam.xml index dd8f3aba08..db87e0a65b 100644 --- a/app/src/main/res/values-lt-rLT/exam.xml +++ b/app/src/main/res/values-lt-rLT/exam.xml @@ -134,8 +134,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-u Tema: Profilio keitimas Kai profilio keitime nustatote 90%… diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/app/src/main/res/values-lt-rLT/strings.xml index ca91704dae..b0d58a7eb8 100644 --- a/app/src/main/res/values-lt-rLT/strings.xml +++ b/app/src/main/res/values-lt-rLT/strings.xml @@ -261,7 +261,6 @@ Vertė %1$s viršija griežtą limitą Pompos prijungimui atsakykite su kodu %1$s Nepavyko prisijungti prie pompos - Norėdami atjungti pompą %1d min., atsakykite kodu %2$s Pompa atjungta Pompa prijungta Nuotolinis valdymas negalimas @@ -405,12 +404,10 @@ Rodyti laikrodyje bazės ir bolusų AIO Bandymas nesėkmingas - pasitikrinkite telefoną n/a - Paciento amžius Vaikas Paauglys Suaugęs Insulinui rezistentiškas suaugęs - Pasirinkite paciento amžių saugumo riboms nustatyti Paciento vardas Pateikite paciento vardą arba slapyvardį, kad galima būtų atskirti tarp skirtingų konfigūracijų. Vartotojas @@ -990,6 +987,7 @@ vidinės saugyklos apribojimas Atlaisvinkite 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ūruota Profilio perjungimas sukurtas @@ -1155,6 +1153,9 @@ 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 Authenticator 2. Nuskanuoti kodą AndroidAPS OTP kodų nustatymyu 3. Patikrinti vienkartinį slaptažodį @@ -1218,4 +1219,5 @@ Darbinė 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..3039d5ae62 100644 --- a/app/src/main/res/values-nl-rNL/exam.xml +++ b/app/src/main/res/values-nl-rNL/exam.xml @@ -134,8 +134,6 @@ 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. https://androidaps.readthedocs.io/en/latest/CROWDIN/nl/Getting-Started/FAQ.html#Koolhydraat-ratio-KH-g-E Onderwerp: Profiel wissels Bij het opgeven van 90% in je profiel wissel… diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 38ffb10fd9..3a3caf6e30 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -261,7 +261,6 @@ Waarde %1$s valt buiten de toegestane harde limieten Om verbinding te maken met pomp antwoord met code %1$s Verbinding maken met pomp is mislukt - Om verbinding te verbreken met pomp gedurende %1d minuten antwoord met code %2$s Pomp verbinding verbroken Pomp opnieuw verbonden Commando\'s op afstand zijn niet toegestaan @@ -405,12 +404,10 @@ Splits IOB in bolus en basaal op de watchface Niet geslaagd - controleer de telefoon n.v.t. - Leeftijd Patient Kind Tiener Volwassene insuline resistente volwassene - Kies leeftijd van de patient voor veiligheids limieten Naam patiënt Geef de naam of roepnaam van de patiënt op om onderscheid te maken tussen meerdere setups Gebruiker diff --git a/app/src/main/res/values-no-rNO/exam.xml b/app/src/main/res/values-no-rNO/exam.xml index 8bc7127bf1..f80bbf5d4e 100644 --- a/app/src/main/res/values-no-rNO/exam.xml +++ b/app/src/main/res/values-no-rNO/exam.xml @@ -53,15 +53,15 @@ 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 IC testing - Når bør jeg validere basal, ISF og IC verdier? + 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, IC, ISF, DIA). + Validert profil informasjon (basal, IK, ISF, DIA). En datamaskin for å lage en APK. En telefon som støttes. En bil. @@ -131,18 +131,18 @@ 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 IC forhold fører til at mindre insulin leveres for en gitt mengde karbohydrater. - Lavere IC forhold fører til at mindre insulin leveres for en gitt mengde karbohydrater. - Hvis du har 0 COB, vil endring av IC forholdet føre til endring av insulinmengden som trengs for å korrigere ditt BS nivå. - IC vil være forskjellig hvis du regner en skive brød som 10g eller 12g. - IC betyr: Hvor mange brødenheter som dekkes av 1E insulin. + 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. - IC verdien vil være 10% høyere. - IC verdien 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. diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index ee5298e91f..b0ceaf7462 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -261,7 +261,7 @@ 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 %1d minutter, svar med koden %2$s + For å koble fra pumpen i %1$d minutter, svar med koden %2$s Pumpe frakoblet Pumpen tilkoblet igjen Fjernstyringskommando er ikke tillatt @@ -405,12 +405,13 @@ Vis IOB med bolus och basal IOB på klokke mislykket - sjekk telefonen n/a - Pasientens alder + Pasient type Barn Tenåring Voksen Insulin resistent voksen - Velg pasientens alder for oppsett av sikkerhetsgrenser + Graviditet + Velg pasientens type for oppsett av sikkerhetsgrenser Pasientens navn Angi pasientnavn eller kallenavn for å kunne skille mellom flere oppsett Bruker @@ -454,6 +455,8 @@ 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] @@ -484,6 +487,12 @@ Insulin alder Gjør profilbytte Alder pumpebatteri + Sensor + Kanyle + Insulin + Pumpe batteri + alder: + nivå: Alarm valg Opprett varsler fra NS alarmer Opprett varsler fra NS meldinger @@ -1156,6 +1165,9 @@ 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 @@ -1175,6 +1187,7 @@ 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 diff --git a/app/src/main/res/values-pl-rPL/exam.xml b/app/src/main/res/values-pl-rPL/exam.xml index b346bd076c..e14eee2190 100644 --- a/app/src/main/res/values-pl-rPL/exam.xml +++ b/app/src/main/res/values-pl-rPL/exam.xml @@ -134,8 +134,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-u Temat: Przełączanie profili Jeśli podasz 90% podczas zmiany profilu… diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index c2654fb745..305039d112 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -261,7 +261,7 @@ Wartość %1$s jest poza dopuszczalną granicą Aby podłączyć pompę odpowiedz kodem %1$s Połą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$s Pompa odłączona Pompa ponownie podłączona Zdalne komendy nie są dozwolone @@ -405,12 +405,13 @@ Rozłóż IOB na bolus i IOB bazy na zegarku nie udało się - proszę sprawdzić telefon n/a - Wiek pacjenta + Typ pacjenta Dziecko Nastolatek Osoba dorosła Osoba dorosła insulinooporna - Proszę wybierz wiek pacjenta w celu ustawienia wartości limitów bezpieczeństwa + Ciąża + Wybierz typ pacjenta, aby ustawić limity bezpieczeństwa Nazwa pacjenta Proszę podać nazwę pacjenta lub pseudonim w celu rozróżnienia pomiędzy różnymi konfiguracjami Użytkownik @@ -454,6 +455,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] @@ -485,6 +488,12 @@ Czas insuliny Zmień profil Czas baterii pompy + Sensor + Kaniula + Insulina + Bateria pompy + wiek: + poziom: Opcje alarmu Utwórz powiadomienia z alarmów NS Utwórz powiadomienia z komunikatów NS @@ -1179,6 +1188,7 @@ Kopiowanie ustawień z NS Czy skopiować ustawienia NS (jeśli istnieją)? Motyw oryginalny + Mały ekran Przyciski są zawsze wyświetlane na dole ekranu Duży ekran Motyw diff --git a/app/src/main/res/values-pt-rBR/exam.xml b/app/src/main/res/values-pt-rBR/exam.xml index cd256141c4..c4df446552 100644 --- a/app/src/main/res/values-pt-rBR/exam.xml +++ b/app/src/main/res/values-pt-rBR/exam.xml @@ -134,8 +134,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-u Tópico: Alternando Perfil Ao especificar 90% na mudança de perfil… diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9e7baf1bad..d3cc2f1645 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -381,12 +381,10 @@ Dividir IOB entre IOB de bolus e de basal na face do relógio não foi bem sucedido - por favor, verifique o telefone n/a - Idade do Paciente Criança Adolescente Adulto Adulto resistente insulina - Por favor seleccione a idade do diabético para definir os limites de segurança Nome do Paciente Por favor, forneça nome do paciente ou apelido para diferenciar entre várias configurações Usuário diff --git a/app/src/main/res/values-pt-rPT/exam.xml b/app/src/main/res/values-pt-rPT/exam.xml index 4ce02a40a9..efdc4f1120 100644 --- a/app/src/main/res/values-pt-rPT/exam.xml +++ b/app/src/main/res/values-pt-rPT/exam.xml @@ -134,8 +134,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-u Tópico: Mudança De Perfil Ao especificar 90% na mudança de perfil… diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index ca6a31ce0e..1cdb34559e 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -261,7 +261,6 @@ O valor %1$s está fora dos limites permitidos Para ligar a bomba responda com o código %1$s Ligação à bomba falhou - Para desligar a bomba por %1d minutos responda com o código %2$s Bomba desligada Bomba ligada novamente O comando remoto não é permitido @@ -405,12 +404,10 @@ Dividir IOB entre IOB de bolus e de basal na face do relógio sem efeito - por favor verifique no telemóvel n/d - Idade do Paciente Criança Adolescente Adulto Adulto resistente insulina - Por favor seleccione a idade do diabético para definir os limites de segurança Nome do Paciente Por favor, forneça nome do paciente ou alcunha para diferenciar entre várias configurações Utilizador diff --git a/app/src/main/res/values-ro-rRO/exam.xml b/app/src/main/res/values-ro-rRO/exam.xml index be73b91f50..fd16aa99a9 100644 --- a/app/src/main/res/values-ro-rRO/exam.xml +++ b/app/src/main/res/values-ro-rRO/exam.xml @@ -134,8 +134,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-u Subiect: Schimbarea de profil Atunci când se specifică 90% la schimbarea de profil… diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index 33ac5eea56..9d8e80321a 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -261,7 +261,6 @@ Valoarea %1$s este mai mare decât limita stabilită Pentru a conecta pompa raspundeti cu codul %1$s Conectarea cu pompa a esuat - Pentru a deconecta pompa timp de %1d minute, raspundeti cu: %2$s Pompă deconectată Pompă reconectată Comanda de la distanță nu este permisă @@ -405,12 +404,10 @@ Separă IOB în bolus și IOB bazal pe ceas fără succes - verificați telefonul indisponibil - Vârsta pacientului Copil Adolescent Adult Adult rezistent la insulină - Vă rog să selectați vârsta pacientului în vederea stabilirii valorilor maxime admise de siguranță Numele pacientului Vă rugăm să furnizați numele sau porecla pacientului pentru a diferenția între configurări Utilizator diff --git a/app/src/main/res/values-ru-rRU/exam.xml b/app/src/main/res/values-ru-rRU/exam.xml index 732da76770..a131119924 100644 --- a/app/src/main/res/values-ru-rRU/exam.xml +++ b/app/src/main/res/values-ru-rRU/exam.xml @@ -136,7 +136,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/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 5788656162..82e509ac58 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -261,7 +261,7 @@ Значение %1$s недопустимо Чтобы подсоединить помпу ответьте кодом %1$s Ошибка подключения к помпе - Для разъединения с помпой на %1d мин ответьте кодом %2$s + Для разъединения с помпой на %1$d мин ответьте кодом %2$s Помпа отключена Связь с помпой возобновлена удаленная команда не разрешена @@ -405,12 +405,13 @@ разбивка IOB на болюсный и базальный IOB на циферблате смарт-часов неудача - проверьте телефон н/д - Возраст пациента + Тип пациента ребенок подросток взрослый Инсулинорезистентный взрослый - выберите возраст пациента для определения ограничителей безопасности + Беременность + Пожалуйста, выберите тип пациента для установки лимитов безопасности Имя пациента Укажите имя или псевдоним пациента, чтобы распознавать разные настройки Пользователь @@ -454,6 +455,8 @@ Критический порог предупреждения о времени, отработанном инсулином [h] Порог предупреждения о времени, отработанном сенсором [h] Критический порог предупреждения о времени, отработанном сенсором [h] + Порог предупреждения о разрядке батареи [%] + Порог предупреждения о критическом уровне разрядки батареи [%] Порог предупреждения о разрядке батареи [h] Порог предупреждения о критическом уровне разрядки батареи [h] Порог уровня наполненности резервуара для оповещения [ед.] @@ -484,6 +487,12 @@ Инсулин проработал Переключить профиль Батарея помпы работает + Сенсор + Канюля + Инсулин + Батарея помпы + Возраст: + Уровень: опции оповещения Создать уведомления из оповещений NS Создать уведомления из оповещений NS @@ -1158,6 +1167,9 @@ Context | Edit Context Сбросить ключ идентификации Вы действительно хотите сбросить ключ аутентификации? Все сконфигурированные в настоящее время ключи станут недопустимы, и придется их настроить заново. Создан новый ключ аутентификации! Для идентификации используйте обновленный QRCode. + Экспорт секретного кода OTP + Вы действительно хотите скопировать пароль OTP в буфер обмена?\n\nЭто может потребоваться только в том случае, если у вашего приложения идентификации проблемы при сканировании QR кода, вы хотите ввести его вручную или настроить аппаратный маркер OTP с помощью специального приложения. + Секретный одноразовый код OTP (в формате Base32) экспортирован и скопирован в буфер обмена. Вставьте его в систему идентификации или аппаратный маркер OTP! 1. Установить Аутентификатор 2. Код сканирования для настройки кодов OTP AndroidAPS 3. Одноразовый Пароль @@ -1177,6 +1189,7 @@ Context | Edit Context Копировать параметры из NS Копировать настройки NS (если есть)? Исходная тема оформления + Скин для низкого разрешения Кнопки всегда отображаются в нижней части экрана Большой дисплей Тема оформления diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 2064179e64..7809168e77 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -260,7 +260,6 @@ Hodnota %1$s je mimo prednastavený rozsah Ak chcete pripojiť pumpu, odpovedzte pomocou SMS s kódom %1$s Pripojenie k pumpe zlyhalo - Ak chcete odpojiť pumpu na %1d minút, odpovedzte pomocou SMS s kódom %2$s Pumpa odpojená Pumpa bola znovu pripojená Príkazy na diaľku nie sú povolené @@ -404,12 +403,10 @@ Rozpísať IOB na hodinkách do bolusového a bazálneho Neúspešné - skontrolujte telefón nie je k dispozícii - Vek pacienta Dieťa Dospievajúci Dospelý Dospelý s nízkou citlivosťou - Vyberte vek pacienta pre nastavenie bezpečnostných limitov Meno pacienta Zadajte meno pacienta, alebo prezývku pre rozlíšenie medzi viacerými nastaveniami Používateľ diff --git a/app/src/main/res/values-sv-rSE/exam.xml b/app/src/main/res/values-sv-rSE/exam.xml index 10e769312a..397f0987f1 100644 --- a/app/src/main/res/values-sv-rSE/exam.xml +++ b/app/src/main/res/values-sv-rSE/exam.xml @@ -134,8 +134,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/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index bbb31a8e13..6926f1eeb7 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -21,6 +21,7 @@ Visar förutbestämda inställningar för mat i Nightscout Insulininställning för vanliga direktverkande insuliner som Humalog, Lispro, Apidra och Novorapid/Novolog Insulininställning för ultrasnabba insuliner, t ex Fiasp + Insulininställning för Lyumjev Låter dig ställa in tidpunkten för toppen på insulinets aktivitet. Bör bara användas av avancerade användare Aktivera eller inaktivera implementationen som kör loopen. Synkroniserar dina data med Nightscout @@ -261,7 +262,7 @@ Eversense-appen. Värdet %1$s är utanför hård begränsning För att ansluta pumpen, svara med kod %1$s Anslutning 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$s Pump frånkopplad Pump återansluten Otillåtet fjärrkommando @@ -405,12 +406,13 @@ Eversense-appen. Visa IOB med bolus och basal på klocka misslyckat - kontrollera telefonen - - Personens ålder + Patienttyp Barn Tonåring Vuxen Insulinresistent 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änser Patientens namn Vänligen ange patientens namn eller smeknamn för att kunna skilja mellan flera uppsättningar av inställningar Ditt namn @@ -454,6 +456,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] @@ -484,6 +488,12 @@ Eversense-appen. Insulinålder Genomför profilbyte Pumpbatteri ålder + Sensor + Kanyl + Insulin + Pumpbatteri + ålder: + nivå: Larminställningar Skapa aviseringar från NS-larm Skapa aviseringar från NS-meddelanden @@ -536,6 +546,7 @@ Eversense-appen. Free-Peak Oref Rapid-Acting Oref Ultra-Rapid Oref + Lyumjev %1$f tim DIA är för kort. Använder %2$f istället! Aktivera profil OGILTIG @@ -798,6 +809,8 @@ Eversense-appen. Konfigurera BG-källa Vänligen välj källa för profil. Om patienten är ett barn bör du använda NS profil. Om ingen följer dig på Nightscout kommer du förmodligen föredra lokal profil. Kom ihåg att du endast väljer profilkälla här. För att använda den måste du aktivera den genom att köra ”Byt Profil” Välj en av dessa algoritmer. De sorteras från den äldsta till nyaste. Nyare algoritm är oftast mer kraftfull och mer aggressiv. Om du är ny som loopanvändare vill du förmodligen börja med AMA och inte med senaste. Glöm inte att läsa dokumentationen om OpenAPS och konfigurera algoritmen innan användning. + Väntar på Riley Link-anslutning...\n + Du kan fortsätta installationen först när pumpen har initierats.\n Påbörja ditt första mål Behörighet Be om behörighet @@ -987,6 +1000,7 @@ Eversense-appen. intern lagringsbegränsning Frigö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 konfigurerad Skapade ett profilbyte @@ -1152,6 +1166,9 @@ Eversense-appen. Å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 autentiseringsapp 2. Scanna koden för att ställa in engångslösenord för AndroidAPS 3. Testa engångslösenord @@ -1171,6 +1188,7 @@ Eversense-appen. Kopiera inställningar från NS Kopiera NS-inställningar (om det finns)? Ursprungligt tema + Lågupplöst tema Knappar visas alltid längst ned på skärmen Stor skärm Tema @@ -1215,4 +1233,5 @@ Eversense-appen. Jobbstatus: %s Uppladdad data Fö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..fd6a4ef74b 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -293,12 +293,10 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d Ayrıntılı IOB göster Watchface üzerinde IOB\'yi bolus ve bazal IOB\'ye ayırın başarısız - lütfen telefonu kontrol edin - Hasta yaşı Çocuk Ergen Yetişkin Yetişkin İnsülin direnci - Güvenlik sınırlarını ayarlamak için lütfen hasta yaşını seçiniz Glimp Döngü durduldu Askıya alındı (%1$d m) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index ec2b5760b4..f3a71d5df5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -308,12 +308,10 @@ 显示详细 IOB 在手表的表盘上分别显示大剂量IOB和基础IOB 未成功-请检查手机 - 病人年龄 儿童 青少年 成人 胰岛素抵抗成人 - 请选择患者年龄以设置安全限制 Glimp %1$s 需要加入电池优化白名单才能正常运行 闭环暂停了 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 9d3c758f57..b8fb302f4d 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -77,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/exam.xml b/app/src/main/res/values/exam.xml index 49dc294fa1..f3a6625011 100644 --- a/app/src/main/res/values/exam.xml +++ b/app/src/main/res/values/exam.xml @@ -134,8 +134,8 @@ 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 unit as 10g or 12g. - IC meaning is: How many bread units are covered by 1U of insulin. + 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-u Topic: Profile Switching When specifying 90% in profile switch… diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9b6011b98e..e40850f3ec 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -306,7 +306,7 @@ Value %1$s is out of hard limits To connect pump reply with code %1$s Connection 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$s Pump disconnected Pump reconnected Remote command is not allowed @@ -464,17 +464,19 @@ n/a smscommunicator_allowednumbers smscommunicator_remotecommandsallowed - Patient age + Patient type Child Teenage Adult Insulin resistant adult + Pregnancy age child teenage adult resistantadult - Please select patient age to setup safety limits + pregnant + Please select patient type to setup safety limits Patient name Please provide patient name or nickname to differentiate among multiple setups User @@ -528,6 +530,10 @@ Threshold warning sensor age [h] statuslights_sage_critical Threshold critical sensor age [h] + statuslights_sbat_warning + Threshold warning sensor battery level [%] + statuslights_sbat_critical + Threshold critical sensor battery level [%] statuslights_bage_warning Threshold warning battery age [h] statuslights_bage_critical @@ -566,6 +572,12 @@ Insulin age Do Profile Switch Pump battery age + Sensor + Canula + Insulin + Pump battery + age: + level: Alarm options ns_announcements ns_alarms @@ -1405,6 +1417,7 @@ Copy NS settings (if exists)? statuslights_overview_advanced Original skin + Low Resolution skin Buttons are always displayed on bottom of screen Large display skin @@ -1453,4 +1466,6 @@ Uploaded Data The 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 + diff --git a/app/src/main/res/xml/pref_overview.xml b/app/src/main/res/xml/pref_overview.xml index 77e21cab7b..75f81c96c4 100644 --- a/app/src/main/res/xml/pref_overview.xml +++ b/app/src/main/res/xml/pref_overview.xml @@ -360,6 +360,32 @@ validate:minNumber="24" validate:testType="numericRange" /> + + + + : " + 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/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/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/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/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/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/res/values-bg-rBG/strings.xml b/core/src/main/res/values-bg-rBG/strings.xml index dda69073db..37464462bd 100644 --- a/core/src/main/res/values-bg-rBG/strings.xml +++ b/core/src/main/res/values-bg-rBG/strings.xml @@ -170,7 +170,6 @@ Изчаква резултат от помпата SMB - %dгр допълнителни въглехидрати ще са необходими до %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ýsledek SMB - 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 minut Statistiky Kumulativní 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 warten SMB - %d g zusätzliche Kohlenhydrate innerhalb von %d Minuten erforderlich + %1$d g zusätzliche Kohlenhydrate innerhalb von %2$d Minuten erforderlich Statistik Kumulative 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..f22c6ac7d3 100644 --- a/core/src/main/res/values-es-rES/strings.xml +++ b/core/src/main/res/values-es-rES/strings.xml @@ -170,7 +170,6 @@ Esperando resultado SMB - %dg Carbohidratos adicionales necesarios dentro De %d minutos Estadísticas TDD 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ésultat SMB - %d g de glucides supplémentaires requis d\'ici %d minutes + %1$dg de glucides requis dans %2$d min. Stats DTI 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 risultato SMB - %d g di CHO aggiuntivi richiesti entro %d minuti + %1$d g di CHO aggiuntivi richiesti entro %2$d minuti Statistiche TDD 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 rezultato SMB - Būtina suvartoti %d g papildomų AV per %d min Statistika BPD viso diff --git a/core/src/main/res/values-nl-rNL/strings.xml b/core/src/main/res/values-nl-rNL/strings.xml index 1aec4f4c0e..54f299ecf4 100644 --- a/core/src/main/res/values-nl-rNL/strings.xml +++ b/core/src/main/res/values-nl-rNL/strings.xml @@ -170,7 +170,6 @@ Wachtend op resultaat SMB - %d g extra koolhydraten nodig binnen %d minuten Statistieken Cumulatieve TDD diff --git a/core/src/main/res/values-no-rNO/strings.xml b/core/src/main/res/values-no-rNO/strings.xml index 58134736fd..c9e12c5a0f 100644 --- a/core/src/main/res/values-no-rNO/strings.xml +++ b/core/src/main/res/values-no-rNO/strings.xml @@ -170,7 +170,7 @@ Venter på resultat SMB - %d g ekstra karbo kreves innen %d minutter + %1$d g ekstra karbohydrater kreves innen %2$d minutter Statistikk Akkumulert TDD diff --git a/core/src/main/res/values-pl-rPL/strings.xml b/core/src/main/res/values-pl-rPL/strings.xml index e1332c1f87..9b738dc373 100644 --- a/core/src/main/res/values-pl-rPL/strings.xml +++ b/core/src/main/res/values-pl-rPL/strings.xml @@ -170,7 +170,7 @@ Oczekiwanie na wynik SMB - Zalecane podanie %d g węglowodanów w przeciągu %d minut + Zalecane podanie %1$d g węglowodanów w przeciągu %2$d minut Statystyki Kumulatywna TDD (dawka dzienna) 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 resultado SMB - %d g Hidratos Adicionais Necessários Dentro de %d Minutos Estatísticas Dose 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ă rezultatul SMB - %d g carbohidrați suplimentari necesari în %d minute Statistici TDD 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..453614d602 100644 --- a/core/src/main/res/values-sk-rSK/strings.xml +++ b/core/src/main/res/values-sk-rSK/strings.xml @@ -170,7 +170,6 @@ Čakanie na výsledok SMB - %d g dodatočných sacharidov požadovaných v priebehu %d minút Štatistiky Kumulatí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å resultat SMB - %dg KH behövs inom %d minuter + %1$dg KH behövs inom %2$d minuter Statistik Kumulativ TDD diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index cf0ba8bd9d..87e58a0b45 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -213,7 +213,7 @@ SMB - %d g Additional Carbs Required Within %d Minutes + %1$d g Additional Carbs Required Within %2$d Minutes Stats diff --git a/dana/src/main/res/values-iw-rIL/strings.xml b/dana/src/main/res/values-iw-rIL/strings.xml index 3ea04e700d..dce7b1073c 100644 --- a/dana/src/main/res/values-iw-rIL/strings.xml +++ b/dana/src/main/res/values-iw-rIL/strings.xml @@ -1,2 +1,121 @@ - + + מזווג + לא נמצאו מכשירים עד כה + הזיווג הצליח + הזיווג חרג ממגבלת הזמן + מחכה לזיווג עם משאבה + DanaRS + Dana + חיבור משאבת DANA Diabecare RS + בולוס גבוה מדי + שגיאת פקודה + שגיאת מהירות + כמות אינסולין גבוהה מדי + התבקש: %1$.2f יח\' הוזרק: %2$.2f יח\' קוד שגיאה: %3$s + ערך לא מוגדר כראוי + הגדר מינון באזלי ל-0.01 יח\'\שעה + לאפס את נתוני הזיווג? + %1$s\nדגם: %2$02X\nפרוטוקול: %3$02X\nקוד: %4$02X + מעבד אירוע + אפשר בזאלי ממושך במשאבה + הוזרק + נעצר + קושחת משאבה לא נתמכת + תקלת משאבה + סוללה חלשה + מספק כמות פחותה מהמינון הבזאלי שהוגדר מראש + משאבה כבויה + סוללת משאבה לא טעונה + חסימה + מכל ריק + נא לבדוק את הבוכנה + באזלי מקסימלי + מקסימום יומי + התראת מדידת סוכר בדם + רמת אינסולין נותרת + החמיץ בולוס + נתוני הזיווג אינם חוקיים. מבצע זיווג מחדש + מקבל סטטוס המשאבה + מקבל סטטוס בולוס ממושך + מקבל סטטוס בולוס + מקבל סטטוס בזאלי זמני + מקבל הגדרות משאבה + מקבל תאריך ושעת המשאבה + הפרש זמן גדול + הפרש זמן גדול:\nשעון המשאבה לא מכוון במעל ל-1.5 שעות.\n נא להתאים את השעון במשאבה באופן ידני ולוודא כי קריאת ההיסטוריה מהמשאבה אינה גורמת להתנהגות בלתי צפויה.\nבמידת האפשר, מחקו את ההיסטוריה מהמשאבה לפני שתשנו את השעה או השביתו את הלולאה הסגורה למשך פעילות אינסולין (DIA) לאחר רשומת ההיסטוריה השגויה האחרונה אך לפחות DIA אחד מעכשיו. + נא לזווג את המשאבה עם הטלפון שלכם! + מתקרב למגבלת האינסולין היומית + מתחיל מתן בולוס + המתינו לסיום מתן הבולוס. נותרו %1$d שניות. + הפסקת בזאלי זמני + מגדיר בולוס ממושך + מפסיק בולוס ממושך + מעדכן את הקצב הבזאלי + הגדרת בזאלי זמני + ממתין לסינכרון השעון (%1$d שנ\') + סיסמת משאבה שגויה! + התראות + שעות בזאלי + בולוסים + פחמימות + אינסולין יומי + שגיאות + גלוקוז + מילוי מחדש + השהיה + מילוי + אפשרויות משתמש + מבנה הצגת השעה + לחצן גלילה + צפצוף בלחיצה על כפתורים + התראה + צלילים + רטט + שניהם + זמן הפעלת מסך [seconds] + זמן תאורת מסך [seconds] + יחידות גלוקוז + כיבוי [hours] + מכל נמוך [Units] + שמירת הגדרות במשאבה + חיבור משאבת DANA Diabecare R + חיבור משאבת DANA Diabecare R מהשוק הקוריאני + חיבור משאבת DANA Diabecare R עם קושחה משודרגת + DANA + לא נמצא מתאם בלוטות\' + ההתקן שנבחר לא נמצא + שנה מצב מיח\' ליום ליח\' לשעה במשאבה + DanaR קוריאנית + DanaR + דרייבר המשאבה תוקן + DanaRv2 + ביטול מצב EasyUI במשאבה + הגדרת פרופיל הבזאלי נכשל + מצב בלוטות\' + אינסולין פעיל מהמשאבה + צעד במינון בזאלי + צעד במינון בולוס + קושחה + הגדרות משאבת Dana + 12 שע\' + 24 שע\' + מופעל + כבוי + מכשיר בלוטות\' DanaR + סיסמת משאבה (v1 בלבד) + סיסמת משאבה + השתמש בבולוס ממושך של >200%% + הצגת בולוס ממושך כ-%% + מהירות בולוס + בחרו משאבה + רשום החלפת מכל + הוסף אירוע \"החלפת אינסולין\" לפורטל הטיפולים כשימצא בהיסטוריה + רשום החלפת צינורית + הוסף אירוע \"החלפת צינורית\" לפורטל הטיפולים כשימצא בהיסטוריה + PIN1 + PIN2 + לחצו OK במשאבה\nוהכניסו את שני המספרים המוצגים\nהשאירו את מסך המשאבה מופעל ע\"י לחיצה על לחצן מינוס עד סיום הכנסת הקוד. + 1: (12 ספרות) + 2: (8 ספרות) + diff --git a/dana/src/main/res/values-sv-rSE/strings.xml b/dana/src/main/res/values-sv-rSE/strings.xml index e360cafe02..f48d7bff78 100644 --- a/dana/src/main/res/values-sv-rSE/strings.xml +++ b/dana/src/main/res/values-sv-rSE/strings.xml @@ -115,8 +115,7 @@ Logga kanylbyte automatiskt när det upptäcks i historiken PIN1 PIN2 - Tryck på OK på pumpen och skriv in de två\nnycklarna som visas på pumpens skärm.\n -\nFör att förhindra att skärmen släcks, tryck\npå minus (-) tills du skrivit in nycklarna. + Tryck på OK på pumpen och skriv in nycklarna som visas på skärmen. För att förhindra att pumpskärmen släcks, tryck på minus (-) ibland. 1: (12 tecken) 2: (8 tecken) 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/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt b/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt index 2979ab605a..cc20b91d22 100644 --- a/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt +++ b/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt @@ -210,7 +210,7 @@ class DanaRSPlugin @Inject constructor( } override fun isSuspended(): Boolean { - return danaPump.pumpSuspended + return danaPump.pumpSuspended || danaPump.errorState != DanaPump.ErrorState.NONE } override fun isBusy(): Boolean { 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..85f68f5290 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,9 +15,9 @@ 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.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.* @@ -63,13 +63,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 +94,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 @@ -111,6 +116,7 @@ class BLEScanActivity : NoSplashAppCompatActivity() { } private inner class ViewHolder internal constructor(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/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_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_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/services/DanaRSService.kt b/danars/src/main/java/info/nightscout/androidaps/danars/services/DanaRSService.kt index 23873e34e9..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 @@ -234,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 { @@ -332,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 { @@ -347,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 { @@ -365,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 { @@ -411,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 { @@ -421,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)) @@ -441,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/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/omnipod/build.gradle b/omnipod/build.gradle index 50f97665c2..46f11bf653 100644 --- a/omnipod/build.gradle +++ b/omnipod/build.gradle @@ -18,13 +18,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 { 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 ec8626d19f..c7b92f7181 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,11 +4,11 @@ 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; @@ -33,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; @@ -52,6 +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.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; @@ -74,13 +76,18 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.acti 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; @@ -88,6 +95,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.service.RileyLi 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; @@ -135,6 +143,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, private final List customActions = Collections.singletonList(new CustomAction( R.string.omnipod_custom_action_reset_rileylink, OmnipodCustomActionType.RESET_RILEY_LINK_CONFIGURATION, true)); private final CompositeDisposable disposables = new CompositeDisposable(); + private final NSUpload nsUpload; // variables for handling statuses and history private boolean firstRun = true; @@ -148,6 +157,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, private final Handler loopHandler = new Handler(Looper.getMainLooper()); private final Runnable statusChecker; + private boolean isSetTempBasalRunning; private boolean isCancelTempBasalRunning; @Inject @@ -169,7 +179,8 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, AapsOmnipodUtil aapsOmnipodUtil, RileyLinkUtil rileyLinkUtil, OmnipodAlertUtil omnipodAlertUtil, - ProfileFunction profileFunction + ProfileFunction profileFunction, + NSUpload nsUpload ) { super(new PluginDescription() // .mainType(PluginType.PUMP) // @@ -195,6 +206,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, this.rileyLinkUtil = rileyLinkUtil; this.omnipodAlertUtil = omnipodAlertUtil; this.profileFunction = profileFunction; + this.nsUpload = nsUpload; pumpDescription = new PumpDescription(pumpType); @@ -241,6 +253,11 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, getCommandQueue().customCommand(new CommandUpdateAlertConfiguration(), null); } + if (aapsOmnipodManager.isAutomaticallyAcknowledgeAlertsEnabled() && podStateManager.isPodActivationCompleted() && !podStateManager.isPodDead() && + podStateManager.getActiveAlerts().size() > 0 && !getCommandQueue().isCustomCommandInQueue(CommandAcknowledgeAlerts.class)) { + queueAcknowledgeAlertsCommand(); + } + doPodCheck(); loopHandler.postDelayed(this, STATUS_CHECK_INTERVAL_MILLIS); @@ -258,13 +275,6 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, // When PodStateManager is created, which causes an IllegalArgumentException for DateTimeZones not being recognized podStateManager.loadPodState(); - // BS @ 2020-10-17 FIXME: for backwards compatibility; remove before release - if (podStateManager.isPodInitialized() && - podStateManager.getActivationProgress() == ActivationProgress.NONE && - podStateManager.getPodProgressStatus().isAtLeast(PodProgressStatus.ABOVE_FIFTY_UNITS)) { - podStateManager.setActivationProgress(ActivationProgress.COMPLETED); - } - lastConnectionTimeMillis = sp.getLong( RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, 0L); @@ -279,7 +289,22 @@ 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) @@ -291,10 +316,12 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, 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_rileylink_stats_button_enabled) || event.isChanged(getResourceHelper(), R.string.key_omnipod_time_change_event_enabled) || event.isChanged(getResourceHelper(), R.string.key_omnipod_notification_uncertain_tbr_sound_enabled) || event.isChanged(getResourceHelper(), R.string.key_omnipod_notification_uncertain_smb_sound_enabled) || - event.isChanged(getResourceHelper(), R.string.key_omnipod_notification_uncertain_bolus_sound_enabled)) { + event.isChanged(getResourceHelper(), R.string.key_omnipod_notification_uncertain_bolus_sound_enabled) || + event.isChanged(getResourceHelper(), R.string.key_omnipod_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) || @@ -333,20 +360,73 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, return rileyLinkServiceData.rileyLinkServiceState.isReady(); } - 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 (!isCancelTempBasalRunning) { - if (activePlugin.getActiveTreatments().isTempBasalInProgress() && !aapsOmnipodManager.hasSuspendedFakeTbr()) { - aapsOmnipodManager.reportCancelledTbr(); + 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() { + // Ignore changes in certainty during tbr commands; these are normal + if (isSetTempBasalRunning || isCancelTempBasalRunning) { + return; + } + + 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(); @@ -359,6 +439,16 @@ 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()) { @@ -366,7 +456,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, rxBus.send(new EventNewNotification(notification)); } else { if (podStateManager.isSuspended()) { - Notification notification = new Notification(Notification.OMNIPOD_POD_SUSPENDED, resourceHelper.gs(R.string.omnipod_confirmation_pod_suspended), Notification.NORMAL); + Notification notification = new Notification(Notification.OMNIPOD_POD_SUSPENDED, resourceHelper.gs(R.string.omnipod_error_pod_suspended), Notification.NORMAL); rxBus.send(new EventNewNotification(notification)); } } @@ -455,18 +545,26 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, } /** - * The only actual status requests we send to the Pod here are on startup (in {@link #initializeAfterRileyLinkConnection() initializeAfterRileyLinkConnection()}) - * And when the user explicitly requested it by clicking the Refresh button on the Omnipod tab (which is executed through {@link #executeCustomCommand(CustomCommand)}) * 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(); 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(); } } + private PumpEnactResult getPodStatus() { + return executeCommand(OmnipodCommandType.GET_POD_STATUS, aapsOmnipodManager::getPodStatus); + } + @NonNull @Override public PumpEnactResult setNewBasalProfile(Profile profile) { @@ -484,7 +582,7 @@ 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 @@ -545,6 +643,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, // 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); @@ -568,7 +667,13 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, } } - PumpEnactResult result = executeCommand(OmnipodCommandType.SET_TEMPORARY_BASAL, () -> aapsOmnipodManager.setTemporaryBasal(new TempBasalPair(absoluteRate, false, durationInMinutes))); + isSetTempBasalRunning = true; + PumpEnactResult result; + try { + result = executeCommand(OmnipodCommandType.SET_TEMPORARY_BASAL, () -> aapsOmnipodManager.setTemporaryBasal(new TempBasalPair(absoluteRate, false, durationInMinutes))); + } finally { + isSetTempBasalRunning = false; + } aapsLogger.info(LTag.PUMP, "setTempBasalAbsolute - setTBR. Response: " + result.success); @@ -580,6 +685,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, } @Override + @NonNull public PumpEnactResult cancelTempBasal(boolean enforceNew) { TemporaryBasal tbrCurrent = readTBR(); @@ -648,7 +754,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, return pump; } - @Override public ManufacturerType manufacturer() { + @Override @NonNull public ManufacturerType manufacturer() { return pumpType.getManufacturer(); } @@ -706,14 +812,10 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, public void executeCustomAction(CustomActionType customActionType) { OmnipodCustomActionType mcat = (OmnipodCustomActionType) customActionType; - switch (mcat) { - case RESET_RILEY_LINK_CONFIGURATION: - serviceTaskExecutor.startTask(new ResetRileyLinkConfigurationTask(getInjector())); - break; - - default: - aapsLogger.warn(LTag.PUMP, "Unknown custom action: " + mcat); - break; + if (mcat == OmnipodCustomActionType.RESET_RILEY_LINK_CONFIGURATION) { + serviceTaskExecutor.startTask(new ResetRileyLinkConfigurationTask(getInjector())); + } else { + aapsLogger.warn(LTag.PUMP, "Unknown custom action: " + mcat); } } @@ -732,7 +834,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, case ACKNOWLEDGE_ALERTS: return executeCommand(OmnipodCommandType.ACKNOWLEDGE_ALERTS, aapsOmnipodManager::acknowledgeAlerts); case GET_POD_STATUS: - return executeCommand(OmnipodCommandType.GET_POD_STATUS, aapsOmnipodManager::getPodStatus); + return getPodStatus(); case READ_PULSE_LOG: return retrievePulseLog(); case SUSPEND_DELIVERY: @@ -745,6 +847,8 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, 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)); @@ -808,7 +912,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, } 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 = executeCommand(OmnipodCommandType.GET_POD_STATUS, aapsOmnipodManager::getPodStatus); + result = getPodStatus(); } if (result.success) { @@ -857,7 +961,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, @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) { @@ -939,23 +1043,24 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, private void initializeAfterRileyLinkConnection() { if (podStateManager.getActivationProgress().isAtLeast(ActivationProgress.PAIRING_COMPLETED)) { + boolean success = false; for (int i = 0; STARTUP_STATUS_REQUEST_TRIES > i; i++) { - PumpEnactResult result = executeCommand(OmnipodCommandType.GET_POD_STATUS, aapsOmnipodManager::getPodStatus); + PumpEnactResult result = getPodStatus(); if (result.success) { + success = true; aapsLogger.debug(LTag.PUMP, "Successfully retrieved Pod status on startup"); break; - } else { - aapsLogger.warn(LTag.PUMP, "Failed to retrieve Pod status on startup"); } } + 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"); } - Bundle params = new Bundle(); - params.putString("version", BuildConfig.VERSION); - - fabricPrivacy.logCustom("OmnipodPumpInit", params); + fabricPrivacy.logCustom("OmnipodPumpInit"); } @NonNull private PumpEnactResult deliverBolus(final DetailedBolusInfo detailedBolusInfo) { 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 index 4421900b15..338534da78 100644 --- 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 @@ -25,6 +25,7 @@ import javax.inject.Provider abstract class OmnipodWizardModule { companion object { + @Provides @OmnipodPluginQualifier fun providesViewModelFactory(@OmnipodPluginQualifier viewModels: MutableMap, @JvmSuppressWildcards Provider>): ViewModelProvider.Factory { 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 8d9b250ac4..7cbc3c8a11 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 @@ -21,7 +21,8 @@ public enum OmnipodCommandType { ACKNOWLEDGE_ALERTS(R.string.omnipod_cmd_acknowledge_alerts), // 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); + RESUME_DELIVERY(R.string.omnipod_cmd_resume_delivery), + PLAY_TEST_BEEP(R.string.omnipod_cmd_play_test_beep); private int resourceId; 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 a780f11b5c..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 @@ -20,6 +20,8 @@ public class OmnipodStorageKeys { 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 { 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 89560786e0..47b2fd7693 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 @@ -35,6 +35,7 @@ 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), 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/InsertCannulaAction.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/action/InsertCannulaAction.java index ff47b1b900..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 @@ -58,7 +58,7 @@ public class InsertCannulaAction implements OmnipodAction { if (podStateManager.getActivationProgress().needsCannulaInsertion()) { communicationService.executeAction(new BolusAction(podStateManager, OmnipodConstants.POD_CANNULA_INSERTION_BOLUS_UNITS, - Duration.standardSeconds(1), false, false)); + Duration.standardSeconds(1), false, true)); podStateManager.setActivationProgress(ActivationProgress.INSERTING_CANNULA); } 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/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/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/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/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/manager/OmnipodManager.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/OmnipodManager.java index e4601e2a68..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; @@ -33,6 +34,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess 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; @@ -41,7 +43,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodInfo 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.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.IllegalPodProgressException; @@ -49,8 +50,8 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.NonceOut 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; @@ -62,17 +63,16 @@ public class OmnipodManager { 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) { @@ -173,40 +173,68 @@ public class OmnipodManager { public synchronized void setBasalSchedule(BasalSchedule schedule, boolean acknowledgementBeep) { assertReadyForDelivery(); - boolean wasSuspended = podStateManager.isSuspended(); - if (!wasSuspended) { - suspendDelivery(acknowledgementBeep); - } - - try { - executeAndVerify(() -> communicationService.executeAction(new SetBasalScheduleAction(podStateManager, schedule, - false, podStateManager.getScheduleOffset(), acknowledgementBeep))); - podStateManager.setBasalSchedule(schedule); - } 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)) { - podStateManager.setBasalSchedule(schedule); - } else { - if (!wasSuspended) { - throw new CommandFailedAfterChangingDeliveryStatusException("Suspending delivery succeeded but setting the new basal schedule did not", ex); - } + if (!podStateManager.isBasalCertain()) { + try { + getPodStatus(); + } catch (OmnipodException ex) { ex.setCertainFailure(true); throw ex; } } + + boolean wasSuspended = podStateManager.isSuspended(); + if (!wasSuspended) { + try { + suspendDelivery(acknowledgementBeep); + } catch (OmnipodException ex) { + if (ex.isCertainFailure()) { + throw ex; + } + + // Uncertain failure + throw new PrecedingCommandFailedUncertainlyException(ex); + } + } + + 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; + } } // CAUTION: cancels temp basal and then sets new temp basal. An OmnipodException[certainFailure=false] indicates that the pod might have cancelled the previous temp basal, but did not set a new temp basal public synchronized void setTemporaryBasal(double rate, Duration duration, boolean acknowledgementBeep, boolean completionBeep) { assertReadyForDelivery(); + 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(); if (cancelCurrentTbr) { @@ -217,85 +245,65 @@ public class OmnipodManager { throw ex; } - try { - if (!verifyDeliveryStatus(DeliveryStatus.NORMAL, ex)) { - ex.setCertainFailure(true); - throw ex; - } - } catch (DeliveryStatusVerificationFailedException ex2) { - podStateManager.setTempBasalCertain(false); - throw ex2; - } + // Uncertain failure + throw new PrecedingCommandFailedUncertainlyException(ex); } } 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))); - podStateManager.setTempBasal(DateTime.now().minus(OmnipodConstants.AVERAGE_TEMP_BASAL_COMMAND_COMMUNICATION_DURATION), rate, duration, true); } 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; } - // 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 ex; } } public synchronized void cancelTemporaryBasal(boolean acknowledgementBeep) { - try { - cancelDelivery(EnumSet.of(DeliveryType.TEMP_BASAL), acknowledgementBeep); - } catch (OmnipodException ex) { - if (ex.isCertainFailure()) { - throw ex; - } - - try { - if (!verifyDeliveryStatus(DeliveryStatus.NORMAL, ex)) { - ex.setCertainFailure(true); - throw ex; - } - } catch (DeliveryStatusVerificationFailedException ex2) { - podStateManager.setTempBasalCertain(false); - throw ex2; - } - } + cancelDelivery(EnumSet.of(DeliveryType.TEMP_BASAL), acknowledgementBeep); } private synchronized StatusResponse cancelDelivery(EnumSet deliveryTypes, boolean acknowledgementBeep) { assertReadyForDelivery(); - return executeAndVerify(() -> { - 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; - }); + if (deliveryTypes.contains(DeliveryType.BASAL)) { + podStateManager.setBasalCertain(false); + } + if (deliveryTypes.contains(DeliveryType.TEMP_BASAL)) { + podStateManager.setTempBasalCertain(false); + } + + try { + return executeAndVerify(() -> { + 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; + }); + } 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; + } } // Returns a SingleSubject that returns when the bolus has finished. @@ -304,6 +312,19 @@ public class OmnipodManager { public synchronized BolusCommandResult bolus(Double units, boolean acknowledgementBeep, boolean completionBeep, BiConsumer progressIndicationConsumer) { assertReadyForDelivery(); + 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(); CommandDeliveryStatus commandDeliveryStatus = CommandDeliveryStatus.SUCCESS; @@ -423,20 +444,7 @@ public class OmnipodManager { public synchronized void suspendDelivery(boolean acknowledgementBeep) { assertReadyForDelivery(); - - 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; - } - } + cancelDelivery(EnumSet.allOf(DeliveryType.class), acknowledgementBeep); } // CAUTION: cancels all delivery @@ -484,6 +492,25 @@ public class OmnipodManager { 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; } @@ -573,28 +600,6 @@ public class OmnipodManager { throw new PodProgressStatusVerificationFailedException(expectedPodProgressStatus, ex); } - /** - * @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()); - } - } - aapsLogger.warn(LTag.PUMPCOMM, "Failed to verify delivery status"); - throw new DeliveryStatusVerificationFailedException(expectedStatus, verificationCause); - } - private Duration calculateEstimatedBolusDuration(DateTime startTime, double units, double deliveryRateInUnitsPerSecond) { if (!podStateManager.isPodActivationCompleted()) { // No basal or temp basal is active yet 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 34726daffb..2163e9ffb1 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 @@ -116,7 +116,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) { @@ -238,15 +238,6 @@ 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 isFaulted() { - return podState != null && podState.getFaultEventCode() != null; - } - public final FaultEventCode getFaultEventCode() { return getSafe(() -> podState.getFaultEventCode()); } @@ -377,6 +368,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()); } @@ -425,14 +425,19 @@ public abstract class PodStateManager { } public final void setTempBasalCertain(boolean certain) { - setSafe(() -> podState.setTempBasalCertain(certain)); + setAndStore(() -> { + if (!Objects.equals(podState.isTempBasalCertain(), certain)) { + podState.setTempBasalCertain(certain); + onTbrChanged(); + } + }); } - public final void setTempBasal(DateTime startTime, Double amount, Duration duration, boolean certain) { - setTempBasal(startTime, amount, duration, certain, true); + public final void setTempBasal(DateTime startTime, Double amount, Duration duration) { + setTempBasal(startTime, amount, duration, true); } - public final void setTempBasal(DateTime startTime, Double amount, Duration duration, Boolean certain, boolean store) { + private void setTempBasal(DateTime startTime, Double amount, Duration duration, boolean store) { DateTime currentStartTime = getTempBasalStartTime(); Double currentAmount = getTempBasalAmount(); Duration currentDuration = getTempBasalDuration(); @@ -441,7 +446,6 @@ public abstract class PodStateManager { podState.setTempBasalStartTime(startTime); podState.setTempBasalAmount(amount); podState.setTempBasalDuration(duration); - podState.setTempBasalCertain(certain); }; if (store) { @@ -453,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 @@ -466,13 +478,22 @@ public abstract class PodStateManager { * @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(DateTime.now()); + return isTempBasalRunningAt(null); } /** - * @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) + * @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 tempBasalStartTime = getTempBasalStartTime(); DateTime tempBasalEndTime = tempBasalStartTime.plus(getTempBasalDuration()); @@ -537,28 +558,47 @@ public abstract class PodStateManager { podState.setActivatedAt(activatedAtCalculated); } podState.setSuspended(status.getDeliveryStatus() == DeliveryStatus.SUSPENDED); - podState.setActiveAlerts(status.getUnacknowledgedAlerts()); + 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()); - if (status.getDeliveryStatus().isTbrRunning()) { - if (!isTempBasalCertain() && isTempBasalRunning()) { - podState.setTempBasalCertain(true); + + boolean isBasalCertain = podState.isBasalCertain() == null || podState.isBasalCertain(); + boolean isTempBasalCertain = podState.isTempBasalCertain() == null || podState.isTempBasalCertain(); + if (!status.getDeliveryStatus().isTbrRunning()) { + 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); } - } else { - // Triggers {@link #onTbrChanged() onTbrChanged()} when appropriate - setTempBasal(null, null, null, true, false); } - podState.setLastUpdatedFromResponse(DateTime.now()); + if (!isTempBasalCertain) { + podState.setTempBasalCertain(true); + onUncertainTbrRecovered(); + } + if (!isBasalCertain) { + podState.setBasalCertain(true); + } if (status instanceof PodInfoDetailedStatus) { PodInfoDetailedStatus detailedStatus = (PodInfoDetailedStatus) status; if (detailedStatus.isFaulted()) { - podState.setFaultEventCode(detailedStatus.getFaultEventCode()); + if (!Objects.equals(podState.getFaultEventCode(), detailedStatus.getFaultEventCode())) { + podState.setFaultEventCode(detailedStatus.getFaultEventCode()); + onFaultEventChanged(); + } } } + + podState.setLastUpdatedFromResponse(DateTime.now()); }); } @@ -567,6 +607,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(); @@ -660,6 +715,7 @@ public abstract class PodStateManager { private DeliveryStatus lastDeliveryStatus; private AlertSet activeAlerts; private BasalSchedule basalSchedule; + private Boolean basalCertain; private DateTime lastBolusStartTime; private Double lastBolusAmount; private Duration lastBolusDuration; @@ -864,6 +920,14 @@ public abstract class PodStateManager { this.basalSchedule = basalSchedule; } + Boolean isBasalCertain() { + return basalCertain; + } + + void setBasalCertain(Boolean certain) { + this.basalCertain = certain; + } + DateTime getLastBolusStartTime() { return lastBolusStartTime; } 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 bf51916268..b0ff0ef435 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,5 +1,8 @@ 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; @@ -14,6 +17,7 @@ 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; @@ -46,7 +50,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.mess 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; @@ -55,7 +59,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedul 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.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; @@ -70,7 +73,9 @@ 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; @@ -102,6 +107,7 @@ public class AapsOmnipodManager { private final OmnipodAlertUtil omnipodAlertUtil; private final NSUpload nsUpload; private final ProfileFunction profileFunction; + private final Context context; private boolean basalBeepsEnabled; private boolean bolusBeepsEnabled; @@ -113,6 +119,9 @@ public class AapsOmnipodManager { private boolean notificationUncertainTbrSoundEnabled; private boolean notificationUncertainSmbSoundEnabled; private boolean notificationUncertainBolusSoundEnabled; + private boolean automaticallyAcknowledgeAlertsEnabled; + private boolean testBeepButtonEnabled; + private boolean rileylinkStatsButtonEnabled; @Inject public AapsOmnipodManager(OmnipodRileyLinkCommunicationManager communicationService, @@ -127,8 +136,9 @@ public class AapsOmnipodManager { DatabaseHelperInterface databaseHelper, OmnipodAlertUtil omnipodAlertUtil, NSUpload nsUpload, - ProfileFunction profileFunction - ) { + ProfileFunction profileFunction, + Context context) { + this.podStateManager = podStateManager; this.aapsOmnipodUtil = aapsOmnipodUtil; this.aapsLogger = aapsLogger; @@ -141,8 +151,9 @@ public class AapsOmnipodManager { 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(); } @@ -151,13 +162,15 @@ 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, true); 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 initializePod() { @@ -230,6 +243,20 @@ public class AapsOmnipodManager { 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; @@ -280,24 +307,22 @@ public class AapsOmnipodManager { String errorMessage = translateException(ex.getCause()); addFailureToHistory(historyEntryType, errorMessage); return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); - } catch (DeliveryStatusVerificationFailedException ex) { + } catch (PrecedingCommandFailedUncertainlyException ex) { if (showNotifications) { - String note; - if (ex.getExpectedStatus() == DeliveryStatus.SUSPENDED) { - // Happened when suspending delivery before setting the new profile - note = getStringResource(R.string.omnipod_error_set_basal_failed_delivery_might_be_suspended); - } else { - // Happened when setting the new profile (after suspending delivery) - 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); + 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) { if (showNotifications) { - showNotification(Notification.FAILED_UDPATE_PROFILE, getStringResource(R.string.omnipod_error_set_basal_failed), Notification.URGENT, R.raw.boluserror); + 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); @@ -357,7 +382,7 @@ public class AapsOmnipodManager { if (detailedBolusInfo.isSMB) { 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_error_bolus_failed_uncertain), Notification.URGENT, isNotificationUncertainBolusSoundEnabled() ? R.raw.boluserror : null); + showErrorDialog(getStringResource(R.string.omnipod_error_bolus_failed_uncertain), isNotificationUncertainBolusSoundEnabled() ? R.raw.boluserror : null); } } @@ -454,13 +479,19 @@ public class AapsOmnipodManager { String errorMessage = translateException(ex.getCause()); addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, errorMessage); return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); - } catch (DeliveryStatusVerificationFailedException ex) { + } catch (PrecedingCommandFailedUncertainlyException ex) { String errorMessage = translateException(ex.getCause()); + addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, errorMessage); - String note; - if (ex.getExpectedStatus() == DeliveryStatus.TEMP_BASAL_RUNNING) { - // Happened after cancelling the old TBR, when attempting to set new TBR - note = getStringResource(R.string.omnipod_error_set_temp_basal_failed_old_tbr_cancelled_new_might_have_failed); + showNotification(getStringResource(R.string.omnipod_error_set_temp_basal_failed_old_tbr_might_be_cancelled), Notification.URGENT, isNotificationUncertainTbrSoundEnabled() ? R.raw.boluserror : null); + + 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 @@ -468,19 +499,10 @@ 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 - long pumpId = addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, errorMessage); - addTempBasalTreatment(System.currentTimeMillis(), pumpId, tempBasalPair); - } else { - // Happened when attempting to cancel the old TBR - note = getStringResource(R.string.omnipod_error_set_temp_basal_failed_old_tbr_might_be_cancelled); - addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, errorMessage); - } - showNotification(note, Notification.URGENT, isNotificationUncertainTbrSoundEnabled() ? R.raw.boluserror : null); - return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); - } catch (Exception ex) { - String errorMessage = translateException(ex); - addFailureToHistory(PodHistoryEntryType.SET_TEMPORARY_BASAL, errorMessage); + addTempBasalTreatment(System.currentTimeMillis(), pumpId, tempBasalPair); + } + return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); } @@ -559,7 +581,7 @@ public class AapsOmnipodManager { String errorMessage = translateException(ex.getCause()); addFailureToHistory(PodHistoryEntryType.SET_TIME, errorMessage); return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); - } catch (DeliveryStatusVerificationFailedException ex) { + } catch (PrecedingCommandFailedUncertainlyException ex) { if (showNotifications) { showNotification(getStringResource(R.string.omnipod_error_set_time_failed_delivery_might_be_suspended), Notification.URGENT, R.raw.boluserror); } @@ -567,6 +589,9 @@ public class AapsOmnipodManager { addFailureToHistory(PodHistoryEntryType.SET_TIME, errorMessage); return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); } catch (Exception 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); addFailureToHistory(PodHistoryEntryType.SET_TIME, errorMessage); return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); @@ -613,6 +638,14 @@ public class AapsOmnipodManager { return pulseLogButtonEnabled; } + public boolean isTestBeepButtonEnabled() { + return testBeepButtonEnabled; + } + + public boolean isRileylinkStatsButtonEnabled() { + return rileylinkStatsButtonEnabled; + } + public boolean isTimeChangeEventEnabled() { return timeChangeEventEnabled; } @@ -629,6 +662,10 @@ public class AapsOmnipodManager { return notificationUncertainBolusSoundEnabled; } + public boolean isAutomaticallyAcknowledgeAlertsEnabled() { + return automaticallyAcknowledgeAlertsEnabled; + } + public void addBolusToHistory(DetailedBolusInfo originalDetailedBolusInfo) { DetailedBolusInfo detailedBolusInfo = originalDetailedBolusInfo.copy(); @@ -706,6 +743,10 @@ public class AapsOmnipodManager { activePlugin.getActiveTreatments().addToHistoryTempBasal(temporaryBasal); } + public long addTbrSuccessToHistory(long requestTime, TempBasalPair tempBasalPair) { + return addSuccessToHistory(requestTime, PodHistoryEntryType.SET_TEMPORARY_BASAL, tempBasalPair); + } + private void addTempBasalTreatment(long time, long pumpId, TempBasalPair tempBasalPair) { TemporaryBasal tempStart = new TemporaryBasal(injector) // .date(time) // @@ -795,6 +836,8 @@ public class AapsOmnipodManager { } 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) { @@ -844,6 +887,15 @@ public class AapsOmnipodManager { 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); } 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/CommandPlayTestBeep.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandPlayTestBeep.java new file mode 100644 index 0000000000..94ff4996c0 --- /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 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/OmnipodCustomCommandType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommandType.java index e6df62c47b..f5c787be26 100644 --- 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 @@ -8,7 +8,9 @@ public enum OmnipodCustomCommandType { RESUME_DELIVERY("RESUME DELIVERY"), DEACTIVATE_POD("DEACTIVATE POD"), HANDLE_TIME_CHANGE("HANDLE TIME CHANGE"), - UPDATE_ALERT_CONFIGURATION("UPDATE ALERT CONFIGURATION"); + UPDATE_ALERT_CONFIGURATION("UPDATE ALERT CONFIGURATION"), + PLAY_TEST_BEEP("PLAY TEST BEEP") + ; private final String description; 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 index 0aec406de1..32260d1fc9 100644 --- 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 @@ -19,7 +19,6 @@ 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 @@ -30,7 +29,11 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateMa 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.* +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 @@ -119,14 +122,6 @@ class OmnipodOverviewFragment : DaggerFragment() { DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_refresh_status), false)) } - omnipod_overview_button_rileylink_stats.setOnClickListener { - if (omnipodPumpPlugin.rileyLinkService?.verifyConfiguration() == true) { - startActivity(Intent(context, RileyLinkStatusActivity::class.java)) - } else { - displayNotConfiguredDialog() - } - } - omnipod_overview_button_acknowledge_active_alerts.setOnClickListener { disablePodActionButtons() commandQueue.customCommand(CommandAcknowledgeAlerts(), @@ -147,12 +142,6 @@ class OmnipodOverviewFragment : DaggerFragment() { DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_set_time), true) .messageOnSuccess(resourceHelper.gs(R.string.omnipod_confirmation_time_on_pod_updated))) } - - omnipod_overview_button_pulse_log.setOnClickListener { - disablePodActionButtons() - commandQueue.customCommand(CommandReadPulseLog(), - DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_read_pulse_log), false)) - } } override fun onResume() { @@ -275,7 +264,7 @@ class OmnipodOverviewFragment : DaggerFragment() { }) } - if (podStateManager.isFaulted) { + if (podStateManager.isPodFaulted) { val faultEventCode = podStateManager.faultEventCode errors.add(resourceHelper.gs(R.string.omnipod_pod_status_pod_fault_description, faultEventCode.value, faultEventCode.name)) } @@ -361,11 +350,17 @@ class OmnipodOverviewFragment : DaggerFragment() { } } else { if (podStateManager.podProgressStatus.isRunning) { - if (podStateManager.isSuspended) { + 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) { @@ -375,7 +370,7 @@ class OmnipodOverviewFragment : DaggerFragment() { } } - val podStatusColor = if (!podStateManager.isPodActivationCompleted || podStateManager.isPodDead || podStateManager.isSuspended) { + val podStatusColor = if (!podStateManager.isPodActivationCompleted || podStateManager.isPodDead || podStateManager.isSuspended || (podStateManager.isPodRunning && !podStateManager.isBasalCertain)) { Color.RED } else { Color.WHITE @@ -406,18 +401,36 @@ class OmnipodOverviewFragment : DaggerFragment() { private fun updateTempBasal() { if (podStateManager.isPodActivationCompleted && podStateManager.isTempBasalRunning) { - val now = DateTime.now() + 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 startTime = podStateManager.tempBasalStartTime + val amount = podStateManager.tempBasalAmount + val duration = podStateManager.tempBasalDuration - val minutesRunning = Duration(startTime, now).standardMinutes + val minutesRunning = Duration(startTime, now).standardMinutes - var text: String + 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 - text = resourceHelper.gs(R.string.omnipod_overview_temp_basal_value, amount, dateUtil.timeString(startTime.millis), minutesRunning, duration.standardMinutes) - if (podStateManager.isTempBasalCertain) { + + if (!podStateManager.isPodActivationCompleted || podStateManager.isTempBasalCertain) { textColor = Color.WHITE } else { textColor = Color.RED @@ -426,9 +439,6 @@ class OmnipodOverviewFragment : DaggerFragment() { omnipod_overview_temp_basal.text = text omnipod_overview_temp_basal.setTextColor(textColor) - } else { - omnipod_overview_temp_basal.text = PLACEHOLDER - omnipod_overview_temp_basal.setTextColor(Color.WHITE) } } @@ -447,7 +457,6 @@ class OmnipodOverviewFragment : DaggerFragment() { updateAcknowledgeAlertsButton() updateSuspendDeliveryButton() updateSetTimeButton() - updatePulseLogButton() } private fun disablePodActionButtons() { @@ -456,7 +465,6 @@ class OmnipodOverviewFragment : DaggerFragment() { omnipod_overview_button_suspend_delivery.isEnabled = false omnipod_overview_button_set_time.isEnabled = false omnipod_overview_button_refresh_status.isEnabled = false - omnipod_overview_button_pulse_log.isEnabled = false } private fun updateRefreshStatusButton() { @@ -474,7 +482,7 @@ class OmnipodOverviewFragment : DaggerFragment() { } private fun updateAcknowledgeAlertsButton() { - if (podStateManager.isPodRunning && (podStateManager.hasActiveAlerts() || commandQueue.isCustomCommandInQueue(CommandAcknowledgeAlerts::class.java))) { + 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 { @@ -501,15 +509,6 @@ class OmnipodOverviewFragment : DaggerFragment() { } } - private fun updatePulseLogButton() { - if (omnipodManager.isPulseLogButtonEnabled) { - omnipod_overview_button_pulse_log.visibility = View.VISIBLE - omnipod_overview_button_pulse_log.isEnabled = podStateManager.isPodActivationCompleted && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() - } else { - omnipod_overview_button_pulse_log.visibility = View.GONE - } - } - private fun displayNotConfiguredDialog() { context?.let { UIRunnable(Runnable { 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 ff8319a557..74aded32fb 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 @@ -35,6 +35,7 @@ import info.nightscout.androidaps.plugins.pump.common.defs.PumpType; import info.nightscout.androidaps.plugins.pump.common.utils.ProfileUtil; import info.nightscout.androidaps.plugins.pump.omnipod.R; import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodHistoryEntryType; +import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.BeepConfigType; import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil; import info.nightscout.androidaps.utils.resources.ResourceHelper; @@ -272,6 +273,12 @@ public class PodHistoryActivity extends NoSplashAppCompatActivity { } 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: 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 fa1de1ef5c..058a033d85 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,25 +1,35 @@ package info.nightscout.androidaps.plugins.pump.omnipod.ui +import android.content.Context import android.content.Intent import android.os.Bundle 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.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.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.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_management.* @@ -38,6 +48,8 @@ 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 private var disposables: CompositeDisposable = CompositeDisposable() @@ -55,11 +67,45 @@ class PodManagementActivity : NoSplashAppCompatActivity() { omnipod_pod_management_button_discard_pod.setOnClickListener { OKDialog.showConfirmation(this, - resourceHelper.gs(R.string.omnipod_pod_management_discard_pod_state_confirmation), Thread { + resourceHelper.gs(R.string.omnipod_pod_management_discard_pod_confirmation), Thread { aapsOmnipodManager.discardPodState() }) } + omnipod_pod_management_button_rileylink_stats.setOnClickListener { + if (omnipodPumpPlugin.rileyLinkService?.verifyConfiguration() == true) { + startActivity(Intent(context, RileyLinkStatusActivity::class.java)) + } else { + displayNotConfiguredDialog() + } + } + + 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)) } @@ -75,6 +121,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() } @@ -88,24 +138,82 @@ class PodManagementActivity : NoSplashAppCompatActivity() { // 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 - // TODO maybe rename this button and the confirmation dialog text (see onCreate) val discardButtonEnabled = podStateManager.hasPodState() && !podStateManager.isPodInitialized omnipod_pod_management_button_discard_pod.visibility = discardButtonEnabled.toVisibility() + + 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) { 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 { + 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 index eccc00eb94..b5f4ee3114 100644 --- 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 @@ -10,6 +10,7 @@ import javax.inject.Inject class PodActivationWizardActivity : OmnipodWizardActivityBase() { companion object { + const val KEY_START_DESTINATION = "startDestination" } 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 index 2bad054984..8fc2d30b65 100644 --- 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 @@ -11,6 +11,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.fragment 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 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 index 425ff1e7ea..f7a1053785 100644 --- 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 @@ -6,6 +6,7 @@ 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 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 index bc10c3daf1..82af74414f 100644 --- 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 @@ -11,6 +11,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.view import javax.inject.Inject class InitializePodActionFragment : PodActivationActionFragmentBase() { + @Inject @OmnipodPluginQualifier lateinit var viewModelFactory: ViewModelProvider.Factory 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 index 009318c60d..76a470ee3a 100644 --- 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 @@ -11,6 +11,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.activation.view import javax.inject.Inject class InsertCannulaActionFragment : PodActivationActionFragmentBase() { + @Inject @OmnipodPluginQualifier lateinit var viewModelFactory: ViewModelProvider.Factory 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 index 455a8063a3..d0c807a4e3 100644 --- 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 @@ -6,6 +6,7 @@ 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 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 index 54df2de98e..40c8e9fbc9 100644 --- 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 @@ -11,6 +11,7 @@ import kotlinx.android.synthetic.main.omnipod_wizard_action_page_fragment.* import javax.inject.Inject abstract class PodActivationActionFragmentBase : ActionFragmentBase() { + @Inject protected lateinit var podStateManager: PodStateManager @@ -26,7 +27,7 @@ abstract class PodActivationActionFragmentBase : ActionFragmentBase() { } override fun onActionFailure() { - if (podStateManager.isPodActivationTimeExceeded && podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)) { + 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 } 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 index 429b1170d2..674ca9f8a7 100644 --- 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 @@ -6,5 +6,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.viewmode 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 index fe042a4a03..1b1bd126dc 100644 --- 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 @@ -7,5 +7,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.common.viewmode 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 index 9f0f878b04..0621cd02d5 100644 --- 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 @@ -7,6 +7,7 @@ import info.nightscout.androidaps.activities.NoSplashAppCompatActivity import info.nightscout.androidaps.plugins.pump.omnipod.R abstract class OmnipodWizardActivityBase : NoSplashAppCompatActivity() { + override fun onBackPressed() { exitActivityAfterConfirmation() } 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 index 1b0d8e41f6..a8167c4568 100644 --- 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 @@ -12,6 +12,7 @@ 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?) { 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 index cd6f135f08..b2a002470e 100644 --- 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 @@ -19,6 +19,7 @@ import kotlinx.android.synthetic.main.omnipod_wizard_progress_indication.* import kotlin.math.roundToInt abstract class WizardFragmentBase : DaggerFragment() { + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, 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 index 892d85a97e..dafba7fb4d 100644 --- 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 @@ -5,6 +5,7 @@ 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) 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 index 595bda103e..59843bc180 100644 --- 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 @@ -18,6 +18,7 @@ import kotlinx.android.synthetic.main.omnipod_wizard_action_page_fragment.* import javax.inject.Inject class DeactivatePodActionFragment : ActionFragmentBase() { + @Inject @OmnipodPluginQualifier lateinit var viewModelFactory: ViewModelProvider.Factory 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 index 5fefcfc549..8a24e2767b 100644 --- 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 @@ -6,6 +6,7 @@ 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 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 index 3b1c80cbb1..240efe4735 100644 --- 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 @@ -6,6 +6,7 @@ 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 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 index 7b53f4abc4..ebbfa0b3fd 100644 --- 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 @@ -6,6 +6,7 @@ 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 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 index 80296603f2..9e0b75f2e3 100644 --- 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 @@ -10,6 +10,7 @@ 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() { diff --git a/omnipod/src/main/res/drawable/ic_acknowledge_alerts.xml b/omnipod/src/main/res/drawable/ic_acknowledge_alerts.xml new file mode 100644 index 0000000000..9aa0dc8d80 --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_acknowledge_alerts.xml @@ -0,0 +1,9 @@ + + + + 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 28aed597c8..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_activate_pod.xml b/omnipod/src/main/res/drawable/ic_activate_pod.xml new file mode 100644 index 0000000000..3a9f39141b --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_activate_pod.xml @@ -0,0 +1,5 @@ + + + + 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 ab562c35a6..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_pump_canula.xml b/omnipod/src/main/res/drawable/ic_cp_pump_canula.xml deleted file mode 100644 index f302f9770c..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_deactivate_pod.xml b/omnipod/src/main/res/drawable/ic_deactivate_pod.xml new file mode 100644 index 0000000000..7eef8975c0 --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_deactivate_pod.xml @@ -0,0 +1,5 @@ + + + + diff --git a/omnipod/src/main/res/drawable/ic_toast_delete_confirm.xml b/omnipod/src/main/res/drawable/ic_discard_pod.xml similarity index 86% rename from omnipod/src/main/res/drawable/ic_toast_delete_confirm.xml rename to omnipod/src/main/res/drawable/ic_discard_pod.xml index e5be03e8ec..9bff377c93 100644 --- a/omnipod/src/main/res/drawable/ic_toast_delete_confirm.xml +++ b/omnipod/src/main/res/drawable/ic_discard_pod.xml @@ -1,10 +1,9 @@ \ No newline at end of file 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 c171fe367e..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 81dabea9d6..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_play_test_beep.xml b/omnipod/src/main/res/drawable/ic_play_test_beep.xml new file mode 100644 index 0000000000..bca912f844 --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_play_test_beep.xml @@ -0,0 +1,14 @@ + + + + diff --git a/omnipod/src/main/res/drawable/ic_pod_history.xml b/omnipod/src/main/res/drawable/ic_pod_history.xml new file mode 100644 index 0000000000..07846055da --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_pod_history.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/omnipod/src/main/res/drawable/ic_pod_management.xml b/omnipod/src/main/res/drawable/ic_pod_management.xml new file mode 100644 index 0000000000..55ed07f4fc --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_pod_management.xml @@ -0,0 +1,5 @@ + + + + diff --git a/omnipod/src/main/res/drawable/ic_cp_bolus_correction.xml b/omnipod/src/main/res/drawable/ic_pulse_log.xml similarity index 95% rename from omnipod/src/main/res/drawable/ic_cp_bolus_correction.xml rename to omnipod/src/main/res/drawable/ic_pulse_log.xml index 49d6332c8e..3114b7f4fc 100644 --- a/omnipod/src/main/res/drawable/ic_cp_bolus_correction.xml +++ b/omnipod/src/main/res/drawable/ic_pulse_log.xml @@ -5,8 +5,8 @@ android:viewportHeight="24"> + android:fillColor="#A14FFF" /> + android:fillColor="#FFBC4F" /> diff --git a/omnipod/src/main/res/drawable/ic_refresh_pod_status.xml b/omnipod/src/main/res/drawable/ic_refresh_pod_status.xml new file mode 100644 index 0000000000..ea35939c1a --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_refresh_pod_status.xml @@ -0,0 +1,5 @@ + + + + diff --git a/omnipod/src/main/res/drawable/ic_resume_delivery.xml b/omnipod/src/main/res/drawable/ic_resume_delivery.xml new file mode 100644 index 0000000000..effffa5470 --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_resume_delivery.xml @@ -0,0 +1,5 @@ + + + + diff --git a/omnipod/src/main/res/drawable/ic_rl_stats.xml b/omnipod/src/main/res/drawable/ic_rl_stats.xml new file mode 100644 index 0000000000..81b3952eb4 --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_rl_stats.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/omnipod/src/main/res/drawable/ic_access_alarm.xml b/omnipod/src/main/res/drawable/ic_set_time.xml similarity index 93% rename from omnipod/src/main/res/drawable/ic_access_alarm.xml rename to omnipod/src/main/res/drawable/ic_set_time.xml index 48a463f81b..3548756add 100644 --- a/omnipod/src/main/res/drawable/ic_access_alarm.xml +++ b/omnipod/src/main/res/drawable/ic_set_time.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/omnipod/src/main/res/drawable/ic_toast_check.xml b/omnipod/src/main/res/drawable/ic_success.xml similarity index 100% rename from omnipod/src/main/res/drawable/ic_toast_check.xml rename to omnipod/src/main/res/drawable/ic_success.xml diff --git a/omnipod/src/main/res/drawable/ic_suspend_delivery.xml b/omnipod/src/main/res/drawable/ic_suspend_delivery.xml new file mode 100644 index 0000000000..fb0a216bd6 --- /dev/null +++ b/omnipod/src/main/res/drawable/ic_suspend_delivery.xml @@ -0,0 +1,5 @@ + + + + diff --git a/omnipod/src/main/res/layout/omnipod_overview.xml b/omnipod/src/main/res/layout/omnipod_overview.xml index ff36031400..b14c3304c9 100644 --- a/omnipod/src/main/res/layout/omnipod_overview.xml +++ b/omnipod/src/main/res/layout/omnipod_overview.xml @@ -37,7 +37,6 @@ android:textAppearance="?android:attr/textAppearanceSmall" />
- - - - -
@@ -752,7 +747,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" - android:drawableTop="@drawable/ic_actions_refill" + android:drawableTop="@drawable/ic_refresh_pod_status" android:paddingLeft="0dp" android:paddingRight="0dp" android:text="@string/omnipod_overview_button_refresh" /> @@ -763,7 +758,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" - android:drawableTop="@drawable/ic_danarhistory" + android:drawableTop="@drawable/ic_pod_management" android:paddingLeft="0dp" android:paddingRight="0dp" android:text="@string/omnipod_overview_button_pod_management" /> @@ -774,41 +769,18 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" - android:drawableTop="@drawable/ic_cp_aaps_offline" + android:drawableTop="@drawable/ic_acknowledge_alerts" android:paddingLeft="0dp" android:paddingRight="0dp" android:text="@string/omnipod_overview_button_acknowledge_active_alerts" /> -