104 lines
4.5 KiB
Kotlin
104 lines
4.5 KiB
Kotlin
package info.nightscout.source
|
|
|
|
import android.content.Context
|
|
import androidx.work.WorkerParameters
|
|
import androidx.work.workDataOf
|
|
import dagger.android.HasAndroidInjector
|
|
import info.nightscout.core.utils.receivers.DataWorkerStorage
|
|
import info.nightscout.core.utils.worker.LoggingWorker
|
|
import info.nightscout.database.entities.GlucoseValue
|
|
import info.nightscout.database.impl.AppRepository
|
|
import info.nightscout.database.impl.transactions.CgmSourceTransaction
|
|
import info.nightscout.database.transactions.TransactionGlucoseValue
|
|
import info.nightscout.interfaces.plugin.PluginBase
|
|
import info.nightscout.interfaces.plugin.PluginDescription
|
|
import info.nightscout.interfaces.plugin.PluginType
|
|
import info.nightscout.interfaces.receivers.Intents
|
|
import info.nightscout.interfaces.source.BgSource
|
|
import info.nightscout.interfaces.source.XDripSource
|
|
import info.nightscout.rx.logging.AAPSLogger
|
|
import info.nightscout.rx.logging.LTag
|
|
import info.nightscout.shared.interfaces.ResourceHelper
|
|
import kotlinx.coroutines.Dispatchers
|
|
import javax.inject.Inject
|
|
import javax.inject.Singleton
|
|
|
|
@Singleton
|
|
class XdripSourcePlugin @Inject constructor(
|
|
injector: HasAndroidInjector,
|
|
rh: ResourceHelper,
|
|
aapsLogger: AAPSLogger
|
|
) : PluginBase(
|
|
PluginDescription()
|
|
.mainType(PluginType.BGSOURCE)
|
|
.fragmentClass(BGSourceFragment::class.java.name)
|
|
.pluginIcon((info.nightscout.core.main.R.drawable.ic_blooddrop_48))
|
|
.preferencesId(R.xml.pref_bgsource)
|
|
.pluginName(R.string.source_xdrip)
|
|
.description(R.string.description_source_xdrip),
|
|
aapsLogger, rh, injector
|
|
), BgSource, XDripSource {
|
|
|
|
private var advancedFiltering = false
|
|
override var sensorBatteryLevel = -1
|
|
|
|
override fun advancedFilteringSupported(): Boolean = advancedFiltering
|
|
|
|
private fun detectSource(glucoseValue: GlucoseValue) {
|
|
advancedFiltering = arrayOf(
|
|
GlucoseValue.SourceSensor.DEXCOM_NATIVE_UNKNOWN,
|
|
GlucoseValue.SourceSensor.DEXCOM_G6_NATIVE,
|
|
GlucoseValue.SourceSensor.DEXCOM_G5_NATIVE,
|
|
GlucoseValue.SourceSensor.DEXCOM_G6_NATIVE_XDRIP,
|
|
GlucoseValue.SourceSensor.DEXCOM_G5_NATIVE_XDRIP,
|
|
GlucoseValue.SourceSensor.DEXCOM_G6_G5_NATIVE_XDRIP
|
|
).any { it == glucoseValue.sourceSensor }
|
|
}
|
|
|
|
// cannot be inner class because of needed injection
|
|
class XdripSourceWorker(
|
|
context: Context,
|
|
params: WorkerParameters
|
|
) : LoggingWorker(context, params, Dispatchers.IO) {
|
|
|
|
@Inject lateinit var xdripSourcePlugin: XdripSourcePlugin
|
|
@Inject lateinit var repository: AppRepository
|
|
@Inject lateinit var dataWorkerStorage: DataWorkerStorage
|
|
|
|
override suspend fun doWorkAndLog(): Result {
|
|
var ret = Result.success()
|
|
|
|
if (!xdripSourcePlugin.isEnabled()) return Result.success(workDataOf("Result" to "Plugin not enabled"))
|
|
val bundle = dataWorkerStorage.pickupBundle(inputData.getLong(DataWorkerStorage.STORE_KEY, -1))
|
|
?: return Result.failure(workDataOf("Error" to "missing input data"))
|
|
|
|
aapsLogger.debug(LTag.BGSOURCE, "Received xDrip data: $bundle")
|
|
val glucoseValues = mutableListOf<TransactionGlucoseValue>()
|
|
glucoseValues += TransactionGlucoseValue(
|
|
timestamp = bundle.getLong(Intents.EXTRA_TIMESTAMP, 0),
|
|
value = bundle.getDouble(Intents.EXTRA_BG_ESTIMATE, 0.0),
|
|
raw = bundle.getDouble(Intents.EXTRA_RAW, 0.0),
|
|
noise = null,
|
|
trendArrow = GlucoseValue.TrendArrow.fromString(bundle.getString(Intents.EXTRA_BG_SLOPE_NAME)),
|
|
sourceSensor = GlucoseValue.SourceSensor.fromString(
|
|
bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION)
|
|
?: ""
|
|
)
|
|
)
|
|
repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null))
|
|
.doOnError {
|
|
aapsLogger.error(LTag.DATABASE, "Error while saving values from Xdrip", it)
|
|
ret = Result.failure(workDataOf("Error" to it.toString()))
|
|
}
|
|
.blockingGet()
|
|
.also { savedValues ->
|
|
savedValues.all().forEach {
|
|
xdripSourcePlugin.detectSource(it)
|
|
aapsLogger.debug(LTag.DATABASE, "Inserted bg $it")
|
|
}
|
|
}
|
|
xdripSourcePlugin.sensorBatteryLevel = bundle.getInt(Intents.EXTRA_SENSOR_BATTERY, -1)
|
|
return ret
|
|
}
|
|
}
|
|
}
|