Merge pull request #134 from 0pen-dash/avereha/warnings

fix warnings. merge with dev
This commit is contained in:
Andrei Vereha 2021-10-04 17:55:51 +02:00 committed by GitHub
commit 3f6c922455
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
168 changed files with 2876 additions and 1299 deletions

View file

@ -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

View file

@ -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)_

View file

@ -165,7 +165,7 @@ class MainActivity : NoSplashAppCompatActivity() {
actionBarDrawerToggle.syncState()
}
public override fun onDestroy() {
override fun onDestroy() {
super.onDestroy()
disposable.clear()
}

View file

@ -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)
@ -271,9 +271,12 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
private fun loadAll(from: String) {
updateDate()
Thread {
overviewData.prepareBasalData(from)
overviewData.prepareTemporaryTargetData(from)
overviewData.prepareBgData("$from")
overviewData.prepareTreatmentsData(from)
rxBus.send(EventRefreshOverview("loadAll_$from"))
overviewData.prepareTemporaryTargetData(from)
rxBus.send(EventRefreshOverview("loadAll_$from"))
overviewData.prepareBasalData(from)
rxBus.send(EventRefreshOverview(from))
aapsLogger.debug(LTag.UI, "loadAll $from finished")
runCalculation(from)

View file

@ -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))
}
}

View file

@ -11,6 +11,7 @@ import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.interfaces.*
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
import info.nightscout.androidaps.plugins.configBuilder.PluginStore
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctionImplementation
@ -22,6 +23,7 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorP
import info.nightscout.androidaps.plugins.pump.PumpSyncImplementation
import info.nightscout.androidaps.queue.CommandQueue
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.HardLimits
import info.nightscout.androidaps.utils.androidNotification.NotificationHolderImpl
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
import info.nightscout.androidaps.utils.buildHelper.BuildHelperImpl
@ -69,8 +71,15 @@ open class AppModule {
@Provides
@Singleton
fun provideProfileFunction(aapsLogger: AAPSLogger, sp: SP, resourceHelper: ResourceHelper, activePlugin: ActivePlugin, repository: AppRepository, dateUtil: DateUtil): ProfileFunction =
ProfileFunctionImplementation(aapsLogger, sp, resourceHelper, activePlugin, repository, dateUtil)
fun provideProfileFunction(
aapsLogger: AAPSLogger, sp: SP, rxBus: RxBusWrapper, resourceHelper:
ResourceHelper, activePlugin:
ActivePlugin, repository: AppRepository, dateUtil: DateUtil, config: Config, hardLimits: HardLimits
): ProfileFunction =
ProfileFunctionImplementation(
aapsLogger, sp, rxBus, resourceHelper, activePlugin, repository, dateUtil,
config, hardLimits
)
@Module
interface AppBindings {

View file

@ -9,14 +9,12 @@ import info.nightscout.androidaps.database.ValueWrapper
import info.nightscout.androidaps.database.entities.ProfileSwitch
import info.nightscout.androidaps.database.transactions.InsertOrUpdateProfileSwitch
import info.nightscout.androidaps.extensions.fromConstant
import info.nightscout.androidaps.interfaces.ActivePlugin
import info.nightscout.androidaps.interfaces.GlucoseUnit
import info.nightscout.androidaps.interfaces.Profile
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.interfaces.ProfileStore
import info.nightscout.androidaps.interfaces.*
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.HardLimits
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
@ -30,10 +28,13 @@ import javax.inject.Singleton
class ProfileFunctionImplementation @Inject constructor(
private val aapsLogger: AAPSLogger,
private val sp: SP,
private val rxBus: RxBusWrapper,
private val resourceHelper: ResourceHelper,
private val activePlugin: ActivePlugin,
private val repository: AppRepository,
private val dateUtil: DateUtil
private val dateUtil: DateUtil,
private val config: Config,
private val hardLimits: HardLimits
) : ProfileFunction {
val cache = LongSparseArray<Profile>()
@ -115,35 +116,39 @@ class ProfileFunctionImplementation @Inject constructor(
val ps = buildProfileSwitch(profileStore, profileName, durationInMinutes, percentage, timeShiftInHours, timestamp)
disposable += repository.runTransactionForResult(InsertOrUpdateProfileSwitch(ps))
.subscribe({ result ->
result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted ProfileSwitch $it") }
result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated ProfileSwitch $it") }
}, {
aapsLogger.error(LTag.DATABASE, "Error while saving ProfileSwitch", it)
})
result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted ProfileSwitch $it") }
result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated ProfileSwitch $it") }
}, {
aapsLogger.error(LTag.DATABASE, "Error while saving ProfileSwitch", it)
})
}
override fun createProfileSwitch(durationInMinutes: Int, percentage: Int, timeShiftInHours: Int) {
override fun createProfileSwitch(durationInMinutes: Int, percentage: Int, timeShiftInHours: Int): Boolean {
val profile = repository.getPermanentProfileSwitch(dateUtil.now())
?: throw InvalidParameterSpecException("No active ProfileSwitch")
val ps = ProfileSwitch(
timestamp = dateUtil.now(),
basalBlocks = profile.basalBlocks,
isfBlocks = profile.isfBlocks,
icBlocks = profile.icBlocks,
targetBlocks = profile.targetBlocks,
glucoseUnit = profile.glucoseUnit,
profileName = profile.profileName,
timeshift = T.hours(timeShiftInHours.toLong()).msecs(),
percentage = percentage,
duration = T.mins(durationInMinutes.toLong()).msecs(),
insulinConfiguration = activePlugin.activeInsulin.insulinConfiguration
val profileStore = activePlugin.activeProfileSource.profile ?: return false
val ps = buildProfileSwitch(profileStore, profile.profileName, durationInMinutes, percentage, 0, dateUtil.now())
val validity = ProfileSealed.PS(ps).isValid(
resourceHelper.gs(info.nightscout.androidaps.automation.R.string.careportal_profileswitch),
activePlugin.activePump,
config,
resourceHelper,
rxBus,
hardLimits
)
disposable += repository.runTransactionForResult(InsertOrUpdateProfileSwitch(ps))
.subscribe({ result ->
result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted ProfileSwitch $it") }
result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated ProfileSwitch $it") }
}, {
aapsLogger.error(LTag.DATABASE, "Error while saving ProfileSwitch", it)
})
var returnValue = true
if (validity.isValid) {
repository.runTransactionForResult(InsertOrUpdateProfileSwitch(ps))
.doOnError {
aapsLogger.error(LTag.DATABASE, "Error while saving ProfileSwitch", it)
returnValue = false
}
.blockingGet()
.also { result ->
result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted ProfileSwitch $it") }
result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated ProfileSwitch $it") }
}
} else returnValue = false
return returnValue
}
}

View file

@ -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

View file

@ -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<EffectiveProfileSwitch> {
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")

View file

@ -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

View file

@ -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)?.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 ||

View file

@ -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)

View file

@ -63,7 +63,8 @@ class OverviewData @Inject constructor(
BG,
IOB_COB,
SENSITIVITY,
GRAPH
GRAPH,
PUMPSTATUS
}
var rangeToDisplay = 6 // for graph
@ -72,9 +73,7 @@ class OverviewData @Inject constructor(
var endTime: Long = 0
fun reset() {
profile = null
profileName = null
profileNameWithRemainingTime = null
pumpStatus = ""
calcProgress = ""
lastBg = null
temporaryBasal = null
@ -126,25 +125,10 @@ class OverviewData @Inject constructor(
}
/*
* PROFILE
* PUMP STATUS
*/
var profile: Profile? = null
var profileName: String? = null
var profileNameWithRemainingTime: String? = null
val profileBackgroundColor: Int
get() =
profile?.let { profile ->
if (profile.percentage != 100 || profile.timeshift != 0) resourceHelper.gc(R.color.ribbonWarning)
else resourceHelper.gc(R.color.ribbonDefault)
} ?: resourceHelper.gc(R.color.ribbonTextDefault)
val profileTextColor: Int
get() =
profile?.let { profile ->
if (profile.percentage != 100 || profile.timeshift != 0) resourceHelper.gc(R.color.ribbonTextWarning)
else resourceHelper.gc(R.color.ribbonTextDefault)
} ?: resourceHelper.gc(R.color.ribbonTextDefault)
var pumpStatus: String = ""
/*
* CALC PROGRESS
@ -181,14 +165,14 @@ class OverviewData @Inject constructor(
val temporaryBasalText: String
get() =
profile?.let { profile ->
profileFunction.getProfile()?.let { profile ->
if (temporaryBasal?.isInProgress == false) temporaryBasal = null
temporaryBasal?.let { "T:" + it.toStringShort() }
?: resourceHelper.gs(R.string.pump_basebasalrate, profile.getBasal())
} ?: resourceHelper.gs(R.string.notavailable)
val temporaryBasalDialogText: String
get() = profile?.let { profile ->
get() = profileFunction.getProfile()?.let { profile ->
temporaryBasal?.let { temporaryBasal ->
"${resourceHelper.gs(R.string.basebasalrate_label)}: ${resourceHelper.gs(R.string.pump_basebasalrate, profile.getBasal())}" +
"\n" + resourceHelper.gs(R.string.tempbasal_label) + ": " + temporaryBasal.toStringFull(profile, dateUtil)
@ -198,7 +182,7 @@ class OverviewData @Inject constructor(
val temporaryBasalIcon: Int
get() =
profile?.let { profile ->
profileFunction.getProfile()?.let { profile ->
temporaryBasal?.let { temporaryBasal ->
val percentRate = temporaryBasal.convertedToPercent(dateUtil.now(), profile)
when {
@ -510,7 +494,7 @@ class OverviewData @Inject constructor(
@Synchronized
fun prepareTemporaryTargetData(from: String) {
// val start = dateUtil.now()
val profile = profile ?: return
val profile = profileFunction.getProfile() ?: return
val units = profileFunction.getUnits()
var toTime = toTime
val targetsSeriesArray: MutableList<DataPoint> = java.util.ArrayList()

View file

@ -26,6 +26,7 @@ import dagger.android.HasAndroidInjector
import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.R
import info.nightscout.androidaps.data.ProfileSealed
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.entities.UserEntry.Action
import info.nightscout.androidaps.database.entities.UserEntry.Sources
@ -60,7 +61,11 @@ import info.nightscout.androidaps.plugins.source.DexcomPlugin
import info.nightscout.androidaps.plugins.source.XdripPlugin
import info.nightscout.androidaps.queue.CommandQueue
import info.nightscout.androidaps.skins.SkinProvider
import info.nightscout.androidaps.utils.*
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.ToastUtils
import info.nightscout.androidaps.utils.TrendCalculator
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
import info.nightscout.androidaps.utils.protection.ProtectionCheck
@ -72,6 +77,7 @@ import info.nightscout.androidaps.utils.wizard.QuickWizard
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.plusAssign
import java.util.*
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import kotlin.collections.ArrayList
import kotlin.math.abs
@ -158,8 +164,6 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
skinProvider.activeSkin().preProcessLandscapeOverviewLayout(dm, view, landscape, resourceHelper.gb(R.bool.isTablet), smallHeight)
binding.nsclientLayout.visibility = config.NSCLIENT.toVisibility()
binding.loopPumpStatusLayout.pumpStatus.setBackgroundColor(resourceHelper.gc(R.color.colorInitializingBorder))
binding.notifications.setHasFixedSize(false)
binding.notifications.layoutManager = LinearLayoutManager(view.context)
axisWidth = if (dm.densityDpi <= 120) 3 else if (dm.densityDpi <= 160) 10 else if (dm.densityDpi <= 320) 35 else if (dm.densityDpi <= 420) 50 else if (dm.densityDpi <= 560) 70 else 80
@ -188,10 +192,10 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
prepareGraphsIfNeeded(overviewMenus.setting.size)
overviewMenus.setupChartMenu(binding.graphsLayout.chartMenuButton)
binding.loopPumpStatusLayout.activeProfile.setOnClickListener(this)
binding.loopPumpStatusLayout.activeProfile.setOnLongClickListener(this)
binding.loopPumpStatusLayout.tempTarget.setOnClickListener(this)
binding.loopPumpStatusLayout.tempTarget.setOnLongClickListener(this)
binding.activeProfile.setOnClickListener(this)
binding.activeProfile.setOnLongClickListener(this)
binding.tempTarget.setOnClickListener(this)
binding.tempTarget.setOnLongClickListener(this)
binding.buttonsLayout.acceptTempButton.setOnClickListener(this)
binding.buttonsLayout.treatmentButton.setOnClickListener(this)
binding.buttonsLayout.wizardButton.setOnClickListener(this)
@ -203,7 +207,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
binding.buttonsLayout.quickWizardButton.setOnLongClickListener(this)
binding.infoLayout.apsMode.setOnClickListener(this)
binding.infoLayout.apsMode.setOnLongClickListener(this)
binding.loopPumpStatusLayout.activeProfile.setOnLongClickListener(this)
binding.activeProfile.setOnLongClickListener(this)
}
@Synchronized
@ -244,10 +248,14 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
.toObservable(EventNewOpenLoopNotification::class.java)
.observeOn(aapsSchedulers.io)
.subscribe({ scheduleUpdateGUI("EventNewOpenLoopNotification") }, fabricPrivacy::logException))
disposable.add(rxBus
disposable += rxBus
.toObservable(EventPumpStatusChanged::class.java)
.observeOn(aapsSchedulers.main)
.subscribe({ updatePumpStatus(it) }, fabricPrivacy::logException))
.delay (30, TimeUnit.MILLISECONDS, aapsSchedulers.main)
.subscribe({
overviewData.pumpStatus = it.getStatus(resourceHelper)
updateGUI("EventPumpStatusChanged", OverviewData.Property.PUMPSTATUS)
}, fabricPrivacy::logException)
refreshLoop = Runnable {
overviewPlugin.refreshLoop("refreshLoop")
@ -405,18 +413,6 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
}
}
private fun updatePumpStatus(event: EventPumpStatusChanged) {
val status = event.getStatus(resourceHelper)
if (status != "") {
binding.loopPumpStatusLayout.pumpStatus.text = status
binding.loopPumpStatusLayout.pumpStatusLayout.visibility = View.VISIBLE
binding.loopPumpStatusLayout.loopLayout.visibility = View.GONE
} else {
binding.loopPumpStatusLayout.pumpStatusLayout.visibility = View.GONE
binding.loopPumpStatusLayout.loopLayout.visibility = View.VISIBLE
}
}
@SuppressLint("SetTextI18n")
private fun processButtonsVisibility() {
val lastBG = iobCobCalculator.ads.lastBg()
@ -598,15 +594,12 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
fun updateGUI(from: String, what: OverviewData.Property) {
// if (what != OverviewData.Property.CALC_PROGRESS)
// aapsLogger.debug(LTag.UI, "UpdateGui $from $what")
if (overviewData.profile == null) {
binding.loopPumpStatusLayout.pumpStatus.setText(R.string.noprofileset)
binding.loopPumpStatusLayout.pumpStatusLayout.visibility = View.VISIBLE
binding.loopPumpStatusLayout.loopLayout.visibility = View.GONE
if (profileFunction.getProfile() == null) {
binding.activeProfile.setText(R.string.noprofileset)
binding.activeProfile.setBackgroundColor(resourceHelper.gc(R.color.errorAlertBackground))
return
}
binding.notifications.let { notificationStore.updateNotifications(it) }
binding.loopPumpStatusLayout.pumpStatusLayout.visibility = View.GONE
binding.loopPumpStatusLayout.loopLayout.visibility = View.VISIBLE
val units = profileFunction.getUnits()
val pump = activePlugin.activePump
@ -641,10 +634,25 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
}
OverviewData.Property.PROFILE -> {
binding.loopPumpStatusLayout.activeProfile.text = overviewData.profileNameWithRemainingTime
?: ""
binding.loopPumpStatusLayout.activeProfile.setBackgroundColor(overviewData.profileBackgroundColor)
binding.loopPumpStatusLayout.activeProfile.setTextColor(overviewData.profileTextColor)
val profileBackgroundColor =
profileFunction.getProfile()?.let {
val profile = (it as ProfileSealed.EPS).value
if (profile.originalPercentage != 100 || profile.originalTimeshift != 0L || profile.originalDuration != 0L)
resourceHelper.gc(R.color.ribbonWarning)
else resourceHelper.gc(R.color.ribbonDefault)
} ?: resourceHelper.gc(R.color.ribbonTextDefault)
val profileTextColor =
profileFunction.getProfile()?.let {
val profile = (it as ProfileSealed.EPS).value
if (profile.originalPercentage != 100 || profile.originalTimeshift != 0L || profile.originalDuration != 0L)
resourceHelper.gc(R.color.ribbonTextWarning)
else resourceHelper.gc(R.color.ribbonTextDefault)
} ?: resourceHelper.gc(R.color.ribbonTextDefault)
binding.activeProfile.text = profileFunction.getProfileNameWithRemainingTime()
binding.activeProfile.setBackgroundColor(profileBackgroundColor)
binding.activeProfile.setTextColor(profileTextColor)
}
OverviewData.Property.TEMPORARY_BASAL -> {
@ -705,23 +713,23 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
if (overviewData.temporaryTarget?.isInProgress(dateUtil) == false) overviewData.temporaryTarget = null
val tempTarget = overviewData.temporaryTarget
if (tempTarget != null) {
binding.loopPumpStatusLayout.tempTarget.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
binding.loopPumpStatusLayout.tempTarget.setBackgroundColor(resourceHelper.gc(R.color.ribbonWarning))
binding.loopPumpStatusLayout.tempTarget.text = Profile.toTargetRangeString(tempTarget.lowTarget, tempTarget.highTarget, GlucoseUnit.MGDL, units) + " " + dateUtil.untilString(tempTarget.end, resourceHelper)
binding.tempTarget.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
binding.tempTarget.setBackgroundColor(resourceHelper.gc(R.color.ribbonWarning))
binding.tempTarget.text = Profile.toTargetRangeString(tempTarget.lowTarget, tempTarget.highTarget, GlucoseUnit.MGDL, units) + " " + dateUtil.untilString(tempTarget.end, resourceHelper)
} else {
// If the target is not the same as set in the profile then oref has overridden it
overviewData.profile?.let { profile ->
profileFunction.getProfile()?.let { profile ->
val targetUsed = loopPlugin.lastRun?.constraintsProcessed?.targetBG ?: 0.0
if (targetUsed != 0.0 && abs(profile.getTargetMgdl() - targetUsed) > 0.01) {
aapsLogger.debug("Adjusted target. Profile: ${profile.getTargetMgdl()} APS: $targetUsed")
binding.loopPumpStatusLayout.tempTarget.text = Profile.toTargetRangeString(targetUsed, targetUsed, GlucoseUnit.MGDL, units)
binding.loopPumpStatusLayout.tempTarget.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
binding.loopPumpStatusLayout.tempTarget.setBackgroundColor(resourceHelper.gc(R.color.tempTargetBackground))
binding.tempTarget.text = Profile.toTargetRangeString(targetUsed, targetUsed, GlucoseUnit.MGDL, units)
binding.tempTarget.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
binding.tempTarget.setBackgroundColor(resourceHelper.gc(R.color.tempTargetBackground))
} else {
binding.loopPumpStatusLayout.tempTarget.setTextColor(resourceHelper.gc(R.color.ribbonTextDefault))
binding.loopPumpStatusLayout.tempTarget.setBackgroundColor(resourceHelper.gc(R.color.ribbonDefault))
binding.loopPumpStatusLayout.tempTarget.text = Profile.toTargetRangeString(profile.getTargetLowMgdl(), profile.getTargetHighMgdl(), GlucoseUnit.MGDL, units)
binding.tempTarget.setTextColor(resourceHelper.gc(R.color.ribbonTextDefault))
binding.tempTarget.setBackgroundColor(resourceHelper.gc(R.color.ribbonDefault))
binding.tempTarget.text = Profile.toTargetRangeString(profile.getTargetLowMgdl(), profile.getTargetHighMgdl(), GlucoseUnit.MGDL, units)
}
}
}
@ -816,6 +824,12 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
String.format(Locale.ENGLISH, "%.0f%%", autosensData.autosensResult.ratio * 100)
} ?: ""
}
OverviewData.Property.PUMPSTATUS -> {
val status = overviewData.pumpStatus
binding.pumpStatus.text = status
binding.pumpStatusLayout.visibility = (status != "").toVisibility()
}
}
}
}

View file

@ -90,7 +90,7 @@ class OverviewPlugin @Inject constructor(
}, fabricPrivacy::logException)
disposable += rxBus
.toObservable(EventIobCalculationProgress::class.java)
.observeOn(aapsSchedulers.main)
.observeOn(aapsSchedulers.io)
.subscribe({ overviewData.calcProgress = it.progress; overviewBus.send(EventUpdateOverview("EventIobCalculationProgress", OverviewData.Property.CALC_PROGRESS)) }, fabricPrivacy::logException)
disposable += rxBus
.toObservable(EventTempBasalChange::class.java)
@ -135,16 +135,22 @@ class OverviewPlugin @Inject constructor(
.toObservable(EventLoopInvoked::class.java)
.observeOn(aapsSchedulers.io)
.subscribe({ overviewData.preparePredictions("EventLoopInvoked") }, fabricPrivacy::logException)
disposable.add(rxBus
disposable += rxBus
.toObservable(EventNewBasalProfile::class.java)
.observeOn(aapsSchedulers.io)
.subscribe({ loadProfile("EventNewBasalProfile") }, fabricPrivacy::logException))
disposable.add(rxBus
.subscribe({ loadProfile("EventNewBasalProfile") }, fabricPrivacy::logException)
disposable += rxBus
.toObservable(EventAutosensCalculationFinished::class.java)
.observeOn(aapsSchedulers.io)
.subscribe({
if (it.cause !is EventCustomCalculationFinished) refreshLoop("EventAutosensCalculationFinished")
}, fabricPrivacy::logException))
}, fabricPrivacy::logException)
disposable += rxBus
.toObservable(EventPumpStatusChanged::class.java)
.observeOn(aapsSchedulers.io)
.subscribe({
overviewData.pumpStatus = it.getStatus(resourceHelper)
}, fabricPrivacy::logException)
Thread { loadAll("onResume") }.start()
}
@ -227,6 +233,7 @@ class OverviewPlugin @Inject constructor(
if (runningRefresh) return
runningRefresh = true
loadIobCobResults(from)
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.PROFILE))
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.BG))
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.TIME))
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.TEMPORARY_BASAL))
@ -264,9 +271,6 @@ class OverviewPlugin @Inject constructor(
}
private fun loadProfile(from: String) {
overviewData.profile = profileFunction.getProfile()
overviewData.profileName = profileFunction.getProfileName()
overviewData.profileNameWithRemainingTime = profileFunction.getProfileNameWithRemainingTime()
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.PROFILE))
}

View file

@ -510,10 +510,11 @@ class IobCobCalculatorPlugin @Inject constructor(
val tb = repository.getTemporaryBasalActiveAt(timestamp).blockingGet()
if (tb is ValueWrapper.Existing) return tb.value
val eb = repository.getExtendedBolusActiveAt(timestamp).blockingGet()
val profile = profileFunction.getProfile(timestamp) ?: return null
if (eb is ValueWrapper.Existing && activePlugin.activePump.isFakingTempsByExtendedBoluses)
return eb.value.toTemporaryBasal(profile)
if (activePlugin.activePump.isFakingTempsByExtendedBoluses) {
val eb = repository.getExtendedBolusActiveAt(timestamp).blockingGet()
val profile = profileFunction.getProfile(timestamp) ?: return null
if (eb is ValueWrapper.Existing) return eb.value.toTemporaryBasal(profile)
}
return null
}

View file

@ -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)

View file

@ -42,6 +42,7 @@ class NSClientSourcePlugin @Inject constructor(
.fragmentClass(BGSourceFragment::class.java.name)
.pluginIcon(R.drawable.ic_nsclient_bg)
.pluginName(R.string.nsclientbg)
.shortName(R.string.nsclientbgshort)
.description(R.string.description_source_ns_client),
aapsLogger, resourceHelper, injector
), BgSource {

View file

@ -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()
}

View file

@ -135,6 +135,7 @@ class QueueThread internal constructor(
aapsLogger.debug(LTag.PUMPQUEUE, "disconnected")
return
} else {
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.WAITING_FOR_DISCONNECTION))
aapsLogger.debug(LTag.PUMPQUEUE, "waiting for disconnect")
SystemClock.sleep(1000)
}

View file

@ -70,7 +70,7 @@ class SetupWizardActivity : NoSplashAppCompatActivity() {
}
}
public override fun onPause() {
override fun onPause() {
super.onPause()
disposable.clear()
}

View file

@ -273,7 +273,7 @@
style="@style/ButtonSmallFontStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_danarhistory"
android:drawableTop="@drawable/ic_pump_history"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/nav_historybrowser"

View file

@ -273,7 +273,7 @@
style="@style/ButtonSmallFontStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_danarhistory"
android:drawableTop="@drawable/ic_pump_history"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/nav_historybrowser"

View file

@ -10,8 +10,7 @@
android:id="@+id/top_part_scrollbar"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
tools:ignore="UselessParent">
android:layout_weight="1">
<LinearLayout
android:id="@+id/inner_layout"
@ -24,9 +23,42 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<include
android:id="@+id/loop_pump_status_layout"
layout="@layout/overview_loop_pumpstatus_layout" />
<LinearLayout
android:id="@+id/loop_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/active_profile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginEnd="5dp"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:text="Profile"
android:textAppearance="?android:attr/textAppearanceSmall"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/temp_target"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:text="TempTarget"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/mdtp_white"
tools:ignore="HardcodedText" />
</LinearLayout>
<include
android:id="@+id/info_layout"
@ -92,6 +124,28 @@
</ScrollView>
<LinearLayout
android:id="@+id/pump_status_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:id="@+id/pump_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@color/pumpStatusBackground"
android:gravity="center_vertical|center_horizontal"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:text="@string/initializing"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<include
android:id="@+id/buttons_layout"
layout="@layout/overview_buttons_layout" />

View file

@ -1,67 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/loop_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/active_profile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginEnd="5dp"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:text="Profile"
android:textAppearance="?android:attr/textAppearanceSmall"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/temp_target"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:text="TempTarget"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/mdtp_white"
tools:ignore="HardcodedText" />
</LinearLayout>
<LinearLayout
android:id="@+id/pump_status_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:id="@+id/pump_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:gravity="center_vertical|center_horizontal"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:text="@string/initializing"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>

View file

@ -494,6 +494,7 @@
<string name="dexcomg5_xdripupload_title">Odesílat data do xDrip+</string>
<string name="dexcomg5_xdripupload_summary">V xDrip+ vyberte zdroj dat 640g/Eversense</string>
<string name="nsclientbg">Glykémie z NS</string>
<string name="nsclientbgshort">NSGL</string>
<string name="overview_editquickwizard_usebg">Kalkulace glykémie</string>
<string name="overview_editquickwizard_usebolusiob">Kalkulace bolusového IOB</string>
<string name="overview_editquickwizard_usebasaliob">Kalkulace bazálního IOB</string>

View file

@ -494,6 +494,7 @@
<string name="dexcomg5_xdripupload_title">Sende BZ-Werte zu xDrip+</string>
<string name="dexcomg5_xdripupload_summary">Wähle in xDrip+ 640g/Eversense als Daten-Quelle.</string>
<string name="nsclientbg">Nightscout-Client BZ</string>
<string name="nsclientbgshort">NS BZ</string>
<string name="overview_editquickwizard_usebg">BZ Berechnung</string>
<string name="overview_editquickwizard_usebolusiob">Bolus-IOB Berechnung</string>
<string name="overview_editquickwizard_usebasaliob">Basal-IOB Berechnung</string>
@ -868,6 +869,8 @@ Unerwartetes Verhalten.</string>
<string name="ns_receive_temp_target_summary">Temp. Ziele akzeptieren, die in NS oder NSClient eingegeben wurden</string>
<string name="ns_receive_profile_switch">Profilwechsel abrufen</string>
<string name="ns_receive_profile_switch_summary">Profilwechsel akzeptieren, die in NS oder NSClient eingegeben wurden</string>
<string name="ns_receive_offline_event">APS Offline-Ereignisse empfangen</string>
<string name="ns_receive_offline_event_summary">APS Offline-Ereignisse akzeptieren, die über NS oder NSClient eingegeben wurden</string>
<string name="ns_receive_insulin">Insulin abrufen</string>
<string name="ns_receive_insulin_summary">Insulin akzeptieren, das in NS oder NSClient eingegeben wurden</string>
<string name="ns_receive_carbs">Kohlenhydrate abrufen</string>
@ -878,4 +881,5 @@ Unerwartetes Verhalten.</string>
<string name="ns_receive_cgm_summary">CGM Daten von NS akzeptieren</string>
<string name="sms_timeout_while_wating">Zeitüberschreitung beim Warten auf das Ende der vorherigen Kommunikation mit der Pumpe</string>
<string name="smscommunicator_another_bolus_in_queue">In der Warteschlange befindet sich ein weiterer Bolus. Bitte später erneut versuchen.</string>
<string name="calculation_in_progress">Kalkulation wird gerade durchgeführt</string>
</resources>

View file

@ -59,7 +59,7 @@
<string name="exercise_setunchanged">השאירו את ערך מטרת הסוכר ללא שינוי.</string>
<string name="exercise_15g">המתינו עד שהגלוקוז בדם יירד מתחת לערך המטרה של היפו ואז אכלו 15 גרם של פחמימות מהירות.</string>
<string name="exercise_hint1">https://androidaps.readthedocs.io/en/latest/EN/Usage/temptarget.html#activity-temp-target</string>
<string name="suspendloop_label">השבתת / השהיית לולאה</string>
<string name="suspendloop_label">השבתת \\ השהיית לולאה</string>
<string name="suspendloop_doigetinsulin">האם אני מקבל\\ת אינסולין כאשר הלולאה מושבתת\\מושהית?</string>
<string name="suspendloop_yes">כן, אינסולין בזאלי ממשיך להינתן.</string>
<string name="suspendloop_no">לא, אספקת האינסולין נפסקת.</string>
@ -161,10 +161,10 @@
<string name="nsclient_data">ע\"מ לעקוב אחר AndroidAPS מרחוק, שני ההתקנים חייבים להיות בעלי גישה לאינטרנט (למשל באמצעות רשת אינטרנט אלחוטית או אינטרנט סלולרי).</string>
<string name="nsclient_fullcontrol">אפליקציית NS Client אצל עוקב משמשת לניטור מרוחק ומאפשרת שליטה מלאה ב-AndroidAPS.</string>
<string name="nsclient_hint1">https://androidaps.readthedocs.io/en/latest/EN/Children/Children.html</string>
<string name="isf_label_exam">יחס התיקון (ISF) </string>
<string name="isf_label_exam">יחס התיקון (ISF)</string>
<string name="isf_increasingvalue">עלייה בערך יחס התיקון תביא למתן יותר אינסולין לכיסוי כמות נתונה של פחמימות.</string>
<string name="isf_decreasingvalue">הפחתת ערך יחס התיקון (ISF) מובילים למתן יותר אינסולין כדי לתקן רמת סוכר שמעל ערך המטרה.</string>
<string name="isf_noeffect">העלאת או הורדת יחס התיקון (ISF) אינו משפיע על מינון האינסולין כאשר רמות הגלוקוז בדם הן מתחת לערך המטרה.</string>
<string name="isf_decreasingvalue">הפחתת ערך יחס התיקון (ISF) מובילה למתן יותר אינסולין כדי לתקן רמת סוכר שמעל ערך המטרה.</string>
<string name="isf_noeffect">העלאת או הורדת יחס התיקון (ISF) אינה משפיעה על מינון האינסולין כאשר רמות הגלוקוז בדם הן מתחת לערך המטרה.</string>
<string name="isf_preferences">יש להזין את יחס התיקון בהעדפות ב-AndroidAPS.</string>
<string name="isf_profile">שינוי ערך ISF בפרופיל שלכם מספיק כדי להחיל את השינוי.</string>
<string name="isf_hint1">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u</string>
@ -179,7 +179,7 @@
<string name="ic_meaning">יחס הפחמימות (IC) הוא: כמה יחידות לחם מכוסות ע\"י יחידת אינסולין אחת.</string>
<string name="ic_hint1">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-u</string>
<string name="profileswitch_label">החלפת פרופילים</string>
<string name="profileswitch_pctwillchange"> בעת החלפה לפרופיל 90%, מהם ההיגדים הנכונים?</string>
<string name="profileswitch_pctwillchange"> בעת החלפה לפרופיל 90%, מהם כל ההיגדים הנכונים?</string>
<string name="profileswitch_basallower">המינון הבזאלי יהיה נמוך ב-10%.</string>
<string name="profileswitch_isfhigher">ערך פקטור התיקון (ISF) יהיה גבוה ב-10%.</string>
<string name="profileswitch_iclower">ערך יחס הפחמימות יהיה נמוך ב-10%.</string>

View file

@ -113,7 +113,7 @@
<string name="apsmode_title">מצב APS</string>
<string name="closedloop">לולאה סגורה</string>
<string name="openloop">לולאה פתוחה</string>
<string name="lowglucosesuspend">השהיה בגלל ערך סוכר נמוך</string>
<string name="lowglucosesuspend">השהיה עקב ערך סוכר נמוך</string>
<string name="disabledloop">לולאה כבויה</string>
<string name="openloop_newsuggestion">הצעה חדשה זמינה</string>
<string name="carbssuggestion">המלצת פחמימות</string>
@ -241,7 +241,7 @@
<string name="units_colon">יחידות:</string>
<string name="units">יחידות</string>
<string name="dia">משך פעילות אינסולין</string>
<string name="prefs_range_title">טווח להדמיה</string>
<string name="prefs_range_title">טווח הצגה</string>
<string name="prefs_range_summary">סימוני גבוה ונמוך בתרשים סקירה כללית ובשעון חכם</string>
<string name="low_mark">סימון נמוך</string>
<string name="high_mark">סימון גבוה</string>
@ -329,7 +329,7 @@
<string name="resistantadult">מבוגר\\ת עם תנגודת אינסולין גבוהה</string>
<string name="pregnant">הריון</string>
<string name="patientage_summary">נא לבחור את גיל המטופל\\ת להתאמת מגבלות בטיחות</string>
<string name="patient_name">שם מטופל\\ת</string>
<string name="patient_name">שם המטופל\\ת</string>
<string name="patient_name_summary">נא לציין את שם המטופל\\ת או כינוי, להבחנה בין מספר הגדרות</string>
<string name="patient_name_default" comment="This is default patient display name, when user does not provide real one">משתמש</string>
<string name="Glimp">Glimp</string>
@ -494,6 +494,7 @@
<string name="dexcomg5_xdripupload_title">שליחת נתוני סוכר אל xDrip</string>
<string name="dexcomg5_xdripupload_summary">ב-xDrip בחרו 640g/Eversense כמקור נתונים</string>
<string name="nsclientbg">רמת סוכר מ-NSClient</string>
<string name="nsclientbgshort">סוכר NS</string>
<string name="overview_editquickwizard_usebg">חישוב רמת הסוכר</string>
<string name="overview_editquickwizard_usebolusiob">חישוב IOB של בולוס</string>
<string name="overview_editquickwizard_usebasaliob">חישוב IOB של בזאלי</string>
@ -751,7 +752,7 @@
<string name="saveorresetchangesfirst">יש לשמור או לאפס תחילה את השינויים הנוכחיים</string>
<string name="deletecurrentprofile">למחוק את הפרופיל הנוכחי?</string>
<string name="copytolocalprofile">ליצור פרופיל מקומי חדש מפרופיל זה?</string>
<string name="profilenamecontainsdot">שם הפרפיל מכיל נקודות.\nשם כזה אינו נתמך ע\"י Nightscout \n הפרופיל לא הועלה ל-Nightscout.</string>
<string name="profilenamecontainsdot">שם הפרופיל מכיל נקודות.\nשם כזה אינו נתמך ע\"י Nightscout \n הפרופיל לא הועלה ל-Nightscout.</string>
<string name="low_mark_comment">ערך נמוך יותר באזור הטווח (הצגה בלבד)</string>
<string name="high_mark_comment">ערך גבוה יותר באזור הטווח (הצגה בלבד)</string>
<string name="age">גיל:</string>

View file

@ -132,6 +132,7 @@
<string name="wronginsulin_label">인슐린 주입/입력 오류</string>
<string name="wronginsulin_whattodo">만약 펌프 기록에서 보여지는 것보다 인슐린이 적게 주입되었을 때 어떻게 해야 할까요? (예를 들어, 주입 막힘, 캐뉼라 문제, 샤워 후 펌프 재부착을 잊어버렸을 때)</string>
<string name="wronginsulin_careportal">Nightscout 케어포탈에서 인슐린 데이터를 삭제하여 펌프 기록에서 이를 제거합니다.</string>
<string name="wronginsulin_compare">AndroidAPS와 펌프 기록을 비교합니다.</string>
<string name="wronginsulin_prime">\"주입되지 않은\" 인슐린양을 계산하여 시린지/펜 또는 prime 기능을 사용하여 인슐린을 주입합니다.</string>
<string name="wronginsulin_donothing">특별한 조치를 취하지 않고, AndroidAPS가 결과적으로 높은 혈당 정도를 조정할 수 있도록 합니다.</string>
<string name="iob_label">활성 인슐린 (IOB)</string>

View file

@ -140,6 +140,7 @@
<string name="filenotfound">파일을 찾을 수 없습니다</string>
<string name="nav_export">설정 저장하기</string>
<string name="nav_import">설정 불러오기</string>
<string name="openapsma_maxbasal_title">임시 Basal 최대량 [U/h]</string>
<string name="openapsma_maxbasal_summary">이 값은 OpenAPS에서 Max Basal(최대 Basal)로 설정되는 값입니다</string>
<string name="openapsma_maxiob_title">OpenAPS가 주입할수 있는 최대 Basal IOB [U]</string>
<string name="openapsma_maxiob_summary">이 값은 OpenAPS에서 Max IOB라고 부르는 값입니다\n기본값은 0으로 설정되어 있습니다. 몇일 혹은 몇주 정도 사용 후 적절한 값으로 변경할 수 있습니다.</string>
@ -147,6 +148,11 @@
<string name="password_preferences_decrypt_prompt">내보낸 preferences를 가져오기 위해서는 마스터 비밀번호가 필요합니다.</string>
<string name="preferences_export_canceled">내보내기 취소됩니다! 환경 설정을 내보내지 않았습니다!</string>
<string name="preferences_import_canceled">가져오고 취소됩니다! 환경설정을 가져오지 않았습니다.</string>
<string name="preferences_import_impossible">기본 설정을 가져올 수 없습니다.</string>
<string name="goto_main_try_again">기본 화면으로 돌아가서 다시 시도하십시오.</string>
<string name="old_master_password">이전 마스터 비밀번호</string>
<string name="different_password_used">이 파일을 내보내고 다른 마스터 암호로 암호화했습니다. 파일의 암호를 해독하려면 이전 마스터 암호를 제공하십시오.</string>
<string name="master_password_will_be_replaced">가져오기에 성공하면 현재 마스터 암호가 이전 마스터 암호로 대체됩니다.</string>
<string name="check_preferences_before_import">가져오기 전에 환경설정을 확인하세요.</string>
<string name="check_preferences_cannot_import">환경 설정을 가져올 수가 없습니다.</string>
<string name="check_preferences_dangerous_import">환경 설정을 가져오면 안됩니다.</string>
@ -173,6 +179,9 @@
<string name="smscommunicator_remotebolusmindistance_summary">원격 Bolus를 주입한 후 얼마간의 시간이 흐른 후에야 다음 원격 Bolus주입이 가능합니다</string>
<string name="smscommunicator_remotebolusmindistance">원격 Bolus를 주입한 후 몇분이 지나야 다음 원격 Bolus 주입이 가능하게 합니까</string>
<string name="smscommunicator_remotebolusmindistance_caveat">안전을 위하여 이 설정을 수정하기 위해 최소 2개의 폰 번호를 추가해야합니다.</string>
<string name="bolusrequested"> %1$.2f U이 주입됩니다.</string>
<string name="smscommunicator_bolusdelivered">Bolus %1$.2f U이 성공적으로 주입되었습니다.</string>
<string name="smscommunicator_mealbolusdelivered">식사 Bolus %1$.2f U 이 성공적으로 주입되었습니다. </string>
<string name="smscommunicator_mealbolusdelivered_tt">%2$d 분 동안 목표 %1$s</string>
<string name="smscommunicator_tt_set">%2$d 분 동안 목표 %1$s 설정이 완료되었습니다</string>
<string name="smscommunicator_tt_canceled">임시 목표 취소가 완료되었습니다</string>
@ -180,14 +189,25 @@
<string name="smscommunicator_loophasbeendisabled">Loop가 중지되었습니다.</string>
<string name="smscommunicator_loophasbeenenabled">Loop가 실행되었습니다.</string>
<string name="smscommunicator_loopisenabled">Loop가 실행중입니다.</string>
<string name="smscommunicator_pumpconnectwithcode">코드 %1$s을(를) 사용하여 펌프에 연결하기</string>
<string name="smscommunicator_pumpconnectfail">펌프에 연결하지 못했습니다.</string>
<string name="smscommunicator_pumpdisconnectwithcode">%1$d분 동안 펌프 연결을 끊으려면 코드 %2$s를 입력하세요.</string>
<string name="smscommunicator_pumpdisconnected">펌프가 연결되지 않았습니다.</string>
<string name="smscommunicator_reconnect">펌프가 다시 연결되었습니다.</string>
<string name="smscommunicator_remotecommandnotallowed">원격 명령이 허가되지 않았습니다</string>
<string name="smscommunicator_remotebolusnotallowed">원격 주입이 불가능합니다. 나중에 다시 시도해주세요.</string>
<string name="smscommunicator_basalreplywithcode">%2$d분동안 basal %1$.2fU/h 주입하려면 %3$s을(를) 입력하세요.</string>
<string name="smscommunicator_profilereplywithcode">프로파일 %1$s %2$d%%로 변경하려면 %3$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_extendedreplywithcode">%2$d분동안 확장bolus %1$.2fU 주입하려면 %3$s을(를) 입력하세요.</string>
<string name="smscommunicator_carbsreplywithcode">%2$s에 %1$dg을 입력하려면 %3$s를 입력하고 답장하세요</string>
<string name="smscommunicator_basalpctreplywithcode">%2$d 분 동안 Basal %1$d%% 주입하려면 %3$s을 입력하고 답장하세요</string>
<string name="smscommunicator_suspendreplywithcode">%1$d분동안 Loop 일시중지하려면 %2$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_loopresumereplywithcode">코드 %1$s을(를) 사용하여 loop의 작동 다시 시작하기</string>
<string name="smscommunicator_loopenablereplywithcode">코드 %1$s을(를) 사용하여 loop의 작동 활성화하기</string>
<string name="smscommunicator_loopdisablereplywithcode">코드 %1$s을(를) 사용하여 loop의 작동 비활성화하기</string>
<string name="smscommunicator_tempbasalset">Temp Basal %1$.2fU/h for %2$d min started successfully</string>
<string name="smscommunicator_extendedset">Extended bolus %1$.2fU for %2$d min started successfully</string>
<string name="smscommunicator_carbsset">탄수화물 %1$dg 입력이 완료되었습니다.</string>
<string name="smscommunicator_carbsfailed">탄수화물 %1$dg 입력이 실패하였습니다</string>
<string name="smscommunicator_tempbasalset_percent">Temp basal %1$d%% for %2$d min started successfully</string>
<string name="smscommunicator_tempbasalfailed">Temp Basal start failed</string>
@ -209,9 +229,12 @@
<string name="mealbolus">Meal</string>
<string name="correctionbous">교정주입</string>
<string name="actions">실행</string>
<string name="ns_upload_only">(비활성화 시 위험함) NS에 업로드만 하기</string>
<string name="ns_upload_only_summary">NS에 업로드만 하기 (sync를 비활성화 함). xDrip+와 같은 로컬 출처를 선택한 경우 외에는 SGV에 영향을 주지 않음. NS 프로파일을 사용하는 동안 프로파일에 영향을 주지 않음.\n!!! 경고!!! 이 기능을 비활성화하면 일부 구성요소 (AAPS, NS, xDrip+) 가 잘못 설정되어 있을 때 잘못 작동하거나 인슐린의 과다주입을 야기할 수 있음. AAPS에서 보여지는 정보와 펌프 상태가 일치하는지 유의해서 관찰해야 함!</string>
<string name="pumpNotInitialized">펌프가 초기화 되지 않았습니다!</string>
<string name="primefill">교체/채움</string>
<string name="fillwarning">양이 인퓨전세트의 사양과 일치하는지 확인하세요!</string>
<string name="fillbolus_title">교체/채움 기본 인슐린 양</string>
<string name="button1">버튼1</string>
<string name="button2">버튼2</string>
<string name="button3">버튼3</string>
@ -240,6 +263,7 @@
<string name="openapsma_autosensdata_label">Autosens 정보</string>
<string name="openapsma_scriptdebugdata_label">스크립트 디버그</string>
<string name="openapsama_useautosens">Autosens 기능 사용</string>
<string name="refresheventsfromnightscout">NS로부터 최신 정보로 업데이트 함.</string>
<string name="deletefuturetreatments">미래시점의 관리 삭제</string>
<string name="actions_shortname">ACT</string>
<string name="configbuilder_shortname">CONF</string>
@ -254,11 +278,13 @@
<string name="smscommunicator_shortname">SMS</string>
<string name="short_tabtitles">탭 이름 단축</string>
<string name="always_use_shortavg">단순증분값 대신 단기평균증분값을 항상 사용합니다.</string>
<string name="always_use_shortavg_summary">xDrip+처럼 필터링되지 않은 혈당 출처에서 받은 데이터의 노이즈가 심할 경우 유용함.</string>
<string name="profile">프로파일</string>
<string name="openapsama_max_daily_safety_multiplier_summary">기본값: 3\n이 값은 중요한 OpenAPS 안전장치입니다. 이 값의 역할은 펌프에 설정되어 있는 최대Basal보다 3배를 초과할 수 없게 제한하는 것입니다. 이 값을 변경할 필요는 없을 것이지만, 안전을 위해 \"3x max daily; 4x current\"이 의미하는 바를 알고 있어야 합니다.</string>
<string name="openapsama_current_basal_safety_multiplier_summary">기본값: 4\n이 값은 \"3x max daily; 4x current\"의 나머지 절반에 해당하는 또 다른 중요한 OpenAPS 안전장치입니다. 이것은, 펌프에 설정된 최대 Basal과는 관계없이, Basal이 설정된 현재시간의 Basal에 이 값을 곱한 양을 초과할 수 없다는 것을 의미합니다. 이는 알고리즘의 작동 방식을 이해하기 전에 과도하게 높은 최대 기본을 설정하여 위험한 상황에 빠지지 않도록 보호하기 위한 것입니다. 다시한번, 기본 값은 4배인 것을 알아두세요; 일반적으로 이것을 조정할 필요는 전혀 없으며, 대신 이 안전장치를 변경해야할것처럼 생각이 된다면, 다른 설정을 변경해야 할 가능성이 더 큽니다.</string>
<string name="openapsama_autosens_max_summary">기본값: 1.2\n이 옵션은 autosens의 최대 한계 값을 20%%로 제한하기 위해 autosens(곧 autotune)이 이용하는 승수값입니다. 이 값이 autosens에 대한 Basal의 최대 값, 인슐린 민감도(ISF)의 최소값 및 혈당 목표의 최소값을 결정케 합니다.</string>
<string name="openapsama_autosens_min_summary">기본값: 0.7\nautosens 안전 제한의 나머지 부분입니다. 이는 Basal을 얼마나 낮게 조절할 수 있는지, ISF와 혈당 목표범위를 얼마나 높게 설정할 수 있는지를 결정합니다.</string>
<string name="openapsama_autosens_adjusttargets">Autosens가 목표값도 조절합니다.</string>
<string name="openapsama_autosens_adjusttargets_summary">기본값: 활성\n이것은 autosens가 ISF와 Basal뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">기본값: 2\n식사주입 후 Bolus snooze가 수행되게 되고, 따라서 식사주입 직후엔 loop가 low temp에 대응하지 않게 됩니다. 기본값이 2일때 예제는 다음과 같습니다; DIA가 3시간일 경우 bolus snooz는 점차적으로 1.5시간에 걸쳐 단계적으로 사라지게 됩니다.(3DIA/2).</string>
<string name="openapsama_min_5m_carbimpact_summary">기본값: 3.0 (AMA) 또는 8.0 (SMB). 5분당 탄수화물이 얼만큼 흡수되었는지에 대한 기본값 설정입니다. 기본값은 3mg/dl / 5분 입니다. 이는 혈당이 예상보다 빨리 떨어지거나 혹은 예상보다 오르지 않을때, COB가 얼마나 빨리 사라지게 되는지에 영향을 주게 되고, 추정된 탄수화물 흡수량이 미래 혈당 예측 계산시에도 영향을 주게 됩니다.</string>
@ -268,6 +294,7 @@
<string name="xdripnotinstalled">xDrip+가 설치되지 않았습니다</string>
<string name="calibrationsent">보정이 xDrip으로 전송되었습니다+</string>
<string name="smscommunicator_calibrationsent">보정 전송됨. xDrip에서 수신이 되도록 설정되어 있어야 합니다+.</string>
<string name="smscommunicator_calibrationfailed">xDrip+에서 보정값을 받지 못합니다.</string>
<string name="pumpsuspended">펌프 일시중지됨</string>
<string name="executing">실행중</string>
<string name="virtualpump_settings">가상펌프 설정</string>
@ -295,10 +322,16 @@
<string name="wear_detailedIOB_summary">워치페이스에 IOB를 Bolus IOB와 Basal IOB로 나누어서 보여줍니다.</string>
<string name="nosuccess">성공하지 못했습니다. 폰을 확인하세요</string>
<string name="notavailable">사용불가</string>
<string name="patientage">환자 유형</string>
<string name="child">어린이</string>
<string name="teenage">청소년</string>
<string name="adult">성인</string>
<string name="resistantadult">인슐린 저항성 높은 성인</string>
<string name="pregnant">임신 중</string>
<string name="patientage_summary">안전 제한 설정을 위해 환자 유형을 선택하십시오.</string>
<string name="patient_name">환자 이름</string>
<string name="patient_name_summary">다양한 설정들을 구별하기 위하여 환자 이름 또는 별명을 입력합니다.</string>
<string name="patient_name_default" comment="This is default patient display name, when user does not provide real one">사용자</string>
<string name="Glimp">Glimp</string>
<string name="needwhitelisting">최적의 성능을 위해 %1$s에서 배터리 최적화를 해제해야합니다.</string>
<string name="loopsuspended">Loop 일시중지</string>
@ -313,6 +346,8 @@
<string name="disconnectpumpfor1h">1시간동안 펌프 일시중지</string>
<string name="disconnectpumpfor2h">2시간동안 펌프 일시중지</string>
<string name="disconnectpumpfor3h">3시간동안 펌프 일시중지</string>
<string name="duration15m">15분</string>
<string name="duration30m">30분</string>
<string name="duration1h">1시간</string>
<string name="duration2h">2시간</string>
<string name="duration3h">3시간</string>
@ -334,13 +369,32 @@
<string name="enablesuperbolus">마법사에서 Superbolus 활성화하기</string>
<string name="enablesuperbolus_summary">마법사에서 Superbolus 기능을 활성화합니다. 어떤 기능인지 확실히 알기전까지 활성화 하지 마세요. 제대로 알지 못하고 사용하면 일슐린이 과다 주입될 수 있습니다!</string>
<string name="show_statuslights">홈화면에 상태 표시등 보여주기</string>
<string name="statuslights_cage_warning">캐뉼라 사용 기간 경고 기준 [h]</string>
<string name="statuslights_cage_critical">캐뉼라 사용 기간 위험 기준 [h]</string>
<string name="statuslights_iage_warning">인슐린 사용 기간 경고 기준 [h]</string>
<string name="statuslights_iage_critical">인슐린 사용 기간 위험 기준 [h]</string>
<string name="statuslights_sage_warning">센서 사용 기간 경고 기준 [h]</string>
<string name="statuslights_sage_critical">센서 사용 기간 위험 기준 [h]</string>
<string name="statuslights_sbat_warning">배터리 잔량 경고 기준 [%]</string>
<string name="statuslights_sbat_critical">배터리 잔량 위험 기준 [%]</string>
<string name="statuslights_bage_warning">펌프 배터리 사용 기간 경고 기준 [h]</string>
<string name="statuslights_bage_critical">펌프 배터리 사용 기간 위험 기준 [h]</string>
<string name="statuslights_res_warning">주사기량 경고 기준값[U]</string>
<string name="statuslights_res_critical">주사기량 위험 기준값[U]</string>
<string name="statuslights_bat_warning">펌프 배터리 잔량 경고 기준 [%]</string>
<string name="statuslights_bat_critical">펌프 배터리 잔량 위험 기준 [%]</string>
<string name="prediction_shortname">PRED</string>
<string name="basal_shortname">BAS</string>
<string name="deviation_shortname">DEV</string>
<string name="activity_shortname">ACT</string>
<string name="bgi_shortname">-BGI</string>
<string name="abs_insulin_shortname">ABS</string>
<string name="devslope_shortname">DEVSLOPE</string>
<string name="nav_about">버전정보</string>
<string name="smscommunicator_missingsmspermission">SMS 권한 누락</string>
<string name="smscommunicator_missingphonestatepermission">전화 상태 권한이 허가되지 않았습니다</string>
<string name="xdripstatus_settings">xDrip+ 상태 (워치)</string>
<string name="xdripstatus">xDrip+ 상태표시라인 (워치)</string>
<string name="xdripstatus_shortname">xds</string>
<string name="wear_showbgi_title">BGI 보기</string>
<string name="wear_showbgi_summary">BGI를 상태라인에 추가하기</string>
@ -348,8 +402,12 @@
<string name="doprofileswitch">프로파일 변경 실행</string>
<string name="careportal_sensor_label">센서</string>
<string name="careportal_insulin_label">인슐린</string>
<string name="careportal_pb_label">펌프 배터리</string>
<string name="careportal_age_label">나이:</string>
<string name="careportal_level_label">레벨:</string>
<string name="ns_alarmoptions">알람 옵션</string>
<string name="ns_alarms">NS 알람에서 알림 만들기</string>
<string name="ns_announcements">NS 안내에서 알림 만들기</string>
<string name="nsalarm_staledatavalue_label">누락 데이터 기준값 [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">위험 누락 데이터 기준값 [min]</string>
<string name="openapsama_autosens_period">autosens 시간 [h]</string>
@ -375,6 +433,7 @@
<string name="mdtp_cancel">취소</string>
<string name="notloadedplugins">모든 프로파일이 로드되지 않았습니다.</string>
<string name="valuesnotstored">값이 저장되지 않았습니다!</string>
<string name="ns_localbroadcasts">다른 앱 (예: xDrip)으로 데이터 전송을 활성화합니다. AAPS 또는 NSClient를 두 개 이상 설치 한 경우 활성화하지 마세요!</string>
<string name="ns_localbroadcasts_title">Local Broadcasts 활성화하기</string>
<string name="openapssmb">OpenAPS SMB</string>
<string name="enableuam">UAM 활성화하기</string>
@ -386,6 +445,7 @@
<string name="free_peak_oref">사용자지정-피크 Oref</string>
<string name="rapid_acting_oref">초속효성 Oref</string>
<string name="ultrarapid_oref">초-초속효성 Oref</string>
<string name="lyumjev">Lyumjev</string>
<string name="dia_too_short">DIA %1$f는 너무 짧습니다. 대신 %2$f을 사용하세요!</string>
<string name="activate_profile">프로파일 활성화하기</string>
<string name="invalid">유효하지 않음</string>
@ -398,6 +458,7 @@
<string name="activity_target">활동 목표</string>
<string name="hypo_duration">저혈당 기간</string>
<string name="hypo_target">저혈당 목표</string>
<string name="reuse_profile_pct_hours">%1$d%%를 %2$dh 동안 재사용하기</string>
<string name="wearcontrol_title">워치로 제어하기</string>
<string name="wearcontrol_summary">임시목표와 관리입력을 워치로 설정합니다.</string>
<string name="food">음식</string>
@ -411,10 +472,12 @@
<string name="executingrightnow">명령을 지금 실행합니다.</string>
<string name="missed_bg_readings">혈당 읽기가 누락되었습니다.</string>
<string name="raise_notifications_as_android_notifications">경고와 알림시 시스템 알림 사용하기</string>
<string name="gradually_increase_notification_volume">알람과 알림의 소리를 점차적으로 증가시킴</string>
<string name="localalertsettings_title">자체 경고 기능</string>
<string name="enable_missed_bg_readings_alert">혈당 데이터 누락시 경고하기</string>
<string name="enable_pump_unreachable_alert">펌프와 연결불가시 경고하기</string>
<string name="pump_unreachable_threshold">펌프 연결불가 기준시간 [min]</string>
<string name="enable_carbs_req_alert">탄수화물이 요구되는 경우 경고함</string>
<string name="urgent_alarm">긴급 알람</string>
<string name="info">정보</string>
<string name="eversense">Eversense 앱(패치버전)</string>
@ -422,7 +485,12 @@
<string name="bgsource_upload">혈당 업로드 설정</string>
<string name="wear_detailed_delta_title">델타(혈당증분값) 자세히 보여주기</string>
<string name="wear_detailed_delta_summary">소수점 자리 추가된 증분값 보여주기</string>
<string name="smbinterval_summary">SMB를 주입하는 빈도 (몇 분마다)</string>
<string name="smbmaxminutes_summary">SMB가 Basal을 제한할 수 있는 최대 시간(분)</string>
<string name="uamsmbmaxminutes">UAM SMB의 최대 기간 (분)</string>
<string name="uamsmbmaxminutes_summary">SMB가 UAM에 대해 basal을 제한할 수 있는 최대 시간(분)</string>
<string name="carbsReqThreshold">제안을 위한 최소 탄수화물 필요량</string>
<string name="carbsReqThreshold_summary">탄수화물 제안 알림을 보여주는 최소 탄수화물 g수. 이 양보다 적은 경우 탄수화물 제안 알림이 작동하지 않습니다.</string>
<string name="dexcomg5_xdripupload_title">혈당 데이터를 xDrip+에 전송하기</string>
<string name="dexcomg5_xdripupload_summary">xDrip+ 데이터 소스에서 640g/Eversense을 선택하세요</string>
<string name="nsclientbg">NSClient 혈당</string>
@ -451,6 +519,7 @@
<string name="enablesmbwithtemptarget">임시 목표에서 SMB 사용하기</string>
<string name="enablesmbwithtemptarget_summary">활성화된 임시 목표(식사직전, 운동)가 있으면 SMB를 사용합니다.</string>
<string name="enablesmbwithhightemptarget">높은 임시 목표에서 SMB 사용하기</string>
<string name="enablesmbwithhightemptarget_summary">높은 임시 목표 (운동, 100mg/dl 또는 5.5 mmol/l 초과)가 활성되어 있을 때 SMB 사용하기</string>
<string name="overview_insulin_label">인슐린</string>
<string name="overview_buttons_selection">버튼</string>
<string name="show_calibration_button_summary">xDrip+에 보정값을 전송하거나 G5 보정창을 엽니다.</string>
@ -459,11 +528,17 @@
<string name="insulin_increment_button_message">버튼을 누를때 추가될 인슐린 양</string>
<string name="error_starting_cgm">CGM앱을 실행할 수 없습니다. 앱이 설치되어 있는지 확인하세요.</string>
<string name="overview_cgm">CGM</string>
<string name="ignore5m">5분간 무시하기</string>
<string name="ignore15m">5분간 무시하기</string>
<string name="ignore30m">30분간 무시하기</string>
<string name="required">필요량</string>
<string name="nav_historybrowser">이력 브라우저</string>
<string name="wear_notifysmb_title">SMB 알림</string>
<string name="wear_notifysmb_summary">일반 Bolus처럼 워치에 SMB 표시</string>
<string name="ns_create_announcements_from_errors_title">에러 발생시 알림 생성</string>
<string name="ns_create_announcements_from_carbs_req_title">\"필요 탄수화물 경고\"에서 알림 만들기</string>
<string name="ns_create_announcements_from_errors_summary">에러 발생에 대한 Nightscout 알림과 자체 경고를 생성합니다. (케어포털 관리에서도 표시됩니다.)</string>
<string name="ns_create_announcements_from_carbs_req_summary">\"필요한 탄수화물 경고\"를 위해 Nightscout 알림 만들기</string>
<string name="wear_predictions_summary">워치페이스에서 예측치를 보여줍니다.</string>
<string name="wear_predictions_title">예측</string>
<string name="data_choices">데이터선택</string>
@ -477,8 +552,10 @@
<string name="do_not_bolus_record_only">실제 Bolus 주입않고, 기록만 하기</string>
<string name="category">분류</string>
<string name="subcategory">하위 분류</string>
<string name="bolusrecordedonly">Bolus 기록만 하기 (펌프에서 주입되지 않음)</string>
<string name="loop_smbsetbypump_label">펌프에 의한 SMB 설정</string>
<string name="overview_show_activity">활동</string>
<string name="overview_show_bgi">BG impact</string>
<string name="overview_show_sensitivity">민감도</string>
<string name="overview_show_deviations">편차</string>
<string name="overview_show_cob">체내탄수화물양(COB)</string>
@ -556,10 +633,14 @@
<string name="nsclientinfotext">NSClient는 Nightscout와의 연결을 처리합니다. 이 부분을 건너뛸 수 있지만 설정하기 전엔 목적을 수행할 수 없습니다.</string>
<string name="diawarning">새로운 인슐린 프로파일은 최소 5시간의 DIA가 요구됩니다. 새로운 프로파일의 DIA 5-6시간은 구식 인슐린 프로파일의 DIA 3시간과 동일합니다.</string>
<string name="setupwizard_aps_description">사용 가능한 알고리즘 중 하나를 선택하세요. 과거부터 최신의 순으로 정렬이 되어 있습니다. 일반적으로 새로운 알고리즘은 보다 강력하고 공격적입니다. 따라서 당신이 신규 사용자라면 최신의 알고리즘보단 AMA로 시작하는것이 나을 수 있습니다. 사용 전에 OpenAPS 문서를 읽어보고 설정하는 것을 잊지마세요.</string>
<string name="setupwizard_pump_waiting_for_riley_link_connection">하단의 RileyLink를 설정하십시오. RileyLink를 선택한 뒤, RileyLink 상태가 \"연결됨\"이 되고 나면 설정을 계속 할 수 있습니다. 이 작업은 금방 진행됩니다.\n</string>
<string name="setupwizard_pump_pump_not_initialized"><b>참고:</b> 펌프가 한 번 연동되면 계속 설정할 수 있습니다.\n</string>
<string name="startobjective">첫번째 목표를 시작하세요.</string>
<string name="permission">권한</string>
<string name="askforpermission">권한 요청하기</string>
<string name="needsystemwindowpermission">알림에 대한 시스템 창 권한이 필요합니다</string>
<string name="needlocationpermission">어플은 BT scan과 WiFi 식별을 위해 \"위치 허용\"이 요구됩니다.</string>
<string name="needstoragepermission">어플은 로그 파일 저장과 설정 내보내기를 위해 \"저장공간 허용\"이 요구됩니다.</string>
<string name="request">요청</string>
<string name="open_navigation">메뉴 열기</string>
<string name="close_navigation">메뉴 닫기</string>
@ -574,12 +655,17 @@
<string name="high_temptarget_raises_sensitivity_summary"><![CDATA[임시목표 100이상을 위해 민감도를 올립니다.]]></string>
<string name="low_temptarget_lowers_sensitivity_title">낮은 임시목표는 민감도를 내립니다.</string>
<string name="low_temptarget_lowers_sensitivity_summary"><![CDATA[임시목표 100미만을 위해 민감도를 낮춥니다.]]></string>
<string name="resistance_lowers_target_title">저항성이 목표 낮추기</string>
<string name="resistance_lowers_target_summary">저항성이 감지되면, 목표 혈당을 낮춥니다.</string>
<string name="sensitivity_raises_target_title">민감성이 목표 올리기</string>
<string name="sensitivity_raises_target_summary">민감성이 감지되면, 목표 혈당을 높입니다.</string>
<string name="careportal_removestartedevents">\"AndroidAPS 시작\" 기록 삭제하기</string>
<string name="storedsettingsfound">저장된 설정이 있습니다.</string>
<string name="allow_hardware_pump_text">주의: 활성화하고 펌프에 연결하게되면, AndroidAPS는 프로파일의 Basal설정을 복사해서 기존에 펌프에 저장되어 있던 Basal설정을 덮어쓰게 될것입니다. AndroidAPS의 Basal설정이 올바른지 반드시 확인하세요. 만약 확실치 않거나 Basal설정을 덮어씌우길 원치않는다면, 취소버튼을 누르고 나중에 다시 연결하세요.</string>
<string name="error_adding_treatment_title">관리 데이터가 불완전합니다</string>
<string name="maintenance_settings">정비 설정</string>
<string name="maintenance_email">Email</string>
<string name="maintenance_encrypt_exported_prefs">내보내는 설정을 암호화하기</string>
<string name="maintenance_amount">전송할 로그 수</string>
<string name="maintenance">정비</string>
<string name="maintenance_shortname">MAINT</string>
@ -624,6 +710,7 @@
<string name="storage">내부 저장 용량 제한</string>
<string name="diskfull">내부 저장 공간을 최소 %1$d MB 이상 비우세요! Loop가 비활성화되었습니다!</string>
<string name="wrongformat">잘못된 형식</string>
<string name="wrongTbrDuration">TBR 기간은 %1$d분의 배수가 되어야 하고 0보다 커야 함.</string>
<string name="sms_wrongcode">잘못된 코드입니다. 명령이 취소됩니다.</string>
<string name="notconfigured">설정되지 않음</string>
<string name="profileswitchcreated">프로파일 변경 생성됨</string>
@ -635,6 +722,8 @@
<string name="dexcom_app_patched">Dexcom 앱(패치버전)</string>
<string name="dexcom_short">DXCM</string>
<string name="description_source_dexcom">패치된 Dexcom 앱에서 혈당값 받기</string>
<string name="cobvsiob">COB vs IOB</string>
<string name="bolusconstraintappliedwarn">Bolus 제한이 적용됨: %1$.2f U에서 %2$.2f U으로</string>
<string name="slowabsorptiondetected"><![CDATA[<font color=\'%1$s\'>!!!!! 느린 탄수화물 흡수 감지: %2$d%% of time. 계산을 다시 확인하십시오. COB를 과대하게 측정하여 더 많은 인슐린이 주입될 수 있습니다 !!!!!</font>]]></string>
<string name="partialboluswizard">Bolus 마법사 결과의 이 부분 주입[%]</string>
<string name="deliverpartofboluswizard">Bolus 마법사는 계산을 수행하지만 계산된 인슐린의 이 부분만 주입됩니다. SMB 알고리즘에 유용합니다.</string>
@ -661,6 +750,7 @@
<string name="clone_label">복사</string>
<string name="saveorresetchangesfirst">우선 현재 변경사항을을 저장하거나 재설정하세요</string>
<string name="deletecurrentprofile">현재 프로파일을 삭제 하시겠습니까?</string>
<string name="copytolocalprofile">프로파일에서 새로운 로컬 프로파일을 만드시겠습니까?</string>
<string name="profilenamecontainsdot">프로파일명에 점을 포함하고 있습니다.\n이는 NS에서 지원하지 않습니다.\n프로파일이 NS에 업로드되지 않습니다.</string>
<string name="low_mark_comment">혈당 정상범위의 하한값(표시 전용)</string>
<string name="high_mark_comment">혈당 정상범위의 상한값(표시 전용)</string>
@ -672,6 +762,7 @@
<string name="survey_comment">참고: 이 화면에 보이는 데이터만 익명으로 업로드됩니다. ID는 AndroidAPS 설치에 할당됩니다. 기본 프로파일이 변경되면 데이터를 다시 제출할 수 있지만 어느정도 시간 범위의 결과가 보이도록 최소 1주일 이상 실행하여 주세요. 당신의 도움 감사하겠습니다.</string>
<string name="invalidage">유효하지 않은 나이입니다</string>
<string name="invalidweight">유효하지 않은 몸무게입니다</string>
<string name="invalidpct">유효하지 않은 % 입력</string>
<string name="tirformat"><![CDATA[<b>%1$s:</b> Low: <b>%2$02d%%</b> In: <b>%3$02d%%</b> High: <b>%4$02d%%</b>]]></string>
<string name="average">평균</string>
<string name="tir">TIR</string>
@ -683,6 +774,7 @@
<string name="randombg_short">BG</string>
<string name="tools">도구</string>
<string name="show_calculation">계산 표시</string>
<string name="show_removed">삭제된 기록 표시</string>
<string name="clearqueueconfirm">대기열을 삭제하시겠습니까? 대기열에 있는 모든 데이터가 삭제됩니다!</string>
<string name="ebstopsloop">확장 Bolus 기능을 사용하는 동안에는 Closed Loop 모드가 중지됩니다. 정말 원하십니까?</string>
<string name="closed_loop_disabled_with_eb">확장 Bolus 사용으로 인해 Closed Loop가 비활성화됨</string>
@ -693,7 +785,99 @@
<string name="loop_tbrrequest_time_label">임시 Basal 요청시간</string>
<string name="loop_tbrexecution_time_label">임시 Basal 실행시간</string>
<!-- SMS Communicator & OTP Authenticator -->
<string name="smscommunicator_code_from_authenticator_for" comment="This is continuation of sentence: To [ACTION] reply with code">인증 어플에서: %1$s 뒤에 PIN</string>
<string name="smscommunicator_otp_pin">암호 끝에 더해지는 자동형성 PIN</string>
<string name="smscommunicator_otp_pin_summary">부가적인 숫자를 생성되는 일회성 비밀번호 끝에 더하고 기억해야 함.</string>
<string name="smscomunicator_tab_otp_label">인증 설정</string>
<string name="smscommunicator_code_verify_label">확인용 code:</string>
<string name="smscommunicator_code_verify_hint">OTP + PIN</string>
<string name="smscommunicator_code_verify_info">유효한 코드는 인증 어플에서 보여지는 6개의 숫자 (OTP) 뒤에 자동형성 PIN의 3개 또는 그 이상의 숫자가 이어져야 함.</string>
<string name="smscommunicator_otp_reset_btn">인증 초기화</string>
<string name="smscommunicator_otp_reset_title">인증 암호 초기화</string>
<string name="smscommunicator_otp_reset_prompt">인증 암호를 초기화하는 것이 확실합니까? 현재 설정된 인증 암호를 모두 무효화 시키며, 이들을 모두 다시 설정해야 합니다.</string>
<string name="smscommunicator_otp_reset_successful">새로운 인증 암호가 생성되었습니다! 준비된 인증 어플에서 업데이트된 QRCode를 사용하십시오.</string>
<string name="smscommunicator_otp_export_title">OTP 비밀번호 내보내기</string>
<string name="smscommunicator_otp_export_prompt">OTP 비밀번호의 클립보드 복사를 원하는 것이 확실합니까?\n\n 이는 인증 어플이 QRCode를 스캐닝하는데 문제가 있을 때, 비밀번호 수동 입력을 원할 때, 또는 공용 어플 사용 시에 하드웨어 OTP 암호 설정을 원할 때에만 필요합니다.</string>
<string name="smscommunicator_otp_export_successful">OTP 비밀번호 (Base32 포맷)가 클립보드에 내보내져서 복사되었습니다. 인증 어플 또는 하드웨어 OTP burner에 붙여넣기 하십시오!</string>
<string name="smscommunicator_otp_step1_install_header">1. 인증어플 설치하기</string>
<string name="smscommunicator_otp_step2_provisioning_header">2. AndroidAPS OTP 코드 설정을 위해 code를 스캔하기</string>
<string name="smscommunicator_otp_step3_test_header">3. 일회성 비밀번호 테스트</string>
<string name="smscommunicator_otp_reset_header">인증 초기화</string>
<string name="smscommunicator_otp_install_info">각각의 팔로워 폰에 RFC 6238 TOTP 암호를 사용하는 인증 어플을 설치합니다. 대중적인 무료 어플은 다음과 같습니다:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator.</string>
<string name="smscommunicator_otp_reset_warning">인증을 초기화함으로써 준비된 인증을 모두 무효화합니다. 이들을 다시 설정해야 합니다.</string>
<string name="overview_show_predictions">예측</string>
<string name="overview_show_deviationslope">편차 기울기</string>
<string name="authorizationfailed">인증 실패</string>
<string name="overview_show_absinsulin">인슐린 절대값</string>
<string name="master_password_summary">마스터 비밀번호는 백업 암호 또는 보안 해제를 위해 사용됩니다. 이를 기억하거나 안전한 곳에 저장해두세요.</string>
<string name="current_master_password">현재 마스터 비밀번호</string>
<string name="statuslights">상태 등</string>
<string name="statuslights_copy_ns">NS에서 설정을 복사해오기</string>
<string name="copyexistingvalues">NS 설정(이 존재하는 경우) 복사하기?</string>
<string name="classic_description">기본 스킨</string>
<string name="lowres_description">저해상도 스킨</string>
<string name="buttonson_description">버튼을 화면 아래 고정하여 보여주기</string>
<string name="largedisplay_description">큰 화면</string>
<string name="skin">스킨</string>
<string name="comapareprofile">프로파일 비교하기</string>
<string name="nav_profilehelper">프로파일 보조기</string>
<string name="motoldefaultprofile">기본 프로파일</string>
<string name="currentprofile">현재 프로파일</string>
<string name="availableprofile">사용 가능한 프로파일</string>
<string name="profiletype">프로파일 종류</string>
<string name="formatwithtdd">나이: %1$.0f TDD: %2$.0f U</string>
<string name="formatwittddandpct">나이: %1$.0f TDD: %2$.0f U %3$d%%</string>
<string name="formatwithweight">나이: %1$.0f 체중: %2$.0f kg</string>
<string name="basalpctfromtdd_label">% basal</string>
<string name="dpvdefaultprofile">DPV 기본 프로파일</string>
<string name="setupwizard_pump_riley_link_status">RileyLink 상태:</string>
<string name="filter">필터</string>
<string name="copytolocalprofile_invalid">로컬 프로파일 생성 불가능. 프로파일이 유효하지 않습니다.</string>
<string name="cta_dont_kill_my_app_info">앱이 종료되지 않도록 합니다?</string>
<string name="smscommunicator_report_pump_ureachable_summary">허용되지 않는 펌프 이벤트가 발생하면 SMS를 보내기</string>
<string name="smscommunicator_pump_ureachable">허용되지 않는 펌프 기록</string>
<string name="advisoralarm">식사 시간이 되면 알람을 울리기</string>
<string name="alarminxmin">%1$d분 뒤 알람 울림</string>
<string name="bolusadvisor">Bolus advisor</string>
<string name="bolusadvisormessage">현재 혈당이 높습니다. 지금 식사를 하기 보다 적절한 혈당이 되도록 기다리는 것을 추천합니다. 교정 bolus를 지금 주입하고 식사할 시간이 되면 알려드릴까요? 이 경우 탄수화물은 기록되지 않으며, 알림을 받으면 wizard를 다시 사용해야 합니다.</string>
<string name="enablebolusadvisor">Bolus advisor 활성화</string>
<string name="enablebolusadvisor_summary">혈당이 높을 때 wizard 결과 대신 reminder를 사용하여 나중에 식사하기 (pre-bolus)</string>
<string name="time_to_eat">식사할 시간입니다! \nBolus wizard를 켜고 다시 계산하십시오.</string>
<string name="timetoeat">식사할 시간</string>
<string name="fabric_upload_disabled">충돌 로그 업로드가 작동하지 않습니다.</string>
<string name="graph_menu_divider_header">그래프</string>
<string name="chart_menu">차트 메뉴</string>
<string name="clear_filter">필터 지우기</string>
<string name="trend_arrow">경향 화살표</string>
<string name="cannula">캐뉼라</string>
<string name="userentry">사용자 항목</string>
<string name="common_values">평소 섭취하는 가장 많은 양의 탄수화물 값을 사용하세요.\n</string>
<string name="summary_email_for_crash_report">긴급 상황에서 사용자에게 연락을 취하기 위해 이 이메일 주소를 충돌 보고에 첨부합니다. 이는 선택사항입니다.</string>
<string name="email_address">이메일 주소</string>
<string name="privacy_settings">개인정보 설정</string>
<string name="privacy_summary">어플의 충돌에 대해 통지를 받기 원하는 경우 선택적으로 이메일 주소를 제공할 수 있습니다. 이는 자동 지원 서비스는 아닙니다. 위험 상황에서 개발자들에게 연락이 올 것입니다.</string>
<string name="full_sync">전체 동기화 됨</string>
<string name="prime">교체</string>
<string name="ns_sync_options">동기화</string>
<string name="ns_upload_summary">프로파일, bolus, 탄수화물, 임시 basal이 NS에 업로드 됨</string>
<string name="ns_upload">NS에 데이터 업로드하기</string>
<string name="ns_receive_profile_store">프로파일 목록 받기</string>
<string name="ns_receive_profile_store_summary">NS 프로파일 편집기에서 로컬 프로파일로 프로파일들 동기화하기</string>
<string name="ns_receive_temp_target">임시 목표들 받기</string>
<string name="ns_receive_temp_target_summary">NS 또는 NSClient에서 입력한 임시 목표 수락하기</string>
<string name="ns_receive_profile_switch">프로파일 변경 받기</string>
<string name="ns_receive_profile_switch_summary">NS 또는 NSClient에서 입력한 프로파일 변경 수락하기</string>
<string name="ns_receive_offline_event">APS 오프라인 이벤트 받기</string>
<string name="ns_receive_offline_event_summary">NS 또는 NSClient에서 입력한 APS 오프라인 이벤트 수락하기</string>
<string name="ns_receive_insulin">인슐린 받기</string>
<string name="ns_receive_insulin_summary">NS 또는 NSClient에서 입력한 인슐린 수락하기 (주입되지는 않음, IOB에 계산만 됨)</string>
<string name="ns_receive_carbs">탄수화물 받기</string>
<string name="ns_receive_carbs_summary">NS 또는 NSClient에서 입력한 탄수화물 수락하기</string>
<string name="ns_receive_therapy_events">처치 이벤트 받기</string>
<string name="ns_receive_therapy_events_summary">NS 또는 NSClient에서 입력한 처치 이벤트 (캐뉼라, 인슐린, 배터리 교체 등) 수락하기</string>
<string name="ns_receive_cgm">CGM 데이터 받기/다시 채우기</string>
<string name="ns_receive_cgm_summary">NS로부터 CGM 데이터 수락하기</string>
<string name="sms_timeout_while_wating">직전의 펌프 통신 종료를 기다리는 동안 타임 아웃</string>
<string name="smscommunicator_another_bolus_in_queue">대기열에 또다른 bolus가 있습니다. 이후에 다시 시도하세요.</string>
<string name="calculation_in_progress">계산 진행 중</string>
</resources>

View file

@ -46,6 +46,7 @@
<string name="key_ns_temporary_basal_last_synced_id" translatable="false">ns_temporary_basal_last_synced_id</string>
<string name="key_ns_extended_bolus_last_synced_id" translatable="false">ns_extended_bolus_last_synced_id</string>
<string name="key_ns_profile_switch_last_synced_id" translatable="false">profile_switch_last_synced_id</string>
<string name="key_ns_effective_profile_switch_last_synced_id" translatable="false">ns_effective_profile_switch_last_synced_id</string>
<string name="key_ns_offline_event_last_synced_id" translatable="false">ns_offline_event_last_synced_id</string>
<string name="key_ns_profile_store_last_synced_timestamp" translatable="false">ns_profile_store_last_synced_timestamp</string>
<string name="key_local_profile_last_change" translatable="false">local_profile_last_change</string>
@ -604,6 +605,7 @@
<string name="key_dexcomg5_xdripupload" translatable="false">dexcomg5_xdripupload</string>
<string name="dexcomg5_xdripupload_summary">In xDrip+ select 640g/Eversense data source</string>
<string name="nsclientbg">NSClient BG</string>
<string name="nsclientbgshort">NS BG</string>
<string name="overview_editquickwizard_usebg">BG calculation</string>
<string name="overview_editquickwizard_usebolusiob">Bolus IOB calculation</string>
<string name="overview_editquickwizard_usebasaliob">Basal IOB calculation</string>

View file

@ -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<PluginBase>()
constraintsPluginsList.add(safetyPlugin)
constraintsPluginsList.add(objectivesPlugin)

View file

@ -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())

View file

@ -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)
}

View file

@ -27,6 +27,7 @@ abstract class AutomationModule {
@ContributesAndroidInjector abstract fun triggerBTDeviceInjector(): TriggerBTDevice
@ContributesAndroidInjector abstract fun triggerRecurringTimeInjector(): TriggerRecurringTime
@ContributesAndroidInjector abstract fun triggerTempTargetInjector(): TriggerTempTarget
@ContributesAndroidInjector abstract fun triggerTempTargetValueInjector(): TriggerTempTargetValue
@ContributesAndroidInjector abstract fun triggerTime(): TriggerTime
@ContributesAndroidInjector abstract fun triggerTimeRangeInjector(): TriggerTimeRange
@ContributesAndroidInjector abstract fun triggerWifiSsidInjector(): TriggerWifiSsid

View file

@ -311,6 +311,7 @@ class AutomationPlugin @Inject constructor(
TriggerCOB(injector),
TriggerProfilePercent(injector),
TriggerTempTarget(injector),
TriggerTempTargetValue(injector),
TriggerWifiSsid(injector),
TriggerLocation(injector),
TriggerAutosensValue(injector),

View file

@ -9,6 +9,7 @@ import info.nightscout.androidaps.database.entities.UserEntry
import info.nightscout.androidaps.database.entities.UserEntry.Sources
import info.nightscout.androidaps.database.entities.ValueWithUnit
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.general.automation.elements.Comparator
import info.nightscout.androidaps.plugins.general.automation.elements.InputDuration
@ -43,10 +44,17 @@ class ActionProfileSwitchPercent(injector: HasAndroidInjector) : Action(injector
}
override fun doAction(callback: Callback) {
uel.log(UserEntry.Action.PROFILE_SWITCH, Sources.Automation, title + ": " + resourceHelper.gs(R.string.startprofile, pct.value.toInt(), duration.value),
ValueWithUnit.Percent(pct.value.toInt()),
ValueWithUnit.Minute(duration.value))
profileFunction.createProfileSwitch(duration.value, pct.value.toInt(), 0)
if (profileFunction.createProfileSwitch(duration.value, pct.value.toInt(), 0)) {
uel.log(
UserEntry.Action.PROFILE_SWITCH,
Sources.Automation,
title + ": " + resourceHelper.gs(R.string.startprofile, pct.value.toInt(), duration.value),
ValueWithUnit.Percent(pct.value.toInt()),
ValueWithUnit.Minute(duration.value)
)
} else {
aapsLogger.error(LTag.AUTOMATION, "Final profile not valid")
}
callback.result(PumpEnactResult(injector).success(true).comment(R.string.ok))?.run()
}

View file

@ -131,6 +131,10 @@ abstract class Trigger(val injector: HasAndroidInjector) {
TriggerTempTarget::class.java.simpleName -> TriggerTempTarget(injector).fromJSON(
data.toString()
)
TriggerTempTargetValue::class.java.name,
TriggerTempTargetValue::class.java.simpleName -> TriggerTempTargetValue(injector).fromJSON(
data.toString()
)
TriggerTime::class.java.name,
TriggerTime::class.java.simpleName -> TriggerTime(injector).fromJSON(data.toString())
TriggerTimeRange::class.java.name,
@ -141,7 +145,7 @@ abstract class Trigger(val injector: HasAndroidInjector) {
TriggerWifiSsid::class.java.simpleName -> TriggerWifiSsid(injector).fromJSON(
data.toString()
)
else -> throw ClassNotFoundException(type)
else -> TriggerConnector(injector)
}
}

View file

@ -0,0 +1,98 @@
package info.nightscout.androidaps.plugins.general.automation.triggers
import android.widget.LinearLayout
import com.google.common.base.Optional
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.automation.R
import info.nightscout.androidaps.database.ValueWrapper
import info.nightscout.androidaps.interfaces.GlucoseUnit
import info.nightscout.androidaps.interfaces.Profile
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.general.automation.elements.Comparator
import info.nightscout.androidaps.plugins.general.automation.elements.InputBg
import info.nightscout.androidaps.plugins.general.automation.elements.LabelWithElement
import info.nightscout.androidaps.plugins.general.automation.elements.LayoutBuilder
import info.nightscout.androidaps.plugins.general.automation.elements.StaticLabel
import info.nightscout.androidaps.utils.JsonHelper
import org.json.JSONObject
class TriggerTempTargetValue(injector: HasAndroidInjector) : Trigger(injector) {
var ttValue = InputBg(profileFunction)
var comparator = Comparator(resourceHelper)
constructor(injector: HasAndroidInjector, value: Double, units: GlucoseUnit, compare: Comparator.Compare) : this(injector) {
ttValue = InputBg(profileFunction, value, units)
comparator = Comparator(resourceHelper, compare)
}
constructor(injector: HasAndroidInjector, triggerTempTarget: TriggerTempTargetValue) : this(injector) {
ttValue = InputBg(profileFunction, triggerTempTarget.ttValue.value, triggerTempTarget.ttValue.units)
comparator = Comparator(resourceHelper, triggerTempTarget.comparator.value)
}
fun comparator(comparator: Comparator.Compare): TriggerTempTargetValue {
this.comparator.value = comparator
return this
}
fun setUnits(units: GlucoseUnit): TriggerTempTargetValue {
ttValue.units = units
return this
}
fun setValue(value: Double): TriggerTempTargetValue {
ttValue.value = value
return this
}
override fun shouldRun(): Boolean {
val tt = repository.getTemporaryTargetActiveAt(dateUtil.now()).blockingGet()
if (tt is ValueWrapper.Absent && comparator.value == Comparator.Compare.IS_NOT_AVAILABLE) {
aapsLogger.debug(LTag.AUTOMATION, "Ready for execution: " + friendlyDescription())
return true
}
if (tt is ValueWrapper.Existing && comparator.value.check(tt.value.lowTarget, Profile.toMgdl(ttValue.value, ttValue.units))) {
aapsLogger.debug(LTag.AUTOMATION, "Ready for execution: " + friendlyDescription())
return true
}
aapsLogger.debug(LTag.AUTOMATION, "NOT ready for execution: " + friendlyDescription())
return false
}
override fun dataJSON(): JSONObject =
JSONObject()
.put("tt", ttValue.value)
.put("comparator", comparator.value.toString())
.put("units", ttValue.units.asText)
override fun fromJSON(data: String): Trigger {
val d = JSONObject(data)
ttValue.setUnits(GlucoseUnit.fromText(JsonHelper.safeGetString(d, "units", Constants.MGDL)))
ttValue.value = JsonHelper.safeGetDouble(d, "tt")
comparator.setValue(Comparator.Compare.valueOf(JsonHelper.safeGetString(d, "comparator")!!))
return this
}
override fun friendlyName(): Int = R.string.careportal_temporarytargetvalue
override fun friendlyDescription(): String {
return if (comparator.value == Comparator.Compare.IS_NOT_AVAILABLE)
resourceHelper.gs(R.string.notemptarget)
else
resourceHelper.gs(if (ttValue.units == GlucoseUnit.MGDL) R.string.temptargetcomparedmgdl else R.string.temptargetcomparedmmol, resourceHelper.gs(comparator.value.stringRes), ttValue.value, ttValue.units)
}
override fun icon(): Optional<Int?> = Optional.of(R.drawable.ic_keyboard_tab)
override fun duplicate(): Trigger = TriggerTempTargetValue(injector, this)
override fun generateDialog(root: LinearLayout) {
LayoutBuilder()
.add(StaticLabel(resourceHelper, R.string.careportal_temporarytargetvalue, this))
.add(comparator)
.add(LabelWithElement(resourceHelper, resourceHelper.gs(R.string.target_u, ttValue.units), "", ttValue))
.build(root)
}
}

View file

@ -38,6 +38,9 @@
<string name="glucoseisnotavailable">Glykémie není k dispozici</string>
<string name="glucosecomparedmgdl">Glykémie %1$s %2$.0f %3$s</string>
<string name="glucosecomparedmmol">Glykémie %1$s %2$.1f %3$s</string>
<string name="notemptarget">Dočasný cíl neexistuje</string>
<string name="temptargetcomparedmgdl">Dočasný cíl %1$s %2$.0f %3$s</string>
<string name="temptargetcomparedmmol">Dočasný cíl %1$s %2$.1f %3$s</string>
<string name="percentagecompared">Profil pct %1$s %2$d</string>
<string name="iobcompared">IOB %1$s %2$.1f</string>
<string name="and">A</string>
@ -86,6 +89,7 @@
<string name="latitude_short">Zem. šířka:</string>
<string name="longitude_short">Zem. délka:</string>
<string name="glucose_u">Glykémie [%1$s]:</string>
<string name="target_u">Cíl [%1$s]:</string>
<string name="lastboluslabel">Poslední bolus</string>
<string name="lastboluscompared">Poslední bolus %1$s před %2$s min</string>
<string name="triggercoblabel">COB</string>

View file

@ -38,6 +38,9 @@
<string name="glucoseisnotavailable">Glukosewert nicht verfügbar</string>
<string name="glucosecomparedmgdl">Glukosewert %1$s %2$.0f %3$s</string>
<string name="glucosecomparedmmol">Glukosewert %1$s %2$.1f %3$s</string>
<string name="notemptarget">Kein temporäres Ziel vorhanden</string>
<string name="temptargetcomparedmgdl">Temp. Zielwert %1$s %2$.0f %3$s</string>
<string name="temptargetcomparedmmol">Temp. Zielwert %1$s %2$.1f %3$s</string>
<string name="percentagecompared">Profil-Prozentsatz %1$s %2$d</string>
<string name="iobcompared">IOB %1$s %2$.1f</string>
<string name="and">Und</string>
@ -86,6 +89,7 @@
<string name="latitude_short">Breitengrad:</string>
<string name="longitude_short">Längengrad:</string>
<string name="glucose_u">Glukosewert [%1$s]:</string>
<string name="target_u">Zielwert [%1$s]:</string>
<string name="lastboluslabel">Letzter Bolus vor</string>
<string name="lastboluscompared">Letzter Bolus vor %1$s %2$s Min</string>
<string name="triggercoblabel">COB</string>

View file

@ -38,6 +38,9 @@
<string name="glucoseisnotavailable">La glycémie n\'est pas disponible</string>
<string name="glucosecomparedmgdl">Glycémie %1$s %2$.0f %3$s</string>
<string name="glucosecomparedmmol">Glycémie %1$s %2$.1f %3$s</string>
<string name="notemptarget">La Cible Temp. n\'existe pas</string>
<string name="temptargetcomparedmgdl">Cible Temp. %1$s %2$.0f %3$s</string>
<string name="temptargetcomparedmmol">Cible Temp. %1$s %2$.1f %3$s</string>
<string name="percentagecompared">Profil %% %1$s %2$d</string>
<string name="iobcompared">IA %1$s %2$.1f</string>
<string name="and">Et</string>
@ -86,6 +89,7 @@
<string name="latitude_short">Lat :</string>
<string name="longitude_short">Long :</string>
<string name="glucose_u">Glycémie [%1$s] :</string>
<string name="target_u">Cible [%1$s]:</string>
<string name="lastboluslabel">Lors du dernier Bolus</string>
<string name="lastboluscompared">Heure du dernier bolus %1$s il y a %2$s min</string>
<string name="triggercoblabel">GA</string>

View file

@ -38,6 +38,9 @@
<string name="glucoseisnotavailable">גלוקוז אינו זמין</string>
<string name="glucosecomparedmgdl">גלוקוז %1$s %2$.0f %3$s</string>
<string name="glucosecomparedmmol">גלוקוז %1$s %2$.1f %3$s</string>
<string name="notemptarget">ערך המטרה הזמני לא קיים</string>
<string name="temptargetcomparedmgdl">ערך מטרה זמני %1$s %2$.0f %3$s</string>
<string name="temptargetcomparedmmol">ערך מטרה זמני %1$s %2$.1f %3$s</string>
<string name="percentagecompared">אחוז פרופיל %1$s %2$d</string>
<string name="iobcompared">אינסולין פעיל %1$s %2$.1f</string>
<string name="and">וגם</string>
@ -86,6 +89,7 @@
<string name="latitude_short">רוחב:</string>
<string name="longitude_short">אורך:</string>
<string name="glucose_u">גלוקוז [%1$s]:</string>
<string name="target_u">מטרה [%1$s]:</string>
<string name="lastboluslabel">בולוס אחרון</string>
<string name="lastboluscompared">הבולוס האחרון היה לפני %1$s %2$s דק\'</string>
<string name="triggercoblabel">פחמ\' פעילות</string>

View file

@ -74,6 +74,7 @@
<string name="copy_short">복사</string>
<string name="temptargetcompared">임시 목표 %1$s</string>
<string name="btdevicecompared">장치에 블루투스 연결 %1$s %2$s</string>
<string name="btdevice">블루투스 장치에 연결</string>
<string name="wifissidcompared">WiFi SSID %1$s %2$s</string>
<string name="autosenscompared">Autosens %1$s %2$s %%</string>
<string name="autosenslabel">Autosens %</string>

View file

@ -38,6 +38,9 @@
<string name="glucoseisnotavailable">Glykémia nedostupná</string>
<string name="glucosecomparedmgdl">Glykémia %1$s %2$.0f %3$s</string>
<string name="glucosecomparedmmol">Glykémia %1$s %2$.1f %3$s</string>
<string name="notemptarget">Dočasný cieľ neexistuje</string>
<string name="temptargetcomparedmgdl">Doč. cieľ %1$s %2$.0f %3$s</string>
<string name="temptargetcomparedmmol">Doč. cieľ %1$s %2$.1f %3$s</string>
<string name="percentagecompared">Percentuálny profil %1$s %2$d</string>
<string name="iobcompared">IOB %1$s %2$.1f</string>
<string name="and">A</string>
@ -86,6 +89,7 @@
<string name="latitude_short">Lat:</string>
<string name="longitude_short">Lon:</string>
<string name="glucose_u">Glykémia [%1$s]:</string>
<string name="target_u">Cieľ [%1$s]:</string>
<string name="lastboluslabel">Od posledného bolusu</string>
<string name="lastboluscompared">Čas posledného bolusu: pred %1$s %2$s min </string>
<string name="triggercoblabel">COB</string>

View file

@ -40,6 +40,9 @@
<string name="glucoseisnotavailable">Glucose is not available</string>
<string name="glucosecomparedmgdl">Glucose %1$s %2$.0f %3$s</string>
<string name="glucosecomparedmmol">Glucose %1$s %2$.1f %3$s</string>
<string name="notemptarget">Temp Target does not exist</string>
<string name="temptargetcomparedmgdl">Temp Target %1$s %2$.0f %3$s</string>
<string name="temptargetcomparedmmol">Temp Target %1$s %2$.1f %3$s</string>
<string name="percentagecompared">Profile pct %1$s %2$d</string>
<string name="iobcompared">IOB %1$s %2$.1f</string>
<string name="and">And</string>
@ -88,6 +91,7 @@
<string name="latitude_short">Lat:</string>
<string name="longitude_short">Lon:</string>
<string name="glucose_u">Glucose [%1$s]:</string>
<string name="target_u">Target [%1$s]:</string>
<string name="lastboluslabel">Last bolus ago</string>
<string name="lastboluscompared">Last bolus time %1$s %2$s min ago</string>
<string name="triggercoblabel">COB</string>

View file

@ -0,0 +1,85 @@
package info.nightscout.androidaps.plugins.general.automation.triggers
import com.google.common.base.Optional
import info.nightscout.androidaps.automation.R
import info.nightscout.androidaps.database.ValueWrapper
import info.nightscout.androidaps.database.entities.TemporaryTarget
import info.nightscout.androidaps.interfaces.GlucoseUnit
import info.nightscout.androidaps.plugins.general.automation.elements.Comparator
import io.reactivex.Single
import org.json.JSONObject
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.mockito.Mockito.`when`
class TriggerTempTargetValueTest : TriggerTestBase() {
var now = 1514766900000L
@Before
fun prepare() {
`when`(profileFunction.getUnits()).thenReturn(GlucoseUnit.MGDL)
`when`(dateUtil.now()).thenReturn(now)
}
@Test
fun shouldRunTest() {
`when`(repository.getTemporaryTargetActiveAt(dateUtil.now())).thenReturn(Single.just(ValueWrapper.Existing(TemporaryTarget(duration = 60000, highTarget = 140.0, lowTarget = 140.0, reason = TemporaryTarget.Reason.CUSTOM, timestamp = now - 1))))
var t: TriggerTempTargetValue = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MMOL).setValue(7.7).comparator(Comparator.Compare.IS_EQUAL)
Assert.assertFalse(t.shouldRun())
t = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MGDL).setValue(140.0).comparator(Comparator.Compare.IS_EQUAL)
Assert.assertTrue(t.shouldRun())
t = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MGDL).setValue(140.0).comparator(Comparator.Compare.IS_EQUAL_OR_GREATER)
Assert.assertTrue(t.shouldRun())
t = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MGDL).setValue(140.0).comparator(Comparator.Compare.IS_EQUAL_OR_LESSER)
Assert.assertTrue(t.shouldRun())
t = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MGDL).setValue(139.0).comparator(Comparator.Compare.IS_EQUAL)
Assert.assertFalse(t.shouldRun())
t = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MGDL).setValue(141.0).comparator(Comparator.Compare.IS_EQUAL_OR_LESSER)
Assert.assertTrue(t.shouldRun())
t = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MGDL).setValue(141.0).comparator(Comparator.Compare.IS_EQUAL_OR_GREATER)
Assert.assertFalse(t.shouldRun())
t = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MGDL).setValue(139.0).comparator(Comparator.Compare.IS_EQUAL_OR_GREATER)
Assert.assertTrue(t.shouldRun())
t = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MGDL).setValue(139.0).comparator(Comparator.Compare.IS_EQUAL_OR_LESSER)
Assert.assertFalse(t.shouldRun())
Assert.assertFalse(t.shouldRun())
t = TriggerTempTargetValue(injector).comparator(Comparator.Compare.IS_NOT_AVAILABLE)
Assert.assertFalse(t.shouldRun())
`when`(repository.getTemporaryTargetActiveAt(dateUtil.now())).thenReturn(Single.just(ValueWrapper.Absent()))
Assert.assertTrue(t.shouldRun())
}
@Test
fun copyConstructorTest() {
val t: TriggerTempTargetValue = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MGDL).setValue(140.0).comparator(Comparator.Compare.IS_EQUAL_OR_LESSER)
val t1 = t.duplicate() as TriggerTempTargetValue
Assert.assertEquals(140.0, t1.ttValue.value, 0.01)
Assert.assertEquals(GlucoseUnit.MGDL, t1.ttValue.units)
Assert.assertEquals(Comparator.Compare.IS_EQUAL_OR_LESSER, t.comparator.value)
}
private var ttJson = "{\"data\":{\"tt\":7.7,\"comparator\":\"IS_EQUAL\",\"units\":\"mmol\"},\"type\":\"TriggerTempTargetValue\"}"
@Test
fun toJSONTest() {
val t: TriggerTempTargetValue = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MMOL).setValue(7.7).comparator(Comparator.Compare.IS_EQUAL)
Assert.assertEquals(ttJson, t.toJSON())
}
@Test
fun fromJSONTest() {
val t: TriggerTempTargetValue = TriggerTempTargetValue(injector).setUnits(GlucoseUnit.MMOL).setValue(7.7).comparator(Comparator.Compare.IS_EQUAL)
val t2 = TriggerDummy(injector).instantiate(JSONObject(t.toJSON())) as TriggerTempTargetValue
Assert.assertEquals(Comparator.Compare.IS_EQUAL, t2.comparator.value)
Assert.assertEquals(7.7, t2.ttValue.value, 0.01)
Assert.assertEquals(GlucoseUnit.MMOL, t2.ttValue.units)
}
@Test
fun iconTest() {
Assert.assertEquals(Optional.of(R.drawable.ic_keyboard_tab), TriggerTempTargetValue(injector).icon())
}
}

View file

@ -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.1'
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,25 +65,14 @@ 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 {
kotlinOptions {
freeCompilerArgs = ['-Xjvm-default=all']
freeCompilerArgs = [
// Ignore warning for @ExperimentalCoroutinesApi
"-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi",
'-Xjvm-default=all' //Support @JvmDefault
]
jvmTarget = "1.8"
}
}

View file

@ -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))
}
}

View file

@ -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))
}
}

View file

@ -10,6 +10,7 @@ class EventPumpStatusChanged : EventStatus {
CONNECTED,
HANDSHAKING,
PERFORMING,
WAITING_FOR_DISCONNECTION,
DISCONNECTING,
DISCONNECTED
}
@ -46,12 +47,13 @@ class EventPumpStatusChanged : EventStatus {
// status for startup wizard
override fun getStatus(resourceHelper: ResourceHelper): String {
return when (status) {
Status.CONNECTING -> String.format(resourceHelper.gs(R.string.connectingfor), secondsElapsed)
Status.HANDSHAKING -> resourceHelper.gs(R.string.handshaking)
Status.CONNECTED -> resourceHelper.gs(R.string.connected)
Status.PERFORMING -> performingAction
Status.DISCONNECTING -> resourceHelper.gs(R.string.disconnecting)
Status.DISCONNECTED -> ""
Status.CONNECTING -> String.format(resourceHelper.gs(R.string.connectingfor), secondsElapsed)
Status.HANDSHAKING -> resourceHelper.gs(R.string.handshaking)
Status.CONNECTED -> resourceHelper.gs(R.string.connected)
Status.PERFORMING -> performingAction
Status.WAITING_FOR_DISCONNECTION -> resourceHelper.gs(R.string.waiting_for_disconnection)
Status.DISCONNECTING -> resourceHelper.gs(R.string.disconnecting)
Status.DISCONNECTED -> ""
}
}
}

View file

@ -1,8 +1,14 @@
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.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<EffectiveProfileSwitch>.isEPSEvent5minBack(time: Long): Boolean {
for (event in this) {
@ -15,3 +21,72 @@ fun List<EffectiveProfileSwitch>.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): 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")

View file

@ -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<EffectiveProfileSwitch>
// Until NS v3
fun processChangedEffectiveProfileSwitchesCompat(): Boolean
fun confirmLastOfflineEventIdIfGreater(lastSynced: Long)
fun changedOfflineEvents() : List<OfflineEvent>
// Until NS v3

View file

@ -76,8 +76,9 @@ interface ProfileFunction {
* @param durationInMinutes
* @param percentage 100 = no modification
* @param timeShiftInHours 0 = no modification
* @return true if profile switch is created
*/
fun createProfileSwitch(durationInMinutes: Int, percentage: Int, timeShiftInHours: Int)
fun createProfileSwitch(durationInMinutes: Int, percentage: Int, timeShiftInHours: Int): Boolean
/*
* Midnight time conversion

View file

@ -449,4 +449,4 @@ interface PumpSync {
fun createOrUpdateTotalDailyDose(timestamp: Long, bolusAmount: Double, basalAmount: Double, totalAmount: Double, pumpId: Long?, pumpType: PumpType, pumpSerial: String): Boolean
}
}

View file

@ -1,6 +1,5 @@
package info.nightscout.androidaps.plugins.general.maintenance
import android.content.Context
import android.os.Environment
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.core.R
@ -30,7 +29,7 @@ class PrefFileListProvider @Inject constructor(
private val storage: Storage,
private val versionCheckerUtils: VersionCheckerUtils
) {
@Suppress("DEPRECATION")
private val path = File(Environment.getExternalStorageDirectory().toString())
private val aapsPath = File(path, "AAPS" + File.separator + "preferences")
private val exportsPath = File(path, "AAPS" + File.separator + "exports")

View file

@ -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))
}
}

View file

@ -237,7 +237,10 @@ class AutosensDataStore {
}
val newBucketedData = ArrayList<InMemoryGlucoseValue>()
var currentTime = bgReadings[0].timestamp - bgReadings[0].timestamp % T.mins(5).msecs()
currentTime = adjustToReferenceTime(currentTime)
val adjustedTime = adjustToReferenceTime(currentTime)
// after adjusting time may be newer. In this case use T-5min
if (adjustedTime > currentTime) currentTime = adjustedTime - T.mins(5).msecs()
else currentTime = adjustedTime
aapsLogger.debug("Adjusted time " + dateUtil.dateAndTimeAndSecondsString(currentTime))
//log.debug("First reading: " + new Date(currentTime).toLocaleString());
while (true) {

View file

@ -196,6 +196,7 @@
<string name="careportal_openapsoffline">OpenAPS vypnuto</string>
<string name="careportal_pumpbatterychange">Výměna baterie pumpy</string>
<string name="careportal_temporarytarget">Dočasný cíl</string>
<string name="careportal_temporarytargetvalue">Hodnota dočasného cíle</string>
<string name="careportal_temporarytargetcancel">Dočasný cíl konec</string>
<string name="boluswizard">Bolusová kalkulačka</string>
<string name="glucosetype_finger">Glukoměr</string>

View file

@ -196,6 +196,7 @@
<string name="careportal_openapsoffline">OpenAPS offline</string>
<string name="careportal_pumpbatterychange">Pumpenbatterie-Wechsel</string>
<string name="careportal_temporarytarget">Temporäres Ziel</string>
<string name="careportal_temporarytargetvalue">Temporärer Zielwert</string>
<string name="careportal_temporarytargetcancel">Temporäres Ziel abbrechen</string>
<string name="boluswizard">Bolus-Rechner</string>
<string name="glucosetype_finger">Finger</string>
@ -316,6 +317,7 @@
<string name="uel_disconnect">VERBINDUNG TRENNEN</string>
<string name="uel_resume">FORTFAHREN</string>
<string name="uel_suspend">UNTERBRECHEN</string>
<string name="uel_hw_pump_allowed">HW PUMPE ERLAUBT</string>
<string name="uel_clear_pairing_keys">PAIRING SCHLÜSSEL LÖSCHEN</string>
<string name="uel_accepts_temp_basal">TEMP BASAL AKZEPTIEREN</string>
<string name="uel_cancel_temp_basal">TEMP BASAL ABBRECHEN</string>
@ -332,22 +334,57 @@
<string name="uel_profile_switch_ns_refresh">PROFILWECHSEL NIGHTSCOUT AKTUALISIEREN</string>
<string name="uel_treatments_ns_refresh">BEHANDLUNGEN NIGHTSCOUT AKTUALISIEREN </string>
<string name="uel_tt_ns_refresh">TEMP. ZIEL NS AKTUALISIEREN</string>
<string name="uel_automation_removed">AUTOMATION ENTFERNT</string>
<string name="uel_bg_removed">BZ ENTFERNT</string>
<string name="uel_careportal_removed">CAREPORTAL ENTFERNT</string>
<string name="uel_bolus_removed">BOLUS ENTFERNT</string>
<string name="uel_carbs_removed">KOHLENHYDRATE ENTFERNT</string>
<string name="uel_temp_basal_removed">TEMP BASAL ENTFERNT</string>
<string name="uel_extended_bolus_removed">VERZÖGERTER BOLUS ENTFERNT</string>
<string name="uel_food">NAHRUNG</string>
<string name="uel_food_removed">LEBENSMITTEL ENTFERNT</string>
<string name="uel_profile_removed">PROFIL ENTFERNT</string>
<string name="uel_profile_switch_removed">PROFILWECHSEL ENTFERNT</string>
<string name="uel_restart_events_removed">NEUSTARTS ENTFERNT</string>
<string name="uel_treatment_removed">BEHANDLUNGEN ENTFERNT</string>
<string name="uel_tt_removed">TEMP ZIEL ENTFERNT</string>
<string name="uel_ns_paused">NS PAUSIERT</string>
<string name="uel_ns_resume">NS NEUSTART</string>
<string name="uel_ns_queue_cleared">NS WARTESCHLANGE GELÖSCHT</string>
<string name="uel_ns_settings_copied">NS EINSTELLUNGEN KOPIERT</string>
<string name="uel_error_dialog_ok">WARNMELDUNG OK</string>
<string name="uel_error_dialog_mute">WARNMELDUNGEN STUMM</string>
<string name="uel_error_dialog_mute_5min">WARNMELDUNGEN STUMM 5 MIN</string>
<string name="uel_objective_started">OBJECTIVE GESTARTET</string>
<string name="uel_objective_unstarted">OBJECTIVE NICHT GESTARTET</string>
<string name="uel_objectives_skipped">OBJECTIVES ÜBERSPRUNGEN</string>
<string name="uel_stat_reset">STATISTIKEN ZURÜCKGESETZT</string>
<string name="uel_delete_logs">LOGS LÖSCHEN</string>
<string name="uel_delete_future_treatments">BEHANDLUNGEN IN DER ZUKUNFT ENTFERNEN</string>
<string name="uel_export_settings">EINSTELLUNGEN EXPORTIEREN</string>
<string name="uel_import_settings">EINSTELLUNGEN IMPORTIEREN</string>
<string name="uel_reset_databases">DATENBANK ZURÜCKSETZEN</string>
<string name="uel_export_databases">DATENBANK EXPORTIEREN</string>
<string name="uel_import_databases">DATENBANK IMPORTIEREN</string>
<string name="uel_otp_export">OTP EXPORT</string>
<string name="uel_otp_reset">OTP ZURÜCKSETZEN</string>
<string name="uel_stop_sms">STOP SMS</string>
<string name="uel_export_csv">BENUTZEREINTRÄGE EXPORTIEREN</string>
<string name="uel_start_aaps">STARTE AAPS</string>
<string name="uel_exit_aaps">AAPS BEENDEN</string>
<string name="uel_plugin_enabled">PLUGIN AKTIVIERT</string>
<string name="uel_plugin_disabled">PLUGIN DEAKTIVIERT</string>
<string name="uel_unknown">UNBEKANNT</string>
<string name="ue_string">Zeichenfolge</string>
<string name="ue_source">Quelle</string>
<string name="ue_utc_offset">UTC-Abstand</string>
<string name="ue_action">Aktion</string>
<string name="ue_timestamp">Zeitstempel</string>
<string name="ue_none">Keine Einheit</string>
<string name="ue_export_to_csv">Benutzereinträge nach Excel exportieren (csv)</string>
<string name="uel_loop_change">LOOP GEÄNDERT</string>
<string name="uel_loop_removed">LOOP ENTFERNT</string>
<string name="uel_other">ANDERE</string>
<!-- HardLimits -->
<string name="profile_low_target">Profil unteres Ziel</string>
<string name="profile_high_target">Profil oberes Ziel</string>
@ -361,6 +398,8 @@
<string name="profile_carbs_ratio_value">Profil KH-Faktor</string>
<string name="valuelimitedto">%1$.2f limitiert auf %2$.2f</string>
<string name="valueoutofrange">»%1$s« ist außerhalb der fest programmierten Grenzen</string>
<string name="value_out_of_hard_limits">»%1$s« %2$.2f ist außerhalb der fest programmierten Grenzen</string>
<string name="basal_value">Basal-Wert</string>
<plurals name="days">
<item quantity="one">%1$d Tag</item>
<item quantity="other">%1$d Tage</item>

View file

@ -196,6 +196,7 @@
<string name="careportal_openapsoffline">OpenAPS hors ligne</string>
<string name="careportal_pumpbatterychange">Changement pile pompe</string>
<string name="careportal_temporarytarget">Cible Temp</string>
<string name="careportal_temporarytargetvalue">Valeur de Cible Temporaire</string>
<string name="careportal_temporarytargetcancel">Annuler Cible Temporaire</string>
<string name="boluswizard">Assistant Bolus</string>
<string name="glucosetype_finger">Doigt</string>
@ -385,6 +386,20 @@
<string name="uel_loop_removed">BOUCLE SUPPRIMÉE</string>
<string name="uel_other">AUTRE</string>
<!-- HardLimits -->
<string name="profile_low_target">Cible basse du profil</string>
<string name="profile_high_target">Cible haute du profil</string>
<string name="temp_target_low_target">Valeur basse de Cible Temp.</string>
<string name="temp_target_high_target">Valeur haute de Cible Temp.</string>
<string name="temp_target_value">Valeur de Cible Temporaire</string>
<string name="profile_dia">Valeur DAI du profil</string>
<string name="profile_sensitivity_value">Valeur de sensibilité du profil</string>
<string name="profile_max_daily_basal_value">Basale maximale du profil</string>
<string name="current_basal_value">Basale actuelle</string>
<string name="profile_carbs_ratio_value">Rapport glucides/insuline de profil</string>
<string name="valuelimitedto">%1$.2f limité à %2$.2f</string>
<string name="valueoutofrange">\"%1$s\" est en dehors des limites</string>
<string name="value_out_of_hard_limits">\"%1$s\" %2$.2f est en dehors des limites</string>
<string name="basal_value">Valeur de Basal</string>
<plurals name="days">
<item quantity="one">%1$d jour</item>
<item quantity="other">%1$d jours</item>

View file

@ -196,6 +196,7 @@
<string name="careportal_openapsoffline">OpenAPS במצב לא מקוון</string>
<string name="careportal_pumpbatterychange">החלפת סוללת משאבה</string>
<string name="careportal_temporarytarget">ערך מטרה זמני</string>
<string name="careportal_temporarytargetvalue">ערך המטרה הזמני</string>
<string name="careportal_temporarytargetcancel">ביטול ערך מטרה זמני</string>
<string name="boluswizard">אשף בולוס</string>
<string name="glucosetype_finger">אצבע</string>

View file

@ -9,8 +9,10 @@
<string name="profile_set_ok">Basal 프로파일이 펌프에 업데이트 되었습니다</string>
<string name="invalidinput">사용할수 없는 입력 데이터</string>
<string name="tempbasaldeliveryerror">임시Basal 주입 에러</string>
<string name="goingtodeliver">%1$.2f U을 주입합니다.</string>
<string name="waitingforpump">펌프를 기다리는 중</string>
<string name="connectingfor">%1$d 초 동안 연결중</string>
<string name="bolusdelivering">%1$.2f U 주입 중</string>
<string name="handshaking">통신 확인</string>
<string name="connecting">연결중</string>
<string name="connected">연결됨</string>
@ -19,6 +21,8 @@
<string name="androidaps_start">AndroidAPS 시작</string>
<string name="formatinsulinunits1">%1$.1f U</string>
<string name="formatinsulinunits">%1$.2f U</string>
<string name="formatsignedinsulinunits">%1$+.2f U</string>
<string name="format_carbs">%1$d g</string>
<string name="reservoirvalue">%1$.0f / %2$d U</string>
<string name="pump_basebasalrate">%1$.2f U/h</string>
<string name="format_hours">%1$.2f 시간</string>
@ -59,6 +63,7 @@
<string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string>
<string name="shortgram">g</string>
<string name="shortpercent">%</string>
<string name="advancedsettings_title">고급 설정</string>
<string name="bluetooth">블루투스</string>
<string name="btwatchdog_title">블루투스 감시기능</string>
@ -67,6 +72,7 @@
<string name="yes"></string>
<string name="no">아니오</string>
<string name="loopdisabled">제한으로 인해 LOOP가 사용불가합니다.</string>
<string name="bolusdelivered">Bolus %1$.2f U이 성공적으로 주입되었습니다.</string>
<string name="virtualpump_resultok"></string>
<string name="novalidbasalrate">펌프에서 유효한 Basal양을 읽을 수 없습니다.</string>
<string name="limitingmaxiob">%2$s로 인해 최대 IOB가 %1$.1f U로 제한됩니다.</string>
@ -93,10 +99,12 @@
<string name="name_short">이름:</string>
<string name="time">시간</string>
<string name="ns_wifi_ssids">와이파이 SSID</string>
<string name="loading">로딩 중 …</string>
<string name="event_time_label">이벤트 시간</string>
<string name="notes_label">노트</string>
<string name="remove_button">삭제</string>
<string name="addnew">새로 추가</string>
<string name="wrong_pump_data">다른 펌프에서 전송된 데이터. 펌프 상태 재설정을 위해 펌프 드라이버를 바꾸세요.</string>
<!-- Constraints-->
<string name="limitingbasalratio">%2$s로 인해 최대 Basal양이 %1$.2f U/h으로 제한됩니다.</string>
<string name="pumplimit">펌프 제한</string>
@ -112,10 +120,13 @@
<string name="dismiss">무시</string>
<!-- BlePreCheck-->
<string name="ble_not_supported">BLE(블루투스 저전력) 지원되지 않음</string>
<string name="ble_not_supported_or_not_paired">저전력 블루투스(BLE)가 작동하지 않거나, 기기가 연동되지 않았습니다.</string>
<string name="ble_not_enabled">블루투스가 활성화되지 않았습니다.</string>
<string name="location_not_found_title">위치가 활성화되지 않았습니다.</string>
<string name="location_not_found_message">최신 스마트폰에서 블루투스 검색이 작동하려면 위치가 활성화되어 있어야합니다. AAPS는 당신의 위치를 추적하지 않으며 페어링에 성공한 후 비활성화 할 수 있습니다.</string>
<!-- DateUtil-->
<string name="minago">%1$d 분 전</string>
<string name="hoursago">%1$.1f 시간 전</string>
<string name="shorthour">시간</string>
<string name="days"></string>
<string name="hours">시간</string>
@ -133,6 +144,7 @@
<string name="shortday"></string>
<!-- Protection-->
<string name="wrongpassword">잘못된 비밀번호</string>
<string name="passwords_dont_match">비밀번호가 일치하지 않습니다.</string>
<!-- Profile-->
<string name="basalprofilenotaligned">Basal값이 시간단위로 설정되지 않았습니다: %1$s</string>
<string name="minimalbasalvaluereplaced">지원되는 최소값으로 Basal값이 대체되었습니다:%1$s</string>
@ -155,9 +167,14 @@
<!-- ProfileSwitch-->
<string name="zerovalueinprofile">유효하지 않은 프로파일: %1$s</string>
<!-- Temptarget-->
<string name="mins">%1$d 분</string>
<!-- TDD-->
<string name="tddformat"><![CDATA[<b>%1$s:</b> ∑: <b>%2$.2f U</b> Bol: <b>%3$.2f U</b> Bas: <b>%4$.2f U(%5$.0f%%)</b>]]></string>
<string name="tddwithcarbsformat"><![CDATA[<b>%1$s:</b> ∑: <b>%2$.2f U</b> Bol: <b>%3$.2f U</b> Bas: <b>%4$.2f U(%5$.0f%%)</b> Carbs: <b>%6$.0f g</b>]]></string>
<string name="activitymonitorformat"><![CDATA[<b>%3$d</b> 일<br>에 <b><span style=\"color:yellow\">%1$s:</span></b> <b>%2$s</b>]]></string>
<!-- Translator-->
<string name="careportal_bgcheck">혈당 체크</string>
<string name="careportal_mbg">수동 BG 값 입력 또는 보정</string>
<string name="careportal_announcement">알림</string>
<string name="careportal_note">노트</string>
<string name="careportal_question">의문</string>
@ -165,6 +182,8 @@
<string name="careportal_pumpsitechange">펌프 위치 변경</string>
<string name="careportal_cgmsensorinsert">CGM 센서 삽입</string>
<string name="careportal_cgmsensorstart">CGM 센서 시작</string>
<string name="careportal_cgm_sensor_stop">CGM 센서 정지</string>
<string name="careportal_dad_alert">D.A.D 경고</string>
<string name="careportal_insulincartridgechange">인슐린 카트리지 교체</string>
<string name="careportal_profileswitch">프로파일 변경</string>
<string name="careportal_snackbolus">간식Bolus</string>
@ -191,6 +210,8 @@
<string name="custom">사용자 정의</string>
<string name="pump">펌프</string>
<string name="loop">Loop</string>
<string name="ns">NS</string>
<string name="record">기록</string>
<!-- Command-->
<string name="connectiontimedout">연결시간초과</string>
<!-- PumpEnactResult-->
@ -204,7 +225,9 @@
<string name="waitingforpumpresult">결과 기다리는 중</string>
<string name="smb_shortname">SMB</string>
<!-- CarbsReq-->
<string name="carbsreq">%2$d 분 안에 %1$d g의 추가적인 탄수화물이 요구됨</string>
<!-- TDDStatsActivity-->
<string name="stats">통계</string>
<string name="cumulative_tdd">누적 일총량</string>
<string name="expweight">지수가중 일총량</string>
<string name="basalrate">Basal</string>
@ -219,13 +242,43 @@
<string name="tbb2">총기초량 * 2</string>
<!-- Ntp-->
<string name="timedetection">시간 감지</string>
<string name="format_hour_minute">%1$d시 %2$d분</string>
<string name="mute5min">5분 동안 음소거</string>
<!-- Maintenance -->
<string name="metadata_label_format">파일 형식</string>
<string name="metadata_label_created_at">생성 일자</string>
<string name="metadata_label_aaps_version">AAPS 버전</string>
<string name="metadata_label_aaps_flavour">다른 형식 빌드</string>
<string name="metadata_label_device_name">장치의 환자 이름 내보내기</string>
<string name="metadata_label_device_model">장치 모델 내보내기</string>
<string name="metadata_label_encryption">파일 암호화</string>
<string name="metadata_format_old">오래된 내보내기 형식</string>
<string name="metadata_format_new">암호화된 새로운 형식</string>
<string name="metadata_format_debug">오류가 제거된 새로운 형식 (암호화되지 않음)</string>
<string name="metadata_format_other">알려지지 않은 내보내기 형식</string>
<string name="exported_ago" comment="at placeholder we add pluralized number of hours/minutes">%1$s 전에 내보내기 함</string>
<string name="exported_at" comment="at placeholder we add export date">%1$s에 내보내기 함</string>
<string name="exported_less_than_hour_ago">내보내기 한지 1시간이 지나지 않았습니다.</string>
<string name="in_directory" comment="placeholder is for exported file path">디렉토리: %1$s</string>
<string name="preferences_import_list_title">가져올 파일을 선택하세요.</string>
<string name="metadata_warning_different_flavour">환경설정은 AAPS (%1$s) 와는 다르게 생성되기 때문에 불러오는 도중 일부 설정이 누락되거나 설정이 되지 않을 수 있습니다. - 가져오기를 수행한 후 설정을 확인하고 업데이트 해주시기 바랍니다.</string>
<string name="metadata_warning_different_device">환경설정은 다른 기기에서 설정되었습니다. 다른 혹은 전에 쓰던 기기에서 환경설정을 가져오는 건 괜찮지만 가져온 후 환경설정이 올바르게 설정되었는지 확인해주시기 바랍니다.</string>
<string name="metadata_warning_outdated_format">이전 버전의 AAPS에서 사용하는 구식 legacy 포멧은 안전하지 않습니다. 최근에 내보내기한 설정이 없는 경우에만 최후의 수단으로 JSONㅠ포멧을 사용해주시기 바랍니다.</string>
<string name="metadata_warning_old_export">가져온 환경설정은 이미 %1$s일이 지났습니다. 최신의 환경설정으로 업데이트된 파일이 있거나 잘못된 파일을 선택하셨을 수도 있습니다. 환경설정을 정기적으로 내보주시기 바랍니다.</string>
<string name="metadata_warning_date_format">잘못된 날짜 형식입니다.</string>
<string name="metadata_warning_different_version">다른 하위 버전 어플의 설정입니다. 업그레이드 후에 설정을 불러오는 것은 괜찮지만, 설정이 올바른지 확인하십시오!</string>
<string name="metadata_urgent_different_version">다른 상위 버전 어플의 설정입니다. 상위 버전은 매우 상이하며, 호환되지 않는 설정일 수 있습니다! 설정을 불러온 후 올바른지 반드시 확인하십시오!</string>
<string name="prefdecrypt_settings_tampered">설정 파일 변경됨</string>
<string name="prefdecrypt_settings_secure">설정 파일 안전함</string>
<string name="prefdecrypt_settings_unencrypted">안전하지 않음, 암호화되지 않은 설정 형식</string>
<string name="prefdecrypt_wrong_json">JSON 형식 에러, 필요 영역 손실됨 (형식, 내용, 메타데이터, 또는 보안)</string>
<string name="prefdecrypt_wrong_password">암호 해독 에러, 입력한 비빌번호가 파일을 열 수 없습니다.</string>
<string name="prefdecrypt_issue_missing_file_hash">파일의 checksum (hash) 손실됨, 설정의 진위를 확인할 수 없습니다.</string>
<string name="prefdecrypt_issue_modified">내보내기 후 파일이 변형되었습니다!</string>
<string name="prefdecrypt_issue_parsing">해독 에러, 파싱 설정 실패함!</string>
<string name="prefdecrypt_issue_wrong_pass">해독 에러, 입력한 비밀번호가 유효하지 않거나 설정 파일이 수정되었습니다. 가져온 파일이 다른 마스터 비밀번호로 내보내기 되었을 가능성이 있습니다.</string>
<string name="prefdecrypt_issue_wrong_format">암호화 설정이 누락되었음, 설정 형식이 유효하지 않습니다!</string>
<string name="prefdecrypt_issue_wrong_algorithm">지원되지 않는 또는 명시되지 않은 암호화 알고리즘!</string>
<!-- VersionChecker -->
<string name="signature_verifier">서명 확인</string>
<string name="running_invalid_version">유효하지 않은 버전을 이용 중입니다. Loop가 비활성화 되었습니다!</string>
@ -233,9 +286,119 @@
<!-- Permissions -->
<string name="alert_dialog_storage_permission_text">폰을 재부팅하거나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그 기록이 되지 않습니다.(알고리즘이 정상적인 작동하는지 확인하기 위해 로그가 필요합니다.)!</string>
<!-- WeekdayPicker -->
<string name="monday_short"></string>
<string name="tuesday_short"></string>
<string name="wednesday_short"></string>
<string name="thursday_short"></string>
<string name="friday_short"></string>
<string name="saturday_short"></string>
<string name="sunday_short"></string>
<!-- User Entry -->
<string name="uel_bolus">Bolus</string>
<string name="uel_bolus_advisor">Bolus 어드바이저</string>
<string name="uel_extended_bolus">확장 bolus</string>
<string name="uel_superbolus_tbr">Superbolus TBR</string>
<string name="uel_carbs">탄수화물</string>
<string name="uel_extended_carbs">확장 탄수화물</string>
<string name="uel_temp_basal">임시 basal</string>
<string name="uel_tt">임시 목표</string>
<string name="uel_new_profile">새로운 프로파일</string>
<string name="uel_clone_profile">프로파일 복사</string>
<string name="uel_store_profile">프로파일 저장</string>
<string name="uel_profile_switch">프로파일 변경</string>
<string name="uel_profile_switch_cloned">프로파일 변경 복사됨</string>
<string name="uel_closed_loop_mode">Closed loop 모드</string>
<string name="uel_lgs_loop_mode">LGS loop 모드</string>
<string name="uel_open_loop_mode">Open loop 모드</string>
<string name="uel_loop_disabled">Loop 사용하지 않음</string>
<string name="uel_loop_enabled">Loop 사용함</string>
<string name="uel_reconnect">재연결</string>
<string name="uel_disconnect">연결 끊기</string>
<string name="uel_resume">재시작</string>
<string name="uel_suspend">일시 정지</string>
<string name="uel_hw_pump_allowed">HW 펌프 허가됨</string>
<string name="uel_clear_pairing_keys">연동 비밀번호 삭제</string>
<string name="uel_accepts_temp_basal">임시 basal 수락</string>
<string name="uel_cancel_temp_basal">임시 basal 취소</string>
<string name="uel_cancel_bolus">Bolus 취소</string>
<string name="uel_cancel_extended_bolus">확장 bolus 취소</string>
<string name="uel_cancel_tt">임시 목표 취소</string>
<string name="uel_careportal">케어포털</string>
<string name="uel_site_change">삽입 위치 변경</string>
<string name="uel_reservoir_change">펌프 주사기 변경</string>
<string name="uel_calibration">보정</string>
<string name="uel_prime_bolus">프라임 bolus</string>
<string name="uel_treatment">처치</string>
<string name="uel_careportal_ns_refresh">케어포털 NS 새로고침</string>
<string name="uel_profile_switch_ns_refresh">프로파일 변경 NS 새로고침</string>
<string name="uel_treatments_ns_refresh">처치 NS 새로고침</string>
<string name="uel_tt_ns_refresh">임시 목표 NS 새로고침</string>
<string name="uel_automation_removed">자동화 제거됨</string>
<string name="uel_bg_removed">혈당 제거됨</string>
<string name="uel_careportal_removed">케어포털 제거됨</string>
<string name="uel_bolus_removed">bolus 제거됨</string>
<string name="uel_carbs_removed">탄수화물 제거됨</string>
<string name="uel_temp_basal_removed">임시 basal 제거됨</string>
<string name="uel_extended_bolus_removed">확장 bolus 제거됨</string>
<string name="uel_food">음식</string>
<string name="uel_food_removed">음식 제거됨</string>
<string name="uel_profile_removed">프로파일 제거됨</string>
<string name="uel_profile_switch_removed">프로파일 변경 제거됨</string>
<string name="uel_restart_events_removed">재시작 이벤트 제거됨</string>
<string name="uel_treatment_removed">처치 제거됨</string>
<string name="uel_tt_removed">임시 목표 제거됨</string>
<string name="uel_ns_paused">NS 정지</string>
<string name="uel_ns_resume">NS 재시작</string>
<string name="uel_ns_queue_cleared">NS 대기열 제거함</string>
<string name="uel_ns_settings_copied">NS 설정 복사됨</string>
<string name="uel_error_dialog_ok">에러 대화상자 확인</string>
<string name="uel_error_dialog_mute">에러 대화상자 음소거 </string>
<string name="uel_error_dialog_mute_5min">에러 대화상자 5분간 음소거</string>
<string name="uel_objective_started">목표 시작됨</string>
<string name="uel_objective_unstarted">목표 시작되지 않음</string>
<string name="uel_objectives_skipped">목표를 건너뜀</string>
<string name="uel_stat_reset">통계 재설정</string>
<string name="uel_delete_logs">로그 지우기</string>
<string name="uel_delete_future_treatments">이후의 처치 지우기</string>
<string name="uel_export_settings">설정 내보내기</string>
<string name="uel_import_settings">설정 들여오기</string>
<string name="uel_reset_databases">데이터베이스 재설정</string>
<string name="uel_export_databases">데이터베이스 내보내기</string>
<string name="uel_import_databases">데이터베이스 들여오기</string>
<string name="uel_otp_export">OTP 내보내기</string>
<string name="uel_otp_reset">OPT 재설정</string>
<string name="uel_stop_sms">SMS 중지</string>
<string name="uel_export_csv">사용자 항목 내보내기</string>
<string name="uel_start_aaps">AAPS 시작하기</string>
<string name="uel_exit_aaps">AAPS 나가기</string>
<string name="uel_plugin_enabled">플러그인 활성화됨</string>
<string name="uel_plugin_disabled">플러그인 비활성화됨</string>
<string name="uel_unknown">알 수 없음</string>
<string name="ue_string">문자열</string>
<string name="ue_source">소스</string>
<string name="ue_utc_offset">UTC 오프셋</string>
<string name="ue_action">실행</string>
<string name="ue_timestamp">시간 기록</string>
<string name="ue_none">Unit 없음</string>
<string name="ue_export_to_csv">사용자 항목 엑셀 파일로 내보내기 (csv)</string>
<string name="uel_loop_change">Loop 변경됨</string>
<string name="uel_loop_removed">Loop 제거됨</string>
<string name="uel_other">기타</string>
<!-- HardLimits -->
<string name="profile_low_target">프로파일 저혈당 목표</string>
<string name="profile_high_target">프로파일 고혈당 목표</string>
<string name="temp_target_low_target">임시 목표 최저값</string>
<string name="temp_target_high_target">임시 목표 최고값</string>
<string name="temp_target_value">임시 목표 수치</string>
<string name="profile_dia">프로파일 DIA 값</string>
<string name="profile_sensitivity_value">프로파일 민감도 값</string>
<string name="profile_max_daily_basal_value">프로파일의 최대 basal 값</string>
<string name="current_basal_value">현재 basal 값</string>
<string name="profile_carbs_ratio_value">프로파일의 탄수화물 비율 값</string>
<string name="valuelimitedto">%1$.2f은 %2$.2f까지 제한됨</string>
<string name="valueoutofrange">»%1$s«이 \'고정된 한계값\'을 벗어났습니다.</string>
<string name="value_out_of_hard_limits">»%1$s« %2$.2f이 \'고정된 한계값\'을 벗어났습니다.</string>
<string name="basal_value">Basal 값</string>
<plurals name="days">
<item quantity="other">%1$d 일</item>
</plurals>

View file

@ -2,6 +2,23 @@
<resources>
<string name="error_only_numeric_digits_allowed">숫자만 입력가능합니다.</string>
<string name="error_only_numeric_digits_range_allowed">이 범위(%1$s - %2$s)안에 해당하는 숫자만 입력가능합니다.</string>
<string name="error_this_field_cannot_contain_special_character">이 영역은 특수 문자를 입력할 수 없습니다</string>
<string name="error_only_standard_letters_are_allowed">표준 문자만 입력 가능합니다.</string>
<string name="error_field_must_not_be_empty">필수 입력 항목입니다.</string>
<string name="error_email_address_not_valid">유효하지 않은 이메일 주소</string>
<string name="error_creditcard_number_not_valid">신용 카드 번호가 유효하지 않습니다.</string>
<string name="error_phone_not_valid">폰번호가 유효하지 않습니다</string>
<string name="error_domain_not_valid">유효하지 않은 도메인 이름</string>
<string name="error_ip_not_valid">유효하지 않은 IP 주소</string>
<string name="error_url_not_valid">Web URL이 유효하지 않습니다.</string>
<string name="error_notvalid_personname">유효하지 않은 성 또는 이름</string>
<string name="error_notvalid_personfullname">유효하지 않은 이름</string>
<string name="error_date_not_valid">유효하지 않은 형식</string>
<string name="error_mustbe4digitnumber">4자리 숫자이어야 함</string>
<string name="error_mustbe6digitnumber">6자리 숫자이어야 함</string>
<string name="error_mustbe12hexadidits">ABCDEF0123456789로 구성된 12자리 문자이어야 함</string>
<string name="error_mustbe8hexadidits">ABCDEF083456789로 구성된 8자리 문자이어야 함</string>
<string name="error_mustbe4hexadidits">ABCDEF043456789로 구성된 4자리 문자이어야 함</string>
<string name="error_not_a_minimum_length">최소 길이가 안됨</string>
<string name="error_pin_not_valid">비밀번호는 똑같은 숫자나 연속된 숫자를 제외한 3~6자리 숫자이어야 함</string>
</resources>

View file

@ -196,6 +196,7 @@
<string name="careportal_openapsoffline">OpenAPS vypnuté</string>
<string name="careportal_pumpbatterychange">Výmena batérie v pumpe</string>
<string name="careportal_temporarytarget">Dočasný cieľ</string>
<string name="careportal_temporarytargetvalue">Hodnota dočasného cieľa</string>
<string name="careportal_temporarytargetcancel">Zrušiť dočasný cieľ</string>
<string name="boluswizard">Bolusová kalkulačka</string>
<string name="glucosetype_finger">Prst</string>
@ -385,6 +386,20 @@
<string name="uel_loop_removed">UZAVRETÝ OKRUH ODSTRÁNENÝ</string>
<string name="uel_other">INÉ</string>
<!-- HardLimits -->
<string name="profile_low_target">Dolný cieľ profilu</string>
<string name="profile_high_target">Horný cieľ profilu</string>
<string name="temp_target_low_target">Dolná hodnota dočasného cieľa</string>
<string name="temp_target_high_target">Horná hodnota dočasného cieľa</string>
<string name="temp_target_value">Hodnota dočasného cieľa</string>
<string name="profile_dia">Profilová hodnota DIA</string>
<string name="profile_sensitivity_value">Profilová hodnota citlivosti</string>
<string name="profile_max_daily_basal_value">Profilová maximálna hodnota bazálu</string>
<string name="current_basal_value">Aktuálna hodnota bazálu</string>
<string name="profile_carbs_ratio_value">Profilový inzulino-sacharidový pomer</string>
<string name="valuelimitedto">%1$.2f obmedzené na %2$.2f</string>
<string name="valueoutofrange">»%1$s« je mimo pevne nastavené limity</string>
<string name="value_out_of_hard_limits">»%1$s« %2$.2f je mimo pevne nastavených limitov</string>
<string name="basal_value">Hodnota bazálu</string>
<plurals name="days">
<item quantity="one">%1$d deň</item>
<item quantity="few">%1$d dní</item>

View file

@ -12,7 +12,7 @@
<color name="black_overlay">#66000000</color>
<!-- Fragments-->
<color name="colorInitializingBorder">#00695c</color>
<color name="pumpStatusBackground">#505050</color>
<!-- Dialogs-->
<color name="dialog_title_background">#303030</color>

View file

@ -81,6 +81,7 @@
<string name="connected">Connected</string>
<string name="disconnected">Disconnected</string>
<string name="disconnecting">Disconnecting</string>
<string name="waiting_for_disconnection">Waiting for disconnection</string>
<string name="androidaps_start">AndroidAPS started</string>
<string name="formatinsulinunits1">%1$.1f U</string>
<string name="formatinsulinunits">%1$.2f U</string>
@ -272,6 +273,7 @@
<string name="careportal_openapsoffline">OpenAPS Offline</string>
<string name="careportal_pumpbatterychange">Pump Battery Change</string>
<string name="careportal_temporarytarget">Temporary target</string>
<string name="careportal_temporarytargetvalue">Temporary target value</string>
<string name="careportal_temporarytargetcancel">Temporary target cancel</string>
<string name="boluswizard">Bolus wizard</string>
<string name="glucosetype_finger">Finger</string>
@ -288,6 +290,8 @@
<string name="loop">Loop</string>
<string name="ns">NS</string>
<string name="record">Record</string>
<string name="reading_pump_history">Reading pump history</string>
<string name="pump_icon">Pump icon</string>
<!-- Command-->
<string name="connectiontimedout">Connection timed out</string>

View file

@ -64,6 +64,8 @@ class DanaFragment : DaggerFragment() {
private val loopHandler = Handler(Looper.getMainLooper())
private lateinit var refreshLoop: Runnable
private var pumpStatus = ""
private var pumpStatusIcon = "{fa-bluetooth-b}"
private var _binding: DanarFragmentBinding? = null
@ -87,10 +89,8 @@ class DanaFragment : DaggerFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.danaPumpstatus.setBackgroundColor(resourceHelper.gc(R.color.colorInitializingBorder))
binding.history.setOnClickListener { startActivity(Intent(context, DanaHistoryActivity::class.java)) }
binding.viewprofile.setOnClickListener {
binding.viewProfile.setOnClickListener {
val profile = danaPump.createConvertedProfile()?.getDefaultProfileJson()
?: return@setOnClickListener
val profileName = danaPump.createConvertedProfile()?.getDefaultProfileName()
@ -152,31 +152,25 @@ class DanaFragment : DaggerFragment() {
.toObservable(EventPumpStatusChanged::class.java)
.observeOn(aapsSchedulers.main)
.subscribe({
when (it.status) {
pumpStatusIcon = when (it.status) {
EventPumpStatusChanged.Status.CONNECTING ->
@Suppress("SetTextI18n")
binding.btconnection.text = "{fa-bluetooth-b spin} ${it.secondsElapsed}s"
"{fa-bluetooth-b spin} ${it.secondsElapsed}s"
EventPumpStatusChanged.Status.CONNECTED ->
@Suppress("SetTextI18n")
binding.btconnection.text = "{fa-bluetooth}"
"{fa-bluetooth}"
EventPumpStatusChanged.Status.DISCONNECTED ->
@Suppress("SetTextI18n")
binding.btconnection.text = "{fa-bluetooth-b}"
"{fa-bluetooth-b}"
else -> {
}
}
if (it.getStatus(resourceHelper) != "") {
binding.danaPumpstatus.text = it.getStatus(resourceHelper)
binding.danaPumpstatuslayout.visibility = View.VISIBLE
} else {
binding.danaPumpstatuslayout.visibility = View.GONE
else ->
"{fa-bluetooth-b}"
}
binding.btconnection.text = pumpStatusIcon
pumpStatus = it.getStatus(resourceHelper)
binding.pumpStatus.text = pumpStatus
binding.pumpStatusLayout.visibility = (pumpStatus != "").toVisibility()
}, fabricPrivacy::logException)
binding.danaPumpstatus.text = ""
binding.danaPumpstatuslayout.visibility = View.GONE
@Suppress("SetTextI18n")
binding.btconnection.text = "{fa-bluetooth-b}"
pumpStatus = ""
pumpStatusIcon = "{fa-bluetooth-b}"
updateGUI()
}
@ -185,6 +179,8 @@ class DanaFragment : DaggerFragment() {
super.onPause()
disposable.clear()
loopHandler.removeCallbacks(refreshLoop)
pumpStatus = ""
pumpStatusIcon = "{fa-bluetooth-b}"
}
@Synchronized
@ -197,6 +193,11 @@ class DanaFragment : DaggerFragment() {
@Synchronized
fun updateGUI() {
if (_binding == null) return
binding.btconnection.text = pumpStatusIcon
binding.pumpStatus.text = pumpStatus
binding.pumpStatusLayout.visibility = (pumpStatus != "").toVisibility()
binding.queue.text = commandQueue.spannedStatus()
binding.queueStatusLayout.visibility = (commandQueue.spannedStatus().toString() != "").toVisibility()
val pump = danaPump
val plugin: Pump = activePlugin.activePump
if (pump.lastConnection != 0L) {
@ -225,18 +226,9 @@ class DanaFragment : DaggerFragment() {
warnColors.setColorInverse(binding.reservoir, pump.reservoirRemainingUnits, 50.0, 20.0)
binding.battery.text = "{fa-battery-" + pump.batteryRemaining / 25 + "}"
warnColors.setColorInverse(binding.battery, pump.batteryRemaining.toDouble(), 51.0, 26.0)
binding.iob.text = resourceHelper.gs(R.string.formatinsulinunits, pump.iob)
binding.firmware.text = resourceHelper.gs(R.string.dana_model, pump.modelFriendlyName(), pump.hwModel, pump.protocol, pump.productCode)
binding.basalstep.text = pump.basalStep.toString()
binding.bolusstep.text = pump.bolusStep.toString()
binding.basalBolusStep.text = pump.basalStep.toString() + "/" + pump.bolusStep.toString()
binding.serialNumber.text = pump.serialNumber
val status = commandQueue.spannedStatus()
if (status.toString() == "") {
binding.queue.visibility = View.GONE
} else {
binding.queue.visibility = View.VISIBLE
binding.queue.text = status
}
val icon = if (danaPump.pumpType() == PumpType.DANA_I) R.drawable.ic_dana_i else R.drawable.ic_dana_rs
binding.danaIcon.setImageDrawable(context?.let { ContextCompat.getDrawable(it, icon) })
//hide user options button if not an RS pump or old firmware

File diff suppressed because it is too large Load diff

View file

@ -28,7 +28,7 @@
android:contentDescription="@string/pumphistory"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_danarhistory" />
app:srcCompat="@drawable/ic_pump_history" />
<TextView
android:id="@+id/textView2"

View file

@ -5,7 +5,9 @@
<string name="danars_pairingok">Pairing OK</string>
<string name="danars_pairingtimedout">Zeitüberschreitung beim Pairing</string>
<string name="danars_waitingforpairing">Auf Verbindung warten</string>
<string name="danarspump">Dana-i/RS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Pumpen-Integration für Dana Diabecare RS und Dana-i Pumpen</string>
<string name="maxbolusviolation">Max. Bolus überschritten</string>
<string name="commanderror">Fehler bei Befehl</string>
<string name="speederror">Geschwindigkeits-Fehler</string>

View file

@ -108,8 +108,6 @@
<string name="profile_set_failed">Setting of basal profile failed</string>
<string name="danar_bluetooth_status">Bluetooth status</string>
<string name="danar_iob_label">Pump IOB</string>
<string name="basal_step">Basal Step</string>
<string name="bolus_step">Bolus Step</string>
<string name="virtualpump_firmware_label">Firmware</string>
<string name="danar_pump_settings">Dana pump settings</string>
<string name="timeformat12h">12h</string>
@ -131,5 +129,6 @@
<string name="press_ok_on_the_pump">Press OK on the pump\nand enter 2 displayed numbers\nKeep display on pump ON by pressing minus button until you finish entering code.</string>
<string name="num1pin">1: (12 digits)</string>
<string name="num2pin">2: (8 digits)</string>
<string name="basal_bolus_step">Basal/bolus step</string>
</resources>

View file

@ -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
}

View file

@ -190,6 +190,7 @@ class DanaRSService : DaggerService() {
aapsLogger.debug(LTag.PUMPCOMM, "Pump time difference: $timeDiff seconds")
}
}
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.reading_pump_history)))
loadEvents()
// RS doesn't provide exact timestamp = rely on history
val eb = pumpSync.expectedPumpState().extendedBolus
@ -376,6 +377,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()

View file

@ -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<List<EffectiveProfileSwitch>> =
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<List<Carbs>>.expand() = this.map { it.map(::expandCarbs).flatten() }
private fun Single<List<Carbs>>.filterOutExtended() = this.map { it.filter { c -> c.duration == 0L } }
private fun Single<List<Carbs>>.fromTo(from: Long, to: Long) = this.map { it.filter { c -> c.timestamp in from..to } }
private fun Single<List<Carbs>>.until(to: Long) = this.map { it.filter { c -> c.timestamp <= to } }
private infix fun Single<List<Carbs>>.until(to: Long) = this.map { it.filter { c -> c.timestamp <= to } }
private fun Single<List<Carbs>>.from(start: Long) = this.map { it.filter { c -> c.timestamp >= start } }
private fun Single<List<Carbs>>.sort() = this.map { it.sortedBy { c -> c.timestamp } }

View file

@ -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<EffectiveProfileSwit
@Query("SELECT id FROM $TABLE_EFFECTIVE_PROFILE_SWITCHES ORDER BY id DESC limit 1")
fun getLastId(): Maybe<Long>
@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?

View file

@ -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

View file

@ -54,6 +54,8 @@ data class EffectiveProfileSwitch(
enum class GlucoseUnit {
MGDL,
MMOL
MMOL;
companion object
}
}

View file

@ -21,7 +21,7 @@ data class UserEntry(
var action: Action,
var source: Sources,
var note: String,
var values: List<ValueWithUnit?>
var values: List<@JvmSuppressWildcards ValueWithUnit?>
) : DBEntry, DBEntryWithTime {
enum class Action (val colorGroup: ColorGroup) {
BOLUS (ColorGroup.InsulinTreatment),

View file

@ -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<SyncNsEffectiveProfileSwitchTransaction.TransactionResult>() {
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<EffectiveProfileSwitch>()
val inserted = mutableListOf<EffectiveProfileSwitch>()
val invalidated = mutableListOf<EffectiveProfileSwitch>()
}
}

View file

@ -0,0 +1,14 @@
package info.nightscout.androidaps.database.transactions
import info.nightscout.androidaps.database.entities.EffectiveProfileSwitch
class UpdateNsIdEffectiveProfileSwitchTransaction(val effectiveProfileSwitch: EffectiveProfileSwitch) : Transaction<Unit>() {
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)
}
}
}

View file

@ -10,6 +10,8 @@ import android.view.View
import android.view.ViewGroup
import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.activities.TDDStatsActivity
import info.nightscout.androidaps.diaconn.activities.DiaconnG8HistoryActivity
import info.nightscout.androidaps.diaconn.activities.DiaconnG8UserOptionsActivity
import info.nightscout.androidaps.diaconn.databinding.DiaconnG8FragmentBinding
import info.nightscout.androidaps.diaconn.events.EventDiaconnG8NewStatus
import info.nightscout.androidaps.events.EventExtendedBolusChange
@ -74,10 +76,9 @@ class DiaconnG8Fragment : DaggerFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.diaconnG8Pumpstatus.setBackgroundColor(resourceHelper.gc(R.color.colorInitializingBorder))
binding.history.setOnClickListener { startActivity(Intent(context, info.nightscout.androidaps.diaconn.activities.DiaconnG8HistoryActivity::class.java)) }
binding.history.setOnClickListener { startActivity(Intent(context, DiaconnG8HistoryActivity::class.java)) }
binding.stats.setOnClickListener { startActivity(Intent(context, TDDStatsActivity::class.java)) }
binding.userOptions.setOnClickListener { startActivity(Intent(context, info.nightscout.androidaps.diaconn.activities.DiaconnG8UserOptionsActivity::class.java)) }
binding.userOptions.setOnClickListener { startActivity(Intent(context, DiaconnG8UserOptionsActivity::class.java)) }
binding.btconnection.setOnClickListener {
aapsLogger.debug(LTag.PUMP, "Clicked connect to pump")
diaconnG8Pump.lastConnection = 0

View file

@ -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)

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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)

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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)
}

View file

@ -31,7 +31,7 @@ class TimeInquireResponsePacket(
val result2 = getByteToInt(bufferData)
if(!isSuccInquireResponseResult(result2)) {
failed = true
return;
return
}
}

View file

@ -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())

View file

@ -36,6 +36,7 @@
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@color/pumpStatusBackground"
android:gravity="center_vertical|center_horizontal"
android:text="@string/initializing"
android:textAppearance="?android:attr/textAppearanceSmall" />
@ -678,7 +679,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:drawableTop="@drawable/ic_danarhistory"
android:drawableTop="@drawable/ic_pump_history"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/pumphistory" />

View file

@ -21,7 +21,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/pumphistory"
app:srcCompat="@drawable/ic_danarhistory" />
app:srcCompat="@drawable/ic_pump_history" />
<TextView
android:layout_width="match_parent"

View file

@ -52,6 +52,8 @@
<string name="diagonn_g8_useroptions">BENUTZER-OPTIONEN</string>
<string name="pairfirst">Bitte kopple deine Pumpe mit deinem Telefon!</string>
<string name="processinghistory">"Ereignis wird verarbeitet "</string>
<string name="apslastLogNum">aps_last_log_num</string>
<string name="apsWrappingCount">aps_wrapping_count</string>
<string name="diaconn_g8_history_tempbasal">Temporäre Basalrate</string>
<string name="diaconng8_pump_settings">Diaconn-Pumpen Einstellungen</string>
<string name="diaconn_g8_pumpalarm">Töne</string>
@ -79,6 +81,9 @@
<string name="insulinlackwarning">Warnung Insulinmangel</string>
<string name="needbatteryreplace">Batteriewechsel erforderlich</string>
<string name="needinsullinreplace">Neues Insulin erforderlich</string>
<string name="pumpversion">pump_version</string>
<string name="apsIncarnationNo">aps_incarnation_no</string>
<string name="pumpserialno">pump_serial_no</string>
<string name="diaconn_g8_loginsulinchange_title">Reservoirwechsel aufzeichnen</string>
<string name="diaconn_g8_loginsulinchange_summary">Reservoirwechsel im Careportal hinzufügen, falls dies in der Historie gefunden wird.</string>
<string name="diaconn_g8_logcanulachange_title">Kanülenwechsel protokollieren</string>
@ -112,6 +117,7 @@
<string name="diacon_g8_blockdualbolus">DUAL BOLUS</string>
<string name="diacon_g8_blockreplacetube">KATHETER WECHSELN</string>
<string name="diacon_g8_blockreplaceneedle">KANÜLE WECHSELN</string>
<string name="diacon_g8_blockreplacesyringe">NADEL WECHSELN</string>
<string name="diaconn_g8_logalarmblock">Verstopfung (%s)</string>
<string name="diaconn_g8_lgorelease">Basalabgabe (%s)</string>
<string name="diaconn_g8_lgosuspend">Basal unterbrechen (%s)</string>

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