G6: calibration fix

This commit is contained in:
Milos Kozak 2022-01-27 21:35:12 +01:00
parent a20f4ff822
commit 900c5db0dc
3 changed files with 44 additions and 20 deletions

View file

@ -7,6 +7,8 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.work.ListenableWorker
import androidx.work.workDataOf
import dagger.android.support.DaggerFragment import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import info.nightscout.androidaps.database.AppRepository import info.nightscout.androidaps.database.AppRepository
@ -32,6 +34,8 @@ import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.plusAssign import io.reactivex.rxkotlin.plusAssign
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -48,6 +52,7 @@ class BGSourceFragment : DaggerFragment() {
@Inject lateinit var aapsSchedulers: AapsSchedulers @Inject lateinit var aapsSchedulers: AapsSchedulers
@Inject lateinit var uel: UserEntryLogger @Inject lateinit var uel: UserEntryLogger
@Inject lateinit var activePlugin: ActivePlugin @Inject lateinit var activePlugin: ActivePlugin
@Inject lateinit var aapsLogger: AAPSLogger
private val disposable = CompositeDisposable() private val disposable = CompositeDisposable()
private val millsToThePast = T.hours(36).msecs() private val millsToThePast = T.hours(36).msecs()
@ -154,7 +159,10 @@ class BGSourceFragment : DaggerFragment() {
Action.BG_REMOVED, source, Action.BG_REMOVED, source,
ValueWithUnit.Timestamp(glucoseValue.timestamp) ValueWithUnit.Timestamp(glucoseValue.timestamp)
) )
disposable += repository.runTransaction(InvalidateGlucoseValueTransaction(glucoseValue.id)).subscribe() repository.runTransactionForResult(InvalidateGlucoseValueTransaction(glucoseValue.id))
.doOnError { aapsLogger.error(LTag.DATABASE, "Error while invalidating BG value", it) }
.blockingGet()
.also { result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated bg $it") } }
}) })
} }
} }

View file

@ -17,6 +17,7 @@ import info.nightscout.androidaps.database.entities.UserEntry.Action
import info.nightscout.androidaps.database.entities.UserEntry.Sources import info.nightscout.androidaps.database.entities.UserEntry.Sources
import info.nightscout.androidaps.database.entities.ValueWithUnit import info.nightscout.androidaps.database.entities.ValueWithUnit
import info.nightscout.androidaps.database.transactions.CgmSourceTransaction import info.nightscout.androidaps.database.transactions.CgmSourceTransaction
import info.nightscout.androidaps.database.transactions.InvalidateGlucoseValueTransaction
import info.nightscout.androidaps.extensions.fromConstant import info.nightscout.androidaps.extensions.fromConstant
import info.nightscout.androidaps.interfaces.* import info.nightscout.androidaps.interfaces.*
import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.logging.UserEntryLogger
@ -144,18 +145,6 @@ class DexcomPlugin @Inject constructor(
sourceSensor = sourceSensor sourceSensor = sourceSensor
) )
} }
// G6 calibration bug workaround (2 additional GVs are created within 1 second from previous record)
if (sourceSensor == GlucoseValue.SourceSensor.DEXCOM_G6_NATIVE) {
glucoseValues.sortBy { it.timestamp }
for (i in glucoseValues.indices) {
if (i < glucoseValues.size - 1) {
if (abs(glucoseValues[i].timestamp - glucoseValues[i + 1].timestamp) < 1000) {
aapsLogger.debug(LTag.DATABASE, "Excluding bg ${glucoseValues[i + 1]}")
glucoseValues.removeAt(i + 1)
}
}
}
}
val sensorStartTime = if (sp.getBoolean(R.string.key_dexcom_lognssensorchange, false) && bundle.containsKey("sensorInsertionTime")) { val sensorStartTime = if (sp.getBoolean(R.string.key_dexcom_lognssensorchange, false) && bundle.containsKey("sensorInsertionTime")) {
bundle.getLong("sensorInsertionTime", 0) * 1000 bundle.getLong("sensorInsertionTime", 0) * 1000
} else { } else {
@ -168,9 +157,27 @@ class DexcomPlugin @Inject constructor(
} }
.blockingGet() .blockingGet()
.also { result -> .also { result ->
result.inserted.forEach { // G6 calibration bug workaround (2 additional GVs are created within 1 minute)
xDripBroadcast.send(it) for (i in result.inserted.indices) {
aapsLogger.debug(LTag.DATABASE, "Inserted bg $it") if (sourceSensor == GlucoseValue.SourceSensor.DEXCOM_G6_NATIVE) {
if (i < result.inserted.size - 1) {
if (abs(result.inserted[i].timestamp - result.inserted[i + 1].timestamp) < T.mins(1).msecs()) {
repository.runTransactionForResult(InvalidateGlucoseValueTransaction(result.inserted[i].id))
.doOnError { aapsLogger.error(LTag.DATABASE, "Error while invalidating BG value", it) }
.blockingGet()
.also { result1 -> result1.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted and invalidated bg $it") } }
repository.runTransactionForResult(InvalidateGlucoseValueTransaction(result.inserted[i + 1].id))
.doOnError { aapsLogger.error(LTag.DATABASE, "Error while invalidating BG value", it) }
.blockingGet()
.also { result1 -> result1.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted and invalidated bg $it") } }
result.inserted.removeAt(i + 1)
result.inserted.removeAt(i)
continue
}
}
}
xDripBroadcast.send(result.inserted[i])
aapsLogger.debug(LTag.DATABASE, "Inserted bg ${result.inserted[i]}")
} }
result.updated.forEach { result.updated.forEach {
xDripBroadcast.send(it) xDripBroadcast.send(it)

View file

@ -1,15 +1,24 @@
package info.nightscout.androidaps.database.transactions package info.nightscout.androidaps.database.transactions
import info.nightscout.androidaps.database.transactions.Transaction import info.nightscout.androidaps.database.entities.GlucoseValue
/** /**
* Invalidates the GlucoseValue with the specified id * Invalidates the GlucoseValue with the specified id
*/ */
class InvalidateGlucoseValueTransaction(val id: Long) : Transaction<Unit>() { class InvalidateGlucoseValueTransaction(val id: Long) : Transaction<InvalidateGlucoseValueTransaction.TransactionResult>() {
override fun run() {
override fun run(): TransactionResult {
val result = TransactionResult()
val glucoseValue = database.glucoseValueDao.findById(id) val glucoseValue = database.glucoseValueDao.findById(id)
?: throw IllegalArgumentException("There is no such GlucoseValue with the specified ID.") ?: throw IllegalArgumentException("There is no such GlucoseValue with the specified ID.")
glucoseValue.isValid = false glucoseValue.isValid = false
database.glucoseValueDao.updateExistingEntry(glucoseValue) database.glucoseValueDao.updateExistingEntry(glucoseValue)
result.invalidated.add(glucoseValue)
return result
}
class TransactionResult {
val invalidated = mutableListOf<GlucoseValue>()
} }
} }