improve glunovo logic

This commit is contained in:
Milos Kozak 2021-11-09 18:42:55 +01:00
parent 25c048640d
commit ffa4120cd5
2 changed files with 59 additions and 37 deletions
app/src/main
java/info/nightscout/androidaps/plugins/source
res/values

View file

@ -5,6 +5,7 @@ import android.net.Uri
import android.os.Handler
import android.os.HandlerThread
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.R
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.entities.GlucoseValue
@ -15,13 +16,16 @@ import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
import io.reactivex.disposables.CompositeDisposable
import java.util.*
import javax.inject.Inject
import javax.inject.Singleton
import kotlin.math.min
@Singleton
class GlunovoPlugin @Inject constructor(
@ -31,7 +35,9 @@ class GlunovoPlugin @Inject constructor(
private val sp: SP,
private val context: Context,
private val repository: AppRepository,
private val broadcastToXDrip: XDripBroadcast
private val broadcastToXDrip: XDripBroadcast,
private val dateUtil: DateUtil,
private val fabricPrivacy: FabricPrivacy
) : PluginBase(
PluginDescription()
.mainType(PluginType.BGSOURCE)
@ -51,8 +57,15 @@ class GlunovoPlugin @Inject constructor(
init {
refreshLoop = Runnable {
loopHandler.postDelayed(refreshLoop, INTERVAL)
handleNewData()
try {
handleNewData()
} catch (e: Exception) {
fabricPrivacy.logException(e)
aapsLogger.error("Error while processing data", e)
}
val lastReadTimestamp = sp.getLong(R.string.key_last_processed_glunovo_timestamp, 0L)
val differenceToNow = min(INTERVAL, dateUtil.now() - lastReadTimestamp + INTERVAL + T.secs(10).msecs())
loopHandler.postDelayed(refreshLoop, differenceToNow)
}
}
@ -60,7 +73,7 @@ class GlunovoPlugin @Inject constructor(
override fun onStart() {
super.onStart()
loopHandler.postDelayed(refreshLoop, INTERVAL)
loopHandler.postDelayed(refreshLoop, T.secs(30).msecs()) // do not start immediately, app may be still starting
}
override fun onStop() {
@ -73,42 +86,50 @@ class GlunovoPlugin @Inject constructor(
if (!isEnabled()) return
context.contentResolver.query(contentUri, null, null, null, null)?.let { cr ->
cr.moveToLast()
val curTime = Calendar.getInstance().timeInMillis
val time = cr.getLong(0)
val value = cr.getDouble(1) //value in mmol/l...
if (time > curTime || time == 0L) {
aapsLogger.error(LTag.BGSOURCE, "Error in received data date/time $time")
return
}
if (value < 2 || value > 25) {
aapsLogger.error(LTag.BGSOURCE, "Error in received data value (value out of bounds) $value")
return
}
val glucoseValues = mutableListOf<CgmSourceTransaction.TransactionGlucoseValue>()
glucoseValues += CgmSourceTransaction.TransactionGlucoseValue(
timestamp = time,
value = value,
raw = 0.0,
noise = null,
trendArrow = GlucoseValue.TrendArrow.NONE,
sourceSensor = GlucoseValue.SourceSensor.GLUNOVO_NATIVE
)
repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null))
.doOnError {
aapsLogger.error(LTag.DATABASE, "Error while saving values from Glunovo App", it)
}
.blockingGet()
.also { savedValues ->
savedValues.inserted.forEach {
broadcastToXDrip(it)
aapsLogger.debug(LTag.DATABASE, "Inserted bg $it")
}
cr.moveToFirst()
while (!cr.isAfterLast) {
val timestamp = cr.getLong(0)
val value = cr.getDouble(1) //value in mmol/l...
if (timestamp > dateUtil.now() || timestamp == 0L) {
aapsLogger.error(LTag.BGSOURCE, "Error in received data date/time $timestamp")
continue
}
if (value < 2 || value > 25) {
aapsLogger.error(LTag.BGSOURCE, "Error in received data value (value out of bounds) $value")
continue
}
// bypass already processed
if (timestamp < sp.getLong(R.string.key_last_processed_glunovo_timestamp, 0L)) continue
glucoseValues += CgmSourceTransaction.TransactionGlucoseValue(
timestamp = timestamp,
value = value * Constants.MMOLL_TO_MGDL,
raw = 0.0,
noise = null,
trendArrow = GlucoseValue.TrendArrow.NONE,
sourceSensor = GlucoseValue.SourceSensor.GLUNOVO_NATIVE
)
sp.putLong(R.string.key_last_processed_glunovo_timestamp, timestamp)
cr.moveToNext()
}
cr.close()
if (glucoseValues.isNotEmpty())
repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null))
.doOnError {
aapsLogger.error(LTag.DATABASE, "Error while saving values from Glunovo App", it)
}
.blockingGet()
.also { savedValues ->
savedValues.inserted.forEach {
broadcastToXDrip(it)
aapsLogger.debug(LTag.DATABASE, "Inserted bg $it")
}
}
}
}

View file

@ -1134,5 +1134,6 @@
<string name="data_status">BG data status</string>
<string name="recalculated_data_used">Recalculated data used</string>
<string name="bg_too_close">BG too close:\n%1$s\n%2$s</string>
<string name="key_last_processed_glunovo_timestamp">last_processed_glunovo_timestamp</string>
</resources>