G6: calibration fix
This commit is contained in:
parent
a20f4ff822
commit
900c5db0dc
3 changed files with 44 additions and 20 deletions
|
@ -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") } }
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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>()
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue