improve glunovo logic
This commit is contained in:
parent
25c048640d
commit
ffa4120cd5
2 changed files with 59 additions and 37 deletions
app/src/main
|
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue