diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md index b2b607eab0..665cb66fba 100644 --- a/.github/ISSUE_TEMPLATE/custom.md +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -1,34 +1,19 @@ -# Reporting an issue for AAPS-DASH +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' -## AndroidAPS (see about screen) +--- -- version: ... - -- Build number: ... - -- Flavor: ... - -### Phone: - -- Hardware Brand and Type: ... - -- Android OS version: ... - -## Problem description: -... - -#### Additional information and reproduction steps: -... - -#### Additional information and reproduction steps: -... - -#### Time of event: - -- Please enter the exact time of the event here - -## Logfiles: - -When possible, please add logfiles from the time of the event! -Developers need your logfiles to trace the origin of the issue and possibly solve it. -_For how-to get the logfile, see FAQ on Wiki: [Logfiles](https://github.com/0pen-dash/AndroidAPS/wiki/2.-FAQ-&-Troubleshooting#logfiles)_ +Reporting bugs +-------------- +- **Note the precise time the problem occurred** and describe the circumstances and steps that caused + the problem +- Note the Build version (found in the About dialog in the app, when pressing the three dots in the + upper-right corner). +- Obtain the app's log files, which can be found on the phone in + _/storage/emulated/0/Android/data/info.nightscout.androidaps/_ + See https://androidaps.readthedocs.io/en/latest/Usage/Accessing-logfiles.html +- Open an issue at https://github.com/nightscout/AndroidAPS/issues/new diff --git a/.github/ISSUE_TEMPLATE/dash-testing.md b/.github/ISSUE_TEMPLATE/dash-testing.md deleted file mode 100644 index 4cbf493fc8..0000000000 --- a/.github/ISSUE_TEMPLATE/dash-testing.md +++ /dev/null @@ -1,34 +0,0 @@ -# Reporting an issue for AAPS-DASH - -## AndroidAPS (see about screen) - -- version: ... - -- Build number: ... - -- Flavor: ... - -### Phone: - -- Hardware Brand and Type: ... - -- Android OS version: ... - -## Problem description: -... - -#### Additional information and reproduction steps: -... - -#### Additional information and reproduction steps: -... - -#### Time of event: - -- Please enter the exact time of the event here - -## Logfiles: - -When possible, please add logfiles from the time of the event! -Developers need your logfiles to trace the origin of the issue and possibly solve it. -_For how-to get the logfile, see FAQ on Wiki: [Logfiles](https://github.com/0pen-dash/AndroidAPS/wiki/2.-FAQ-&-Troubleshooting#logfiles)_ \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.kt b/app/src/main/java/info/nightscout/androidaps/MainActivity.kt index 8a685a8703..764a5727eb 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.kt @@ -165,7 +165,7 @@ class MainActivity : NoSplashAppCompatActivity() { actionBarDrawerToggle.syncState() } - public override fun onDestroy() { + override fun onDestroy() { super.onDestroy() disposable.clear() } diff --git a/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.kt index 5ef938b134..a6a77c9dd2 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.kt @@ -171,7 +171,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() { } } - public override fun onPause() { + override fun onPause() { super.onPause() disposable.clear() iobCobCalculator.stopCalculation("onPause") @@ -183,7 +183,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() { super.onDestroy() } - public override fun onResume() { + override fun onResume() { super.onResume() disposable.add(rxBus .toObservable(EventAutosensCalculationFinished::class.java) diff --git a/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt index 9b01150122..9421324b66 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt @@ -19,7 +19,7 @@ class SingleFragmentActivity : DaggerAppCompatActivityWithResult() { private var plugin: PluginBase? = null - public override fun onCreate(savedInstanceState: Bundle?) { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_single_fragment) plugin = pluginStore.plugins[intent.getIntExtra("plugin", -1)] @@ -52,7 +52,7 @@ class SingleFragmentActivity : DaggerAppCompatActivityWithResult() { return super.onCreateOptionsMenu(menu) } - public override fun attachBaseContext(newBase: Context) { + override fun attachBaseContext(newBase: Context) { super.attachBaseContext(LocaleHelper.wrap(newBase)) } } \ 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 f861de7b07..cd8e179160 100644 --- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt @@ -42,7 +42,6 @@ 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.dash.OmnipodDashPumpPlugin import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin @@ -155,11 +154,11 @@ abstract class PluginsModule { @IntKey(150) abstract fun bindMedtronicPumpPlugin(plugin: MedtronicPumpPlugin): PluginBase - @Binds - @PumpDriver - @IntoMap - @IntKey(156) - abstract fun bindOmnipodDashPumpPlugin(plugin: OmnipodDashPumpPlugin): PluginBase + // @Binds + // @PumpDriver + // @IntoMap + // @IntKey(155) + // abstract fun bindOmnipodPumpPlugin(plugin: OmnipodErosPumpPlugin): PluginBase @Binds @PumpDriver @@ -371,4 +370,4 @@ abstract class PluginsModule { @Qualifier annotation class APS -} +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/storage/StorageConstraintPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/storage/StorageConstraintPlugin.kt index e474c94906..9fb916690b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/storage/StorageConstraintPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/storage/StorageConstraintPlugin.kt @@ -50,7 +50,7 @@ class StorageConstraintPlugin @Inject constructor( return value } - open fun availableInternalMemorySize(): Long { + fun availableInternalMemorySize(): Long { val path = Environment.getDataDirectory() val stat = StatFs(path.path) val blockSize = stat.blockSizeLong diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/DataSyncSelectorImplementation.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/DataSyncSelectorImplementation.kt index d894b6c146..e5d169527e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/DataSyncSelectorImplementation.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/DataSyncSelectorImplementation.kt @@ -34,6 +34,7 @@ class DataSyncSelectorImplementation @Inject constructor( processChangedTemporaryBasalsCompat() processChangedExtendedBolusesCompat() processChangedProfileSwitchesCompat() + processChangedEffectiveProfileSwitchesCompat() processChangedGlucoseValuesCompat() processChangedTempTargetsCompat() processChangedFoodsCompat() @@ -56,6 +57,7 @@ class DataSyncSelectorImplementation @Inject constructor( sp.remove(R.string.key_ns_extended_bolus_last_synced_id) sp.remove(R.string.key_ns_therapy_event_last_synced_id) sp.remove(R.string.key_ns_profile_switch_last_synced_id) + sp.remove(R.string.key_ns_effective_profile_switch_last_synced_id) sp.remove(R.string.key_ns_offline_event_last_synced_id) sp.remove(R.string.key_ns_profile_store_last_synced_timestamp) } @@ -555,6 +557,48 @@ class DataSyncSelectorImplementation @Inject constructor( return false } + override fun confirmLastEffectiveProfileSwitchIdIfGreater(lastSynced: Long) { + if (lastSynced > sp.getLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0)) { + aapsLogger.debug(LTag.NSCLIENT, "Setting EffectiveProfileSwitch data sync from $lastSynced") + sp.putLong(R.string.key_ns_effective_profile_switch_last_synced_id, lastSynced) + } + } + + override fun changedEffectiveProfileSwitch(): List { + val startId = sp.getLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0) + return appRepository.getModifiedEffectiveProfileSwitchDataFromId(startId).blockingGet().also { + aapsLogger.debug(LTag.NSCLIENT, "Loading EffectiveProfileSwitch data for sync from $startId. Records ${it.size}") + } + } + + @Volatile private var lastEpsId = -1L + @Volatile private var lastEpsTime = -1L + override fun processChangedEffectiveProfileSwitchesCompat(): Boolean { + val lastDbIdWrapped = appRepository.getLastEffectiveProfileSwitchIdWrapped().blockingGet() + val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L + var startId = sp.getLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0) + if (startId > lastDbId) { + sp.putLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0) + startId = 0 + } + if (startId == lastEpsId && dateUtil.now() - lastEpsTime < 5000) return false + lastEpsId = startId + lastEpsTime = dateUtil.now() + appRepository.getNextSyncElementEffectiveProfileSwitch(startId).blockingGet()?.let { ps -> + aapsLogger.info(LTag.DATABASE, "Loading EffectiveProfileSwitch data Start: $startId ID: ${ps.first.id} HistoryID: ${ps.second} ") + when { + // without nsId = create new + ps.first.interfaceIDs.nightscoutId == null -> + nsClientPlugin.nsClientService?.dbAdd("treatments", ps.first.toJson(true, dateUtil), DataSyncSelector.PairEffectiveProfileSwitch(ps.first, ps.second), "$startId/$lastDbId") + // with nsId = update + ps.first.interfaceIDs.nightscoutId != null -> + nsClientPlugin.nsClientService?.dbUpdate("treatments", ps.first.interfaceIDs.nightscoutId, ps.first.toJson(false, dateUtil), DataSyncSelector.PairEffectiveProfileSwitch(ps.first, ps.second), "$startId/$lastDbId") + } + return true + } + return false + } + override fun confirmLastOfflineEventIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_offline_event_last_synced_id, 0)) { aapsLogger.debug(LTag.NSCLIENT, "Setting OfflineEvent data sync from $lastSynced") diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientAddAckWorker.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientAddAckWorker.kt index 1df6309037..68b888f764 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientAddAckWorker.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientAddAckWorker.kt @@ -228,6 +228,25 @@ class NSClientAddAckWorker( dataSyncSelector.processChangedProfileSwitchesCompat() } + is PairEffectiveProfileSwitch -> { + val pair = ack.originalObject + pair.value.interfaceIDs.nightscoutId = ack.id + repository.runTransactionForResult(UpdateNsIdEffectiveProfileSwitchTransaction(pair.value)) + .doOnError { error -> + aapsLogger.error(LTag.DATABASE, "Updated ns id of EffectiveProfileSwitch failed", error) + ret = Result.failure((workDataOf("Error" to error.toString()))) + } + .doOnSuccess { + ret = Result.success(workDataOf("ProcessedData" to pair.toString())) + aapsLogger.debug(LTag.DATABASE, "Updated ns id of EffectiveProfileSwitch " + pair.value) + dataSyncSelector.confirmLastEffectiveProfileSwitchIdIfGreater(pair.updateRecordId) + } + .blockingGet() + rxBus.send(EventNSClientNewLog("DBADD", "Acked EffectiveProfileSwitch " + pair.value.interfaceIDs.nightscoutId)) + // Send new if waiting + dataSyncSelector.processChangedEffectiveProfileSwitchesCompat() + } + is DeviceStatus -> { val deviceStatus = ack.originalObject deviceStatus.interfaceIDs.nightscoutId = ack.id diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientAddUpdateWorker.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientAddUpdateWorker.kt index 0559196eac..a7ee154080 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientAddUpdateWorker.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientAddUpdateWorker.kt @@ -185,6 +185,32 @@ class NSClientAddUpdateWorker( } } ?: aapsLogger.error("Error parsing TT json $json") } + eventType == TherapyEvent.Type.NOTE.text && json.isEffectiveProfileSwitch() -> // replace this by new Type when available in NS + if (sp.getBoolean(R.string.key_ns_receive_profile_switch, false) && buildHelper.isEngineeringMode() || config.NSCLIENT) { + effectiveProfileSwitchFromJson(json, dateUtil, activePlugin)?.let { effectiveProfileSwitch -> + repository.runTransactionForResult(SyncNsEffectiveProfileSwitchTransaction(effectiveProfileSwitch, invalidateByNsOnly = false)) + .doOnError { + aapsLogger.error(LTag.DATABASE, "Error while saving EffectiveProfileSwitch", it) + ret = Result.failure(workDataOf("Error" to it.toString())) + } + .blockingGet() + .also { result -> + result.inserted.forEach { + uel.log(Action.PROFILE_SWITCH, Sources.NSClient, + ValueWithUnit.Timestamp(it.timestamp)) + aapsLogger.debug(LTag.DATABASE, "Inserted EffectiveProfileSwitch $it") + } + result.invalidated.forEach { + uel.log(Action.PROFILE_SWITCH_REMOVED, Sources.NSClient, + ValueWithUnit.Timestamp(it.timestamp)) + aapsLogger.debug(LTag.DATABASE, "Invalidated EffectiveProfileSwitch $it") + } + result.updatedNsId.forEach { + aapsLogger.debug(LTag.DATABASE, "Updated nsId EffectiveProfileSwitch $it") + } + } + } ?: aapsLogger.error("Error parsing EffectiveProfileSwitch json $json") + } eventType == TherapyEvent.Type.CANNULA_CHANGE.text || eventType == TherapyEvent.Type.INSULIN_CHANGE.text || eventType == TherapyEvent.Type.SENSOR_CHANGE.text || diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientUpdateRemoveAckWorker.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientUpdateRemoveAckWorker.kt index 5a38645c4d..8b7aeddc9a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientUpdateRemoveAckWorker.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientUpdateRemoveAckWorker.kt @@ -126,6 +126,15 @@ class NSClientUpdateRemoveAckWorker( ret = Result.success(workDataOf("ProcessedData" to pair.toString())) } + is PairEffectiveProfileSwitch -> { + val pair = ack.originalObject + dataSyncSelector.confirmLastEffectiveProfileSwitchIdIfGreater(pair.updateRecordId) + rxBus.send(EventNSClientNewLog("DBUPDATE", "Acked EffectiveProfileSwitch " + ack._id)) + // Send new if waiting + dataSyncSelector.processChangedEffectiveProfileSwitchesCompat() + ret = Result.success(workDataOf("ProcessedData" to pair.toString())) + } + is PairOfflineEvent -> { val pair = ack.originalObject dataSyncSelector.confirmLastOfflineEventIdIfGreater(pair.updateRecordId) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/profile/local/LocalProfilePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/profile/local/LocalProfilePlugin.kt index 94d907973a..026bcbb603 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/profile/local/LocalProfilePlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/profile/local/LocalProfilePlugin.kt @@ -148,15 +148,17 @@ class LocalProfilePlugin @Inject constructor( fun storeSettings(activity: FragmentActivity? = null) { for (i in 0 until numOfProfiles) { profiles[i].run { - val localProfileNumbered = Constants.LOCAL_PROFILE + "_" + i + "_" - sp.putString(localProfileNumbered + "name", name!!) - sp.putBoolean(localProfileNumbered + "mgdl", mgdl) - sp.putDouble(localProfileNumbered + "dia", dia) - sp.putString(localProfileNumbered + "ic", ic.toString()) - sp.putString(localProfileNumbered + "isf", isf.toString()) - sp.putString(localProfileNumbered + "basal", basal.toString()) - sp.putString(localProfileNumbered + "targetlow", targetLow.toString()) - sp.putString(localProfileNumbered + "targethigh", targetHigh.toString()) + name?.let { name -> + val localProfileNumbered = Constants.LOCAL_PROFILE + "_" + i + "_" + sp.putString(localProfileNumbered + "name", name) + sp.putBoolean(localProfileNumbered + "mgdl", mgdl) + sp.putDouble(localProfileNumbered + "dia", dia) + sp.putString(localProfileNumbered + "ic", ic.toString()) + sp.putString(localProfileNumbered + "isf", isf.toString()) + sp.putString(localProfileNumbered + "basal", basal.toString()) + sp.putString(localProfileNumbered + "targetlow", targetLow.toString()) + sp.putString(localProfileNumbered + "targethigh", targetHigh.toString()) + } } } sp.putInt(Constants.LOCAL_PROFILE + "_profiles", numOfProfiles) diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.kt b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.kt index 62bbf228e9..8553f76596 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.kt +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.kt @@ -64,7 +64,8 @@ class CommandQueue @Inject constructor( private val buildHelper: BuildHelper, private val dateUtil: DateUtil, private val repository: AppRepository, - private val fabricPrivacy: FabricPrivacy + private val fabricPrivacy: FabricPrivacy, + private val config: Config ) : CommandQueueProvider { private val disposable = CompositeDisposable() @@ -79,6 +80,10 @@ class CommandQueue @Inject constructor( .toObservable(EventProfileSwitchChanged::class.java) .observeOn(aapsSchedulers.io) .subscribe({ + if (config.NSCLIENT) { // Effective profileswitch should be synced over NS + rxBus.send(EventNewBasalProfile()) + return@subscribe + } aapsLogger.debug(LTag.PROFILE, "onProfileSwitch") profileFunction.getRequestedProfile()?.let { val nonCustomized = ProfileSealed.PS(it).convertToNonCustomizedProfile(dateUtil) @@ -172,8 +177,7 @@ class CommandQueue @Inject constructor( // After new command added to the queue // start thread again if not already running - @Synchronized - open fun notifyAboutNewCommand() { + @Synchronized fun notifyAboutNewCommand() { waitForFinishedThread() if (thread == null || thread!!.state == Thread.State.TERMINATED) { thread = QueueThread(this, context, aapsLogger, rxBus, activePlugin, resourceHelper, sp) @@ -195,7 +199,9 @@ class CommandQueue @Inject constructor( override fun independentConnect(reason: String, callback: Callback?) { aapsLogger.debug(LTag.PUMPQUEUE, "Starting new queue") - val tempCommandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, activePlugin, context, sp, buildHelper, dateUtil, repository, fabricPrivacy) + val tempCommandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, + constraintChecker, profileFunction, activePlugin, context, sp, + buildHelper, dateUtil, repository, fabricPrivacy, config) tempCommandQueue.readStatus(reason, callback) tempCommandQueue.disposable.clear() } diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt b/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt index 71e0703cb0..9d6cd6acac 100644 --- a/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt @@ -70,7 +70,7 @@ class SetupWizardActivity : NoSplashAppCompatActivity() { } } - public override fun onPause() { + override fun onPause() { super.onPause() disposable.clear() } diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index e07caaf848..977b5a5b32 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -868,6 +868,8 @@ Unerwartetes Verhalten. Temp. Ziele akzeptieren, die in NS oder NSClient eingegeben wurden Profilwechsel abrufen Profilwechsel akzeptieren, die in NS oder NSClient eingegeben wurden + APS Offline-Ereignisse empfangen + APS Offline-Ereignisse akzeptieren, die über NS oder NSClient eingegeben wurden Insulin abrufen Insulin akzeptieren, das in NS oder NSClient eingegeben wurden Kohlenhydrate abrufen @@ -878,4 +880,5 @@ Unerwartetes Verhalten. CGM Daten von NS akzeptieren Zeitüberschreitung beim Warten auf das Ende der vorherigen Kommunikation mit der Pumpe In der Warteschlange befindet sich ein weiterer Bolus. Bitte später erneut versuchen. + Kalkulation wird gerade durchgeführt diff --git a/app/src/main/res/values-iw-rIL/exam.xml b/app/src/main/res/values-iw-rIL/exam.xml index a12548e90c..754eacad96 100644 --- a/app/src/main/res/values-iw-rIL/exam.xml +++ b/app/src/main/res/values-iw-rIL/exam.xml @@ -59,7 +59,7 @@ השאירו את ערך מטרת הסוכר ללא שינוי. המתינו עד שהגלוקוז בדם יירד מתחת לערך המטרה של היפו ואז אכלו 15 גרם של פחמימות מהירות. https://androidaps.readthedocs.io/en/latest/EN/Usage/temptarget.html#activity-temp-target - השבתת / השהיית לולאה + השבתת \\ השהיית לולאה האם אני מקבל\\ת אינסולין כאשר הלולאה מושבתת\\מושהית? כן, אינסולין בזאלי ממשיך להינתן. לא, אספקת האינסולין נפסקת. @@ -161,10 +161,10 @@ ע\"מ לעקוב אחר AndroidAPS מרחוק, שני ההתקנים חייבים להיות בעלי גישה לאינטרנט (למשל באמצעות רשת אינטרנט אלחוטית או אינטרנט סלולרי). אפליקציית NS Client אצל עוקב משמשת לניטור מרוחק ומאפשרת שליטה מלאה ב-AndroidAPS. https://androidaps.readthedocs.io/en/latest/EN/Children/Children.html - יחס התיקון (ISF) + יחס התיקון (ISF) עלייה בערך יחס התיקון תביא למתן יותר אינסולין לכיסוי כמות נתונה של פחמימות. - הפחתת ערך יחס התיקון (ISF) מובילים למתן יותר אינסולין כדי לתקן רמת סוכר שמעל ערך המטרה. - העלאת או הורדת יחס התיקון (ISF) אינו משפיע על מינון האינסולין כאשר רמות הגלוקוז בדם הן מתחת לערך המטרה. + הפחתת ערך יחס התיקון (ISF) מובילה למתן יותר אינסולין כדי לתקן רמת סוכר שמעל ערך המטרה. + העלאת או הורדת יחס התיקון (ISF) אינה משפיעה על מינון האינסולין כאשר רמות הגלוקוז בדם הן מתחת לערך המטרה. יש להזין את יחס התיקון בהעדפות ב-AndroidAPS. שינוי ערך ISF בפרופיל שלכם מספיק כדי להחיל את השינוי. https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u @@ -179,7 +179,7 @@ יחס הפחמימות (IC) הוא: כמה יחידות לחם מכוסות ע\"י יחידת אינסולין אחת. https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-u החלפת פרופילים - בעת החלפה לפרופיל 90%, מהם ההיגדים הנכונים? + בעת החלפה לפרופיל 90%, מהם כל ההיגדים הנכונים? המינון הבזאלי יהיה נמוך ב-10%. ערך פקטור התיקון (ISF) יהיה גבוה ב-10%. ערך יחס הפחמימות יהיה נמוך ב-10%. diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index 2fb794cb9b..a7b672e3c4 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -113,7 +113,7 @@ מצב APS לולאה סגורה לולאה פתוחה - השהיה בגלל ערך סוכר נמוך + השהיה עקב ערך סוכר נמוך לולאה כבויה הצעה חדשה זמינה המלצת פחמימות @@ -241,7 +241,7 @@ יחידות: יחידות משך פעילות אינסולין - טווח להדמיה + טווח הצגה סימוני גבוה ונמוך בתרשים סקירה כללית ובשעון חכם סימון נמוך סימון גבוה @@ -329,7 +329,7 @@ מבוגר\\ת עם תנגודת אינסולין גבוהה הריון נא לבחור את גיל המטופל\\ת להתאמת מגבלות בטיחות - שם מטופל\\ת + שם המטופל\\ת נא לציין את שם המטופל\\ת או כינוי, להבחנה בין מספר הגדרות משתמש Glimp @@ -751,7 +751,7 @@ יש לשמור או לאפס תחילה את השינויים הנוכחיים למחוק את הפרופיל הנוכחי? ליצור פרופיל מקומי חדש מפרופיל זה? - שם הפרפיל מכיל נקודות.\nשם כזה אינו נתמך ע\"י Nightscout \n הפרופיל לא הועלה ל-Nightscout. + שם הפרופיל מכיל נקודות.\nשם כזה אינו נתמך ע\"י Nightscout \n הפרופיל לא הועלה ל-Nightscout. ערך נמוך יותר באזור הטווח (הצגה בלבד) ערך גבוה יותר באזור הטווח (הצגה בלבד) גיל: diff --git a/app/src/main/res/values-ko-rKR/exam.xml b/app/src/main/res/values-ko-rKR/exam.xml index 9bd73ccc2e..bbd1b8fbb6 100644 --- a/app/src/main/res/values-ko-rKR/exam.xml +++ b/app/src/main/res/values-ko-rKR/exam.xml @@ -132,6 +132,7 @@ 인슐린 주입/입력 오류 만약 펌프 기록에서 보여지는 것보다 인슐린이 적게 주입되었을 때 어떻게 해야 할까요? (예를 들어, 주입 막힘, 캐뉼라 문제, 샤워 후 펌프 재부착을 잊어버렸을 때) Nightscout 케어포탈에서 인슐린 데이터를 삭제하여 펌프 기록에서 이를 제거합니다. + AndroidAPS와 펌프 기록을 비교합니다. \"주입되지 않은\" 인슐린양을 계산하여 시린지/펜 또는 prime 기능을 사용하여 인슐린을 주입합니다. 특별한 조치를 취하지 않고, AndroidAPS가 결과적으로 높은 혈당 정도를 조정할 수 있도록 합니다. 활성 인슐린 (IOB) diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 66ed54c5d7..2aefb9877c 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -140,6 +140,7 @@ 파일을 찾을 수 없습니다 설정 저장하기 설정 불러오기 + 임시 Basal 최대량 [U/h] 이 값은 OpenAPS에서 Max Basal(최대 Basal)로 설정되는 값입니다 OpenAPS가 주입할수 있는 최대 Basal IOB [U] 이 값은 OpenAPS에서 Max IOB라고 부르는 값입니다\n기본값은 0으로 설정되어 있습니다. 몇일 혹은 몇주 정도 사용 후 적절한 값으로 변경할 수 있습니다. @@ -147,6 +148,11 @@ 내보낸 preferences를 가져오기 위해서는 마스터 비밀번호가 필요합니다. 내보내기 취소됩니다! 환경 설정을 내보내지 않았습니다! 가져오고 취소됩니다! 환경설정을 가져오지 않았습니다. + 기본 설정을 가져올 수 없습니다. + 기본 화면으로 돌아가서 다시 시도하십시오. + 이전 마스터 비밀번호 + 이 파일을 내보내고 다른 마스터 암호로 암호화했습니다. 파일의 암호를 해독하려면 이전 마스터 암호를 제공하십시오. + 가져오기에 성공하면 현재 마스터 암호가 이전 마스터 암호로 대체됩니다. 가져오기 전에 환경설정을 확인하세요. 환경 설정을 가져올 수가 없습니다. 환경 설정을 가져오면 안됩니다. @@ -173,6 +179,9 @@ 원격 Bolus를 주입한 후 얼마간의 시간이 흐른 후에야 다음 원격 Bolus주입이 가능합니다 원격 Bolus를 주입한 후 몇분이 지나야 다음 원격 Bolus 주입이 가능하게 합니까 안전을 위하여 이 설정을 수정하기 위해 최소 2개의 폰 번호를 추가해야합니다. + %1$.2f U이 주입됩니다. + Bolus %1$.2f U이 성공적으로 주입되었습니다. + 식사 Bolus %1$.2f U 이 성공적으로 주입되었습니다. %2$d 분 동안 목표 %1$s %2$d 분 동안 목표 %1$s 설정이 완료되었습니다 임시 목표 취소가 완료되었습니다 @@ -180,14 +189,25 @@ Loop가 중지되었습니다. Loop가 실행되었습니다. Loop가 실행중입니다. + 코드 %1$s을(를) 사용하여 펌프에 연결하기 + 펌프에 연결하지 못했습니다. + %1$d분 동안 펌프 연결을 끊으려면 코드 %2$s를 입력하세요. + 펌프가 연결되지 않았습니다. + 펌프가 다시 연결되었습니다. 원격 명령이 허가되지 않았습니다 원격 주입이 불가능합니다. 나중에 다시 시도해주세요. + %2$d분동안 basal %1$.2fU/h 주입하려면 %3$s을(를) 입력하세요. 프로파일 %1$s %2$d%%로 변경하려면 %3$s 를 입력하고 답장하세요 + %2$d분동안 확장bolus %1$.2fU 주입하려면 %3$s을(를) 입력하세요. %2$s에 %1$dg을 입력하려면 %3$s를 입력하고 답장하세요 %2$d 분 동안 Basal %1$d%% 주입하려면 %3$s을 입력하고 답장하세요 %1$d분동안 Loop 일시중지하려면 %2$s 를 입력하고 답장하세요 + 코드 %1$s을(를) 사용하여 loop의 작동 다시 시작하기 + 코드 %1$s을(를) 사용하여 loop의 작동 활성화하기 + 코드 %1$s을(를) 사용하여 loop의 작동 비활성화하기 Temp Basal %1$.2fU/h for %2$d min started successfully Extended bolus %1$.2fU for %2$d min started successfully + 탄수화물 %1$dg 입력이 완료되었습니다. 탄수화물 %1$dg 입력이 실패하였습니다 Temp basal %1$d%% for %2$d min started successfully Temp Basal start failed @@ -209,9 +229,12 @@ Meal 교정주입 실행 + (비활성화 시 위험함) NS에 업로드만 하기 + NS에 업로드만 하기 (sync를 비활성화 함). xDrip+와 같은 로컬 출처를 선택한 경우 외에는 SGV에 영향을 주지 않음. NS 프로파일을 사용하는 동안 프로파일에 영향을 주지 않음.\n!!! 경고!!! 이 기능을 비활성화하면 일부 구성요소 (AAPS, NS, xDrip+) 가 잘못 설정되어 있을 때 잘못 작동하거나 인슐린의 과다주입을 야기할 수 있음. AAPS에서 보여지는 정보와 펌프 상태가 일치하는지 유의해서 관찰해야 함! 펌프가 초기화 되지 않았습니다! 교체/채움 양이 인퓨전세트의 사양과 일치하는지 확인하세요! + 교체/채움 기본 인슐린 양 버튼1 버튼2 버튼3 @@ -240,6 +263,7 @@ Autosens 정보 스크립트 디버그 Autosens 기능 사용 + NS로부터 최신 정보로 업데이트 함. 미래시점의 관리 삭제 ACT CONF @@ -254,11 +278,13 @@ SMS 탭 이름 단축 단순증분값 대신 단기평균증분값을 항상 사용합니다. + xDrip+처럼 필터링되지 않은 혈당 출처에서 받은 데이터의 노이즈가 심할 경우 유용함. 프로파일 기본값: 3\n이 값은 중요한 OpenAPS 안전장치입니다. 이 값의 역할은 펌프에 설정되어 있는 최대Basal보다 3배를 초과할 수 없게 제한하는 것입니다. 이 값을 변경할 필요는 없을 것이지만, 안전을 위해 \"3x max daily; 4x current\"이 의미하는 바를 알고 있어야 합니다. 기본값: 4\n이 값은 \"3x max daily; 4x current\"의 나머지 절반에 해당하는 또 다른 중요한 OpenAPS 안전장치입니다. 이것은, 펌프에 설정된 최대 Basal과는 관계없이, Basal이 설정된 현재시간의 Basal에 이 값을 곱한 양을 초과할 수 없다는 것을 의미합니다. 이는 알고리즘의 작동 방식을 이해하기 전에 과도하게 높은 최대 기본을 설정하여 위험한 상황에 빠지지 않도록 보호하기 위한 것입니다. 다시한번, 기본 값은 4배인 것을 알아두세요; 일반적으로 이것을 조정할 필요는 전혀 없으며, 대신 이 안전장치를 변경해야할것처럼 생각이 된다면, 다른 설정을 변경해야 할 가능성이 더 큽니다. 기본값: 1.2\n이 옵션은 autosens의 최대 한계 값을 20%%로 제한하기 위해 autosens(곧 autotune)이 이용하는 승수값입니다. 이 값이 autosens에 대한 Basal의 최대 값, 인슐린 민감도(ISF)의 최소값 및 혈당 목표의 최소값을 결정케 합니다. 기본값: 0.7\nautosens 안전 제한의 나머지 부분입니다. 이는 Basal을 얼마나 낮게 조절할 수 있는지, ISF와 혈당 목표범위를 얼마나 높게 설정할 수 있는지를 결정합니다. + Autosens가 목표값도 조절합니다. 기본값: 활성\n이것은 autosens가 ISF와 Basal뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다. 기본값: 2\n식사주입 후 Bolus snooze가 수행되게 되고, 따라서 식사주입 직후엔 loop가 low temp에 대응하지 않게 됩니다. 기본값이 2일때 예제는 다음과 같습니다; DIA가 3시간일 경우 bolus snooz는 점차적으로 1.5시간에 걸쳐 단계적으로 사라지게 됩니다.(3DIA/2). 기본값: 3.0 (AMA) 또는 8.0 (SMB). 5분당 탄수화물이 얼만큼 흡수되었는지에 대한 기본값 설정입니다. 기본값은 3mg/dl / 5분 입니다. 이는 혈당이 예상보다 빨리 떨어지거나 혹은 예상보다 오르지 않을때, COB가 얼마나 빨리 사라지게 되는지에 영향을 주게 되고, 추정된 탄수화물 흡수량이 미래 혈당 예측 계산시에도 영향을 주게 됩니다. @@ -268,6 +294,7 @@ xDrip+가 설치되지 않았습니다 보정이 xDrip으로 전송되었습니다+ 보정 전송됨. xDrip에서 수신이 되도록 설정되어 있어야 합니다+. + xDrip+에서 보정값을 받지 못합니다. 펌프 일시중지됨 실행중 가상펌프 설정 @@ -295,10 +322,16 @@ 워치페이스에 IOB를 Bolus IOB와 Basal IOB로 나누어서 보여줍니다. 성공하지 못했습니다. 폰을 확인하세요 사용불가 + 환자 유형 어린이 청소년 성인 인슐린 저항성 높은 성인 + 임신 중 + 안전 제한 설정을 위해 환자 유형을 선택하십시오. + 환자 이름 + 다양한 설정들을 구별하기 위하여 환자 이름 또는 별명을 입력합니다. + 사용자 Glimp 최적의 성능을 위해 %1$s에서 배터리 최적화를 해제해야합니다. Loop 일시중지 @@ -313,6 +346,8 @@ 1시간동안 펌프 일시중지 2시간동안 펌프 일시중지 3시간동안 펌프 일시중지 + 15분 + 30분 1시간 2시간 3시간 @@ -334,13 +369,32 @@ 마법사에서 Superbolus 활성화하기 마법사에서 Superbolus 기능을 활성화합니다. 어떤 기능인지 확실히 알기전까지 활성화 하지 마세요. 제대로 알지 못하고 사용하면 일슐린이 과다 주입될 수 있습니다! 홈화면에 상태 표시등 보여주기 + 캐뉼라 사용 기간 경고 기준 [h] + 캐뉼라 사용 기간 위험 기준 [h] + 인슐린 사용 기간 경고 기준 [h] + 인슐린 사용 기간 위험 기준 [h] + 센서 사용 기간 경고 기준 [h] + 센서 사용 기간 위험 기준 [h] + 배터리 잔량 경고 기준 [%] + 배터리 잔량 위험 기준 [%] + 펌프 배터리 사용 기간 경고 기준 [h] + 펌프 배터리 사용 기간 위험 기준 [h] 주사기량 경고 기준값[U] 주사기량 위험 기준값[U] + 펌프 배터리 잔량 경고 기준 [%] + 펌프 배터리 잔량 위험 기준 [%] + PRED BAS + DEV ACT + -BGI + ABS + DEVSLOPE 버전정보 SMS 권한 누락 전화 상태 권한이 허가되지 않았습니다 + xDrip+ 상태 (워치) + xDrip+ 상태표시라인 (워치) xds BGI 보기 BGI를 상태라인에 추가하기 @@ -348,8 +402,12 @@ 프로파일 변경 실행 센서 인슐린 + 펌프 배터리 나이: + 레벨: 알람 옵션 + NS 알람에서 알림 만들기 + NS 안내에서 알림 만들기 누락 데이터 기준값 [min] 위험 누락 데이터 기준값 [min] autosens 시간 [h] @@ -375,6 +433,7 @@ 취소 모든 프로파일이 로드되지 않았습니다. 값이 저장되지 않았습니다! + 다른 앱 (예: xDrip)으로 데이터 전송을 활성화합니다. AAPS 또는 NSClient를 두 개 이상 설치 한 경우 활성화하지 마세요! Local Broadcasts 활성화하기 OpenAPS SMB UAM 활성화하기 @@ -386,6 +445,7 @@ 사용자지정-피크 Oref 초속효성 Oref 초-초속효성 Oref + Lyumjev DIA %1$f는 너무 짧습니다. 대신 %2$f을 사용하세요! 프로파일 활성화하기 유효하지 않음 @@ -398,6 +458,7 @@ 활동 목표 저혈당 기간 저혈당 목표 + %1$d%%를 %2$dh 동안 재사용하기 워치로 제어하기 임시목표와 관리입력을 워치로 설정합니다. 음식 @@ -411,10 +472,12 @@ 명령을 지금 실행합니다. 혈당 읽기가 누락되었습니다. 경고와 알림시 시스템 알림 사용하기 + 알람과 알림의 소리를 점차적으로 증가시킴 자체 경고 기능 혈당 데이터 누락시 경고하기 펌프와 연결불가시 경고하기 펌프 연결불가 기준시간 [min] + 탄수화물이 요구되는 경우 경고함 긴급 알람 정보 Eversense 앱(패치버전) @@ -422,7 +485,12 @@ 혈당 업로드 설정 델타(혈당증분값) 자세히 보여주기 소수점 자리 추가된 증분값 보여주기 + SMB를 주입하는 빈도 (몇 분마다) SMB가 Basal을 제한할 수 있는 최대 시간(분) + UAM SMB의 최대 기간 (분) + SMB가 UAM에 대해 basal을 제한할 수 있는 최대 시간(분) + 제안을 위한 최소 탄수화물 필요량 + 탄수화물 제안 알림을 보여주는 최소 탄수화물 g수. 이 양보다 적은 경우 탄수화물 제안 알림이 작동하지 않습니다. 혈당 데이터를 xDrip+에 전송하기 xDrip+ 데이터 소스에서 640g/Eversense을 선택하세요 NSClient 혈당 @@ -451,6 +519,7 @@ 임시 목표에서 SMB 사용하기 활성화된 임시 목표(식사직전, 운동)가 있으면 SMB를 사용합니다. 높은 임시 목표에서 SMB 사용하기 + 높은 임시 목표 (운동, 100mg/dl 또는 5.5 mmol/l 초과)가 활성되어 있을 때 SMB 사용하기 인슐린 버튼 xDrip+에 보정값을 전송하거나 G5 보정창을 엽니다. @@ -459,11 +528,17 @@ 버튼을 누를때 추가될 인슐린 양 CGM앱을 실행할 수 없습니다. 앱이 설치되어 있는지 확인하세요. CGM + 5분간 무시하기 + 5분간 무시하기 + 30분간 무시하기 + 필요량 이력 브라우저 SMB 알림 일반 Bolus처럼 워치에 SMB 표시 에러 발생시 알림 생성 + \"필요 탄수화물 경고\"에서 알림 만들기 에러 발생에 대한 Nightscout 알림과 자체 경고를 생성합니다. (케어포털 관리에서도 표시됩니다.) + \"필요한 탄수화물 경고\"를 위해 Nightscout 알림 만들기 워치페이스에서 예측치를 보여줍니다. 예측 데이터선택 @@ -477,8 +552,10 @@ 실제 Bolus 주입않고, 기록만 하기 분류 하위 분류 + Bolus 기록만 하기 (펌프에서 주입되지 않음) 펌프에 의한 SMB 설정 활동 + BG impact 민감도 편차 체내탄수화물양(COB) @@ -556,10 +633,14 @@ NSClient는 Nightscout와의 연결을 처리합니다. 이 부분을 건너뛸 수 있지만 설정하기 전엔 목적을 수행할 수 없습니다. 새로운 인슐린 프로파일은 최소 5시간의 DIA가 요구됩니다. 새로운 프로파일의 DIA 5-6시간은 구식 인슐린 프로파일의 DIA 3시간과 동일합니다. 사용 가능한 알고리즘 중 하나를 선택하세요. 과거부터 최신의 순으로 정렬이 되어 있습니다. 일반적으로 새로운 알고리즘은 보다 강력하고 공격적입니다. 따라서 당신이 신규 사용자라면 최신의 알고리즘보단 AMA로 시작하는것이 나을 수 있습니다. 사용 전에 OpenAPS 문서를 읽어보고 설정하는 것을 잊지마세요. + 하단의 RileyLink를 설정하십시오. RileyLink를 선택한 뒤, RileyLink 상태가 \"연결됨\"이 되고 나면 설정을 계속 할 수 있습니다. 이 작업은 금방 진행됩니다.\n + 참고: 펌프가 한 번 연동되면 계속 설정할 수 있습니다.\n 첫번째 목표를 시작하세요. 권한 권한 요청하기 알림에 대한 시스템 창 권한이 필요합니다 + 어플은 BT scan과 WiFi 식별을 위해 \"위치 허용\"이 요구됩니다. + 어플은 로그 파일 저장과 설정 내보내기를 위해 \"저장공간 허용\"이 요구됩니다. 요청 메뉴 열기 메뉴 닫기 @@ -574,12 +655,17 @@ 낮은 임시목표는 민감도를 내립니다. + 저항성이 목표 낮추기 + 저항성이 감지되면, 목표 혈당을 낮춥니다. + 민감성이 목표 올리기 + 민감성이 감지되면, 목표 혈당을 높입니다. \"AndroidAPS 시작\" 기록 삭제하기 저장된 설정이 있습니다. 주의: 활성화하고 펌프에 연결하게되면, AndroidAPS는 프로파일의 Basal설정을 복사해서 기존에 펌프에 저장되어 있던 Basal설정을 덮어쓰게 될것입니다. AndroidAPS의 Basal설정이 올바른지 반드시 확인하세요. 만약 확실치 않거나 Basal설정을 덮어씌우길 원치않는다면, 취소버튼을 누르고 나중에 다시 연결하세요. 관리 데이터가 불완전합니다 정비 설정 Email + 내보내는 설정을 암호화하기 전송할 로그 수 정비 MAINT @@ -624,6 +710,7 @@ 내부 저장 용량 제한 내부 저장 공간을 최소 %1$d MB 이상 비우세요! Loop가 비활성화되었습니다! 잘못된 형식 + TBR 기간은 %1$d분의 배수가 되어야 하고 0보다 커야 함. 잘못된 코드입니다. 명령이 취소됩니다. 설정되지 않음 프로파일 변경 생성됨 @@ -635,6 +722,8 @@ Dexcom 앱(패치버전) DXCM 패치된 Dexcom 앱에서 혈당값 받기 + COB vs IOB + Bolus 제한이 적용됨: %1$.2f U에서 %2$.2f U으로 !!!!! 느린 탄수화물 흡수 감지: %2$d%% of time. 계산을 다시 확인하십시오. COB를 과대하게 측정하여 더 많은 인슐린이 주입될 수 있습니다 !!!!!]]> Bolus 마법사 결과의 이 부분 주입[%] Bolus 마법사는 계산을 수행하지만 계산된 인슐린의 이 부분만 주입됩니다. SMB 알고리즘에 유용합니다. @@ -661,6 +750,7 @@ 복사 우선 현재 변경사항을을 저장하거나 재설정하세요 현재 프로파일을 삭제 하시겠습니까? + 프로파일에서 새로운 로컬 프로파일을 만드시겠습니까? 프로파일명에 점을 포함하고 있습니다.\n이는 NS에서 지원하지 않습니다.\n프로파일이 NS에 업로드되지 않습니다. 혈당 정상범위의 하한값(표시 전용) 혈당 정상범위의 상한값(표시 전용) @@ -672,6 +762,7 @@ 참고: 이 화면에 보이는 데이터만 익명으로 업로드됩니다. ID는 AndroidAPS 설치에 할당됩니다. 기본 프로파일이 변경되면 데이터를 다시 제출할 수 있지만 어느정도 시간 범위의 결과가 보이도록 최소 1주일 이상 실행하여 주세요. 당신의 도움 감사하겠습니다. 유효하지 않은 나이입니다 유효하지 않은 몸무게입니다 + 유효하지 않은 % 입력 %1$s: Low: %2$02d%% In: %3$02d%% High: %4$02d%%]]> 평균 TIR @@ -683,6 +774,7 @@ BG 도구 계산 표시 + 삭제된 기록 표시 대기열을 삭제하시겠습니까? 대기열에 있는 모든 데이터가 삭제됩니다! 확장 Bolus 기능을 사용하는 동안에는 Closed Loop 모드가 중지됩니다. 정말 원하십니까? 확장 Bolus 사용으로 인해 Closed Loop가 비활성화됨 @@ -693,7 +785,99 @@ 임시 Basal 요청시간 임시 Basal 실행시간 + 인증 어플에서: %1$s 뒤에 PIN + 암호 끝에 더해지는 자동형성 PIN + 부가적인 숫자를 생성되는 일회성 비밀번호 끝에 더하고 기억해야 함. + 인증 설정 + 확인용 code: + OTP + PIN + 유효한 코드는 인증 어플에서 보여지는 6개의 숫자 (OTP) 뒤에 자동형성 PIN의 3개 또는 그 이상의 숫자가 이어져야 함. + 인증 초기화 + 인증 암호 초기화 + 인증 암호를 초기화하는 것이 확실합니까? 현재 설정된 인증 암호를 모두 무효화 시키며, 이들을 모두 다시 설정해야 합니다. + 새로운 인증 암호가 생성되었습니다! 준비된 인증 어플에서 업데이트된 QRCode를 사용하십시오. + OTP 비밀번호 내보내기 + OTP 비밀번호의 클립보드 복사를 원하는 것이 확실합니까?\n\n 이는 인증 어플이 QRCode를 스캐닝하는데 문제가 있을 때, 비밀번호 수동 입력을 원할 때, 또는 공용 어플 사용 시에 하드웨어 OTP 암호 설정을 원할 때에만 필요합니다. + OTP 비밀번호 (Base32 포맷)가 클립보드에 내보내져서 복사되었습니다. 인증 어플 또는 하드웨어 OTP burner에 붙여넣기 하십시오! + 1. 인증어플 설치하기 + 2. AndroidAPS OTP 코드 설정을 위해 code를 스캔하기 + 3. 일회성 비밀번호 테스트 + 인증 초기화 + 각각의 팔로워 폰에 RFC 6238 TOTP 암호를 사용하는 인증 어플을 설치합니다. 대중적인 무료 어플은 다음과 같습니다:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator. + 인증을 초기화함으로써 준비된 인증을 모두 무효화합니다. 이들을 다시 설정해야 합니다. 예측 + 편차 기울기 + 인증 실패 + 인슐린 절대값 + 마스터 비밀번호는 백업 암호 또는 보안 해제를 위해 사용됩니다. 이를 기억하거나 안전한 곳에 저장해두세요. + 현재 마스터 비밀번호 + 상태 등 + NS에서 설정을 복사해오기 + NS 설정(이 존재하는 경우) 복사하기? + 기본 스킨 + 저해상도 스킨 + 버튼을 화면 아래 고정하여 보여주기 + 큰 화면 + 스킨 + 프로파일 비교하기 + 프로파일 보조기 + 기본 프로파일 + 현재 프로파일 + 사용 가능한 프로파일 + 프로파일 종류 + 나이: %1$.0f TDD: %2$.0f U + 나이: %1$.0f TDD: %2$.0f U %3$d%% + 나이: %1$.0f 체중: %2$.0f kg + % basal + DPV 기본 프로파일 + RileyLink 상태: + 필터 + 로컬 프로파일 생성 불가능. 프로파일이 유효하지 않습니다. + 앱이 종료되지 않도록 합니다? + 허용되지 않는 펌프 이벤트가 발생하면 SMS를 보내기 + 허용되지 않는 펌프 기록 + 식사 시간이 되면 알람을 울리기 + %1$d분 뒤 알람 울림 + Bolus advisor + 현재 혈당이 높습니다. 지금 식사를 하기 보다 적절한 혈당이 되도록 기다리는 것을 추천합니다. 교정 bolus를 지금 주입하고 식사할 시간이 되면 알려드릴까요? 이 경우 탄수화물은 기록되지 않으며, 알림을 받으면 wizard를 다시 사용해야 합니다. + Bolus advisor 활성화 + 혈당이 높을 때 wizard 결과 대신 reminder를 사용하여 나중에 식사하기 (pre-bolus) + 식사할 시간입니다! \nBolus wizard를 켜고 다시 계산하십시오. + 식사할 시간 + 충돌 로그 업로드가 작동하지 않습니다. + 그래프 차트 메뉴 + 필터 지우기 + 경향 화살표 + 캐뉼라 + 사용자 항목 + 평소 섭취하는 가장 많은 양의 탄수화물 값을 사용하세요.\n + 긴급 상황에서 사용자에게 연락을 취하기 위해 이 이메일 주소를 충돌 보고에 첨부합니다. 이는 선택사항입니다. + 이메일 주소 + 개인정보 설정 + 어플의 충돌에 대해 통지를 받기 원하는 경우 선택적으로 이메일 주소를 제공할 수 있습니다. 이는 자동 지원 서비스는 아닙니다. 위험 상황에서 개발자들에게 연락이 올 것입니다. + 전체 동기화 됨 교체 + 동기화 + 프로파일, bolus, 탄수화물, 임시 basal이 NS에 업로드 됨 + NS에 데이터 업로드하기 + 프로파일 목록 받기 + NS 프로파일 편집기에서 로컬 프로파일로 프로파일들 동기화하기 + 임시 목표들 받기 + NS 또는 NSClient에서 입력한 임시 목표 수락하기 + 프로파일 변경 받기 + NS 또는 NSClient에서 입력한 프로파일 변경 수락하기 + APS 오프라인 이벤트 받기 + NS 또는 NSClient에서 입력한 APS 오프라인 이벤트 수락하기 + 인슐린 받기 + NS 또는 NSClient에서 입력한 인슐린 수락하기 (주입되지는 않음, IOB에 계산만 됨) + 탄수화물 받기 + NS 또는 NSClient에서 입력한 탄수화물 수락하기 + 처치 이벤트 받기 + NS 또는 NSClient에서 입력한 처치 이벤트 (캐뉼라, 인슐린, 배터리 교체 등) 수락하기 + CGM 데이터 받기/다시 채우기 + NS로부터 CGM 데이터 수락하기 + 직전의 펌프 통신 종료를 기다리는 동안 타임 아웃 + 대기열에 또다른 bolus가 있습니다. 이후에 다시 시도하세요. + 계산 진행 중 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a248a82b14..c6cd5c5c23 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,6 +46,7 @@ ns_temporary_basal_last_synced_id ns_extended_bolus_last_synced_id profile_switch_last_synced_id + ns_effective_profile_switch_last_synced_id ns_offline_event_last_synced_id ns_profile_store_last_synced_timestamp local_profile_last_change diff --git a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.kt b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.kt index 19f7b55364..0e086f2957 100644 --- a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.kt @@ -29,7 +29,7 @@ import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin import info.nightscout.androidaps.plugins.source.GlimpPlugin import info.nightscout.androidaps.utils.HardLimits import info.nightscout.androidaps.utils.Profiler -import info.nightscout.androidaps.utils.buildHelper.BuildHelper +import info.nightscout.androidaps.utils.buildHelper.BuildHelperImpl import info.nightscout.androidaps.utils.buildHelper.ConfigImpl import info.nightscout.androidaps.utils.sharedPreferences.SP import org.junit.Assert @@ -138,7 +138,10 @@ class ConstraintsCheckerTest : TestBaseWithProfile() { insightPlugin = LocalInsightPlugin(injector, aapsLogger, rxBus, resourceHelper, sp, commandQueue, profileFunction, context, ConfigImpl(), dateUtil, insightDbHelper, pumpSync) openAPSSMBPlugin = OpenAPSSMBPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, iobCobCalculator, hardLimits, profiler, sp, dateUtil, repository, glucoseStatusProvider) openAPSAMAPlugin = OpenAPSAMAPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, iobCobCalculator, hardLimits, profiler, fabricPrivacy, dateUtil, repository, glucoseStatusProvider) - safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, BuildHelper(ConfigImpl(), fileListProvider), iobCobCalculator, ConfigImpl(), dateUtil) + safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, + openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, + hardLimits, BuildHelperImpl(ConfigImpl(), fileListProvider), iobCobCalculator, + ConfigImpl(), dateUtil) val constraintsPluginsList = ArrayList() constraintsPluginsList.add(safetyPlugin) constraintsPluginsList.add(objectivesPlugin) diff --git a/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.kt b/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.kt index 53059c931f..1398462b42 100644 --- a/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.kt @@ -12,6 +12,7 @@ import info.nightscout.androidaps.database.AppRepository import info.nightscout.androidaps.database.ValueWrapper import info.nightscout.androidaps.database.entities.Bolus import info.nightscout.androidaps.interfaces.ActivePlugin +import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.interfaces.Constraint import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.interfaces.PumpSync @@ -23,6 +24,7 @@ import info.nightscout.androidaps.queue.commands.* import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.buildHelper.BuildHelper +import info.nightscout.androidaps.utils.buildHelper.BuildHelperImpl import info.nightscout.androidaps.utils.buildHelper.ConfigImpl import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.rx.AapsSchedulers @@ -59,8 +61,10 @@ class CommandQueueTest : TestBaseWithProfile() { buildHelper: BuildHelper, dateUtil: DateUtil, repository: AppRepository, - fabricPrivacy: FabricPrivacy - ) : CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, activePlugin, context, sp, buildHelper, dateUtil, repository, fabricPrivacy) { + fabricPrivacy: FabricPrivacy, + config: Config + ) : CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, + activePlugin, context, sp, buildHelper, dateUtil, repository, fabricPrivacy, config) { override fun notifyAboutNewCommand() {} @@ -96,7 +100,10 @@ class CommandQueueTest : TestBaseWithProfile() { @Before fun prepare() { - commandQueue = CommandQueueMocked(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, activePlugin, context, sp, BuildHelper(ConfigImpl(), fileListProvider), dateUtil, repository, fabricPrivacy) + commandQueue = CommandQueueMocked(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, + constraintChecker, profileFunction, activePlugin, context, sp, + BuildHelperImpl(ConfigImpl(), fileListProvider), dateUtil, repository, + fabricPrivacy, config) testPumpPlugin = TestPumpPlugin(injector) testPumpPlugin.pumpDescription.basalMinimumRate = 0.1 @@ -127,7 +134,10 @@ class CommandQueueTest : TestBaseWithProfile() { @Test fun commandIsPickedUp() { - val commandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, activePlugin, context, sp, BuildHelper(ConfigImpl(), fileListProvider), dateUtil, repository, fabricPrivacy) + val commandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, + constraintChecker, profileFunction, activePlugin, context, sp, + BuildHelperImpl(ConfigImpl(), fileListProvider), dateUtil, repository, + fabricPrivacy, config) // start with empty queue Assert.assertEquals(0, commandQueue.size()) diff --git a/app/src/test/java/info/nightscout/androidaps/queue/QueueThreadTest.kt b/app/src/test/java/info/nightscout/androidaps/queue/QueueThreadTest.kt index 9319ba7a63..7944588efd 100644 --- a/app/src/test/java/info/nightscout/androidaps/queue/QueueThreadTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/queue/QueueThreadTest.kt @@ -15,7 +15,7 @@ import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker import info.nightscout.androidaps.plugins.general.maintenance.PrefFileListProvider import info.nightscout.androidaps.queue.commands.Command import info.nightscout.androidaps.queue.commands.CommandTempBasalAbsolute -import info.nightscout.androidaps.utils.buildHelper.BuildHelper +import info.nightscout.androidaps.utils.buildHelper.BuildHelperImpl import info.nightscout.androidaps.utils.buildHelper.ConfigImpl import info.nightscout.androidaps.utils.sharedPreferences.SP import org.junit.Assert @@ -52,7 +52,11 @@ class QueueThreadTest : TestBaseWithProfile() { @Before fun prepare() { pumpPlugin = TestPumpPlugin(injector) - commandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, activePlugin, context, sp, BuildHelper(ConfigImpl(), fileListProvider), dateUtil, repository, fabricPrivacy) + commandQueue = CommandQueue( + injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, + profileFunction, activePlugin, context, sp, + BuildHelperImpl(ConfigImpl(), fileListProvider), dateUtil, repository, fabricPrivacy, config + ) val pumpDescription = PumpDescription() pumpDescription.basalMinimumRate = 0.1 @@ -69,7 +73,8 @@ class QueueThreadTest : TestBaseWithProfile() { val rateConstraint = Constraint(0.0) Mockito.`when`(constraintChecker.applyBasalConstraints(anyObject(), anyObject())).thenReturn(rateConstraint) val percentageConstraint = Constraint(0) - Mockito.`when`(constraintChecker.applyBasalPercentConstraints(anyObject(), anyObject())).thenReturn(percentageConstraint) + Mockito.`when`(constraintChecker.applyBasalPercentConstraints(anyObject(), anyObject())) + .thenReturn(percentageConstraint) sut = QueueThread(commandQueue, context, aapsLogger, rxBus, activePlugin, resourceHelper, sp) } diff --git a/automation/src/main/res/values-ko-rKR/strings.xml b/automation/src/main/res/values-ko-rKR/strings.xml index 8ae570f554..d6e91aec5b 100644 --- a/automation/src/main/res/values-ko-rKR/strings.xml +++ b/automation/src/main/res/values-ko-rKR/strings.xml @@ -74,6 +74,7 @@ 복사 임시 목표 %1$s 장치에 블루투스 연결 %1$s %2$s + 블루투스 장치에 연결 WiFi SSID %1$s %2$s Autosens %1$s %2$s %% Autosens % diff --git a/build.gradle b/build.gradle index 6adb64a5e9..1ef448fdf1 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { rxkotlin_version = '2.4.0' room_version = '2.3.0' lifecycle_version = '2.3.1' - dagger_version = '2.38.1' + dagger_version = '2.39' coroutinesVersion = '1.4.1' activityVersion = '1.3.1' fragmentktx_version = '1.3.6' @@ -21,7 +21,7 @@ buildscript { preferencektx_version = '1.1.1' commonslang3_version = '3.11' commonscodec_version = '1.15' - jodatime_version = '2.10.11' + jodatime_version = '2.10.12' work_version = '2.5.0' tink_version = '1.5.0' @@ -39,7 +39,6 @@ buildscript { google() mavenCentral() maven { url "https://plugins.gradle.org/m2/" } // jacoco 0.2 - maven { url "https://dl.bintray.com/kotlin/kotlinx" } } dependencies { classpath 'com.android.tools.build:gradle:7.0.2' @@ -52,17 +51,12 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version" classpath 'com.hiya:jacoco-android:0.2' - modules { - module("org.jetbrains.trove4j:trove4j") { - replacedBy("org.jetbrains.intellij.deps:trove4j") - } - } } } plugins { - id "io.gitlab.arturbosch.detekt" version "1.16.0-RC2" - id "org.jlleitschuh.gradle.ktlint" version "10.1.0" + id "io.gitlab.arturbosch.detekt" version "1.18.1" + id "org.jlleitschuh.gradle.ktlint" version "10.2.0" } allprojects { @@ -71,20 +65,6 @@ allprojects { mavenCentral() maven { url "https://maven.google.com" } maven { url 'https://jitpack.io' } - ivy { - url 'https://github.com/' - patternLayout { - artifact '/[organisation]/[module]/archive/[revision].[ext]' - } - } - maven { url 'https://jitpack.io' } - jcenter() { - content { - includeModule("com.google.android", "flexbox") - includeModule("org.jetbrains.trove4j", "trove4j") - } - } - maven { url "https://dl.bintray.com/kotlin/kotlinx" } } //Support @JvmDefault tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { diff --git a/core/src/main/java/info/nightscout/androidaps/activities/DialogAppCompatActivity.kt b/core/src/main/java/info/nightscout/androidaps/activities/DialogAppCompatActivity.kt index 14f941a422..6150a62840 100644 --- a/core/src/main/java/info/nightscout/androidaps/activities/DialogAppCompatActivity.kt +++ b/core/src/main/java/info/nightscout/androidaps/activities/DialogAppCompatActivity.kt @@ -5,7 +5,7 @@ import dagger.android.support.DaggerAppCompatActivity import info.nightscout.androidaps.utils.locale.LocaleHelper open class DialogAppCompatActivity : DaggerAppCompatActivity() { - public override fun attachBaseContext(newBase: Context) { + override fun attachBaseContext(newBase: Context) { super.attachBaseContext(LocaleHelper.wrap(newBase)) } } diff --git a/core/src/main/java/info/nightscout/androidaps/activities/NoSplashAppCompatActivity.kt b/core/src/main/java/info/nightscout/androidaps/activities/NoSplashAppCompatActivity.kt index 78e2e009e3..c8f9888ec6 100644 --- a/core/src/main/java/info/nightscout/androidaps/activities/NoSplashAppCompatActivity.kt +++ b/core/src/main/java/info/nightscout/androidaps/activities/NoSplashAppCompatActivity.kt @@ -7,12 +7,12 @@ import info.nightscout.androidaps.utils.locale.LocaleHelper open class NoSplashAppCompatActivity : DaggerAppCompatActivityWithResult() { - public override fun onCreate(savedInstanceState: Bundle?) { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setTheme(R.style.AppTheme_NoActionBar) } - public override fun attachBaseContext(newBase: Context) { + override fun attachBaseContext(newBase: Context) { super.attachBaseContext(LocaleHelper.wrap(newBase)) } } diff --git a/core/src/main/java/info/nightscout/androidaps/extensions/EffectiveProfileSwitchExtension.kt b/core/src/main/java/info/nightscout/androidaps/extensions/EffectiveProfileSwitchExtension.kt index 65b1396e0c..98a6751798 100644 --- a/core/src/main/java/info/nightscout/androidaps/extensions/EffectiveProfileSwitchExtension.kt +++ b/core/src/main/java/info/nightscout/androidaps/extensions/EffectiveProfileSwitchExtension.kt @@ -1,8 +1,15 @@ package info.nightscout.androidaps.extensions +import info.nightscout.androidaps.data.ProfileSealed +import info.nightscout.androidaps.database.embedments.InterfaceIDs import info.nightscout.androidaps.database.entities.EffectiveProfileSwitch +import info.nightscout.androidaps.database.entities.TherapyEvent +import info.nightscout.androidaps.interfaces.ActivePlugin +import info.nightscout.androidaps.interfaces.GlucoseUnit +import info.nightscout.androidaps.utils.DateUtil +import info.nightscout.androidaps.utils.JsonHelper import info.nightscout.androidaps.utils.T.Companion.mins - +import org.json.JSONObject fun List.isEPSEvent5minBack(time: Long): Boolean { for (event in this) { @@ -15,3 +22,72 @@ fun List.isEPSEvent5minBack(time: Long): Boolean { } return false } + +fun EffectiveProfileSwitch.toJson(isAdd: Boolean, dateUtil: DateUtil): JSONObject = + JSONObject() + .put("created_at", dateUtil.toISOString(timestamp)) + .put("enteredBy", "openaps://" + "AndroidAPS") + .put("isValid", isValid) + .put("eventType", TherapyEvent.Type.NOTE.text) // move to separate collection when available in NS + .put("profileJson", ProfileSealed.EPS(this).toPureNsJson(dateUtil).toString()) + .put("originalProfileName", originalProfileName) + .put("originalCustomizedName", originalCustomizedName) + .put("originalTimeshift", originalTimeshift) + .put("originalPercentage", originalPercentage) + .put("originalDuration", originalDuration) + .put("originalEnd", originalEnd) + .also { + if (interfaceIDs.pumpId != null) it.put("pumpId", interfaceIDs.pumpId) + if (interfaceIDs.pumpType != null) it.put("pumpType", interfaceIDs.pumpType!!.name) + if (interfaceIDs.pumpSerial != null) it.put("pumpSerial", interfaceIDs.pumpSerial) + if (isAdd && interfaceIDs.nightscoutId != null) it.put("_id", interfaceIDs.nightscoutId) + } + +fun effectiveProfileSwitchFromJson(jsonObject: JSONObject, dateUtil: DateUtil, activePlugin: ActivePlugin): EffectiveProfileSwitch? { + val timestamp = JsonHelper.safeGetLongAllowNull(jsonObject, "mills", null) ?: return null + val originalTimeshift = JsonHelper.safeGetLong(jsonObject, "originalTimeshift") + val originalDuration = JsonHelper.safeGetLong(jsonObject, "originalDuration") + val originalEnd = JsonHelper.safeGetLong(jsonObject, "originalEnd") + val originalPercentage = JsonHelper.safeGetInt(jsonObject, "originalPercentage", 100) + val isValid = JsonHelper.safeGetBoolean(jsonObject, "isValid", true) + val id = JsonHelper.safeGetStringAllowNull(jsonObject, "_id", null) + val originalProfileName = JsonHelper.safeGetStringAllowNull(jsonObject, "originalProfileName", null) ?: return null + val originalCustomizedName = JsonHelper.safeGetStringAllowNull(jsonObject, "originalCustomizedName", null) ?: return null + val profileJson = JsonHelper.safeGetStringAllowNull(jsonObject, "profileJson", null) ?: return null + val pumpId = JsonHelper.safeGetLongAllowNull(jsonObject, "pumpId", null) + val pumpType = InterfaceIDs.PumpType.fromString(JsonHelper.safeGetStringAllowNull(jsonObject, "pumpType", null)) + val pumpSerial = JsonHelper.safeGetStringAllowNull(jsonObject, "pumpSerial", null) + + if (timestamp == 0L) return null + val pureProfile = pureProfileFromJson(JSONObject(profileJson), dateUtil) ?: return null + val profileSealed = ProfileSealed.Pure(pureProfile) + + + return EffectiveProfileSwitch( + timestamp = timestamp, + basalBlocks = profileSealed.basalBlocks, + isfBlocks = profileSealed.isfBlocks, + icBlocks = profileSealed.icBlocks, + targetBlocks = profileSealed.targetBlocks, + glucoseUnit = EffectiveProfileSwitch.GlucoseUnit.fromConstant(profileSealed.units), + originalProfileName = originalProfileName, + originalCustomizedName = originalCustomizedName, + originalTimeshift = originalTimeshift, + originalPercentage = originalPercentage, + originalDuration = originalDuration, + originalEnd = originalEnd, + insulinConfiguration = profileSealed.insulinConfiguration, + isValid = isValid + ).also { + it.interfaceIDs.nightscoutId = id + it.interfaceIDs.pumpId = pumpId + it.interfaceIDs.pumpType = pumpType + it.interfaceIDs.pumpSerial = pumpSerial + } +} + +fun EffectiveProfileSwitch.GlucoseUnit.Companion.fromConstant(units: GlucoseUnit): EffectiveProfileSwitch.GlucoseUnit = + if (units == GlucoseUnit.MGDL) EffectiveProfileSwitch.GlucoseUnit.MGDL + else EffectiveProfileSwitch.GlucoseUnit.MMOL + +fun JSONObject.isEffectiveProfileSwitch() = has("originalProfileName") \ No newline at end of file diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/DataSyncSelector.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/DataSyncSelector.kt index 83f9e5e7bb..168a51c97e 100644 --- a/core/src/main/java/info/nightscout/androidaps/interfaces/DataSyncSelector.kt +++ b/core/src/main/java/info/nightscout/androidaps/interfaces/DataSyncSelector.kt @@ -16,6 +16,7 @@ interface DataSyncSelector { data class PairTemporaryBasal(val value: TemporaryBasal, val updateRecordId: Long) data class PairExtendedBolus(val value: ExtendedBolus, val updateRecordId: Long) data class PairProfileSwitch(val value: ProfileSwitch, val updateRecordId: Long) + data class PairEffectiveProfileSwitch(val value: EffectiveProfileSwitch, val updateRecordId: Long) data class PairOfflineEvent(val value: OfflineEvent, val updateRecordId: Long) data class PairProfileStore(val value: JSONObject, val timestampSync: Long) @@ -78,6 +79,11 @@ interface DataSyncSelector { // Until NS v3 fun processChangedProfileSwitchesCompat(): Boolean + fun confirmLastEffectiveProfileSwitchIdIfGreater(lastSynced: Long) + fun changedEffectiveProfileSwitch() : List + // Until NS v3 + fun processChangedEffectiveProfileSwitchesCompat(): Boolean + fun confirmLastOfflineEventIdIfGreater(lastSynced: Long) fun changedOfflineEvents() : List // Until NS v3 diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/PumpSync.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/PumpSync.kt index e7c606e458..cc14666dac 100644 --- a/core/src/main/java/info/nightscout/androidaps/interfaces/PumpSync.kt +++ b/core/src/main/java/info/nightscout/androidaps/interfaces/PumpSync.kt @@ -449,4 +449,4 @@ interface PumpSync { fun createOrUpdateTotalDailyDose(timestamp: Long, bolusAmount: Double, basalAmount: Double, totalAmount: Double, pumpId: Long?, pumpType: PumpType, pumpSerial: String): Boolean -} +} \ No newline at end of file diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/activities/PrefImportListActivity.kt b/core/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/activities/PrefImportListActivity.kt index 9e29f529f9..9a8f8a588b 100644 --- a/core/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/activities/PrefImportListActivity.kt +++ b/core/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/activities/PrefImportListActivity.kt @@ -127,7 +127,7 @@ class PrefImportListActivity : DaggerAppCompatActivity() { return false } - public override fun attachBaseContext(newBase: Context) { + override fun attachBaseContext(newBase: Context) { super.attachBaseContext(LocaleHelper.wrap(newBase)) } } \ No newline at end of file diff --git a/core/src/main/res/values-de-rDE/strings.xml b/core/src/main/res/values-de-rDE/strings.xml index 1ad829543c..d5b5d2adb6 100644 --- a/core/src/main/res/values-de-rDE/strings.xml +++ b/core/src/main/res/values-de-rDE/strings.xml @@ -316,6 +316,7 @@ VERBINDUNG TRENNEN FORTFAHREN UNTERBRECHEN + HW PUMPE ERLAUBT PAIRING SCHLÜSSEL LÖSCHEN TEMP BASAL AKZEPTIEREN TEMP BASAL ABBRECHEN @@ -332,22 +333,57 @@ PROFILWECHSEL NIGHTSCOUT AKTUALISIEREN BEHANDLUNGEN NIGHTSCOUT AKTUALISIEREN TEMP. ZIEL NS AKTUALISIEREN + AUTOMATION ENTFERNT + BZ ENTFERNT + CAREPORTAL ENTFERNT BOLUS ENTFERNT KOHLENHYDRATE ENTFERNT TEMP BASAL ENTFERNT + VERZÖGERTER BOLUS ENTFERNT NAHRUNG + LEBENSMITTEL ENTFERNT + PROFIL ENTFERNT + PROFILWECHSEL ENTFERNT + NEUSTARTS ENTFERNT + BEHANDLUNGEN ENTFERNT TEMP ZIEL ENTFERNT + NS PAUSIERT + NS NEUSTART + NS WARTESCHLANGE GELÖSCHT + NS EINSTELLUNGEN KOPIERT + WARNMELDUNG OK + WARNMELDUNGEN STUMM + WARNMELDUNGEN STUMM 5 MIN + OBJECTIVE GESTARTET + OBJECTIVE NICHT GESTARTET + OBJECTIVES ÜBERSPRUNGEN + STATISTIKEN ZURÜCKGESETZT + LOGS LÖSCHEN + BEHANDLUNGEN IN DER ZUKUNFT ENTFERNEN + EINSTELLUNGEN EXPORTIEREN + EINSTELLUNGEN IMPORTIEREN + DATENBANK ZURÜCKSETZEN + DATENBANK EXPORTIEREN + DATENBANK IMPORTIEREN + OTP EXPORT + OTP ZURÜCKSETZEN STOP SMS + BENUTZEREINTRÄGE EXPORTIEREN STARTE AAPS AAPS BEENDEN PLUGIN AKTIVIERT PLUGIN DEAKTIVIERT + UNBEKANNT Zeichenfolge Quelle UTC-Abstand Aktion Zeitstempel Keine Einheit + Benutzereinträge nach Excel exportieren (csv) + LOOP GEÄNDERT + LOOP ENTFERNT + ANDERE Profil unteres Ziel Profil oberes Ziel @@ -361,6 +397,8 @@ Profil KH-Faktor %1$.2f limitiert auf %2$.2f »%1$s« ist außerhalb der fest programmierten Grenzen + »%1$s« %2$.2f ist außerhalb der fest programmierten Grenzen + Basal-Wert %1$d Tag %1$d Tage diff --git a/core/src/main/res/values-ko-rKR/strings.xml b/core/src/main/res/values-ko-rKR/strings.xml index 38e95bbb57..b86cec36ae 100644 --- a/core/src/main/res/values-ko-rKR/strings.xml +++ b/core/src/main/res/values-ko-rKR/strings.xml @@ -9,8 +9,10 @@ Basal 프로파일이 펌프에 업데이트 되었습니다 사용할수 없는 입력 데이터 임시Basal 주입 에러 + %1$.2f U을 주입합니다. 펌프를 기다리는 중 %1$d 초 동안 연결중 + %1$.2f U 주입 중 통신 확인 연결중 연결됨 @@ -19,6 +21,8 @@ AndroidAPS 시작 %1$.1f U %1$.2f U + %1$+.2f U + %1$d g %1$.0f / %2$d U %1$.2f U/h %1$.2f 시간 @@ -59,6 +63,7 @@ mg/dl mmol/l g + % 고급 설정 블루투스 블루투스 감시기능 @@ -67,6 +72,7 @@ 아니오 제한으로 인해 LOOP가 사용불가합니다. + Bolus %1$.2f U이 성공적으로 주입되었습니다. 펌프에서 유효한 Basal양을 읽을 수 없습니다. %2$s로 인해 최대 IOB가 %1$.1f U로 제한됩니다. @@ -93,10 +99,12 @@ 이름: 시간 와이파이 SSID + 로딩 중 … 이벤트 시간 노트 삭제 새로 추가 + 다른 펌프에서 전송된 데이터. 펌프 상태 재설정을 위해 펌프 드라이버를 바꾸세요. %2$s로 인해 최대 Basal양이 %1$.2f U/h으로 제한됩니다. 펌프 제한 @@ -112,10 +120,13 @@ 무시 BLE(블루투스 저전력) 지원되지 않음 + 저전력 블루투스(BLE)가 작동하지 않거나, 기기가 연동되지 않았습니다. 블루투스가 활성화되지 않았습니다. 위치가 활성화되지 않았습니다. 최신 스마트폰에서 블루투스 검색이 작동하려면 위치가 활성화되어 있어야합니다. AAPS는 당신의 위치를 추적하지 않으며 페어링에 성공한 후 비활성화 할 수 있습니다. + %1$d 분 전 + %1$.1f 시간 전 시간 시간 @@ -133,6 +144,7 @@ 잘못된 비밀번호 + 비밀번호가 일치하지 않습니다. Basal값이 시간단위로 설정되지 않았습니다: %1$s 지원되는 최소값으로 Basal값이 대체되었습니다:%1$s @@ -155,9 +167,14 @@ 유효하지 않은 프로파일: %1$s + %1$d 분 + %1$s: ∑: %2$.2f U Bol: %3$.2f U Bas: %4$.2f U(%5$.0f%%)]]> + %1$s: ∑: %2$.2f U Bol: %3$.2f U Bas: %4$.2f U(%5$.0f%%) Carbs: %6$.0f g]]> + %3$d 일
%1$s: %2$s]]>
혈당 체크 + 수동 BG 값 입력 또는 보정 알림 노트 의문 @@ -165,6 +182,8 @@ 펌프 위치 변경 CGM 센서 삽입 CGM 센서 시작 + CGM 센서 정지 + D.A.D 경고 인슐린 카트리지 교체 프로파일 변경 간식Bolus @@ -191,6 +210,8 @@ 사용자 정의 펌프 Loop + NS + 기록 연결시간초과 @@ -204,7 +225,9 @@ 결과 기다리는 중 SMB + %2$d 분 안에 %1$d g의 추가적인 탄수화물이 요구됨 + 통계 누적 일총량 지수가중 일총량 Basal @@ -219,13 +242,43 @@ 총기초량 * 2 시간 감지 + %1$d시 %2$d분 + 5분 동안 음소거 + 파일 형식 + 생성 일자 + AAPS 버전 + 다른 형식 빌드 + 장치의 환자 이름 내보내기 + 장치 모델 내보내기 + 파일 암호화 + 오래된 내보내기 형식 + 암호화된 새로운 형식 + 오류가 제거된 새로운 형식 (암호화되지 않음) + 알려지지 않은 내보내기 형식 + %1$s 전에 내보내기 함 + %1$s에 내보내기 함 + 내보내기 한지 1시간이 지나지 않았습니다. + 디렉토리: %1$s 가져올 파일을 선택하세요. 환경설정은 AAPS (%1$s) 와는 다르게 생성되기 때문에 불러오는 도중 일부 설정이 누락되거나 설정이 되지 않을 수 있습니다. - 가져오기를 수행한 후 설정을 확인하고 업데이트 해주시기 바랍니다. 환경설정은 다른 기기에서 설정되었습니다. 다른 혹은 전에 쓰던 기기에서 환경설정을 가져오는 건 괜찮지만 가져온 후 환경설정이 올바르게 설정되었는지 확인해주시기 바랍니다. 이전 버전의 AAPS에서 사용하는 구식 legacy 포멧은 안전하지 않습니다. 최근에 내보내기한 설정이 없는 경우에만 최후의 수단으로 JSONㅠ포멧을 사용해주시기 바랍니다. 가져온 환경설정은 이미 %1$s일이 지났습니다. 최신의 환경설정으로 업데이트된 파일이 있거나 잘못된 파일을 선택하셨을 수도 있습니다. 환경설정을 정기적으로 내보주시기 바랍니다. 잘못된 날짜 형식입니다. + 다른 하위 버전 어플의 설정입니다. 업그레이드 후에 설정을 불러오는 것은 괜찮지만, 설정이 올바른지 확인하십시오! + 다른 상위 버전 어플의 설정입니다. 상위 버전은 매우 상이하며, 호환되지 않는 설정일 수 있습니다! 설정을 불러온 후 올바른지 반드시 확인하십시오! + 설정 파일 변경됨 + 설정 파일 안전함 + 안전하지 않음, 암호화되지 않은 설정 형식 + JSON 형식 에러, 필요 영역 손실됨 (형식, 내용, 메타데이터, 또는 보안) + 암호 해독 에러, 입력한 비빌번호가 파일을 열 수 없습니다. + 파일의 checksum (hash) 손실됨, 설정의 진위를 확인할 수 없습니다. + 내보내기 후 파일이 변형되었습니다! + 해독 에러, 파싱 설정 실패함! + 해독 에러, 입력한 비밀번호가 유효하지 않거나 설정 파일이 수정되었습니다. 가져온 파일이 다른 마스터 비밀번호로 내보내기 되었을 가능성이 있습니다. + 암호화 설정이 누락되었음, 설정 형식이 유효하지 않습니다! + 지원되지 않는 또는 명시되지 않은 암호화 알고리즘! 서명 확인 유효하지 않은 버전을 이용 중입니다. Loop가 비활성화 되었습니다! @@ -233,9 +286,119 @@ 폰을 재부팅하거나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그 기록이 되지 않습니다.(알고리즘이 정상적인 작동하는지 확인하기 위해 로그가 필요합니다.)! + + + + + + + + Bolus + Bolus 어드바이저 + 확장 bolus + Superbolus TBR + 탄수화물 + 확장 탄수화물 + 임시 basal + 임시 목표 + 새로운 프로파일 + 프로파일 복사 + 프로파일 저장 + 프로파일 변경 + 프로파일 변경 복사됨 + Closed loop 모드 + LGS loop 모드 + Open loop 모드 + Loop 사용하지 않음 + Loop 사용함 + 재연결 + 연결 끊기 + 재시작 + 일시 정지 + HW 펌프 허가됨 + 연동 비밀번호 삭제 + 임시 basal 수락 + 임시 basal 취소 + Bolus 취소 + 확장 bolus 취소 + 임시 목표 취소 + 케어포털 + 삽입 위치 변경 + 펌프 주사기 변경 + 보정 + 프라임 bolus + 처치 + 케어포털 NS 새로고침 + 프로파일 변경 NS 새로고침 + 처치 NS 새로고침 + 임시 목표 NS 새로고침 + 자동화 제거됨 + 혈당 제거됨 + 케어포털 제거됨 + bolus 제거됨 + 탄수화물 제거됨 + 임시 basal 제거됨 + 확장 bolus 제거됨 + 음식 + 음식 제거됨 + 프로파일 제거됨 + 프로파일 변경 제거됨 + 재시작 이벤트 제거됨 + 처치 제거됨 + 임시 목표 제거됨 + NS 정지 + NS 재시작 + NS 대기열 제거함 + NS 설정 복사됨 + 에러 대화상자 확인 + 에러 대화상자 음소거 + 에러 대화상자 5분간 음소거 + 목표 시작됨 + 목표 시작되지 않음 + 목표를 건너뜀 + 통계 재설정 + 로그 지우기 + 이후의 처치 지우기 + 설정 내보내기 + 설정 들여오기 + 데이터베이스 재설정 + 데이터베이스 내보내기 + 데이터베이스 들여오기 + OTP 내보내기 + OPT 재설정 + SMS 중지 + 사용자 항목 내보내기 + AAPS 시작하기 + AAPS 나가기 + 플러그인 활성화됨 + 플러그인 비활성화됨 + 알 수 없음 + 문자열 + 소스 + UTC 오프셋 실행 + 시간 기록 + Unit 없음 + 사용자 항목 엑셀 파일로 내보내기 (csv) + Loop 변경됨 + Loop 제거됨 + 기타 + 프로파일 저혈당 목표 + 프로파일 고혈당 목표 + 임시 목표 최저값 + 임시 목표 최고값 + 임시 목표 수치 + 프로파일 DIA 값 + 프로파일 민감도 값 + 프로파일의 최대 basal 값 + 현재 basal 값 + 프로파일의 탄수화물 비율 값 + %1$.2f은 %2$.2f까지 제한됨 + »%1$s«이 \'고정된 한계값\'을 벗어났습니다. + »%1$s« %2$.2f이 \'고정된 한계값\'을 벗어났습니다. + Basal 값 %1$d 일 diff --git a/core/src/main/res/values-ko-rKR/validator.xml b/core/src/main/res/values-ko-rKR/validator.xml index 64e4675402..f7ba8f1061 100644 --- a/core/src/main/res/values-ko-rKR/validator.xml +++ b/core/src/main/res/values-ko-rKR/validator.xml @@ -2,6 +2,23 @@ 숫자만 입력가능합니다. 이 범위(%1$s - %2$s)안에 해당하는 숫자만 입력가능합니다. + 이 영역은 특수 문자를 입력할 수 없습니다 + 표준 문자만 입력 가능합니다. 필수 입력 항목입니다. + 유효하지 않은 이메일 주소 + 신용 카드 번호가 유효하지 않습니다. 폰번호가 유효하지 않습니다 + 유효하지 않은 도메인 이름 + 유효하지 않은 IP 주소 + Web URL이 유효하지 않습니다. + 유효하지 않은 성 또는 이름 + 유효하지 않은 이름 + 유효하지 않은 형식 + 4자리 숫자이어야 함 + 6자리 숫자이어야 함 + ABCDEF0123456789로 구성된 12자리 문자이어야 함 + ABCDEF083456789로 구성된 8자리 문자이어야 함 + ABCDEF043456789로 구성된 4자리 문자이어야 함 + 최소 길이가 안됨 + 비밀번호는 똑같은 숫자나 연속된 숫자를 제외한 3~6자리 숫자이어야 함 diff --git a/dana/src/main/res/values-de-rDE/strings.xml b/dana/src/main/res/values-de-rDE/strings.xml index c6b0d17822..07b1afd24a 100644 --- a/dana/src/main/res/values-de-rDE/strings.xml +++ b/dana/src/main/res/values-de-rDE/strings.xml @@ -5,7 +5,9 @@ Pairing OK Zeitüberschreitung beim Pairing Auf Verbindung warten + Dana-i/RS Dana + Pumpen-Integration für Dana Diabecare RS und Dana-i Pumpen Max. Bolus überschritten Fehler bei Befehl Geschwindigkeits-Fehler 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 a73ea6b675..896f456d68 100644 --- a/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt +++ b/danars/src/main/java/info/nightscout/androidaps/danars/DanaRSPlugin.kt @@ -439,7 +439,7 @@ class DanaRSPlugin @Inject constructor( result.enacted = false result.success = false result.comment = resourceHelper.gs(R.string.tempbasaldeliveryerror) - aapsLogger.error("setTempBasalPercent: Failed to set temp basal") + aapsLogger.error("setTempBasalPercent: Failed to set temp basal. connectionOK: $connectionOK isTempBasalInProgress: ${danaPump.isTempBasalInProgress} tempBasalPercent: ${danaPump.tempBasalPercent}") return result } 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 ab5d1e13a0..b740eaa1d7 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 @@ -376,6 +376,7 @@ class DanaRSService : DaggerService() { sendMessage(msgTBR) loadEvents() val tbr = pumpSync.expectedPumpState().temporaryBasal + aapsLogger.debug(LTag.PUMPCOMM, "Expected TBR found: $tbr") danaPump.fromTemporaryBasal(tbr) rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING)) return msgTBR.success() diff --git a/database/src/main/java/info/nightscout/androidaps/database/AppRepository.kt b/database/src/main/java/info/nightscout/androidaps/database/AppRepository.kt index eaab40563d..6654bd1377 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/AppRepository.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/AppRepository.kt @@ -17,8 +17,7 @@ import javax.inject.Singleton import kotlin.math.roundToInt @OpenForTesting -@Singleton -open class AppRepository @Inject internal constructor( +@Singleton class AppRepository @Inject internal constructor( internal val database: AppDatabase ) { @@ -263,6 +262,10 @@ open class AppRepository @Inject internal constructor( } } + fun getModifiedEffectiveProfileSwitchDataFromId(lastId: Long): Single> = + database.effectiveProfileSwitchDao.getModifiedFrom(lastId) + .subscribeOn(Schedulers.io()) + fun createEffectiveProfileSwitch(profileSwitch: EffectiveProfileSwitch) { database.effectiveProfileSwitchDao.insert(profileSwitch) } @@ -485,7 +488,7 @@ open class AppRepository @Inject internal constructor( private fun Single>.expand() = this.map { it.map(::expandCarbs).flatten() } private fun Single>.filterOutExtended() = this.map { it.filter { c -> c.duration == 0L } } private fun Single>.fromTo(from: Long, to: Long) = this.map { it.filter { c -> c.timestamp in from..to } } - private fun Single>.until(to: Long) = this.map { it.filter { c -> c.timestamp <= to } } + private infix fun Single>.until(to: Long) = this.map { it.filter { c -> c.timestamp <= to } } private fun Single>.from(start: Long) = this.map { it.filter { c -> c.timestamp >= start } } private fun Single>.sort() = this.map { it.sortedBy { c -> c.timestamp } } diff --git a/database/src/main/java/info/nightscout/androidaps/database/daos/EffectiveProfileSwitchDao.kt b/database/src/main/java/info/nightscout/androidaps/database/daos/EffectiveProfileSwitchDao.kt index db5c4c1134..a6db4442c1 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/daos/EffectiveProfileSwitchDao.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/daos/EffectiveProfileSwitchDao.kt @@ -2,9 +2,7 @@ package info.nightscout.androidaps.database.daos import androidx.room.Dao import androidx.room.Query -import info.nightscout.androidaps.database.TABLE_CARBS import info.nightscout.androidaps.database.TABLE_EFFECTIVE_PROFILE_SWITCHES -import info.nightscout.androidaps.database.entities.Carbs import info.nightscout.androidaps.database.entities.EffectiveProfileSwitch import io.reactivex.Maybe import io.reactivex.Single @@ -22,6 +20,12 @@ internal interface EffectiveProfileSwitchDao : TraceableDao + @Query("SELECT * FROM $TABLE_EFFECTIVE_PROFILE_SWITCHES WHERE timestamp = :timestamp AND referenceId IS NULL") + fun findByTimestamp(timestamp: Long): EffectiveProfileSwitch? + + @Query("SELECT * FROM $TABLE_EFFECTIVE_PROFILE_SWITCHES WHERE nightscoutId = :nsId AND referenceId IS NULL") + fun findByNSId(nsId: String): EffectiveProfileSwitch? + @Query("SELECT * FROM $TABLE_EFFECTIVE_PROFILE_SWITCHES WHERE isValid = 1 AND referenceId IS NULL ORDER BY id ASC LIMIT 1") fun getOldestEffectiveProfileSwitchRecord(): EffectiveProfileSwitch? diff --git a/database/src/main/java/info/nightscout/androidaps/database/daos/ProfileSwitchDao.kt b/database/src/main/java/info/nightscout/androidaps/database/daos/ProfileSwitchDao.kt index da390174d9..14ab01da4d 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/daos/ProfileSwitchDao.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/daos/ProfileSwitchDao.kt @@ -2,11 +2,9 @@ package info.nightscout.androidaps.database.daos import androidx.room.Dao import androidx.room.Query -import info.nightscout.androidaps.database.TABLE_GLUCOSE_VALUES import info.nightscout.androidaps.database.TABLE_PROFILE_SWITCHES import info.nightscout.androidaps.database.daos.workaround.ProfileSwitchDaoWorkaround import info.nightscout.androidaps.database.data.checkSanity -import info.nightscout.androidaps.database.entities.GlucoseValue import info.nightscout.androidaps.database.entities.ProfileSwitch import io.reactivex.Maybe import io.reactivex.Single diff --git a/database/src/main/java/info/nightscout/androidaps/database/entities/EffectiveProfileSwitch.kt b/database/src/main/java/info/nightscout/androidaps/database/entities/EffectiveProfileSwitch.kt index 7a2285831e..a7ff14eb64 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/entities/EffectiveProfileSwitch.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/entities/EffectiveProfileSwitch.kt @@ -54,6 +54,8 @@ data class EffectiveProfileSwitch( enum class GlucoseUnit { MGDL, - MMOL + MMOL; + + companion object } } \ No newline at end of file diff --git a/database/src/main/java/info/nightscout/androidaps/database/entities/UserEntry.kt b/database/src/main/java/info/nightscout/androidaps/database/entities/UserEntry.kt index 4b2b56d019..e7a753713a 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/entities/UserEntry.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/entities/UserEntry.kt @@ -21,7 +21,7 @@ data class UserEntry( var action: Action, var source: Sources, var note: String, - var values: List + var values: List<@JvmSuppressWildcards ValueWithUnit?> ) : DBEntry, DBEntryWithTime { enum class Action (val colorGroup: ColorGroup) { BOLUS (ColorGroup.InsulinTreatment), diff --git a/database/src/main/java/info/nightscout/androidaps/database/transactions/SyncNsEffectiveProfileSwitchTransaction.kt b/database/src/main/java/info/nightscout/androidaps/database/transactions/SyncNsEffectiveProfileSwitchTransaction.kt new file mode 100644 index 0000000000..fd7eced13c --- /dev/null +++ b/database/src/main/java/info/nightscout/androidaps/database/transactions/SyncNsEffectiveProfileSwitchTransaction.kt @@ -0,0 +1,51 @@ +package info.nightscout.androidaps.database.transactions + +import info.nightscout.androidaps.database.entities.EffectiveProfileSwitch + +/** + * Sync the EffectiveProfileSwitch from NS + */ +class SyncNsEffectiveProfileSwitchTransaction(private val effectiveProfileSwitch: EffectiveProfileSwitch, private val invalidateByNsOnly: Boolean) : Transaction() { + + override fun run(): TransactionResult { + val result = TransactionResult() + + val current: EffectiveProfileSwitch? = + effectiveProfileSwitch.interfaceIDs.nightscoutId?.let { + database.effectiveProfileSwitchDao.findByNSId(it) + } + + if (current != null) { + // nsId exists, allow only invalidation + if (current.isValid && !effectiveProfileSwitch.isValid) { + current.isValid = false + database.effectiveProfileSwitchDao.updateExistingEntry(current) + result.invalidated.add(current) + } + return result + } + + if (invalidateByNsOnly) return result + + // not known nsId + val existing = database.effectiveProfileSwitchDao.findByTimestamp(effectiveProfileSwitch.timestamp) + if (existing != null && existing.interfaceIDs.nightscoutId == null) { + // the same record, update nsId only + existing.interfaceIDs.nightscoutId = effectiveProfileSwitch.interfaceIDs.nightscoutId + existing.isValid = effectiveProfileSwitch.isValid + database.effectiveProfileSwitchDao.updateExistingEntry(existing) + result.updatedNsId.add(existing) + } else { + database.effectiveProfileSwitchDao.insertNewEntry(effectiveProfileSwitch) + result.inserted.add(effectiveProfileSwitch) + } + return result + } + + class TransactionResult { + + val updatedNsId = mutableListOf() + val inserted = mutableListOf() + val invalidated = mutableListOf() + } +} \ No newline at end of file diff --git a/database/src/main/java/info/nightscout/androidaps/database/transactions/UpdateNsIdEffectiveProfileSwitchTransaction.kt b/database/src/main/java/info/nightscout/androidaps/database/transactions/UpdateNsIdEffectiveProfileSwitchTransaction.kt new file mode 100644 index 0000000000..027bf61b3a --- /dev/null +++ b/database/src/main/java/info/nightscout/androidaps/database/transactions/UpdateNsIdEffectiveProfileSwitchTransaction.kt @@ -0,0 +1,14 @@ +package info.nightscout.androidaps.database.transactions + +import info.nightscout.androidaps.database.entities.EffectiveProfileSwitch + +class UpdateNsIdEffectiveProfileSwitchTransaction(val effectiveProfileSwitch: EffectiveProfileSwitch) : Transaction() { + + override fun run() { + val current = database.effectiveProfileSwitchDao.findById(effectiveProfileSwitch.id) + if (current != null && current.interfaceIDs.nightscoutId != effectiveProfileSwitch.interfaceIDs.nightscoutId) { + current.interfaceIDs.nightscoutId = effectiveProfileSwitch.interfaceIDs.nightscoutId + database.effectiveProfileSwitchDao.updateExistingEntry(current) + } + } +} \ No newline at end of file diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/AppConfirmSettingPacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/AppConfirmSettingPacket.kt index d0805f6a5f..081362f1c6 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/AppConfirmSettingPacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/AppConfirmSettingPacket.kt @@ -22,7 +22,7 @@ class AppConfirmSettingPacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) buffer.put(reqMsgType) // 명령코드 buffer.putInt(otp) // 응답시 전달받은 opt (random 6digit numbner) diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/BasalLimitInquirePacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/BasalLimitInquirePacket.kt index 36a484cf4a..5dc1860e03 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/BasalLimitInquirePacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/BasalLimitInquirePacket.kt @@ -20,7 +20,7 @@ class BasalLimitInquirePacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) return suffixEncode(buffer) } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/BasalPauseSettingPacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/BasalPauseSettingPacket.kt index 69c88187e9..e0557dd9ca 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/BasalPauseSettingPacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/BasalPauseSettingPacket.kt @@ -21,7 +21,7 @@ class BasalPauseSettingPacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) buffer.put(status.toByte()) // (1:pause, 2: cancel pause) return suffixEncode(buffer) } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/DisplayTimeInquirePacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/DisplayTimeInquirePacket.kt index 9c0692ab45..3d9f9d2769 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/DisplayTimeInquirePacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/DisplayTimeInquirePacket.kt @@ -20,7 +20,7 @@ class DisplayTimeInquirePacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) return suffixEncode(buffer) } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionBasalSettingPacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionBasalSettingPacket.kt index 4e9cbf546b..a912b284d7 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionBasalSettingPacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionBasalSettingPacket.kt @@ -20,7 +20,7 @@ class InjectionBasalSettingPacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) buffer.put(pattern.toByte()) return suffixEncode(buffer) } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionMealSettingPacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionMealSettingPacket.kt index ed901b9187..5460a2de20 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionMealSettingPacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionMealSettingPacket.kt @@ -21,7 +21,7 @@ class InjectionMealSettingPacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) buffer.putShort(amount.toShort()) buffer.putLong(bcDttm) return suffixEncode(buffer) diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionSnackSettingPacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionSnackSettingPacket.kt index 5312aa348e..a3b80bba6a 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionSnackSettingPacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/InjectionSnackSettingPacket.kt @@ -20,7 +20,7 @@ class InjectionSnackSettingPacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) buffer.putShort(amount.toShort()) return suffixEncode(buffer) } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/LanguageInquirePacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/LanguageInquirePacket.kt index 7bca3e499b..d727abd40f 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/LanguageInquirePacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/LanguageInquirePacket.kt @@ -20,7 +20,7 @@ class LanguageInquirePacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) return suffixEncode(buffer) } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/SneckLimitInquirePacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/SneckLimitInquirePacket.kt index 983887eccb..d4357b1554 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/SneckLimitInquirePacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/SneckLimitInquirePacket.kt @@ -20,7 +20,7 @@ class SneckLimitInquirePacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) return suffixEncode(buffer) } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/SoundInquirePacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/SoundInquirePacket.kt index 790523aff9..883fc8b283 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/SoundInquirePacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/SoundInquirePacket.kt @@ -20,7 +20,7 @@ class SoundInquirePacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) return suffixEncode(buffer) } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeInquirePacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeInquirePacket.kt index 722e2030d2..2491bea781 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeInquirePacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeInquirePacket.kt @@ -20,7 +20,7 @@ class TimeInquirePacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) return suffixEncode(buffer) } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeInquireResponsePacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeInquireResponsePacket.kt index 86b1f3befd..0e9436718d 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeInquireResponsePacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeInquireResponsePacket.kt @@ -31,7 +31,7 @@ class TimeInquireResponsePacket( val result2 = getByteToInt(bufferData) if(!isSuccInquireResponseResult(result2)) { failed = true - return; + return } } diff --git a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeSettingPacket.kt b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeSettingPacket.kt index ad158bb211..b67b96c623 100644 --- a/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeSettingPacket.kt +++ b/diaconn/src/main/java/info/nightscout/androidaps/diaconn/packet/TimeSettingPacket.kt @@ -25,7 +25,7 @@ class TimeSettingPacket( } override fun encode(msgSeq:Int): ByteArray { - val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END); + val buffer = prefixEncode(msgType, msgSeq, MSG_CON_END) val date = DateTime(time).withZone(DateTimeZone.UTC) buffer.put((date.year - 2000 and 0xff).toByte()) buffer.put((date.monthOfYear and 0xff).toByte()) diff --git a/diaconn/src/main/res/values-de-rDE/strings.xml b/diaconn/src/main/res/values-de-rDE/strings.xml index 76017f5a34..716f9e053b 100644 --- a/diaconn/src/main/res/values-de-rDE/strings.xml +++ b/diaconn/src/main/res/values-de-rDE/strings.xml @@ -52,6 +52,8 @@ BENUTZER-OPTIONEN Bitte kopple deine Pumpe mit deinem Telefon! "Ereignis wird verarbeitet " + aps_last_log_num + aps_wrapping_count Temporäre Basalrate Diaconn-Pumpen Einstellungen Töne @@ -79,6 +81,9 @@ Warnung Insulinmangel Batteriewechsel erforderlich Neues Insulin erforderlich + pump_version + aps_incarnation_no + pump_serial_no Reservoirwechsel aufzeichnen Reservoirwechsel im Careportal hinzufügen, falls dies in der Historie gefunden wird. Kanülenwechsel protokollieren @@ -112,6 +117,7 @@ DUAL BOLUS KATHETER WECHSELN KANÜLE WECHSELN + NADEL WECHSELN Verstopfung (%s) Basalabgabe (%s) Basal unterbrechen (%s) diff --git a/diaconn/src/main/res/values-ko-rKR/strings.xml b/diaconn/src/main/res/values-ko-rKR/strings.xml index 17265a3e78..2000c331b4 100644 --- a/diaconn/src/main/res/values-ko-rKR/strings.xml +++ b/diaconn/src/main/res/values-ko-rKR/strings.xml @@ -6,11 +6,21 @@ 펌프 에러 알람 시간당 Basal 주입량 + Bolus 하루 주입량 + 에러 + 프라임 교체 중지 + 연동 완료 + 연동 대기 + 버전 + 잘못된 연동 정보. 새로운 연동 요청함. 펌프상태조회 펌프시간정보 조회 + 큰 시간 차이:\n펌프의 시간과 1.5시간 이상 차이가 납니다.\n펌프의 시간을 수동으로 변경하고, 예상치 못한 적용이 발생하지 않도록 펌프의 이력을 반드시 확인하십시오.\n가능한 경우, 시간을 변경하기 전에 펌프의 이력을 삭제하거나, 잘못 입력된 마지막 이력으로부터 DIA 시간만큼, 단 지금으로부터 최소한의 DIA 만큼, closed loop을 비활성화 하십시오. + 큰 시간 차이 + 인슐린 하루 허용량 근접 Bolus 주입 시작 Bolus 주입이 진행 중 입니다. Bolus 상태 조회 @@ -20,11 +30,30 @@ 확장 Bolus 중지 Basal 패턴 반영 G2e에서 만든 Diaconn G8 펌프 + 디아콘 G8 + 디아콘 G8 + 최대 bolus 초과 + 명령 오류 속도 에러 + 인슐린 제한 초과 + 요청: %1$.2fU 주입됨: %2$.2fU 에러 코드: %3$s + 적절하지 않은 값 + 디아콘 G8 블루투스 장치 + 펌프 비밀번호 Bolus 주입속도 펌프를 선택하세요. + >200%% 주입 위해 확장 bolus 사용 + 확장 bolus를 %%로 표시하기 + 블루투스 상태 + 일총량 + Bolus 단위 + Basal 단위 + 펌웨어 사용자설정 펌프와 전화기를 페어링해 주세요! + "이벤트 처리 중 " + aps_last_log_num + apsaps_wrapping_count 임시 Basal 디아콘 펌프 설정 음향 선택 @@ -36,17 +65,25 @@ 조명지속시간[초] + 펌프에 옵션 저장 언어설정 Bolus 주입속도 [U/min] 중국어 한국어 영어 + "10 " + 10 + 20 + 30 Bolus 주입막힘 베터리 경고 인슐린 부족 경고 베터리 교체가 필요합니다. 인슐린 교체가 필요합니다. + 펌프_버전 + aps_incarnation_no + 펌프_시리얼_넘버 인슐린 교체 로그 동기화 시 케어포털 \"인슐린 교체\" 정보 자동 업로드 바늘 교체 @@ -92,6 +129,7 @@ 식사 실패 성공 식사 성공 + 디아콘_g8_로그튜브변경 패킷 CRC 오류로 조회 불가합니다. 입력 파라미터 오류로 설정 불가합니다. 프로토콜 규격 오류로 설정 불가합니다. diff --git a/gradle/test_dependencies.gradle b/gradle/test_dependencies.gradle index 741fabac14..ec62814a21 100644 --- a/gradle/test_dependencies.gradle +++ b/gradle/test_dependencies.gradle @@ -29,4 +29,4 @@ android { } } } -} +} \ No newline at end of file diff --git a/insight/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java b/insight/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java index 56cac1b6c7..ead54ec5e3 100644 --- a/insight/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java +++ b/insight/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java @@ -1433,7 +1433,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai bolusID = insightDbHelper.getInsightBolusID(serial, event.getBolusID(), startTimestamp); // Line added to get id if (event.getBolusType() == BolusType.STANDARD || event.getBolusType() == BolusType.MULTIWAVE) { pumpSync.syncBolusWithPumpId( - startTimestamp, + bolusID.getTimestamp(), event.getImmediateAmount(), null, bolusID.getId(), @@ -1443,7 +1443,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai if (event.getBolusType() == BolusType.EXTENDED || event.getBolusType() == BolusType.MULTIWAVE) { if (event.getDuration() > 0 && profileFunction.getProfile(bolusID.getTimestamp()) != null) pumpSync.syncExtendedBolusWithPumpId( - startTimestamp, + bolusID.getTimestamp(), event.getExtendedAmount(), timestamp - startTimestamp, isFakingTempsByExtendedBoluses(), @@ -1557,8 +1557,6 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai } private long parseRelativeDate(int year, int month, int day, int hour, int minute, int second, int relativeHour, int relativeMinute, int relativeSecond) { - if (relativeHour * 60 * 60 + relativeMinute * 60 + relativeSecond >= hour * 60 * 60 * minute * 60 + second) - day--; Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month - 1); @@ -1566,7 +1564,9 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai calendar.set(Calendar.HOUR_OF_DAY, relativeHour); calendar.set(Calendar.MINUTE, relativeMinute); calendar.set(Calendar.SECOND, relativeSecond); - return calendar.getTimeInMillis(); + long dayOffset = + relativeHour * 60 * 60 + relativeMinute * 60 + relativeSecond >= hour * 60 * 60 + minute * 60 + second ? T.Companion.days(1).msecs() : 0L; + return calendar.getTimeInMillis() - dayOffset; } private void uploadCareportalEvent(long date, DetailedBolusInfo.EventType event) { diff --git a/insight/src/main/res/values-ko-rKR/strings.xml b/insight/src/main/res/values-ko-rKR/strings.xml index 723469bd12..efb441f1ed 100644 --- a/insight/src/main/res/values-ko-rKR/strings.xml +++ b/insight/src/main/res/values-ko-rKR/strings.xml @@ -26,9 +26,15 @@ 이 장치에서 보여지는 코드와 펌프에서 보여지는 코드가 동일한가요? Insight와 동기화 아큐-첵 Insight + %1$.2f U / %2$.2f U 주입됨 %1$s: %2$s 튜브 변경 Sight + 인사이트 펌프 경고 + 수동 bolus 주입 시 진동 비활성화 + Bolus와 확장 bolus의 경우 (인사이트 펌웨어 3.x에서만 가능함) + 자동 bolus 주입 시 진동 비활성화 + SMB와 TBR 기능을 통한 임시 basal의 경우 (인사이트 펌웨어 3.x에서만 가능함) 연결 시간 초과 - 블루투스 재설정 펌프 중지 펌프 시작 @@ -38,6 +44,7 @@ 확장: %3$d분 동안 %1$.2f / %2$.2f U Multiwave: %3$d 분 동안 %1$.2f / %2$.2f U TDD: %1$.2f + 잔여 인슐린 양 : %1$.2f U Batt.: %1$d%% 확인 음소거 diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.kt index 4f918f1ceb..3478cfce7c 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.kt @@ -54,9 +54,12 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth @Inject lateinit var medtronicUtil: MedtronicUtil @Inject lateinit var medtronicPumpHistoryDecoder: MedtronicPumpHistoryDecoder - private val MAX_COMMAND_TRIES = 3 - private val DEFAULT_TIMEOUT = 2000 - private val RILEYLINK_TIMEOUT: Long = 15 * 60 * 1000 // 15 min + companion object { + + private const val MAX_COMMAND_TRIES = 3 + private const val DEFAULT_TIMEOUT = 2000 + private const val RILEYLINK_TIMEOUT: Long = 15 * 60 * 1000L // 15 min + } var errorResponse: String? = null private set @@ -64,7 +67,7 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth private var doWakeUpBeforeCommand = true @Inject - fun onInit(): Unit { + fun onInit() { // we can't do this in the constructor, as sp only gets injected after the constructor has returned medtronicPumpStatus.previousConnection = sp.getLong( RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, 0L) @@ -92,7 +95,7 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth * * @return */ - fun isDeviceReachable(canPreventTuneUp: Boolean): Boolean { + private fun isDeviceReachable(canPreventTuneUp: Boolean): Boolean { val state = medtronicPumpStatus.pumpDeviceState if (state !== PumpDeviceState.PumpUnreachable) medtronicPumpStatus.pumpDeviceState = PumpDeviceState.WakingUp for (retry in 0..4) { @@ -189,6 +192,7 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth } } + @Suppress("SameParameterValue") @Throws(RileyLinkCommunicationException::class) private fun runCommandWithFrames(commandType: MedtronicCommandType, frames: List>): PumpMessage? { aapsLogger.debug(LTag.PUMPCOMM, "Run command with Frames: " + commandType.name) @@ -266,7 +270,7 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth while (!done) { // examine current response for problems. val frameData = currentResponse.frameData - if (frameData.size > 0 && currentResponse.frameNumber == expectedFrameNum) { + if (frameData.isNotEmpty() && currentResponse.frameNumber == expectedFrameNum) { // success! got a frame. if (frameData.size != 64) { aapsLogger.warn(LTag.PUMPCOMM, "Expected frame of length 64, got frame of length " + frameData.size) @@ -286,12 +290,12 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth done = true // successful completion } } else { - if (frameData.size == 0) { + if (frameData.isEmpty()) { aapsLogger.error(LTag.PUMPCOMM, "null frame data, retrying") } else if (currentResponse.frameNumber != expectedFrameNum) { aapsLogger.warn(LTag.PUMPCOMM, String.format(Locale.ENGLISH, "Expected frame number %d, received %d (retrying)", expectedFrameNum, currentResponse.frameNumber)) - } else if (frameData.size == 0) { + } else if (frameData.isEmpty()) { aapsLogger.warn(LTag.PUMPCOMM, "Frame has zero length, retrying") } failures++ @@ -381,8 +385,7 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth medtronicPumpStatus.pumpDeviceState = PumpDeviceState.Active // create message - val msg: PumpMessage - msg = bodyData?.let { makePumpMessage(commandType, it) } ?: makePumpMessage(commandType) + val msg: PumpMessage = bodyData?.let { makePumpMessage(commandType, it) } ?: makePumpMessage(commandType) // send and wait for response val response = sendAndListen(msg, timeoutMs) @@ -396,8 +399,7 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth } // All pump communications go through this function. - @Throws(RileyLinkCommunicationException::class) - protected /*override*/ fun sendAndListen(msg: PumpMessage, timeout_ms: Int): PumpMessage { + @Throws(RileyLinkCommunicationException::class) private /*override*/ fun sendAndListen(msg: PumpMessage, timeout_ms: Int): PumpMessage { return super.sendAndListen(msg, timeout_ms)!! } @@ -451,7 +453,7 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth return responseData } val contents = response.rawContent - return if (contents.size > 0) { + return if (contents.isNotEmpty()) { if (contents.size >= expectedLength) { aapsLogger.debug(LTag.PUMPCOMM, String.format(Locale.ENGLISH, "%s: Content: %s", method, ByteUtil.shortHexString(contents))) null @@ -493,8 +495,7 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth for (retries in 0..MAX_COMMAND_TRIES) { try { // create message - var msg: PumpMessage - msg = makePumpMessage(commandType) + val msg: PumpMessage = makePumpMessage(commandType) // send and wait for response var response = sendAndListen(msg, DEFAULT_TIMEOUT + DEFAULT_TIMEOUT * retries) @@ -527,7 +528,7 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth aapsLogger.debug(LTag.PUMPCOMM, "End Response: {}", ByteUtil.getHex(data)) - var basalProfile: BasalProfile? = medtronicConverter.decodeBasalProfile(medtronicPumpPlugin.pumpDescription.pumpType, data) + val basalProfile: BasalProfile? = medtronicConverter.decodeBasalProfile(medtronicPumpPlugin.pumpDescription.pumpType, data) // checkResponseRawContent(data, commandType) { // basalProfile = medtronicConverter.decodeBasalProfile(medtronicPumpPlugin.pumpDescription.pumpType, data) // } diff --git a/medtronic/src/main/res/values-ko-rKR/strings.xml b/medtronic/src/main/res/values-ko-rKR/strings.xml index 8128024b04..244dc5ef7f 100644 --- a/medtronic/src/main/res/values-ko-rKR/strings.xml +++ b/medtronic/src/main/res/values-ko-rKR/strings.xml @@ -22,8 +22,10 @@ 알카라인(확장뷰) 리튬(확장뷰) NiZn (확장 뷰) + 니켈수소전지 (연장 뷰) Bolus/관리 디버깅 + RileyLink 배터리 에러 일련번호 # 설정되지 않음 @@ -63,13 +65,17 @@ 이력 받기 - 페이지 %1$d (%2$d/16) 이력 받기 - 페이지 %1$d 펌프 시간 받기 + 펌프 시간 설정 + 배터리 상태 확인 설정 받기 펌프 모델 받기 Basal 프로파일 받기 Basal 프로파일 설정 임시 Basal 받기 임시 Basal 설정 + 임시 basal 취소 Bolus 설정 + 잔여 인슐린 확인 펌프에 연결할 수 없습니다 경고 @@ -81,4 +87,7 @@ 켜짐 끄기 펌프 시간 업데이트 + 기본 임시 basal 설정 + 활성화되면, 매 한 시간 전에 임시 basal을 취소할 것입니다. 이 기능은 일부 펌프에서 한 시간마다 울리는 소리/진동 경고를 멈추게 합니다. + %1$.1f U/h (%2$d 분 남음) diff --git a/omnipod-common/src/main/res/values-de-rDE/strings.xml b/omnipod-common/src/main/res/values-de-rDE/strings.xml index e35fcaa95a..b4fd7e95ea 100644 --- a/omnipod-common/src/main/res/values-de-rDE/strings.xml +++ b/omnipod-common/src/main/res/values-de-rDE/strings.xml @@ -2,17 +2,194 @@ + Pod Management + Aktionen + Tools + Pod aktivieren + Pod deaktivieren + Pod verwerfen + Wenn Du den Pod verwirfst, kannst Du nicht mehr mit ihm kommunizieren. Mache das nur, wenn jede Kommunikation mit dem Pod dauerhaft fehlschlägt. Falls Du noch mit dem Pod kommunizieren kannst, verwende bitte die Option Pod deaktivieren.\n\nWenn Du fortfahren willst, entferne jetzt den Pod von Deinem Körper! + Testton abspielen + Spiele Testton ab.... + Pod Historie + Kein aktiver Pod + Setzen des Basal-Profils fehlgeschlagen. + Bolus nicht abgegeben + Fehler beim Festlegen des Basalprofils: Ein leeres Profil wurde empfangen. Akiviere Dein Basalprofil. + Kein Basalprofil aktiv. Aktiviere Dein Profil. + Nicht unterstützter benutzerdefinierter Befehl: %1$s + Status konnte nicht aktualisiert werden. + Status konnte beim Start nicht aktualisiert werden + Alarme können nicht stumm geschaltet werden + Insulinabgabe konnte nicht unterbrochen werden. + Zeiteinstellung fehlgeschlagen + Insulinabgabe konnte nicht gestartet werden. + Pod konnte nicht initalisiert werden. + Kanüle konnte nicht eingeführt werden. + Die Aktivierungszeit des Pods wurde überschritten. Dieser Pod kann nicht mehr aktiviert werden. + Überprüfen des Aktivierungsfortschritts gescheitert. Bitte erneut versuchen. + Pod unterbrochen + Test-Piepton konnte nicht abgespielt werden + Zeit auf dem Pod ist nicht synchron. Aktualisiere die Zeit auf der Registerkarte \"Omnipod\". + Es ist ein unerwarteter Fehler aufgetreten. Bitte melden! (%1$s: %2$s) + Bestätigung + Zeit und/oder Zeitzone auf dem Pod geändert. + Alarm-Einstellungen auf dem Pod geändert. + Zeit auf dem Pod geändert. + Insulinabgabe komplett ausgesetzt. + Aktive Alarme stummgeschaltet. + Insulinabgabe wieder aufgenommen. + Zeit einstellen + Unterbrechungen + Abgabe fortsetzen + Pod Mgmt + Alarme stummschalten + Pod Status + Insgesamt abgegeben + %1$.2f IE + Eindeutige ID + LOT Nummer + Laufende Nummer + Pod läuft ab + Letzte Verbindung + Letzter Bolus + Temporäre Basalrate + Basis-Basalrate + Reservoir + Aktive Pod-Warnungen + Firmware-Version + Zeit auf dem Pod + %1$.2fIE/h @%2$s (%3$d/%4$d min.) + %1$.2f IE übrig + Mehr als 50 IE verbleibend + Fehler + Abbrechen + Beenden + Weiter + Erneut versuchen + Pod deaktivieren + Pod verwerfen + Du hast noch nicht alle Schritte abgeschlossen. Willst Du wirklich beenden? + Schließen + Pod füllen + Pod initialisieren + Pod anlegen + Bereite die Infusionsstelle vor. Entferne den Nadelschutz des Pods und die Schutzfolie über dem Kleber. Klebe dann den Pod an die gewünschte Körperstelle.\n\nFalls die Kanüle herausragt, klicke Abbrechen und verwirf den Pod.\n\nKlicke Weiter; um die Kanüle zu setzen und die Insulinabgabe zu beginnen. + Nachdem Du OK gedrückt hast, wird die Kanüle eingeführt. Klebe den Pod vorher auf die gewünschte Infusionsstelle. + Kanüle setzen + Basalrate wird übertragen und Kanüle gesetzt.\n\nKlicke auf Weiter nachdem die Kanüle erfolgreich gesetzt wurde. + Pod aktiviert + \nDer neue Pod ist jetzt aktiv.\n\nDeine Basalrate ist programmiert und die Kanüle wurde gesetzt.\n\nBitte überprüfe, ob die Kanüle korrekt gesetzt wurde und ersetze den Pod, wenn Du das Gefühl hast, dass dies nicht erfolgreich war. + Pod deaktivieren + Drücke Weiter um den Pod zu deaktivieren.\n\nHinweis: Dies unterbricht die gesamte Insulinabgabe und deaktiviert den Pod. + Deaktiviere den Pod... + Deaktiviere den Pod.\n\nNachdem die Deaktivierung komplett abgeschlossen wurde, kannst Du Weiter drücken. + Pod deaktiviert + Pod wurde deaktiviert.\n\nBitte entferne den Pod von Deinem Körper und recycle ihn. + Pod verworfen + Der Pod-Status wurde verworfen. Die Insulinabgabe wurde nicht unterbrochen, weil der Pod nicht korrekt deaktiviert wurde!\n\nBitte entferne den Pod von Deinem Körper und recycele ihn. + Wenn Du den Pod verwirfst, kannst Du nicht mehr mit ihm kommunizieren. Mache das nur, wenn jede Kommunikation mit dem Pod dauerhaft fehlschlägt. Willst Du den Pod wirklich verwerfen? + Pod verwerfen + Bolus-Piep aktiviert + Basal-Piep aktiviert + SMB-Piep aktiviert + TBR-Piep aktiviert + Button \'Insulinabgabe unterbrechen\' im Omnipod Tab anzeigen + Sommerzeit/Zeitzonen-Erkennung aktiviert + Ablauferinnerung aktiviert + Stunden bis zum Podende + Warnung niedriger Reservoirstand aktiviert + Anzahl der Einheiten + Pod-Alarme automatisch stummschalten + Andere + Alarme + Bestätigungstöne + Benachrichtigungen + Ton für unsichere TBR-Benachrichtigungen aktiviert + Ton für unsichere SMB-Benachrichtigungen aktiviert + Ton für unsichere Bolus-Benachrichtigungen aktiviert + Kein aktiver Pod + Einrichtung im Gange (Warten auf Pod-Aktivierung) + Einrichtung im Gang (Warten auf Setzen der Kanüle) + In Betrieb + Angehalten + Pod-Fehler + Aktivierungszeit überschritten + Inaktiv + Pod-Fehler: %1$03d %2$s + Pod deaktivieren + Pod verwerfen + Mahlzeiten Bolus abgeben + Bolus abbrechen + Setze Temporäre Basalrate + Temporäre Basalrate abbrechen (intern über den Treiber) + Temp. Basalrate abbrechen + Basalrate festlegen + Pod-Status abrufen + Pod-Info abrufen + Zeit einstellen + Warnungen konfigurieren + Alarme stummschalten + Abgabe unterbrechen + Abgabe fortsetzen + Unbekannte Eingabe + Pod initialisieren + Kanüle setzen + Pulse-Log lesen + Fake TBR gesetzt, da der Pod pausiert ist. + Abbruch der Fake TBR. Diese wurde eingestellt, da der Pod pausiert war. + Temp. Basalrate wegen unbekanntem Fehler bei TBR-Abbruch aufgeteilt + Piep-Ton Konfiguration + Testton abspielen + Erinnerung Kopplung beendet + Erinnerung Setup beendet + Pod läuft in Kürze ab + Pod läuft in Kürze ab + Herunterfahren steht unmittelbar bevor + Niedriger Reservoirstand + Unbekannter Alarm + Kein aktiver Pod + Letzte Verb.: vor %1$d min + Letzter Bolus: %1$s @ %2$s + Temp: %1$s + Verlängert: %1$s + Reserv: %1$sU + Ja + Nein + OK + Abbrechen + Warnung + gerade eben + vor weniger als einer Minute + %1$s und %2$s + vor %1$s + + %1$d Minute + %1$d Minuten + + + %1$d Stunde + %1$d Stunden + + + %1$d Tag + %1$d Tage + + + Pod-Alarm: %1$s + Pod-Alarm: %1$s + diff --git a/omnipod-common/src/main/res/values-iw-rIL/strings.xml b/omnipod-common/src/main/res/values-iw-rIL/strings.xml index c6a43df2c2..c4ad088c4e 100644 --- a/omnipod-common/src/main/res/values-iw-rIL/strings.xml +++ b/omnipod-common/src/main/res/values-iw-rIL/strings.xml @@ -111,6 +111,10 @@ אחר התראות צפצופי אימות + התראות + צליל של התראת בזאלי זמני לא ברור מאופשר + צליל של התראת SMB לא ברור מאופשר + צליל של התראת בולוס לא ברור מאופשר אין פוד פעיל התקנה בביצוע (ממתין להפעלת הפוד) diff --git a/omnipod-common/src/main/res/values-ko-rKR/strings.xml b/omnipod-common/src/main/res/values-ko-rKR/strings.xml index e35fcaa95a..93961277b6 100644 --- a/omnipod-common/src/main/res/values-ko-rKR/strings.xml +++ b/omnipod-common/src/main/res/values-ko-rKR/strings.xml @@ -2,17 +2,186 @@ + Pod 관리 + 실행 + 도구 + Pod 활성화 + Pod 비활성화 + Pod 폐기 + Pod를 폐기하면, 더이상 해당 pod와 연결할 수 없습니다. Pod와의 모든 연결이 계속해서 실패할 경우에만 이를 수행하십시오. 만약 Pod와 연결이 아직 가능하다면 Pod 비활성화을 사용하십시오.\n\n계속해서 진행하고 싶은 경우, 반드시 Pod를 몸에서 제거하십시오! + 테스트 신호음 작동 + 테스트 신호음 작동 중... + Pod 이력 + 활성화된 Pod 없음 + Basal 프로파일 설정 실패함 + Bolus가 성공적으로 주입되지 않음 + Basal 프로파일 설정 실패함: 내용이 없는 프로파일 수신됨. Basal 프로파일을 활성화하십시오. + 활성화된 프로파일 없음. Basal 프로파일을 활성화하십시오. + 지원되지 않는 사용자 지정 명령: %1$s + 상태 새로고침 실패함 + 장치 시작에서 상태 새로고침 실패함 + 경고 음소거 실패함 + 주입 중지 실패함 + 시간 설정 실패함 + 주입 재시작 실패함 + Pod 초기화 실패함 + 캐뉼라 삽입 실패함 + Pod의 활성화 시간이 초과되었습니다. 이 Pod는 더 이상 사용할 수 없습니다. + 활성화 과정 확인 실패함. 재시도하십시오. + Pod 중지됨 + 테스트 신호음 작동 실패함 + Pod의 시간이 맞지 않습니다. Omnipod 탭에서 시간을 업데이트 하십시오. + 예상치 못한 오류가 발생하였습니다. 보고 부탁드립니다! (%1$s: %2$s) + 확인 + Pod에서 시간과/또는 시간대 변경됨 + Pod에서 경고 설정 업데이트 됨 + Pod에서 시간 업데이트 됨 + 인슐린 주입이 중지됨 + 활성화된 경고가 음소거 됨 + 인슐린 주입이 재시작됨 + 시간 설정 + 중지 + 주입 재시작 + Pod 관리 + 경고 음소거 + Pod 상태 + 모두 주입됨 + %1$.2f U + 고유 ID + LOT 번호 + 일련번호 + Pod 만료됨 + 마지막 연결 + 마지막 Bolus + 임시 basal 양 + 기본 basal 양 + 인슐린 잔량 + Pod 경고 활성화 + 펌웨어 버전 + Pod 시간 + %1$.2fU/h @%2$s (%3$d/%4$d 분) + %1$.2f U 남음 + 50 U 이상 남음 + 에러 + 취소 + 종료 + 다음 + 재시도 + Pod 비활성화 + Pod 폐기 + 모든 단계를 아직 완료하지 않았습니다. 정말 나가기를 원하십니까? + 종료 + Pod 채우기 + Pod 초기화 + Pod 부착 + 삽입 위치를 준비하십시오. Pod의 바늘 캡과 접착 보호필름을 제거하고 Pod를 삽입 위치에 부착하십시오.\n\n만약, 캐뉼라가 튀어 나오면, 취소를 누르고 Pod를 폐기하십시오.\n\n 다음을 눌러 캐뉼라를 삽입하고 basal 주입을 시작하십시오. + 확인을 누르면, 캐뉼라가 삽입될 것입니다. Pod가 삽입 부위에 부착되었는지 확인하십시오. + 캐뉼라 삽입 + 초기 basal을 설정하고 캐뉼라를 삽입합니다. \n\n캐뉼라가 성공적으로 삽입되면, 다음을 누릅니다. + Pod 활성화됨 + 새로운 Pod가 활성화되었습니다. \n\nBasal이 프로그램되었으며, 캐뉼라가 삽입되었습니다. \n\n캐뉼라가 제대로 삽입되었는지 확인하고, 만약 그렇지 않다면 Pod를 바꾸십시오. + Pod 비활성화 + 다음을 눌러 Pod를 비활성화합니다. \n\n참고:이는 모든 인슐린 주입을 중지하고 Pod를 비활성화할 것입니다. + Pod 비활성화 중 + Pod 비활성화 중. \n\n비활성화가 성공적으로 완료되면, 다음을 누르십시오. + Pod 비활성화됨 + Pod는 비활성화되었습니다. \n\nPod를 몸에서 제거하고 재활용 쓰레기로 분리 배출하십시오. + Pod 폐기됨 + Pod는 폐기된 상태입니다. Pod가 적절하게 비활성화되지 않아 인슐린 주입은 중지되지 않았습니다! \n\nPod를 몸에서 제거하고 재활용 쓰레기로 분리 배출하십시오. + Pod를 폐기하면, Pod와 더이상 연결되지 않습니다. Pod와의 모든 연결이 계속해서 실패하는 경우에만 시행하십시오. 정말로 Pod를 폐기하기 원하십니까? + Pod 폐기 + Bolus 신호음 활성화됨 + Basal 신호음 활성화됨 + SMB 신호음 활성화됨 + TBR 신호음 활성화됨 + Omnipod 탭에서 주입 중지 버튼을 나타내기 + 섬머타임제/시간대 감지 활성화됨 + 만료일 알림 활성화됨 + 종료 한 시간 전 + 인슐린 부족 알람 활성화됨 + 몇 단위 + 자동으로 Pod 경고 음소거 + 기타 + 경고 + 확인 신호음 + 활성화된 Pod 없음 + 설정 진행 중 (Pod 활성화를 기다리는 중) + 설정 진행 중 (캐뉼라 삽입을 기다리는 중) + 실행 중 + 중지됨 + Pod 결함 + 활성화 시간 초과됨 + 비활성화됨 + Pod 결함: %1$03d %2$s + Pod 비활성화 + Pod 폐기 + Bolus설정 + Bolus 취소 + 임시 Basal 설정 + (드라이버에서 내부적으로) 임시 basal 취소 + 임시 basal 취소 + Basal 스케쥴 설정 + Pod 상태 가져오기 + Pod 정보 가져오기 + 시간 설정 + 경고 설정 + 경고 음소거 + 주입 중지 + 주입 재시작 + 알려지지 않은 항목 + Pod 초기화 + 캐뉼라 삽입 + Pulse 로그 확인 + Pod가 중지되어 속임수 임시 basal 설정하기 + Pod가 중지되어 만들었던 속임수 임시 basal 취소하기 + 취소 중 명확하지 않은 실패로 인하여 임시 basal 나누기 + 신호음 설정 + 테스트 신호음 작동 + 연동 알림 종료 + 설정 알림 종료 + Pod가 곧 만료됩니다. + Pod가 곧 만료됩니다. + 종료가 임박했습니다. + 인슐린 부족 + 알 수 없는 경고 + 활성화된 Pod 없음 + 마지막 연결: %1$d 분 전 + 마지막 bolus: %1$s @ %2$s + 임시: %1$s + 확장: %1$s + 잔여 인슐린 양: %1$s U + + 아니오 + + 취소 + 경고 + 방금 전 + 1분 이내 + %1$s과 %2$s + %1$s 전 + + %1$d 분 + + + %1$d 시간 + + + %1$d 일 + + + Pod 경고: %1$s + diff --git a/omnipod-dash/build.gradle b/omnipod-dash/build.gradle index 2ad14d8d0d..b9dd868a07 100644 --- a/omnipod-dash/build.gradle +++ b/omnipod-dash/build.gradle @@ -27,5 +27,5 @@ dependencies { implementation "androidx.room:room-runtime:$room_version" implementation "androidx.room:room-rxjava2:$room_version" kapt "androidx.room:room-compiler:$room_version" - implementation 'com.github.guepardoapps:kulid:1.1.2.0' + implementation 'com.github.guepardoapps:kulid:2.0.0.0' } diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/OmnipodDashBleManagerImpl.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/OmnipodDashBleManagerImpl.kt index 12f8ede4e4..a70ff39266 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/OmnipodDashBleManagerImpl.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/OmnipodDashBleManagerImpl.kt @@ -98,7 +98,7 @@ class OmnipodDashBleManagerImpl @Inject constructor( } override fun getStatus(): ConnectionState { - return connection?.let { it.connectionState() } + return connection?.connectionState() ?: NotConnected } // used for sync connections @@ -154,7 +154,7 @@ class OmnipodDashBleManagerImpl @Inject constructor( val ltk = assertPaired() - var eapSqn = podState.increaseEapAkaSequenceNumber() + val eapSqn = podState.increaseEapAkaSequenceNumber() var newSqn = conn.establishSession(ltk, msgSeq, ids, eapSqn) diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/IllegalResponseException.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/IllegalResponseException.kt deleted file mode 100644 index 931be4d900..0000000000 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/IllegalResponseException.kt +++ /dev/null @@ -1,9 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.exceptions - -import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.response.Response -import kotlin.reflect.KClass - -class IllegalResponseException( - expectedResponseType: KClass, - actualResponse: Response -) : Exception("Illegal response: expected ${expectedResponseType.simpleName} but got $actualResponse") diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/NakResponseException.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/NakResponseException.kt deleted file mode 100644 index 93e4c408b4..0000000000 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/NakResponseException.kt +++ /dev/null @@ -1,6 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.exceptions - -import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.response.NakResponse - -class NakResponseException(val response: NakResponse) : - Exception("Received NAK response: ${response.nakErrorType.value} ${response.nakErrorType.name}") diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/PodAlarmException.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/PodAlarmException.kt deleted file mode 100644 index 0f4968c32d..0000000000 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/exceptions/PodAlarmException.kt +++ /dev/null @@ -1,13 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.exceptions - -import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.response.AlarmStatusResponse -import java.util.* - -class PodAlarmException(val response: AlarmStatusResponse) : Exception( - String.format( - Locale.getDefault(), - "Pod is in alarm: %03d %s", - response.alarmType.value.toInt() and 0xff, - response.alarmType.name - ) -) diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/pair/LTKExchanger.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/pair/LTKExchanger.kt index 0482a12660..543d3a0d7c 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/pair/LTKExchanger.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/driver/comm/pair/LTKExchanger.kt @@ -125,7 +125,7 @@ internal class LTKExchanger( val payload = parseKeys(arrayOf(P0), msg.payload)[0] aapsLogger.debug(LTag.PUMPBTCOMM, "P0 payload from pod: ${payload.toHex()}") if (!payload.contentEquals(UNKNOWN_P0_PAYLOAD)) { - aapsLogger.warn(LTag.PUMPBTCOMM, "Reveived invalid P0 payload: ${payload.toHex()}") + aapsLogger.warn(LTag.PUMPBTCOMM, "Received invalid P0 payload: ${payload.toHex()}") } } diff --git a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/history/data/HistoryRecord.kt b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/history/data/HistoryRecord.kt index 65a2d5294c..f7510c40b1 100644 --- a/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/history/data/HistoryRecord.kt +++ b/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/history/data/HistoryRecord.kt @@ -16,6 +16,6 @@ data class HistoryRecord( ) { fun pumpId(): Long { val entropy = ULID.getEntropy(id) - return ByteBuffer.wrap(entropy).getLong() + return ByteBuffer.wrap(entropy).long } } diff --git a/omnipod-dash/src/main/res/values-af-rZA/strings.xml b/omnipod-dash/src/main/res/values-af-rZA/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-af-rZA/strings.xml +++ b/omnipod-dash/src/main/res/values-af-rZA/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-bg-rBG/strings.xml b/omnipod-dash/src/main/res/values-bg-rBG/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-bg-rBG/strings.xml +++ b/omnipod-dash/src/main/res/values-bg-rBG/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-ca-rES/strings.xml b/omnipod-dash/src/main/res/values-ca-rES/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-ca-rES/strings.xml +++ b/omnipod-dash/src/main/res/values-ca-rES/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-cs-rCZ/strings.xml b/omnipod-dash/src/main/res/values-cs-rCZ/strings.xml index 059619b513..2aa2949dc0 100644 --- a/omnipod-dash/src/main/res/values-cs-rCZ/strings.xml +++ b/omnipod-dash/src/main/res/values-cs-rCZ/strings.xml @@ -4,6 +4,18 @@ Integrace pumpy pro Omnipod Dash (nový model s funkcí Bluetooth a modrým krytem). - Stav Bluetooth - Adresa Bluetooth + Stav Bluetooth + Adresa Bluetooth + Firmware %1$s / Bluetooth %2$s + Kvalita připojení + Stav doručení + + Naplňte nový Pod dostatkem inzulínu na 3 dny.\n\nPoslouchejte, zda Pod během procesu plnění dvakrát zapípá. Tento zvukový signál značí, že bylo naplněno minimální množství 85 U. Ujistěte se, že stříkačka je zcela vyprázdněná, a to i poté, co uslyšíte dvě pípnutí.\n\nPo naplnění Podu prosím stiskněte tlačítko Další.\n\nPoznámka: prozatím nesundávejte kryt jehly Podu. + Systém se snaží spárovat s novým Podem a naplnit ho.\n\nJakmile bude inicializační proces úspěšně dokončen, můžete stisknout tlačítko Další. + Zvuk oznámení při pozastaveném podávání povolen + + Nepodařilo se připojit k Podu + Nalezeno příliš mnoho Podů k aktivaci + Nelze najít dostupný Pod k aktivaci + Obecná chyba: %1$s diff --git a/omnipod-dash/src/main/res/values-da-rDK/strings.xml b/omnipod-dash/src/main/res/values-da-rDK/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-da-rDK/strings.xml +++ b/omnipod-dash/src/main/res/values-da-rDK/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-de-rDE/strings.xml b/omnipod-dash/src/main/res/values-de-rDE/strings.xml index c690568d07..7778e692ff 100644 --- a/omnipod-dash/src/main/res/values-de-rDE/strings.xml +++ b/omnipod-dash/src/main/res/values-de-rDE/strings.xml @@ -1,6 +1,21 @@ + Pumpen-Integration für Omnipod Dash (das neue, bluetooth-fähige Modell mit blauer Nadelkappe). + Bluetooth-Status + Bluetooth-Adresse + Firmware %1$s / Bluetooth %2$s + Verbindungsqualität + Übermittlungsstatus + + Befülle den neuen Pod mit ausreichend Insulin für 3 Tage.\n\nAchte auch zwei Pieptöne vom Pod während des Füllens. Diese zeigen an, dass der Pod mit der Mindestmenge von 80 IE befüllt wurde. Leere die Spritze komplett, auch wenn Du die beiden Pieptöne gehört hast.\n\nKlicke Weiter nachdem Du den Pod befüllt hast.\n\nHinweis: Entferne den Nadelschutz des Pods noch nicht. + Versuche Verbindung mit dem neuen Pod herzustellen und ihn zu befüllen.\n\nNachdem der Initalisierungsprozess erfolgreich beendet wurde, kannst Du auf Weiter klicken. + Ton bei unterbrochener Abgabe aktiviert + + Verbindung mit Pod fehlgeschlagen + Zu viele Pods für die Aktivierung gefunden + Konnte keinen verfügbaren Pod für die Aktivierung finden + Allgemeiner Fehler: %1$s diff --git a/omnipod-dash/src/main/res/values-el-rGR/strings.xml b/omnipod-dash/src/main/res/values-el-rGR/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-el-rGR/strings.xml +++ b/omnipod-dash/src/main/res/values-el-rGR/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-es-rES/strings.xml b/omnipod-dash/src/main/res/values-es-rES/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-es-rES/strings.xml +++ b/omnipod-dash/src/main/res/values-es-rES/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-fr-rFR/strings.xml b/omnipod-dash/src/main/res/values-fr-rFR/strings.xml index 5c3615e060..5cc149124d 100644 --- a/omnipod-dash/src/main/res/values-fr-rFR/strings.xml +++ b/omnipod-dash/src/main/res/values-fr-rFR/strings.xml @@ -4,6 +4,6 @@ Intégration de la pompe Omnipod Dash (le nouveau modèle Bluetooth, avec un bouchon d\'aiguille bleue). - État Bluetooth - Adresse Bluetooth + + diff --git a/omnipod-dash/src/main/res/values-ga-rIE/strings.xml b/omnipod-dash/src/main/res/values-ga-rIE/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-ga-rIE/strings.xml +++ b/omnipod-dash/src/main/res/values-ga-rIE/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-hr-rHR/strings.xml b/omnipod-dash/src/main/res/values-hr-rHR/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-hr-rHR/strings.xml +++ b/omnipod-dash/src/main/res/values-hr-rHR/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-it-rIT/strings.xml b/omnipod-dash/src/main/res/values-it-rIT/strings.xml index 85381120db..5f55d28285 100644 --- a/omnipod-dash/src/main/res/values-it-rIT/strings.xml +++ b/omnipod-dash/src/main/res/values-it-rIT/strings.xml @@ -4,6 +4,6 @@ Integrazione del microinfusore Omnipod Dash (il nuovo modello, abilitato al Bluetooth e con la protezione ago di colore blu). - Stato bluetooth - Indirizzo bluetooth + + diff --git a/omnipod-dash/src/main/res/values-iw-rIL/strings.xml b/omnipod-dash/src/main/res/values-iw-rIL/strings.xml index 156a8b3dd4..2fb153f0c6 100644 --- a/omnipod-dash/src/main/res/values-iw-rIL/strings.xml +++ b/omnipod-dash/src/main/res/values-iw-rIL/strings.xml @@ -4,6 +4,18 @@ חיבור משאבת Omnipod Dash (הדגם החדש, התומך בבלוטות\' ובעל מכסה מחט כחול). - מצב בלוטות\' - כתובת בלוטות\' + מצב בלוטות\' + כתובת בלוטות\' + קושחה%1$s \\ בלוטות\' %2$s + איכות החיבור + סטטוס הזרקה + + מלאו פוד חדש עם מספיק אינסולין לשלושה ימים.\n\nהקשיבו לשני צפצופים מהפוד במהלך המילוי. הם מציינים שהכמות המינימלית של 80 יחידות הוכנסה. הקפידו לרוקן לחלוטין את מזרק המילוי, גם לאחר שמיעת שני הצפצופים.\n\nלאחר מילוי הפוד, יש ללחוץ הבא.\n\nהערה: נא לא להסיר עדיין את מכסה המחט. + מנסה לצמד את הפוד החדש ולתחל אותו.\n\nכאשר תהליך התחול יסתיים בהצלחה, תוכלו ללחוץ על הבא. + השמע כשהתראת הפסקת ההזרקה מאופשרת + + הקישור לפוד נכשל + נמצאו יותר מדי פודים להפעלה + לא נמצא פוד זמין להפעלה + שגיאה גנרית: %1$s diff --git a/omnipod-dash/src/main/res/values-ko-rKR/strings.xml b/omnipod-dash/src/main/res/values-ko-rKR/strings.xml index c690568d07..f01c43835c 100644 --- a/omnipod-dash/src/main/res/values-ko-rKR/strings.xml +++ b/omnipod-dash/src/main/res/values-ko-rKR/strings.xml @@ -1,6 +1,9 @@ + 옴니파드 대쉬(파란색 바늘 캡이 달린 새로운 블루투스 연결 모델)를 위한 펌프 통합 + + diff --git a/omnipod-dash/src/main/res/values-lt-rLT/strings.xml b/omnipod-dash/src/main/res/values-lt-rLT/strings.xml index 582abcf0f6..a73633ba7b 100644 --- a/omnipod-dash/src/main/res/values-lt-rLT/strings.xml +++ b/omnipod-dash/src/main/res/values-lt-rLT/strings.xml @@ -4,6 +4,6 @@ Pompos integracija Omnipod Dash (naujas, Bluetooth palaikantis modelis su mėlynu adatos dangteliu). - Bluetooth statusas - Bluetooth adresas + + diff --git a/omnipod-dash/src/main/res/values-nl-rNL/strings.xml b/omnipod-dash/src/main/res/values-nl-rNL/strings.xml index e78d29a52f..1cc58e3cd8 100644 --- a/omnipod-dash/src/main/res/values-nl-rNL/strings.xml +++ b/omnipod-dash/src/main/res/values-nl-rNL/strings.xml @@ -4,6 +4,6 @@ Pomp integratie voor Omnipod Dash (het nieuwe, Bluetooth-enabled model met een blauwe naalddop). - Bluetooth Status - Bluetooth adres + + diff --git a/omnipod-dash/src/main/res/values-no-rNO/strings.xml b/omnipod-dash/src/main/res/values-no-rNO/strings.xml index 7e3cb97ee9..a8731fa961 100644 --- a/omnipod-dash/src/main/res/values-no-rNO/strings.xml +++ b/omnipod-dash/src/main/res/values-no-rNO/strings.xml @@ -4,6 +4,6 @@ Pumpeintegrering for Omnipod Dash (den nye, Bluetooth-aktiverte modellen med en blå kanylehette). - Bluetooth status - Bluetooth adresse + + diff --git a/omnipod-dash/src/main/res/values-pl-rPL/strings.xml b/omnipod-dash/src/main/res/values-pl-rPL/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-pl-rPL/strings.xml +++ b/omnipod-dash/src/main/res/values-pl-rPL/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-pt-rBR/strings.xml b/omnipod-dash/src/main/res/values-pt-rBR/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-pt-rBR/strings.xml +++ b/omnipod-dash/src/main/res/values-pt-rBR/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-pt-rPT/strings.xml b/omnipod-dash/src/main/res/values-pt-rPT/strings.xml index 76989f77ef..d01a3acdfe 100644 --- a/omnipod-dash/src/main/res/values-pt-rPT/strings.xml +++ b/omnipod-dash/src/main/res/values-pt-rPT/strings.xml @@ -4,6 +4,6 @@ Integração para a Omnipod Dash (o novo modelo, habilitado para o Bluetooth com uma proteção de agulha azul). - Estado do Bluetooth - Endereço Bluetooth + + diff --git a/omnipod-dash/src/main/res/values-ro-rRO/strings.xml b/omnipod-dash/src/main/res/values-ro-rRO/strings.xml index 34e36456e7..003e693422 100644 --- a/omnipod-dash/src/main/res/values-ro-rRO/strings.xml +++ b/omnipod-dash/src/main/res/values-ro-rRO/strings.xml @@ -4,6 +4,6 @@ Integrarea pompei pentru Omnipod Dash (modelul nou, cu Bluetooth, cu un capac de ac albastru). - Stare Bluetooth - Adresă Bluetooth + + diff --git a/omnipod-dash/src/main/res/values-ru-rRU/strings.xml b/omnipod-dash/src/main/res/values-ru-rRU/strings.xml index a53ecbb853..14a4ba1b3b 100644 --- a/omnipod-dash/src/main/res/values-ru-rRU/strings.xml +++ b/omnipod-dash/src/main/res/values-ru-rRU/strings.xml @@ -4,6 +4,6 @@ Интеграция с помпой Omnipod Dash (новая модель с поддержкой Bluetooth, с синим колпачком на игле). - Статус Bluetooth - Адрес Bluetooth + + diff --git a/omnipod-dash/src/main/res/values-sk-rSK/strings.xml b/omnipod-dash/src/main/res/values-sk-rSK/strings.xml index d12d39dc7d..029f44a38e 100644 --- a/omnipod-dash/src/main/res/values-sk-rSK/strings.xml +++ b/omnipod-dash/src/main/res/values-sk-rSK/strings.xml @@ -4,6 +4,6 @@ Integrácia pumpy pre Omnipod Dash (nový model s funkciou Bluetooth a modrým krytom). - Stav Bluetooth - Adresa Bluetooth + + diff --git a/omnipod-dash/src/main/res/values-sl-rSI/strings.xml b/omnipod-dash/src/main/res/values-sl-rSI/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-sl-rSI/strings.xml +++ b/omnipod-dash/src/main/res/values-sl-rSI/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-sv-rSE/strings.xml b/omnipod-dash/src/main/res/values-sv-rSE/strings.xml index 16a67fc776..3c7c463c40 100644 --- a/omnipod-dash/src/main/res/values-sv-rSE/strings.xml +++ b/omnipod-dash/src/main/res/values-sv-rSE/strings.xml @@ -4,6 +4,6 @@ Pumpintegration för Omnipod Dash (den nya, Bluetooth-aktiverade modellen med blå nålskydd). - Bluetoothstatus - Bluetooth-adress + + diff --git a/omnipod-dash/src/main/res/values-ta-rIN/strings.xml b/omnipod-dash/src/main/res/values-ta-rIN/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-ta-rIN/strings.xml +++ b/omnipod-dash/src/main/res/values-ta-rIN/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-tr-rTR/strings.xml b/omnipod-dash/src/main/res/values-tr-rTR/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-tr-rTR/strings.xml +++ b/omnipod-dash/src/main/res/values-tr-rTR/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values-zh-rCN/strings.xml b/omnipod-dash/src/main/res/values-zh-rCN/strings.xml index c690568d07..0d89375603 100644 --- a/omnipod-dash/src/main/res/values-zh-rCN/strings.xml +++ b/omnipod-dash/src/main/res/values-zh-rCN/strings.xml @@ -3,4 +3,6 @@ + + diff --git a/omnipod-dash/src/main/res/values/strings.xml b/omnipod-dash/src/main/res/values/strings.xml index 16c21fa8db..78482e02e7 100644 --- a/omnipod-dash/src/main/res/values/strings.xml +++ b/omnipod-dash/src/main/res/values/strings.xml @@ -22,7 +22,7 @@ omnipod_common_preferences_category_confirmation common_preferences_category_other - AAPS.Omnipod.notification_delivery_suspended_sound_enabled + AAPS.Omnipod.notification_delivery_suspended_sound_enabled Sound when delivery suspended notification enabled diff --git a/omnipod-dash/src/test/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/util/FunctionsTest.kt b/omnipod-dash/src/test/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/util/FunctionsTest.kt index c1d290e8fd..03dfebdbe0 100644 --- a/omnipod-dash/src/test/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/util/FunctionsTest.kt +++ b/omnipod-dash/src/test/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/util/FunctionsTest.kt @@ -3,36 +3,25 @@ package info.nightscout.androidaps.plugins.pump.omnipod.dash.util import info.nightscout.androidaps.interfaces.Profile import info.nightscout.androidaps.interfaces.Profile.ProfileValue import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.definition.BasalProgram +import org.junit.Assert import org.junit.Assert.assertEquals -import org.junit.Rule import org.junit.Test -import org.junit.rules.ExpectedException import org.mockito.Mockito -import org.powermock.api.mockito.PowerMockito +import org.mockito.Mockito.`when` class FunctionsTest { - @Rule - @JvmField var thrown = ExpectedException.none() - @Test fun validProfile() { val profile = Mockito.mock(Profile::class.java) - val value1 = Mockito.mock(ProfileValue::class.java) - value1.timeAsSeconds = 0 - value1.value = 0.5 - val value2 = Mockito.mock(ProfileValue::class.java) - value2.timeAsSeconds = 18000 - value2.value = 1.0 - val value3 = Mockito.mock(ProfileValue::class.java) - value3.timeAsSeconds = 50400 - value3.value = 3.05 - PowerMockito.`when`(profile.getBasalValues()).thenReturn( + + `when`(profile.getBasalValues()).thenReturn( arrayOf( - value1, - value2, - value3 + ProfileValue(0, 0.5), + ProfileValue(18000, 1.0), + ProfileValue(50400, 3.05) ) ) + val basalProgram: BasalProgram = mapProfileToBasalProgram(profile) val entries: List = basalProgram.segments assertEquals(3, entries.size) @@ -51,73 +40,72 @@ class FunctionsTest { } @Test fun invalidProfileZeroEntries() { - thrown.expect(IllegalArgumentException::class.java) - thrown.expectMessage("Basal values should contain values") val profile = Mockito.mock(Profile::class.java) - PowerMockito.`when`(profile.getBasalValues()).thenReturn(emptyArray()) - mapProfileToBasalProgram(profile) + + `when`(profile.getBasalValues()).thenReturn(emptyArray()) + + Assert.assertThrows( + "Basal values should contain values", + java.lang.IllegalArgumentException::class.java + ) { + mapProfileToBasalProgram(profile) + } } @Test fun invalidProfileNonZeroOffset() { - thrown.expect(IllegalArgumentException::class.java) - thrown.expectMessage("First basal segment start time should be 0") val profile = Mockito.mock(Profile::class.java) - val value = Mockito.mock(ProfileValue::class.java) - value.timeAsSeconds = 1800 - value.value = 0.5 - PowerMockito.`when`(profile.getBasalValues()).thenReturn( - arrayOf( - value - ) + + `when`(profile.getBasalValues()).thenReturn( + arrayOf(ProfileValue(1800, 0.5)) ) - mapProfileToBasalProgram(profile) + + Assert.assertThrows( + "First basal segment start time should be 0", + java.lang.IllegalArgumentException::class.java + ) { + mapProfileToBasalProgram(profile) + } } @Test fun invalidProfileMoreThan24Hours() { - thrown.expect(IllegalArgumentException::class.java) - thrown.expectMessage("Basal segment start time can not be greater than 86400") - val profile = Mockito.mock(Profile::class.java) - val value1 = Mockito.mock(ProfileValue::class.java) - value1.timeAsSeconds = 0 - value1.value = 0.5 - val value2 = Mockito.mock(ProfileValue::class.java) - value2.timeAsSeconds = 86400 - value2.value = 0.5 - PowerMockito.`when`(profile.getBasalValues()).thenReturn( + + `when`(profile.getBasalValues()).thenReturn( arrayOf( - value1, - value2 + ProfileValue(0, 0.5), + ProfileValue(86400, 0.5) ) ) - mapProfileToBasalProgram(profile) + + Assert.assertThrows( + "Basal segment start time can not be greater than 86400", + java.lang.IllegalArgumentException::class.java + ) { + mapProfileToBasalProgram(profile) + } } @Test fun invalidProfileNegativeOffset() { - thrown.expect(IllegalArgumentException::class.java) - thrown.expectMessage("Basal segment start time can not be less than 0") val profile = Mockito.mock(Profile::class.java) - val value = Mockito.mock(ProfileValue::class.java) - value.timeAsSeconds = -1 - value.value = 0.5 - PowerMockito.`when`(profile.getBasalValues()).thenReturn( - arrayOf( - value - ) + + `when`(profile.getBasalValues()).thenReturn( + arrayOf(ProfileValue(-1, 0.5)) ) - mapProfileToBasalProgram(profile) + + Assert.assertThrows("Basal segment start time can not be less than 0", IllegalArgumentException::class.java) { + mapProfileToBasalProgram(profile) + } } @Test fun roundsToSupportedPrecision() { val profile = Mockito.mock(Profile::class.java) - val value = Mockito.mock(ProfileValue::class.java) - value.timeAsSeconds = 0 - value.value = 0.04 - PowerMockito.`when`(profile.getBasalValues()).thenReturn( + + `when`(profile.getBasalValues()).thenReturn( arrayOf( - value + ProfileValue(0, 0.04) ) ) + val basalProgram: BasalProgram = mapProfileToBasalProgram(profile) val basalProgramElement: BasalProgram.Segment = basalProgram.segments[0] assertEquals(5, basalProgramElement.basalRateInHundredthUnitsPerHour) diff --git a/omnipod-eros/src/main/res/values-de-rDE/strings.xml b/omnipod-eros/src/main/res/values-de-rDE/strings.xml index ddabbae38f..b3bd8f44af 100644 --- a/omnipod-eros/src/main/res/values-de-rDE/strings.xml +++ b/omnipod-eros/src/main/res/values-de-rDE/strings.xml @@ -1,6 +1,7 @@ + Pumpen-Integration für Omnipod Eros (älteres Modell mit transparenter Nadelkappe). Benötigt ein RileyLink-Gerät mit mindestens Firmware-Version 2.0. @@ -26,8 +27,47 @@ RLBatt: %1$d RileyLink Adresse ungültig. + Kommunikation fehlgeschlagen: Die Überprüfung der Nachrichtenintegrität ist fehlgeschlagen + Kommunikation fehlgeschlagen: Es wurde ein ungültiges Paket vom Pod empfangen. + Kommunikation fehlgeschlagen: Der Pod befindet sich in einem falschen Zustand. + Kommunikation fehlgeschlagen: Es wurde eine ungültige Antwort vom Pod empfangen. + Kommunikation fehlgeschlagen: Ungültige Zeichenfolge vom Pod empfangen. + Kommunikation fehlgeschlagen: Ungültige Adresse vom Pod empfangen. + Kommunikation fehlgeschlagen: Nachricht vom Pod konnte nicht decodiert werden. + Kommunikation fehlgeschlagen: Nonce resync fehlgeschlagen. + Kommunikation fehlgeschlagen: Nonce nicht synchronisiert. + Kommunikation fehlgeschlagen: Nicht genügend Daten vom Pod empfangen. + Ein Pod-Fehler (%1$03d %2$s) wurde festgestellt. Bitte deaktiviere den Pod und aktiviere einen neuen. + Kommunikation fehlgeschlagen: Fehlerhafte Antwort vom Pod. + Keine Antwort vom RileyLink + RileyLink unterbrochen + Keine Rückmeldung vom Pod + Basalprofil konnte nicht eingestellt werden. Insulinabgabe wird evtl. unterbrochen. Aktualisiere den Pod Status bitte manuell im Omnipod Tab und starte die Abgabe falls notwendig neu. + Basalprofil konnte evtl. nicht eingestellt werden. Insulinabgabe wird evtl. unterbrochen. Aktualisiere den Pod Status bitte manuell im Omnipod Tab und starte die Abgabe falls notwendig neu. + Basalprofil konnte nicht eingestellt werden. Insulinabgabe wurde unterbrochen. Bitte starte die Abgabe manuell im Omnipod Tab neu. + Abbruch der temporären Basalrate evtl. fehlgeschlagen. Aktualisiere den Pod Status manuell im Omnipod Tab. + TBR konnte nicht gesetzt werden. Falls zuvor eine andere TBR aktiv war, wurde diese evtl. abgebrochen. Aktualisiere bitte manuell den Pod Status im Omnipod Tab. + TBR konnte evtl. nicht gesetzt werden. Falls zuvor eine andere TBR aktiv war, wurde diese abgebrochen. Aktualisiere bitte manuell den Pod Status im Omnipod Tab. + TBR Dauer muss größer null und ein Vielfaches von %1$s Minuten sein. + Zeit konnte evtl. nicht eingestellt werden. Insulinabgabe wird evtl. unterbrochen. Aktualisiere den Pod Status bitte manuell im Omnipod Tab und starte die Abgabe falls notwendig neu. + Zeit konnte nicht eingestellt werden. Insulinabgabe wurde unterbrochen. Bitte starte die Abgabe manuell im Omnipod Tab neu. + Fehler beim Lesen des Pulse-Log + Zeit auf den Pod konnte nicht geändert werden. Synchronisiere die Zeit manuell im Omnipod tab. + Aktion ist nicht möglich.\n\n Du musst zuerst den Omnipod konfigurieren, bevor Du diese Operation verwenden kannst. + Bolusabgabe kann nicht verifiziert werden. Prüfe manuell, ob der Pod Insulin abgibt, indem Du auf Klickgeräusche achtest. Wenn Du sicher bist, dass der Bolus nicht abgegeben wurde, musst Du ihn manuell aus den Behandlungen löschen. Dies gilt auch, wenn Du jetzt \'Bolus abbrechen\' klickst! + SMB-Abgabe (%1$.2f IE) kann nicht verifiziert werden. Wenn Du sicher bist, dass der SMB nicht abgegeben wurde, musst Du ihn manuell aus den Behandlungen löschen. + Auf dem Pod läuft eine temp. Basalrate, aber AAPS kennt diese nicht. Brich die TBR bitte manuell ab. + RileyLink Status + Warte auf Verbindung mit RileyLink… + RileyLink-Konfiguration zurücksetzen + Pulse-Log lesen + Lese Puls-Log... + Pulse Log + Pulse Log (in Zwischenablage kopiert) Befülle den neuen Pod mit ausreichend Insulin für 3 Tage.\n\nAchte auch zwei Pieptöne vom Pod während des Füllens. Diese zeigen an, dass der Pod mit der Mindestmenge von 80 IE befüllt wurde. Leere die Spritze komplett, auch wenn Du die beiden Pieptöne gehört hast.\n\nKlicke Weiter nachdem Du den Pod befüllt hast.\n\nHinweis: Entferne den Nadelschutz des Pods noch nicht.\nHinweis: Bringe den RileyLink in eine aufrechte Position und platziere den Pod einige Zentimeter entfernt davon. + Versuche, Dich mit dem neuen Pod zu verbinden und ihn zu befüllen.\n\nWenn der Initialisierungsprozess erfolgreich abgeschlossen ist, kannst Du Weiter drücken.\n\nHinweis: Bringe den RileyLink bitte in eine aufrechte Position und platziere den Pod einige Zentimeter entfernt davon. + unsicher diff --git a/omnipod-eros/src/main/res/values-ko-rKR/strings.xml b/omnipod-eros/src/main/res/values-ko-rKR/strings.xml index bc89093c83..b1b3b56249 100644 --- a/omnipod-eros/src/main/res/values-ko-rKR/strings.xml +++ b/omnipod-eros/src/main/res/values-ko-rKR/strings.xml @@ -1,13 +1,73 @@ + Omnipod Eros 를 위한 펌프 통합 (투명 니들 캡이있는 구형 모델). 펌웨어 버전이 2.0 이상인 RileyLink 장치가 필요합니다. + RileyLink 의 구성 + 알림 + Pod 관리 메뉴에 Pulse 로그 버튼 표시 + Pod 관리 메뉴에 RileyLink 통계 버튼 표시 + Actions 탭에서 배터리 교환 활성화 + RileyLink + 불확실한 TBR 알림 소리 활성화 + 불확실한 SMB 알림 소리 활성화 + 불확실한 볼루스 알림 소리 활성화 + Pod 이력 + 상세설명 + 소스 + 날짜 + 종류: + %1$.2f U + %1$.2f U, CH=%2$.1f g + Rate: %1$.2f U, 기간: %2$d 분 + RLBatt: %1$d + RileyLink 주소가 유효하지 않습니다 + 통신 실패: 메시지 연동 확인 실패 + 통신 실패: Pod 에서 유효하지 않은 패킷을 받음 + 통신 실패: Pod 가 잘못된 상태에 있음 + 통신 실패: Pod 에서 유효하지 않은 응답을 받음 + 연결 실패: Pod에서 유효하지 않은 일련번호 포함한 메시지 전송됨 + 연결 실패: Pod에서 유효하지 않은 주소 포함한 메시지 전송됨 + 연결 실패: Pod에서 암호 해독 실패함 + 연결 실패: 임시 재동기화 실패함 + 연결 실패: 임시 동기화 시간 지남 + 연결 실패: Pod로부터 수신한 데이터 부족 + Pod 이상 (%1$03d %2$s)이 감지되었습니다. 현재 pod를 비활성화하고, 새로운 pod를 활성화하십시오. + 연결 실패: Pod가 오류 응답을 보냄 + RileyLink에서 반응 없음 + RileyLink 차단됨 + Pod에서 반응 없음 + Basal 프로파일 설정이 실패함. 주입이 중지되었을 것입니다! 필요하다면, Omnipod 탭에서 Pod 상태를 수동으로 업데이트하고 재시작하십시오. + Basal 프로파일 설정이 실패했을 것입니다. 주입이 중지되었을 것입니다! 필요하다면, Omnipod 탭에서 Pod 상태를 수동으로 업데이트하고, 주입을 재시작하십시오. + Basal 프로파일 설정이 실패함. 주입이 중지됨! Omnipod 탭에서 주입을 수동으로 재시작하십시오. + 임시 basal 취소가 실패한 것 같습니다. Omnipod 탭에서 Pod 상태를 수동으로 업데이트하십시오. + 임시 basal 설정이 실패함. 임시 basal이 작동하고 있었다면, 이는 취소되었을 것입니다. Omnipod 탭에서 Pod 상태를 수동으로 업데이트 하십시오. + 임시 basal 설정이 실패한 것 같습니다. 임시 basal이 작동하고 있었다면, 이는 취소되었을 것입니다. Omnipod 탭에서 Pod 상태를 수동으로 업데이트 하십시오. + TBR 기간은 반드시 0보다 크고, %1$s분의 배수이어야 합니다. + 시간 설정이 실패했을 것입니다. 주입이 중지되었을 것입니다! 필요하다면, Omnipod 탭에서 Pod 상태를 수동으로 업데이트하고, 주입을 재시작하십시오. + 시간 설정이 실패함. 주입이 중지됨! Omnipod 탭에서 주입을 수동으로 재시작하십시오. + Pulse 로그 읽어오기 실패함 + Pod에서 자동 시간 전환 실패함. Omnipod 탭에서 수동으로 시간을 동기화 하여야 합니다. + 작업이 불가능합니다.\n\n이 작업을 사용하기 전에 우선 Omnipod를 설정해야합니다. + Bolus가 성공적으로 주입되었는지 확인이 어렵습니다. 딸깍 소리에 귀기울여 Pod가 bolus를 주입 중인지 수동으로 확인하십시오. Bolus가 성공적으로 주입되지 않음이 확실하면, 지금 \'Bolus 취소\'를 눌렀을지라도 \'처치\' 탭에서 bolus 기록을 수동으로 삭제하십시오! + SMB bolus(%1$.2f U)가 성공적으로 주입되었는지 확인이 어렵습니다. SMB Bolus가 성공적으로 주입되지 않음이 확실하면, \'처치\' 탭에서 SMB 기록을 수동으로 삭제해야 합니다. + Pod에서 임시 basal이 작동하고 있으나, AAPS는 이 임시 basal을 인식하지 못하고 있습니다. 임시 basal을 수동으로 취소하십시오. + RileyLink 통계 + RileyLink 연결 대기... + RileyLink 구성 재설정 + Pulse Log 확인 + Pulse Log 확인 중... + Pulse 로그 + Pulse 로그 (클립보드에 복사됨) + 3일 동안 사용할 수 있는 충분한 인슐린으로 새로운 Pod를 채우십시오. \n\n인슐린을 채우는 동안 Pod에서 나는 두 번의 신호음을 듣습니다. 이는 최소 용량인 80U이 채워졌음을 의미합니다. 두 번의 신호음을 들은 후에도 인슐린 충전용 시린지가 완전히 비워졌는지 확인하십시오. \n\nPod를 채운 후, 다음을 누르십시오. \n\n참고:이 때 Pod의 바늘 캡을 제거하지 마십시오. \n참고:RileyLink를 반듯하게 세워놓고 Pod를 가까이 두십시오. + 새로운 Pod를 연결하고 prime을 시도하십시오. \n\n 시작 과정이 성공적으로 완료되면, 다음을 누를 수 있습니다. \n\n참고:RileyLink를 반듯하게 세워놓고 Pod를 가까이 두십시오. + 불확실함 diff --git a/openhumans/src/main/java/info/nightscout/androidaps/plugin/general/openhumans/OpenHumansUploader.kt b/openhumans/src/main/java/info/nightscout/androidaps/plugin/general/openhumans/OpenHumansUploader.kt index ed2c180ba2..469f4aa346 100644 --- a/openhumans/src/main/java/info/nightscout/androidaps/plugin/general/openhumans/OpenHumansUploader.kt +++ b/openhumans/src/main/java/info/nightscout/androidaps/plugin/general/openhumans/OpenHumansUploader.kt @@ -267,7 +267,7 @@ class OpenHumansUploader @Inject internal constructor( put("currentTemp", JSONObject(it.currentTempJson)) put("iobData", JSONObject(it.iobDataJson)) put("profile", JSONObject(it.profileJson)) - put("autosensData", JSONObject(it.autosensDataJson)) + put("autosensData", JSONObject(it.autosensDataJson ?: "")) put("mealData", JSONObject(it.mealDataJson)) put("isMicroBolusAllowed", it.isMicroBolusAllowed) put("result", JSONObject(it.resultJson)) diff --git a/openhumans/src/main/res/values-ko-rKR/strings.xml b/openhumans/src/main/res/values-ko-rKR/strings.xml index 14bbbe149e..969971395d 100644 --- a/openhumans/src/main/res/values-ko-rKR/strings.xml +++ b/openhumans/src/main/res/values-ko-rKR/strings.xml @@ -2,9 +2,18 @@ Open Humans (데이터를 공개함) OH + Open Humans는 당신의 당뇨 관련 데이터를 업로드하고 이를 과학적 연구 프로젝트에 기증하도록 허용합니다. 로그아웃 + 설정 + Open Humans가 설정되었습니다. 데이터 업로드의 중단을 원할 경우, \'로그아웃\'을 누르십시오. + Open Humans가 현재 비활성화되어 있습니다. 데이터 업로드의 시작을 원할 경우, \'설정\'을 누르십시오. + 프로젝트 회원 ID: %1$s WiFi에 연결되었을 경우에만 업로드함 충전 중에만 업로드함 + Open Humans에 업로드 중... + Open Humans 알림 + AndroidAPS가 Open Humans에 업로드 중입니다. 시간이 조금 걸립니다. Open Humans에 접속 종료되었습니다. 의도한 것이 아닌 경우 \"여기\"를 클릭하여 다시 접속하십시오. + 지금 업로드하기 diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.kt index 6314f5e668..39c4f9ecd6 100644 --- a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.kt +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.kt @@ -69,7 +69,6 @@ abstract class PumpPluginAbstract protected constructor( protected var displayConnectionMessages = false var pumpType: PumpType = PumpType.GENERIC_AAPS - get() = field set(value) { field = value pumpDescription.fillFor(value) diff --git a/rileylink/src/main/res/values-ko-rKR/strings.xml b/rileylink/src/main/res/values-ko-rKR/strings.xml index 776fdba0e6..e6ed20e16c 100644 --- a/rileylink/src/main/res/values-ko-rKR/strings.xml +++ b/rileylink/src/main/res/values-ko-rKR/strings.xml @@ -2,6 +2,19 @@ + 스캔하기 + 정지 + 선택됨 + RileyLink 스캔 + 스캔중 + 스캔 완료 + 스캔 에러: %1$d + 절대 + 현재 선택된 RileyLink + 삭제 + RileyLink를 제거하는 것이 확실합니까? + RileyLink 제거하기 + 선택된 RileyLink 없음 설정 이력 @@ -9,7 +22,23 @@ 펌프 상태 RileyLink 설정 RileyLink + 주소: + 이름: + 배터리 잔량: + %1$d%% + 연결상태: + 연결에러: 장치 + 장치타입: + 설정된 장치 모델: + 연결된 장치 모델: + 최근 사용된 주파수: + 최근 장치 연결: + 펌웨어 버전: + BLE113: %1$s\nCC110: %2$s + 펌프 일련번호: + 펌프 주파수: + %1$.2f MHz 블루투스 초기화중... 블루투스 에러 @@ -19,14 +48,28 @@ RileyLink 에러 RileyLink 와 펌프 튜닝 펌프 연결 문제 + 연결됨 + RileyLink 준비 장치가 RileyLink가 아닙니다. RileyLink에 연결할 수 없음 블루투스 비활성 블루투스 어댑터 없음 튜닝 실패 + 펌프에 연결할 수 없습니다. 포드에 연결할 수 없습니다. 메드트로닉 펌프 + Omnipod (Eros) + + 아니오 + OrangeLink/EmaLink/DiaLink에서 보고한 배터리 잔량 나타내기 + 오리지널 RileyLink와 작동하지 않음. 다른 RileyLink 대체 기기와도 작동하지 않을 수 있음. + + %1$d 일 + + + %1$d 시간 + diff --git a/wear/src/main/res/values-ko-rKR/strings.xml b/wear/src/main/res/values-ko-rKR/strings.xml index 668663e075..90fbedc84f 100644 --- a/wear/src/main/res/values-ko-rKR/strings.xml +++ b/wear/src/main/res/values-ko-rKR/strings.xml @@ -10,6 +10,7 @@ AAPSv2 AAPS(조종석) AAPS(스팀펑크) + AAPS(디지털방식) 데이터없음! 오래된 데이터! %1$s 이후 @@ -60,12 +61,15 @@ 컴플리케이션 탭 동작 컴플리케이션에서 유니코드 사용 버전: + 더 다양한 워치페이스 설정 + 워치페이스 설정을 확인하십시오. 임시목표 마법사 Bolus 확장탄수화물 설정 상태 + 재동기화 교체/채움 없음 기본 @@ -86,6 +90,9 @@ 확인 시간이동 Bolus + Bolus 주입 중 + 눌러서 취소하기 + BOLUS 취소 펌프 Loop CPP @@ -93,4 +100,40 @@ Carb IOB 상태 없음 + 빨강 + 핑크 + 보라 + 진보라 + 진파랑 + 파랑 + 밝은 파랑 + 하늘색 + 청록 + 초록 + 밝은 초록 + 라임 + 노랑 + 황색 + 주황 + 짙은 주황 + 갈색 + 회색 + 청회색 + 흰색 + 검정 + 다양한 색상 + 시간마다 진동 + 몇 번째 주인지 표시 + 사용자 형식: + 형식 없음 + 단순한 형태 + 모양 + 완전한 형식 + 사용자 색상: + 사용자 색상 선명도: + 사용자 색상 불투명도: + AAPS Bolus 주입 중 + AAPS Bolus 주입 무음화 + Bolus 진행과 취소 + Bolus 주입과 취소 시 진동 적게 함 diff --git a/wear/src/test/java/info/nightscout/androidaps/testing/mockers/WearUtilMocker.java b/wear/src/test/java/info/nightscout/androidaps/testing/mockers/WearUtilMocker.java index e3f24e878e..5e6ac597db 100644 --- a/wear/src/test/java/info/nightscout/androidaps/testing/mockers/WearUtilMocker.java +++ b/wear/src/test/java/info/nightscout/androidaps/testing/mockers/WearUtilMocker.java @@ -58,7 +58,7 @@ public class WearUtilMocker { return REF_NOW - (Constants.DAY_IN_MS * d + Constants.HOUR_IN_MS * h + Constants.MINUTE_IN_MS * m + Constants.SECOND_IN_MS * s); } - private static Answer bundleToDataMapMock = invocation -> { + private static final Answer bundleToDataMapMock = invocation -> { DataMap map = new DataMap(); Bundle bundle = invocation.getArgument(0); for(String key: bundle.keySet()) {