Merge branch 'meallink' into meallink_ValueWithUnit
# Conflicts: # app/src/main/java/info/nightscout/androidaps/dialogs/TreatmentDialog.kt
This commit is contained in:
commit
6c8b4dfab0
|
@ -85,7 +85,7 @@ open class AppModule {
|
||||||
@Binds fun bindImportExportPrefsInterface(importExportPrefs: ImportExportPrefs): ImportExportPrefsInterface
|
@Binds fun bindImportExportPrefsInterface(importExportPrefs: ImportExportPrefs): ImportExportPrefsInterface
|
||||||
@Binds fun bindIconsProviderInterface(iconsProvider: IconsProvider): IconsProviderInterface
|
@Binds fun bindIconsProviderInterface(iconsProvider: IconsProvider): IconsProviderInterface
|
||||||
@Binds fun bindLoopInterface(loopPlugin: LoopPlugin): LoopInterface
|
@Binds fun bindLoopInterface(loopPlugin: LoopPlugin): LoopInterface
|
||||||
@Binds fun bindIobCobCalculatorInterface(iobCobCalculatorPlugin: IobCobCalculatorPlugin): IobCobCalculatorInterface
|
@Binds fun bindIobCobCalculatorInterface(iobCobCalculatorPlugin: IobCobCalculatorPlugin): IobCobCalculator
|
||||||
@Binds fun bindSmsCommunicatorInterface(smsCommunicatorPlugin: SmsCommunicatorPlugin): SmsCommunicatorInterface
|
@Binds fun bindSmsCommunicatorInterface(smsCommunicatorPlugin: SmsCommunicatorPlugin): SmsCommunicatorInterface
|
||||||
@Binds fun bindUploadQueueAdminInterfaceToUploadQueue(uploadQueueAdminInterface: UploadQueueAdminInterface) : UploadQueueInterface
|
@Binds fun bindUploadQueueAdminInterfaceToUploadQueue(uploadQueueAdminInterface: UploadQueueAdminInterface) : UploadQueueInterface
|
||||||
@Binds fun bindDataSyncSelector(dataSyncSelectorImplementation: DataSyncSelectorImplementation): DataSyncSelector
|
@Binds fun bindDataSyncSelector(dataSyncSelectorImplementation: DataSyncSelectorImplementation): DataSyncSelector
|
||||||
|
|
|
@ -157,11 +157,13 @@ class TreatmentDialog : DialogFragmentWithDate() {
|
||||||
ValueWithUnit(R.string.record, Units.R_String),
|
ValueWithUnit(R.string.record, Units.R_String),
|
||||||
ValueWithUnit(insulinAfterConstraints, Units.U, insulin != 0.0),
|
ValueWithUnit(insulinAfterConstraints, Units.U, insulin != 0.0),
|
||||||
ValueWithUnit(carbsAfterConstraints, Units.G, carbs != 0))
|
ValueWithUnit(carbsAfterConstraints, Units.G, carbs != 0))
|
||||||
|
if (detailedBolusInfo.insulin > 0)
|
||||||
disposable += repository.runTransactionForResult(detailedBolusInfo.insertBolusTransaction())
|
disposable += repository.runTransactionForResult(detailedBolusInfo.insertBolusTransaction())
|
||||||
.subscribe(
|
.subscribe(
|
||||||
{ result -> result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted bolus $it") } },
|
{ result -> result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted bolus $it") } },
|
||||||
{ aapsLogger.error(LTag.DATABASE, "Error while saving bolus", it) }
|
{ aapsLogger.error(LTag.DATABASE, "Error while saving bolus", it) }
|
||||||
)
|
)
|
||||||
|
if (detailedBolusInfo.carbs > 0)
|
||||||
disposable += repository.runTransactionForResult(detailedBolusInfo.insertCarbsTransaction())
|
disposable += repository.runTransactionForResult(detailedBolusInfo.insertCarbsTransaction())
|
||||||
.subscribe(
|
.subscribe(
|
||||||
{ result -> result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted carbs $it") } },
|
{ result -> result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted carbs $it") } },
|
||||||
|
@ -176,8 +178,7 @@ class TreatmentDialog : DialogFragmentWithDate() {
|
||||||
uel.log(action,
|
uel.log(action,
|
||||||
ValueWithUnit(Sources.TreatmentDialog),
|
ValueWithUnit(Sources.TreatmentDialog),
|
||||||
ValueWithUnit(insulin, Units.U, insulin != 0.0),
|
ValueWithUnit(insulin, Units.U, insulin != 0.0),
|
||||||
ValueWithUnit(carbs, Units.G, carbs != 0)
|
ValueWithUnit(carbs, Units.G, carbs != 0))
|
||||||
)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,13 +25,13 @@ import info.nightscout.androidaps.databinding.DialogWizardBinding
|
||||||
import info.nightscout.androidaps.events.EventAutosensCalculationFinished
|
import info.nightscout.androidaps.events.EventAutosensCalculationFinished
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
||||||
import info.nightscout.androidaps.interfaces.Constraint
|
import info.nightscout.androidaps.interfaces.Constraint
|
||||||
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
import info.nightscout.androidaps.interfaces.TreatmentsInterface
|
import info.nightscout.androidaps.interfaces.TreatmentsInterface
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.logging.LTag
|
import info.nightscout.androidaps.logging.LTag
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.DecimalFormatter
|
import info.nightscout.androidaps.utils.DecimalFormatter
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
|
@ -62,7 +62,7 @@ class WizardDialog : DaggerDialogFragment() {
|
||||||
@Inject lateinit var resourceHelper: ResourceHelper
|
@Inject lateinit var resourceHelper: ResourceHelper
|
||||||
@Inject lateinit var profileFunction: ProfileFunction
|
@Inject lateinit var profileFunction: ProfileFunction
|
||||||
@Inject lateinit var activePlugin: ActivePluginProvider
|
@Inject lateinit var activePlugin: ActivePluginProvider
|
||||||
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
|
@Inject lateinit var iobCobCalculator: IobCobCalculator
|
||||||
@Inject lateinit var repository: AppRepository
|
@Inject lateinit var repository: AppRepository
|
||||||
@Inject lateinit var treatmentsPlugin: TreatmentsInterface
|
@Inject lateinit var treatmentsPlugin: TreatmentsInterface
|
||||||
@Inject lateinit var dateUtil: DateUtil
|
@Inject lateinit var dateUtil: DateUtil
|
||||||
|
@ -269,19 +269,11 @@ class WizardDialog : DaggerDialogFragment() {
|
||||||
binding.bgInput.setStep(0.1)
|
binding.bgInput.setStep(0.1)
|
||||||
|
|
||||||
// Set BG if not old
|
// Set BG if not old
|
||||||
val lastBg = iobCobCalculatorPlugin.actualBg()
|
binding.bgInput.value = iobCobCalculator.actualBg()?.valueToUnits(units) ?: 0.0
|
||||||
|
|
||||||
if (lastBg != null) {
|
|
||||||
binding.bgInput.value = lastBg.valueToUnits(units)
|
|
||||||
} else {
|
|
||||||
binding.bgInput.value = 0.0
|
|
||||||
}
|
|
||||||
binding.ttcheckbox.isEnabled = repository.getTemporaryTargetActiveAt(dateUtil._now()).blockingGet() is ValueWrapper.Existing
|
binding.ttcheckbox.isEnabled = repository.getTemporaryTargetActiveAt(dateUtil._now()).blockingGet() is ValueWrapper.Existing
|
||||||
|
|
||||||
// IOB calculation
|
// IOB calculation
|
||||||
treatmentsPlugin.updateTotalIOBTreatments()
|
val bolusIob = iobCobCalculator.calculateIobFromBolus().round()
|
||||||
val bolusIob = treatmentsPlugin.lastCalculationTreatments.round()
|
|
||||||
treatmentsPlugin.updateTotalIOBTempBasals()
|
|
||||||
val basalIob = treatmentsPlugin.lastCalculationTempBasals.round()
|
val basalIob = treatmentsPlugin.lastCalculationTempBasals.round()
|
||||||
|
|
||||||
binding.bolusiobinsulin.text = resourceHelper.gs(R.string.formatinsulinunits, -bolusIob.iob)
|
binding.bolusiobinsulin.text = resourceHelper.gs(R.string.formatinsulinunits, -bolusIob.iob)
|
||||||
|
@ -324,7 +316,7 @@ class WizardDialog : DaggerDialogFragment() {
|
||||||
// COB
|
// COB
|
||||||
var cob = 0.0
|
var cob = 0.0
|
||||||
if (binding.cobcheckbox.isChecked) {
|
if (binding.cobcheckbox.isChecked) {
|
||||||
val cobInfo = iobCobCalculatorPlugin.getCobInfo(false, "Wizard COB")
|
val cobInfo = iobCobCalculator.getCobInfo(false, "Wizard COB")
|
||||||
cobInfo.displayCob?.let { cob = it }
|
cobInfo.displayCob?.let { cob = it }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -206,7 +206,6 @@ class DetermineBasalAdapterAMAJS internal constructor(scriptReader: ScriptReader
|
||||||
this.glucoseStatus.put("long_avgdelta", glucoseStatus.longAvgDelta)
|
this.glucoseStatus.put("long_avgdelta", glucoseStatus.longAvgDelta)
|
||||||
this.mealData = JSONObject()
|
this.mealData = JSONObject()
|
||||||
this.mealData.put("carbs", mealData.carbs)
|
this.mealData.put("carbs", mealData.carbs)
|
||||||
this.mealData.put("boluses", mealData.boluses)
|
|
||||||
this.mealData.put("mealCOB", mealData.mealCOB)
|
this.mealData.put("mealCOB", mealData.mealCOB)
|
||||||
if (constraintChecker.isAutosensModeEnabled().value()) {
|
if (constraintChecker.isAutosensModeEnabled().value()) {
|
||||||
autosensData.put("ratio", autosensDataRatio)
|
autosensData.put("ratio", autosensDataRatio)
|
||||||
|
|
|
@ -15,9 +15,7 @@ import info.nightscout.androidaps.plugins.aps.loop.ScriptReader
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
import info.nightscout.androidaps.utils.HardLimits
|
import info.nightscout.androidaps.utils.HardLimits
|
||||||
|
@ -40,7 +38,7 @@ open class OpenAPSAMAPlugin @Inject constructor(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val activePlugin: ActivePluginProvider,
|
private val activePlugin: ActivePluginProvider,
|
||||||
private val treatmentsPlugin: TreatmentsInterface,
|
private val treatmentsPlugin: TreatmentsInterface,
|
||||||
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin,
|
private val iobCobCalculator: IobCobCalculator,
|
||||||
private val hardLimits: HardLimits,
|
private val hardLimits: HardLimits,
|
||||||
private val profiler: Profiler,
|
private val profiler: Profiler,
|
||||||
private val fabricPrivacy: FabricPrivacy,
|
private val fabricPrivacy: FabricPrivacy,
|
||||||
|
@ -107,10 +105,10 @@ open class OpenAPSAMAPlugin @Inject constructor(
|
||||||
}.value()
|
}.value()
|
||||||
var start = System.currentTimeMillis()
|
var start = System.currentTimeMillis()
|
||||||
var startPart = System.currentTimeMillis()
|
var startPart = System.currentTimeMillis()
|
||||||
val iobArray = iobCobCalculatorPlugin.calculateIobArrayInDia(profile)
|
val iobArray = iobCobCalculator.calculateIobArrayInDia(profile)
|
||||||
profiler.log(LTag.APS, "calculateIobArrayInDia()", startPart)
|
profiler.log(LTag.APS, "calculateIobArrayInDia()", startPart)
|
||||||
startPart = System.currentTimeMillis()
|
startPart = System.currentTimeMillis()
|
||||||
val mealData = iobCobCalculatorPlugin.mealData
|
val mealData = iobCobCalculator.mealData
|
||||||
profiler.log(LTag.APS, "getMealData()", startPart)
|
profiler.log(LTag.APS, "getMealData()", startPart)
|
||||||
val maxIob = constraintChecker.getMaxIOBAllowed().also { maxIOBAllowedConstraint ->
|
val maxIob = constraintChecker.getMaxIOBAllowed().also { maxIOBAllowedConstraint ->
|
||||||
inputConstraints.copyReasons(maxIOBAllowedConstraint)
|
inputConstraints.copyReasons(maxIOBAllowedConstraint)
|
||||||
|
@ -133,7 +131,7 @@ open class OpenAPSAMAPlugin @Inject constructor(
|
||||||
if (!hardLimits.checkOnlyHardLimits(pump.baseBasalRate, R.string.current_basal_value, 0.01, hardLimits.maxBasal())) return
|
if (!hardLimits.checkOnlyHardLimits(pump.baseBasalRate, R.string.current_basal_value, 0.01, hardLimits.maxBasal())) return
|
||||||
startPart = System.currentTimeMillis()
|
startPart = System.currentTimeMillis()
|
||||||
if (constraintChecker.isAutosensModeEnabled().value()) {
|
if (constraintChecker.isAutosensModeEnabled().value()) {
|
||||||
val autosensData = iobCobCalculatorPlugin.getLastAutosensDataSynchronized("OpenAPSPlugin")
|
val autosensData = iobCobCalculator.getLastAutosensDataSynchronized("OpenAPSPlugin")
|
||||||
if (autosensData == null) {
|
if (autosensData == null) {
|
||||||
rxBus.send(EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openaps_noasdata)))
|
rxBus.send(EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openaps_noasdata)))
|
||||||
return
|
return
|
||||||
|
|
|
@ -249,7 +249,6 @@ class DetermineBasalAdapterSMBJS internal constructor(private val scriptReader:
|
||||||
mGlucoseStatus.put("long_avgdelta", glucoseStatus.longAvgDelta)
|
mGlucoseStatus.put("long_avgdelta", glucoseStatus.longAvgDelta)
|
||||||
mGlucoseStatus.put("date", glucoseStatus.date)
|
mGlucoseStatus.put("date", glucoseStatus.date)
|
||||||
this.mealData.put("carbs", mealData.carbs)
|
this.mealData.put("carbs", mealData.carbs)
|
||||||
this.mealData.put("boluses", mealData.boluses)
|
|
||||||
this.mealData.put("mealCOB", mealData.mealCOB)
|
this.mealData.put("mealCOB", mealData.mealCOB)
|
||||||
this.mealData.put("slopeFromMaxDeviation", mealData.slopeFromMaxDeviation)
|
this.mealData.put("slopeFromMaxDeviation", mealData.slopeFromMaxDeviation)
|
||||||
this.mealData.put("slopeFromMinDeviation", mealData.slopeFromMinDeviation)
|
this.mealData.put("slopeFromMinDeviation", mealData.slopeFromMinDeviation)
|
||||||
|
|
|
@ -17,9 +17,7 @@ import info.nightscout.androidaps.plugins.aps.loop.ScriptReader
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.HardLimits
|
import info.nightscout.androidaps.utils.HardLimits
|
||||||
import info.nightscout.androidaps.utils.Profiler
|
import info.nightscout.androidaps.utils.Profiler
|
||||||
|
@ -41,7 +39,7 @@ open class OpenAPSSMBPlugin @Inject constructor(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val activePlugin: ActivePluginProvider,
|
private val activePlugin: ActivePluginProvider,
|
||||||
private val treatmentsPlugin: TreatmentsInterface,
|
private val treatmentsPlugin: TreatmentsInterface,
|
||||||
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin,
|
private val iobCobCalculator: IobCobCalculator,
|
||||||
private val hardLimits: HardLimits,
|
private val hardLimits: HardLimits,
|
||||||
private val profiler: Profiler,
|
private val profiler: Profiler,
|
||||||
private val sp: SP,
|
private val sp: SP,
|
||||||
|
@ -139,7 +137,7 @@ open class OpenAPSSMBPlugin @Inject constructor(
|
||||||
if (!hardLimits.checkOnlyHardLimits(pump.baseBasalRate, R.string.current_basal_value, 0.01, hardLimits.maxBasal())) return
|
if (!hardLimits.checkOnlyHardLimits(pump.baseBasalRate, R.string.current_basal_value, 0.01, hardLimits.maxBasal())) return
|
||||||
startPart = System.currentTimeMillis()
|
startPart = System.currentTimeMillis()
|
||||||
if (constraintChecker.isAutosensModeEnabled().value()) {
|
if (constraintChecker.isAutosensModeEnabled().value()) {
|
||||||
val autosensData = iobCobCalculatorPlugin.getLastAutosensDataSynchronized("OpenAPSPlugin")
|
val autosensData = iobCobCalculator.getLastAutosensDataSynchronized("OpenAPSPlugin")
|
||||||
if (autosensData == null) {
|
if (autosensData == null) {
|
||||||
rxBus.send(EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openaps_noasdata)))
|
rxBus.send(EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openaps_noasdata)))
|
||||||
return
|
return
|
||||||
|
@ -148,7 +146,7 @@ open class OpenAPSSMBPlugin @Inject constructor(
|
||||||
} else {
|
} else {
|
||||||
lastAutosensResult.sensResult = "autosens disabled"
|
lastAutosensResult.sensResult = "autosens disabled"
|
||||||
}
|
}
|
||||||
val iobArray = iobCobCalculatorPlugin.calculateIobArrayForSMB(lastAutosensResult, SMBDefaults.exercise_mode, SMBDefaults.half_basal_exercise_target, isTempTarget)
|
val iobArray = iobCobCalculator.calculateIobArrayForSMB(lastAutosensResult, SMBDefaults.exercise_mode, SMBDefaults.half_basal_exercise_target, isTempTarget)
|
||||||
profiler.log(LTag.APS, "calculateIobArrayInDia()", startPart)
|
profiler.log(LTag.APS, "calculateIobArrayInDia()", startPart)
|
||||||
startPart = System.currentTimeMillis()
|
startPart = System.currentTimeMillis()
|
||||||
val smbAllowed = Constraint(!tempBasalFallback).also {
|
val smbAllowed = Constraint(!tempBasalFallback).also {
|
||||||
|
@ -172,7 +170,7 @@ open class OpenAPSSMBPlugin @Inject constructor(
|
||||||
activePlugin.activePump.baseBasalRate,
|
activePlugin.activePump.baseBasalRate,
|
||||||
iobArray,
|
iobArray,
|
||||||
glucoseStatus,
|
glucoseStatus,
|
||||||
iobCobCalculatorPlugin.mealData,
|
iobCobCalculator.mealData,
|
||||||
lastAutosensResult.ratio,
|
lastAutosensResult.ratio,
|
||||||
isTempTarget,
|
isTempTarget,
|
||||||
smbAllowed.value(),
|
smbAllowed.value(),
|
||||||
|
|
|
@ -9,11 +9,7 @@ import info.nightscout.androidaps.Config
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.data.IobTotal
|
import info.nightscout.androidaps.data.IobTotal
|
||||||
import info.nightscout.androidaps.events.*
|
import info.nightscout.androidaps.events.*
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.*
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginType
|
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.logging.LTag
|
import info.nightscout.androidaps.logging.LTag
|
||||||
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui
|
import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui
|
||||||
|
@ -22,7 +18,6 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus
|
import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress
|
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
|
||||||
import info.nightscout.androidaps.receivers.ReceiverStatusStore
|
import info.nightscout.androidaps.receivers.ReceiverStatusStore
|
||||||
import info.nightscout.androidaps.services.Intents
|
import info.nightscout.androidaps.services.Intents
|
||||||
import info.nightscout.androidaps.utils.DefaultValueHelper
|
import info.nightscout.androidaps.utils.DefaultValueHelper
|
||||||
|
@ -42,7 +37,7 @@ class DataBroadcastPlugin @Inject constructor(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val fabricPrivacy: FabricPrivacy,
|
private val fabricPrivacy: FabricPrivacy,
|
||||||
private val rxBus: RxBusWrapper,
|
private val rxBus: RxBusWrapper,
|
||||||
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin,
|
private val iobCobCalculator: IobCobCalculator,
|
||||||
private val profileFunction: ProfileFunction,
|
private val profileFunction: ProfileFunction,
|
||||||
private val defaultValueHelper: DefaultValueHelper,
|
private val defaultValueHelper: DefaultValueHelper,
|
||||||
private val nsDeviceStatus: NSDeviceStatus,
|
private val nsDeviceStatus: NSDeviceStatus,
|
||||||
|
@ -121,7 +116,7 @@ class DataBroadcastPlugin @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun bgStatus(bundle: Bundle) {
|
private fun bgStatus(bundle: Bundle) {
|
||||||
val lastBG = iobCobCalculatorPlugin.lastBg() ?: return
|
val lastBG = iobCobCalculator.lastBg() ?: return
|
||||||
val glucoseStatus = glucoseStatusProvider.glucoseStatusData ?: return
|
val glucoseStatus = glucoseStatusProvider.glucoseStatusData ?: return
|
||||||
|
|
||||||
bundle.putDouble("glucoseMgdl", lastBG.value) // last BG in mgdl
|
bundle.putDouble("glucoseMgdl", lastBG.value) // last BG in mgdl
|
||||||
|
@ -136,15 +131,13 @@ class DataBroadcastPlugin @Inject constructor(
|
||||||
|
|
||||||
private fun iobCob(bundle: Bundle) {
|
private fun iobCob(bundle: Bundle) {
|
||||||
profileFunction.getProfile() ?: return
|
profileFunction.getProfile() ?: return
|
||||||
activePlugin.activeTreatments.updateTotalIOBTreatments()
|
val bolusIob: IobTotal = iobCobCalculator.calculateIobFromBolus().round()
|
||||||
val bolusIob: IobTotal = activePlugin.activeTreatments.lastCalculationTreatments.round()
|
|
||||||
activePlugin.activeTreatments.updateTotalIOBTempBasals()
|
|
||||||
val basalIob: IobTotal = activePlugin.activeTreatments.lastCalculationTempBasals.round()
|
val basalIob: IobTotal = activePlugin.activeTreatments.lastCalculationTempBasals.round()
|
||||||
bundle.putDouble("bolusIob", bolusIob.iob)
|
bundle.putDouble("bolusIob", bolusIob.iob)
|
||||||
bundle.putDouble("basalIob", basalIob.basaliob)
|
bundle.putDouble("basalIob", basalIob.basaliob)
|
||||||
bundle.putDouble("iob", bolusIob.iob + basalIob.basaliob) // total IOB
|
bundle.putDouble("iob", bolusIob.iob + basalIob.basaliob) // total IOB
|
||||||
|
|
||||||
val cob = iobCobCalculatorPlugin.getCobInfo(false, "broadcast")
|
val cob = iobCobCalculator.getCobInfo(false, "broadcast")
|
||||||
bundle.putDouble("cob", cob.displayCob ?: -1.0) // COB [g] or -1 if N/A
|
bundle.putDouble("cob", cob.displayCob ?: -1.0) // COB [g] or -1 if N/A
|
||||||
bundle.putDouble("futureCarbs", cob.futureCarbs) // future scheduled carbs
|
bundle.putDouble("futureCarbs", cob.futureCarbs) // future scheduled carbs
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,7 +100,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
@Inject lateinit var configBuilderPlugin: ConfigBuilderPlugin
|
@Inject lateinit var configBuilderPlugin: ConfigBuilderPlugin
|
||||||
@Inject lateinit var activePlugin: ActivePluginProvider
|
@Inject lateinit var activePlugin: ActivePluginProvider
|
||||||
@Inject lateinit var treatmentsPlugin: TreatmentsPlugin
|
@Inject lateinit var treatmentsPlugin: TreatmentsPlugin
|
||||||
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
|
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculator
|
||||||
@Inject lateinit var dexcomPlugin: DexcomPlugin
|
@Inject lateinit var dexcomPlugin: DexcomPlugin
|
||||||
@Inject lateinit var dexcomMediator: DexcomPlugin.DexcomMediator
|
@Inject lateinit var dexcomMediator: DexcomPlugin.DexcomMediator
|
||||||
@Inject lateinit var xdripPlugin: XdripPlugin
|
@Inject lateinit var xdripPlugin: XdripPlugin
|
||||||
|
@ -749,9 +749,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
processButtonsVisibility()
|
processButtonsVisibility()
|
||||||
|
|
||||||
// iob
|
// iob
|
||||||
treatmentsPlugin.updateTotalIOBTreatments()
|
val bolusIob = iobCobCalculatorPlugin.calculateIobFromBolus().round()
|
||||||
treatmentsPlugin.updateTotalIOBTempBasals()
|
|
||||||
val bolusIob = treatmentsPlugin.lastCalculationTreatments.round()
|
|
||||||
val basalIob = treatmentsPlugin.lastCalculationTempBasals.round()
|
val basalIob = treatmentsPlugin.lastCalculationTempBasals.round()
|
||||||
binding.infoLayout.iob.text = resourceHelper.gs(R.string.formatinsulinunits, bolusIob.iob + basalIob.basaliob)
|
binding.infoLayout.iob.text = resourceHelper.gs(R.string.formatinsulinunits, bolusIob.iob + basalIob.basaliob)
|
||||||
|
|
||||||
|
|
|
@ -11,27 +11,22 @@ import com.jjoe64.graphview.series.Series
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.Constants
|
import info.nightscout.androidaps.Constants
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.data.GlucoseValueDataPoint
|
import info.nightscout.androidaps.data.*
|
||||||
import info.nightscout.androidaps.data.IobTotal
|
|
||||||
import info.nightscout.androidaps.data.Profile
|
|
||||||
import info.nightscout.androidaps.data.TherapyEventDataPoint
|
|
||||||
import info.nightscout.androidaps.database.AppRepository
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.database.ValueWrapper
|
import info.nightscout.androidaps.database.ValueWrapper
|
||||||
|
import info.nightscout.androidaps.database.entities.Bolus
|
||||||
import info.nightscout.androidaps.database.entities.GlucoseValue
|
import info.nightscout.androidaps.database.entities.GlucoseValue
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.*
|
||||||
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
|
|
||||||
import info.nightscout.androidaps.interfaces.LoopInterface
|
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
|
||||||
import info.nightscout.androidaps.interfaces.TreatmentsInterface
|
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.logging.LTag
|
import info.nightscout.androidaps.logging.LTag
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.SMBDefaults
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.SMBDefaults
|
||||||
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.*
|
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.*
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.DecimalFormatter
|
import info.nightscout.androidaps.utils.DecimalFormatter
|
||||||
|
import info.nightscout.androidaps.utils.DefaultValueHelper
|
||||||
import info.nightscout.androidaps.utils.Round
|
import info.nightscout.androidaps.utils.Round
|
||||||
|
import info.nightscout.androidaps.utils.T
|
||||||
import info.nightscout.androidaps.utils.extensions.target
|
import info.nightscout.androidaps.utils.extensions.target
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
@ -43,7 +38,7 @@ import kotlin.math.min
|
||||||
class GraphData(
|
class GraphData(
|
||||||
private val injector: HasAndroidInjector,
|
private val injector: HasAndroidInjector,
|
||||||
private val graph: GraphView,
|
private val graph: GraphView,
|
||||||
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin,
|
private val iobCobCalculator: IobCobCalculator,
|
||||||
private val treatmentsPlugin: TreatmentsInterface
|
private val treatmentsPlugin: TreatmentsInterface
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
@ -55,6 +50,7 @@ class GraphData(
|
||||||
@Inject lateinit var databaseHelper: DatabaseHelperInterface
|
@Inject lateinit var databaseHelper: DatabaseHelperInterface
|
||||||
@Inject lateinit var repository: AppRepository
|
@Inject lateinit var repository: AppRepository
|
||||||
@Inject lateinit var dateUtil: DateUtil
|
@Inject lateinit var dateUtil: DateUtil
|
||||||
|
@Inject lateinit var defaultValueHelper: DefaultValueHelper
|
||||||
|
|
||||||
var maxY = Double.MIN_VALUE
|
var maxY = Double.MIN_VALUE
|
||||||
private var minY = Double.MAX_VALUE
|
private var minY = Double.MAX_VALUE
|
||||||
|
@ -70,7 +66,7 @@ class GraphData(
|
||||||
@Suppress("UNUSED_PARAMETER")
|
@Suppress("UNUSED_PARAMETER")
|
||||||
fun addBgReadings(fromTime: Long, toTime: Long, lowLine: Double, highLine: Double, predictions: MutableList<GlucoseValueDataPoint>?) {
|
fun addBgReadings(fromTime: Long, toTime: Long, lowLine: Double, highLine: Double, predictions: MutableList<GlucoseValueDataPoint>?) {
|
||||||
var maxBgValue = Double.MIN_VALUE
|
var maxBgValue = Double.MIN_VALUE
|
||||||
bgReadingsArray = iobCobCalculatorPlugin.bgReadings
|
bgReadingsArray = iobCobCalculator.bgReadings
|
||||||
if (bgReadingsArray?.isEmpty() != false) {
|
if (bgReadingsArray?.isEmpty() != false) {
|
||||||
aapsLogger.debug("No BG data.")
|
aapsLogger.debug("No BG data.")
|
||||||
maxY = if (units == Constants.MGDL) 180.0 else 10.0
|
maxY = if (units == Constants.MGDL) 180.0 else 10.0
|
||||||
|
@ -134,7 +130,7 @@ class GraphData(
|
||||||
time += 60 * 1000L
|
time += 60 * 1000L
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val basalData = iobCobCalculatorPlugin.getBasalData(profile, time)
|
val basalData = iobCobCalculator.getBasalData(profile, time)
|
||||||
val baseBasalValue = basalData.basal
|
val baseBasalValue = basalData.basal
|
||||||
var absoluteLineValue = baseBasalValue
|
var absoluteLineValue = baseBasalValue
|
||||||
var tempBasalValue = 0.0
|
var tempBasalValue = 0.0
|
||||||
|
@ -244,9 +240,15 @@ class GraphData(
|
||||||
|
|
||||||
fun addTreatments(fromTime: Long, endTime: Long) {
|
fun addTreatments(fromTime: Long, endTime: Long) {
|
||||||
val filteredTreatments: MutableList<DataPointWithLabelInterface> = ArrayList()
|
val filteredTreatments: MutableList<DataPointWithLabelInterface> = ArrayList()
|
||||||
treatmentsPlugin.treatmentsFromHistory
|
repository.getBolusesIncludingInvalidFromTimeToTime(fromTime, endTime, true).blockingGet()
|
||||||
.filterTimeframe(fromTime, endTime)
|
.map { BolusDataPoint(it, resourceHelper, activePlugin, defaultValueHelper) }
|
||||||
.filter { !it.isSMB || it.isValid }
|
.filter { it.data.type != Bolus.Type.SMB || it.data.isValid }
|
||||||
|
.forEach {
|
||||||
|
it.y = getNearestBg(it.x.toLong())
|
||||||
|
filteredTreatments.add(it)
|
||||||
|
}
|
||||||
|
repository.getCarbsIncludingInvalidFromTimeToTime(fromTime, endTime, true).blockingGet()
|
||||||
|
.map { CarbsDataPoint(it, resourceHelper) }
|
||||||
.forEach {
|
.forEach {
|
||||||
it.y = getNearestBg(it.x.toLong())
|
it.y = getNearestBg(it.x.toLong())
|
||||||
filteredTreatments.add(it)
|
filteredTreatments.add(it)
|
||||||
|
@ -270,7 +272,7 @@ class GraphData(
|
||||||
|
|
||||||
// Careportal
|
// Careportal
|
||||||
// databaseHelper.getCareportalEventsFromTime(fromTime - 6 * 60 * 60 * 1000, true)
|
// databaseHelper.getCareportalEventsFromTime(fromTime - 6 * 60 * 60 * 1000, true)
|
||||||
repository.compatGetTherapyEventDataFromToTime(fromTime - 6 * 60 * 60 * 1000, endTime).blockingGet()
|
repository.compatGetTherapyEventDataFromToTime(fromTime - T.hours(6).msecs(), endTime).blockingGet()
|
||||||
.map { TherapyEventDataPoint(injector, it) }
|
.map { TherapyEventDataPoint(injector, it) }
|
||||||
.filterTimeframe(fromTime, endTime)
|
.filterTimeframe(fromTime, endTime)
|
||||||
.forEach {
|
.forEach {
|
||||||
|
@ -312,7 +314,7 @@ class GraphData(
|
||||||
time += 5 * 60 * 1000L
|
time += 5 * 60 * 1000L
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
total = iobCobCalculatorPlugin.calculateFromTreatmentsAndTempsSynchronized(time, profile)
|
total = iobCobCalculator.calculateFromTreatmentsAndTempsSynchronized(time, profile)
|
||||||
val act: Double = total.activity
|
val act: Double = total.activity
|
||||||
if (time <= now) actArrayHist.add(ScaledDataPoint(time, act, actScale)) else actArrayPrediction.add(ScaledDataPoint(time, act, actScale))
|
if (time <= now) actArrayHist.add(ScaledDataPoint(time, act, actScale)) else actArrayPrediction.add(ScaledDataPoint(time, act, actScale))
|
||||||
maxIAValue = max(maxIAValue, abs(act))
|
maxIAValue = max(maxIAValue, abs(act))
|
||||||
|
@ -353,10 +355,10 @@ class GraphData(
|
||||||
time += 5 * 60 * 1000L
|
time += 5 * 60 * 1000L
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val deviation = if (devBgiScale) iobCobCalculatorPlugin.getAutosensData(time)?.deviation
|
val deviation = if (devBgiScale) iobCobCalculator.getAutosensData(time)?.deviation
|
||||||
?: 0.0 else 0.0
|
?: 0.0 else 0.0
|
||||||
|
|
||||||
total = iobCobCalculatorPlugin.calculateFromTreatmentsAndTempsSynchronized(time, profile)
|
total = iobCobCalculator.calculateFromTreatmentsAndTempsSynchronized(time, profile)
|
||||||
val bgi: Double = total.activity * profile.getIsfMgdl(time) * 5.0
|
val bgi: Double = total.activity * profile.getIsfMgdl(time) * 5.0
|
||||||
if (time <= now) bgiArrayHist.add(ScaledDataPoint(time, bgi, bgiScale)) else bgiArrayPrediction.add(ScaledDataPoint(time, bgi, bgiScale))
|
if (time <= now) bgiArrayHist.add(ScaledDataPoint(time, bgi, bgiScale)) else bgiArrayPrediction.add(ScaledDataPoint(time, bgi, bgiScale))
|
||||||
maxBGIValue = max(maxBGIValue, max(abs(bgi), deviation))
|
maxBGIValue = max(maxBGIValue, max(abs(bgi), deviation))
|
||||||
|
@ -395,8 +397,8 @@ class GraphData(
|
||||||
var iob = 0.0
|
var iob = 0.0
|
||||||
var absIob = 0.0
|
var absIob = 0.0
|
||||||
if (profile != null) {
|
if (profile != null) {
|
||||||
iob = iobCobCalculatorPlugin.calculateFromTreatmentsAndTempsSynchronized(time, profile).iob
|
iob = iobCobCalculator.calculateFromTreatmentsAndTempsSynchronized(time, profile).iob
|
||||||
if (absScale) absIob = iobCobCalculatorPlugin.calculateAbsInsulinFromTreatmentsAndTempsSynchronized(time).iob
|
if (absScale) absIob = iobCobCalculator.calculateAbsInsulinFromTreatmentsAndTempsSynchronized(time).iob
|
||||||
}
|
}
|
||||||
if (abs(lastIob - iob) > 0.02) {
|
if (abs(lastIob - iob) > 0.02) {
|
||||||
if (abs(lastIob - iob) > 0.2) iobArray.add(ScaledDataPoint(time, lastIob, iobScale))
|
if (abs(lastIob - iob) > 0.2) iobArray.add(ScaledDataPoint(time, lastIob, iobScale))
|
||||||
|
@ -413,25 +415,25 @@ class GraphData(
|
||||||
it.thickness = 3
|
it.thickness = 3
|
||||||
}
|
}
|
||||||
if (showPrediction) {
|
if (showPrediction) {
|
||||||
val autosensData = iobCobCalculatorPlugin.getLastAutosensDataSynchronized("GraphData")
|
val autosensData = iobCobCalculator.getLastAutosensDataSynchronized("GraphData")
|
||||||
val lastAutosensResult = autosensData?.autosensResult ?: AutosensResult()
|
val lastAutosensResult = autosensData?.autosensResult ?: AutosensResult()
|
||||||
val isTempTarget = repository.getTemporaryTargetActiveAt(dateUtil._now()).blockingGet() is ValueWrapper.Existing
|
val isTempTarget = repository.getTemporaryTargetActiveAt(dateUtil._now()).blockingGet() is ValueWrapper.Existing
|
||||||
val iobPrediction: MutableList<DataPointWithLabelInterface> = ArrayList()
|
val iobPrediction: MutableList<DataPointWithLabelInterface> = ArrayList()
|
||||||
val iobPredictionArray = iobCobCalculatorPlugin.calculateIobArrayForSMB(lastAutosensResult, SMBDefaults.exercise_mode, SMBDefaults.half_basal_exercise_target, isTempTarget)
|
val iobPredictionArray = iobCobCalculator.calculateIobArrayForSMB(lastAutosensResult, SMBDefaults.exercise_mode, SMBDefaults.half_basal_exercise_target, isTempTarget)
|
||||||
for (i in iobPredictionArray) {
|
for (i in iobPredictionArray) {
|
||||||
iobPrediction.add(i.setColor(resourceHelper.gc(R.color.iobPredAS)))
|
iobPrediction.add(i.setColor(resourceHelper.gc(R.color.iobPredAS)))
|
||||||
maxIobValueFound = max(maxIobValueFound, abs(i.iob))
|
maxIobValueFound = max(maxIobValueFound, abs(i.iob))
|
||||||
}
|
}
|
||||||
addSeries(PointsWithLabelGraphSeries(Array(iobPrediction.size) { i -> iobPrediction[i] }))
|
addSeries(PointsWithLabelGraphSeries(Array(iobPrediction.size) { i -> iobPrediction[i] }))
|
||||||
val iobPrediction2: MutableList<DataPointWithLabelInterface> = ArrayList()
|
val iobPrediction2: MutableList<DataPointWithLabelInterface> = ArrayList()
|
||||||
val iobPredictionArray2 = iobCobCalculatorPlugin.calculateIobArrayForSMB(AutosensResult(), SMBDefaults.exercise_mode, SMBDefaults.half_basal_exercise_target, isTempTarget)
|
val iobPredictionArray2 = iobCobCalculator.calculateIobArrayForSMB(AutosensResult(), SMBDefaults.exercise_mode, SMBDefaults.half_basal_exercise_target, isTempTarget)
|
||||||
for (i in iobPredictionArray2) {
|
for (i in iobPredictionArray2) {
|
||||||
iobPrediction2.add(i.setColor(resourceHelper.gc(R.color.iobPred)))
|
iobPrediction2.add(i.setColor(resourceHelper.gc(R.color.iobPred)))
|
||||||
maxIobValueFound = max(maxIobValueFound, abs(i.iob))
|
maxIobValueFound = max(maxIobValueFound, abs(i.iob))
|
||||||
}
|
}
|
||||||
addSeries(PointsWithLabelGraphSeries(Array(iobPrediction2.size) { i -> iobPrediction2[i] }))
|
addSeries(PointsWithLabelGraphSeries(Array(iobPrediction2.size) { i -> iobPrediction2[i] }))
|
||||||
aapsLogger.debug(LTag.AUTOSENS, "IOB prediction for AS=" + DecimalFormatter.to2Decimal(lastAutosensResult.ratio) + ": " + iobCobCalculatorPlugin.iobArrayToString(iobPredictionArray))
|
aapsLogger.debug(LTag.AUTOSENS, "IOB prediction for AS=" + DecimalFormatter.to2Decimal(lastAutosensResult.ratio) + ": " + iobCobCalculator.iobArrayToString(iobPredictionArray))
|
||||||
aapsLogger.debug(LTag.AUTOSENS, "IOB prediction for AS=" + DecimalFormatter.to2Decimal(1.0) + ": " + iobCobCalculatorPlugin.iobArrayToString(iobPredictionArray2))
|
aapsLogger.debug(LTag.AUTOSENS, "IOB prediction for AS=" + DecimalFormatter.to2Decimal(1.0) + ": " + iobCobCalculator.iobArrayToString(iobPredictionArray2))
|
||||||
}
|
}
|
||||||
if (useForScale) {
|
if (useForScale) {
|
||||||
maxY = maxIobValueFound
|
maxY = maxIobValueFound
|
||||||
|
@ -452,7 +454,7 @@ class GraphData(
|
||||||
while (time <= toTime) {
|
while (time <= toTime) {
|
||||||
val profile = profileFunction.getProfile(time)
|
val profile = profileFunction.getProfile(time)
|
||||||
var iob = 0.0
|
var iob = 0.0
|
||||||
if (profile != null) iob = iobCobCalculatorPlugin.calculateAbsInsulinFromTreatmentsAndTempsSynchronized(time).iob
|
if (profile != null) iob = iobCobCalculator.calculateAbsInsulinFromTreatmentsAndTempsSynchronized(time).iob
|
||||||
if (abs(lastIob - iob) > 0.02) {
|
if (abs(lastIob - iob) > 0.02) {
|
||||||
if (abs(lastIob - iob) > 0.2) iobArray.add(ScaledDataPoint(time, lastIob, iobScale))
|
if (abs(lastIob - iob) > 0.2) iobArray.add(ScaledDataPoint(time, lastIob, iobScale))
|
||||||
iobArray.add(ScaledDataPoint(time, iob, iobScale))
|
iobArray.add(ScaledDataPoint(time, iob, iobScale))
|
||||||
|
@ -484,7 +486,7 @@ class GraphData(
|
||||||
val cobScale = Scale()
|
val cobScale = Scale()
|
||||||
var time = fromTime
|
var time = fromTime
|
||||||
while (time <= toTime) {
|
while (time <= toTime) {
|
||||||
iobCobCalculatorPlugin.getAutosensData(time)?.let { autosensData ->
|
iobCobCalculator.getAutosensData(time)?.let { autosensData ->
|
||||||
val cob = autosensData.cob.toInt()
|
val cob = autosensData.cob.toInt()
|
||||||
if (cob != lastCob) {
|
if (cob != lastCob) {
|
||||||
if (autosensData.carbsFromBolus > 0) cobArray.add(ScaledDataPoint(time, lastCob.toDouble(), cobScale))
|
if (autosensData.carbsFromBolus > 0) cobArray.add(ScaledDataPoint(time, lastCob.toDouble(), cobScale))
|
||||||
|
@ -530,11 +532,11 @@ class GraphData(
|
||||||
// if align Dev Scale with BGI scale, then calculate BGI value, else bgi = 0.0
|
// if align Dev Scale with BGI scale, then calculate BGI value, else bgi = 0.0
|
||||||
val bgi: Double = if (devBgiScale) {
|
val bgi: Double = if (devBgiScale) {
|
||||||
val profile = profileFunction.getProfile(time)
|
val profile = profileFunction.getProfile(time)
|
||||||
total = iobCobCalculatorPlugin.calculateFromTreatmentsAndTempsSynchronized(time, profile)
|
total = iobCobCalculator.calculateFromTreatmentsAndTempsSynchronized(time, profile)
|
||||||
total.activity * (profile?.getIsfMgdl(time) ?: 0.0) * 5.0
|
total.activity * (profile?.getIsfMgdl(time) ?: 0.0) * 5.0
|
||||||
} else 0.0
|
} else 0.0
|
||||||
|
|
||||||
iobCobCalculatorPlugin.getAutosensData(time)?.let { autosensData ->
|
iobCobCalculator.getAutosensData(time)?.let { autosensData ->
|
||||||
var color = resourceHelper.gc(R.color.deviationblack) // "="
|
var color = resourceHelper.gc(R.color.deviationblack) // "="
|
||||||
if (autosensData.type == "" || autosensData.type == "non-meal") {
|
if (autosensData.type == "" || autosensData.type == "non-meal") {
|
||||||
if (autosensData.pastSensitivity == "C") color = resourceHelper.gc(R.color.deviationgrey)
|
if (autosensData.pastSensitivity == "C") color = resourceHelper.gc(R.color.deviationgrey)
|
||||||
|
@ -570,7 +572,7 @@ class GraphData(
|
||||||
val ratioScale = Scale()
|
val ratioScale = Scale()
|
||||||
var time = fromTime
|
var time = fromTime
|
||||||
while (time <= toTime) {
|
while (time <= toTime) {
|
||||||
iobCobCalculatorPlugin.getAutosensData(time)?.let { autosensData ->
|
iobCobCalculator.getAutosensData(time)?.let { autosensData ->
|
||||||
ratioArray.add(ScaledDataPoint(time, autosensData.autosensResult.ratio - 1, ratioScale))
|
ratioArray.add(ScaledDataPoint(time, autosensData.autosensResult.ratio - 1, ratioScale))
|
||||||
maxRatioValueFound = max(maxRatioValueFound, autosensData.autosensResult.ratio - 1)
|
maxRatioValueFound = max(maxRatioValueFound, autosensData.autosensResult.ratio - 1)
|
||||||
minRatioValueFound = min(minRatioValueFound, autosensData.autosensResult.ratio - 1)
|
minRatioValueFound = min(minRatioValueFound, autosensData.autosensResult.ratio - 1)
|
||||||
|
@ -600,7 +602,7 @@ class GraphData(
|
||||||
val dsMinScale = Scale()
|
val dsMinScale = Scale()
|
||||||
var time = fromTime
|
var time = fromTime
|
||||||
while (time <= toTime) {
|
while (time <= toTime) {
|
||||||
iobCobCalculatorPlugin.getAutosensData(time)?.let { autosensData ->
|
iobCobCalculator.getAutosensData(time)?.let { autosensData ->
|
||||||
dsMaxArray.add(ScaledDataPoint(time, autosensData.slopeFromMaxDeviation, dsMaxScale))
|
dsMaxArray.add(ScaledDataPoint(time, autosensData.slopeFromMaxDeviation, dsMaxScale))
|
||||||
dsMinArray.add(ScaledDataPoint(time, autosensData.slopeFromMinDeviation, dsMinScale))
|
dsMinArray.add(ScaledDataPoint(time, autosensData.slopeFromMinDeviation, dsMinScale))
|
||||||
maxFromMaxValueFound = max(maxFromMaxValueFound, abs(autosensData.slopeFromMaxDeviation))
|
maxFromMaxValueFound = max(maxFromMaxValueFound, abs(autosensData.slopeFromMaxDeviation))
|
||||||
|
|
|
@ -38,7 +38,7 @@ class PersistentNotificationPlugin @Inject constructor(
|
||||||
private val profileFunction: ProfileFunction,
|
private val profileFunction: ProfileFunction,
|
||||||
private val fabricPrivacy: FabricPrivacy,
|
private val fabricPrivacy: FabricPrivacy,
|
||||||
private val activePlugins: ActivePluginProvider,
|
private val activePlugins: ActivePluginProvider,
|
||||||
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin,
|
private val iobCobCalculator: IobCobCalculator,
|
||||||
private val rxBus: RxBusWrapper,
|
private val rxBus: RxBusWrapper,
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val notificationHolder: NotificationHolderInterface,
|
private val notificationHolder: NotificationHolderInterface,
|
||||||
|
@ -131,7 +131,7 @@ class PersistentNotificationPlugin @Inject constructor(
|
||||||
if (profileFunction.isProfileValid("Notification")) {
|
if (profileFunction.isProfileValid("Notification")) {
|
||||||
var line1aa: String
|
var line1aa: String
|
||||||
val units = profileFunction.getUnits()
|
val units = profileFunction.getUnits()
|
||||||
val lastBG = iobCobCalculatorPlugin.lastBg()
|
val lastBG = iobCobCalculator.lastBg()
|
||||||
val glucoseStatus = glucoseStatusProvider.glucoseStatusData
|
val glucoseStatus = glucoseStatusProvider.glucoseStatusData
|
||||||
if (lastBG != null) {
|
if (lastBG != null) {
|
||||||
line1aa = lastBG.valueToUnitsString(units)
|
line1aa = lastBG.valueToUnitsString(units)
|
||||||
|
@ -156,12 +156,10 @@ class PersistentNotificationPlugin @Inject constructor(
|
||||||
line1aa += " " + activeTemp.toStringShort() + "."
|
line1aa += " " + activeTemp.toStringShort() + "."
|
||||||
}
|
}
|
||||||
//IOB
|
//IOB
|
||||||
activePlugins.activeTreatments.updateTotalIOBTreatments()
|
val bolusIob = iobCobCalculator.calculateIobFromBolus().round()
|
||||||
activePlugins.activeTreatments.updateTotalIOBTempBasals()
|
|
||||||
val bolusIob = activePlugins.activeTreatments.lastCalculationTreatments.round()
|
|
||||||
val basalIob = activePlugins.activeTreatments.lastCalculationTempBasals.round()
|
val basalIob = activePlugins.activeTreatments.lastCalculationTempBasals.round()
|
||||||
line2 = resourceHelper.gs(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + resourceHelper.gs(R.string.cob) + ": " + iobCobCalculatorPlugin.getCobInfo(false, "PersistentNotificationPlugin").generateCOBString()
|
line2 = resourceHelper.gs(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + resourceHelper.gs(R.string.cob) + ": " + iobCobCalculator.getCobInfo(false, "PersistentNotificationPlugin").generateCOBString()
|
||||||
val line2aa = resourceHelper.gs(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U. " + resourceHelper.gs(R.string.cob) + ": " + iobCobCalculatorPlugin.getCobInfo(false, "PersistentNotificationPlugin").generateCOBString() + "."
|
val line2aa = resourceHelper.gs(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U. " + resourceHelper.gs(R.string.cob) + ": " + iobCobCalculator.getCobInfo(false, "PersistentNotificationPlugin").generateCOBString() + "."
|
||||||
line3 = DecimalFormatter.to2Decimal(pump.baseBasalRate) + " U/h"
|
line3 = DecimalFormatter.to2Decimal(pump.baseBasalRate) + " U/h"
|
||||||
var line3aa = DecimalFormatter.to2Decimal(pump.baseBasalRate) + " U/h."
|
var line3aa = DecimalFormatter.to2Decimal(pump.baseBasalRate) + " U/h."
|
||||||
line3 += " - " + profileFunction.getProfileName()
|
line3 += " - " + profileFunction.getProfileName()
|
||||||
|
|
|
@ -30,14 +30,12 @@ import info.nightscout.androidaps.logging.UserEntryLogger
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart
|
import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
|
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
|
||||||
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification
|
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification
|
||||||
import info.nightscout.androidaps.plugins.general.smsCommunicator.events.EventSmsCommunicatorUpdateGui
|
import info.nightscout.androidaps.plugins.general.smsCommunicator.events.EventSmsCommunicatorUpdateGui
|
||||||
import info.nightscout.androidaps.plugins.general.smsCommunicator.otp.OneTimePassword
|
import info.nightscout.androidaps.plugins.general.smsCommunicator.otp.OneTimePassword
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
|
||||||
import info.nightscout.androidaps.queue.Callback
|
import info.nightscout.androidaps.queue.Callback
|
||||||
import info.nightscout.androidaps.receivers.DataWorker
|
import info.nightscout.androidaps.receivers.DataWorker
|
||||||
import info.nightscout.androidaps.utils.*
|
import info.nightscout.androidaps.utils.*
|
||||||
|
@ -71,7 +69,7 @@ class SmsCommunicatorPlugin @Inject constructor(
|
||||||
private val activePlugin: ActivePluginProvider,
|
private val activePlugin: ActivePluginProvider,
|
||||||
private val commandQueue: CommandQueueProvider,
|
private val commandQueue: CommandQueueProvider,
|
||||||
private val loopPlugin: LoopPlugin,
|
private val loopPlugin: LoopPlugin,
|
||||||
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin,
|
private val iobCobCalculator: IobCobCalculator,
|
||||||
private val xdripCalibrations: XdripCalibrations,
|
private val xdripCalibrations: XdripCalibrations,
|
||||||
private var otp: OneTimePassword,
|
private var otp: OneTimePassword,
|
||||||
private val config: Config,
|
private val config: Config,
|
||||||
|
@ -311,8 +309,8 @@ class SmsCommunicatorPlugin @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun processBG(receivedSms: Sms) {
|
private fun processBG(receivedSms: Sms) {
|
||||||
val actualBG = iobCobCalculatorPlugin.actualBg()
|
val actualBG = iobCobCalculator.actualBg()
|
||||||
val lastBG = iobCobCalculatorPlugin.lastBg()
|
val lastBG = iobCobCalculator.lastBg()
|
||||||
var reply = ""
|
var reply = ""
|
||||||
val units = profileFunction.getUnits()
|
val units = profileFunction.getUnits()
|
||||||
if (actualBG != null) {
|
if (actualBG != null) {
|
||||||
|
@ -324,11 +322,9 @@ class SmsCommunicatorPlugin @Inject constructor(
|
||||||
}
|
}
|
||||||
val glucoseStatus = glucoseStatusProvider.glucoseStatusData
|
val glucoseStatus = glucoseStatusProvider.glucoseStatusData
|
||||||
if (glucoseStatus != null) reply += resourceHelper.gs(R.string.sms_delta) + " " + Profile.toUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units) + " " + units + ", "
|
if (glucoseStatus != null) reply += resourceHelper.gs(R.string.sms_delta) + " " + Profile.toUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units) + " " + units + ", "
|
||||||
activePlugin.activeTreatments.updateTotalIOBTreatments()
|
val bolusIob = iobCobCalculator.calculateIobFromBolus().round()
|
||||||
val bolusIob = activePlugin.activeTreatments.lastCalculationTreatments.round()
|
|
||||||
activePlugin.activeTreatments.updateTotalIOBTempBasals()
|
|
||||||
val basalIob = activePlugin.activeTreatments.lastCalculationTempBasals.round()
|
val basalIob = activePlugin.activeTreatments.lastCalculationTempBasals.round()
|
||||||
val cobInfo = iobCobCalculatorPlugin.getCobInfo(false, "SMS COB")
|
val cobInfo = iobCobCalculator.getCobInfo(false, "SMS COB")
|
||||||
reply += (resourceHelper.gs(R.string.sms_iob) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U ("
|
reply += (resourceHelper.gs(R.string.sms_iob) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U ("
|
||||||
+ resourceHelper.gs(R.string.sms_bolus) + " " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U "
|
+ resourceHelper.gs(R.string.sms_bolus) + " " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U "
|
||||||
+ resourceHelper.gs(R.string.sms_basal) + " " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U), "
|
+ resourceHelper.gs(R.string.sms_basal) + " " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U), "
|
||||||
|
|
|
@ -28,7 +28,6 @@ import java.util.Set;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import dagger.android.AndroidInjection;
|
import dagger.android.AndroidInjection;
|
||||||
import dagger.android.HasAndroidInjector;
|
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
import info.nightscout.androidaps.Constants;
|
import info.nightscout.androidaps.Constants;
|
||||||
import info.nightscout.androidaps.R;
|
import info.nightscout.androidaps.R;
|
||||||
|
@ -36,10 +35,11 @@ import info.nightscout.androidaps.data.GlucoseValueDataPoint;
|
||||||
import info.nightscout.androidaps.data.IobTotal;
|
import info.nightscout.androidaps.data.IobTotal;
|
||||||
import info.nightscout.androidaps.data.Profile;
|
import info.nightscout.androidaps.data.Profile;
|
||||||
import info.nightscout.androidaps.database.AppRepository;
|
import info.nightscout.androidaps.database.AppRepository;
|
||||||
|
import info.nightscout.androidaps.database.entities.Bolus;
|
||||||
import info.nightscout.androidaps.database.entities.GlucoseValue;
|
import info.nightscout.androidaps.database.entities.GlucoseValue;
|
||||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||||
import info.nightscout.androidaps.db.Treatment;
|
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
||||||
|
import info.nightscout.androidaps.interfaces.IobCobCalculator;
|
||||||
import info.nightscout.androidaps.interfaces.PluginType;
|
import info.nightscout.androidaps.interfaces.PluginType;
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction;
|
import info.nightscout.androidaps.interfaces.ProfileFunction;
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||||
|
@ -52,13 +52,12 @@ import info.nightscout.androidaps.plugins.general.wear.events.EventWearConfirmAc
|
||||||
import info.nightscout.androidaps.plugins.general.wear.events.EventWearInitiateAction;
|
import info.nightscout.androidaps.plugins.general.wear.events.EventWearInitiateAction;
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider;
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider;
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin;
|
|
||||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
|
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
|
||||||
import info.nightscout.androidaps.receivers.ReceiverStatusStore;
|
import info.nightscout.androidaps.receivers.ReceiverStatusStore;
|
||||||
import info.nightscout.androidaps.utils.DecimalFormatter;
|
import info.nightscout.androidaps.utils.DecimalFormatter;
|
||||||
import info.nightscout.androidaps.utils.DefaultValueHelper;
|
import info.nightscout.androidaps.utils.DefaultValueHelper;
|
||||||
import info.nightscout.androidaps.utils.ToastUtils;
|
import info.nightscout.androidaps.utils.ToastUtils;
|
||||||
import info.nightscout.androidaps.utils.extensions.GlucoseValueUtilsKt;
|
import info.nightscout.androidaps.utils.extensions.GlucoseValueExtensionKt;
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||||
|
|
||||||
|
@ -74,7 +73,7 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
|
||||||
@Inject public NSDeviceStatus nsDeviceStatus;
|
@Inject public NSDeviceStatus nsDeviceStatus;
|
||||||
@Inject public ActivePluginProvider activePlugin;
|
@Inject public ActivePluginProvider activePlugin;
|
||||||
@Inject public LoopPlugin loopPlugin;
|
@Inject public LoopPlugin loopPlugin;
|
||||||
@Inject public IobCobCalculatorPlugin iobCobCalculatorPlugin;
|
@Inject public IobCobCalculator iobCobCalculator;
|
||||||
@Inject public TreatmentsPlugin treatmentsPlugin;
|
@Inject public TreatmentsPlugin treatmentsPlugin;
|
||||||
@Inject public AppRepository repository;
|
@Inject public AppRepository repository;
|
||||||
@Inject ReceiverStatusStore receiverStatusStore;
|
@Inject ReceiverStatusStore receiverStatusStore;
|
||||||
|
@ -280,7 +279,7 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
|
||||||
|
|
||||||
private void sendData() {
|
private void sendData() {
|
||||||
|
|
||||||
GlucoseValue lastBG = iobCobCalculatorPlugin.lastBg();
|
GlucoseValue lastBG = iobCobCalculator.lastBg();
|
||||||
// Log.d(TAG, logPrefix + "LastBg=" + lastBG);
|
// Log.d(TAG, logPrefix + "LastBg=" + lastBG);
|
||||||
if (lastBG != null) {
|
if (lastBG != null) {
|
||||||
GlucoseStatus glucoseStatus = glucoseStatusProvider.getGlucoseStatusData();
|
GlucoseStatus glucoseStatus = glucoseStatusProvider.getGlucoseStatusData();
|
||||||
|
@ -314,7 +313,7 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
|
||||||
}
|
}
|
||||||
|
|
||||||
DataMap dataMap = new DataMap();
|
DataMap dataMap = new DataMap();
|
||||||
dataMap.putString("sgvString", GlucoseValueUtilsKt.valueToUnitsString(lastBG, units));
|
dataMap.putString("sgvString", GlucoseValueExtensionKt.valueToUnitsString(lastBG, units));
|
||||||
dataMap.putString("glucoseUnits", units);
|
dataMap.putString("glucoseUnits", units);
|
||||||
dataMap.putLong("timestamp", lastBG.getTimestamp());
|
dataMap.putLong("timestamp", lastBG.getTimestamp());
|
||||||
if (glucoseStatus == null) {
|
if (glucoseStatus == null) {
|
||||||
|
@ -382,7 +381,7 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
|
||||||
googleApiConnect();
|
googleApiConnect();
|
||||||
}
|
}
|
||||||
long startTime = System.currentTimeMillis() - (long) (60000 * 60 * 5.5);
|
long startTime = System.currentTimeMillis() - (long) (60000 * 60 * 5.5);
|
||||||
GlucoseValue last_bg = iobCobCalculatorPlugin.lastBg();
|
GlucoseValue last_bg = iobCobCalculator.lastBg();
|
||||||
|
|
||||||
if (last_bg == null) return;
|
if (last_bg == null) return;
|
||||||
|
|
||||||
|
@ -527,13 +526,10 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Treatment> treatments = treatmentsPlugin.getTreatmentsFromHistory();
|
repository.getBolusesIncludingInvalidFromTime(startTimeWindow, true).blockingGet()
|
||||||
for (Treatment treatment : treatments) {
|
.forEach(bolus -> boluses.add(treatmentMap(bolus.getTimestamp(), bolus.getAmount(), 0, bolus.getType() == Bolus.Type.SMB, bolus.isValid())));
|
||||||
if (treatment.date > startTimeWindow) {
|
repository.getCarbsIncludingInvalidFromTime(startTimeWindow, true).blockingGet()
|
||||||
boluses.add(treatmentMap(treatment.date, treatment.insulin, treatment.carbs, treatment.isSMB, treatment.isValid));
|
.forEach(carb -> boluses.add(treatmentMap(carb.getTimestamp(), 0, carb.getAmount(), false, carb.isValid())));
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
final LoopPlugin.LastRun finalLastRun = loopPlugin.getLastRun();
|
final LoopPlugin.LastRun finalLastRun = loopPlugin.getLastRun();
|
||||||
if (sp.getBoolean("wear_predictions", true) && finalLastRun != null && finalLastRun.getRequest().getHasPredictions() && finalLastRun.getConstraintsProcessed() != null) {
|
if (sp.getBoolean("wear_predictions", true) && finalLastRun != null && finalLastRun.getRequest().getHasPredictions() && finalLastRun.getConstraintsProcessed() != null) {
|
||||||
|
@ -685,14 +681,12 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
|
||||||
String iobSum, iobDetail, cobString, currentBasal, bgiString;
|
String iobSum, iobDetail, cobString, currentBasal, bgiString;
|
||||||
iobSum = iobDetail = cobString = currentBasal = bgiString = "";
|
iobSum = iobDetail = cobString = currentBasal = bgiString = "";
|
||||||
if (profile != null) {
|
if (profile != null) {
|
||||||
treatmentsPlugin.updateTotalIOBTreatments();
|
IobTotal bolusIob = iobCobCalculator.calculateIobFromBolus().round();
|
||||||
IobTotal bolusIob = treatmentsPlugin.getLastCalculationTreatments().round();
|
|
||||||
treatmentsPlugin.updateTotalIOBTempBasals();
|
|
||||||
IobTotal basalIob = treatmentsPlugin.getLastCalculationTempBasals().round();
|
IobTotal basalIob = treatmentsPlugin.getLastCalculationTempBasals().round();
|
||||||
|
|
||||||
iobSum = DecimalFormatter.INSTANCE.to2Decimal(bolusIob.iob + basalIob.basaliob);
|
iobSum = DecimalFormatter.INSTANCE.to2Decimal(bolusIob.iob + basalIob.basaliob);
|
||||||
iobDetail = "(" + DecimalFormatter.INSTANCE.to2Decimal(bolusIob.iob) + "|" + DecimalFormatter.INSTANCE.to2Decimal(basalIob.basaliob) + ")";
|
iobDetail = "(" + DecimalFormatter.INSTANCE.to2Decimal(bolusIob.iob) + "|" + DecimalFormatter.INSTANCE.to2Decimal(basalIob.basaliob) + ")";
|
||||||
cobString = iobCobCalculatorPlugin.getCobInfo(false, "WatcherUpdaterService").generateCOBString();
|
cobString = iobCobCalculator.getCobInfo(false, "WatcherUpdaterService").generateCOBString();
|
||||||
currentBasal = generateBasalString();
|
currentBasal = generateBasalString();
|
||||||
|
|
||||||
//bgi
|
//bgi
|
||||||
|
|
|
@ -7,23 +7,17 @@ import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.data.Profile
|
import info.nightscout.androidaps.data.Profile
|
||||||
import info.nightscout.androidaps.events.*
|
import info.nightscout.androidaps.events.*
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.*
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginType
|
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
|
||||||
import info.nightscout.androidaps.events.EventAutosensCalculationFinished
|
|
||||||
import info.nightscout.androidaps.utils.DecimalFormatter
|
import info.nightscout.androidaps.utils.DecimalFormatter
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
import io.reactivex.rxkotlin.plusAssign
|
|
||||||
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.androidaps.utils.sharedPreferences.SP
|
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
import io.reactivex.rxkotlin.plusAssign
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@ -38,7 +32,7 @@ class StatusLinePlugin @Inject constructor(
|
||||||
private val fabricPrivacy: FabricPrivacy,
|
private val fabricPrivacy: FabricPrivacy,
|
||||||
private val activePlugin: ActivePluginProvider,
|
private val activePlugin: ActivePluginProvider,
|
||||||
private val loopPlugin: LoopPlugin,
|
private val loopPlugin: LoopPlugin,
|
||||||
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin,
|
private val iobCobCalculator: IobCobCalculator,
|
||||||
private val rxBus: RxBusWrapper,
|
private val rxBus: RxBusWrapper,
|
||||||
aapsLogger: AAPSLogger
|
aapsLogger: AAPSLogger
|
||||||
) : PluginBase(
|
) : PluginBase(
|
||||||
|
@ -132,9 +126,7 @@ class StatusLinePlugin @Inject constructor(
|
||||||
status += activeTemp.toStringShort() + " "
|
status += activeTemp.toStringShort() + " "
|
||||||
}
|
}
|
||||||
//IOB
|
//IOB
|
||||||
activePlugin.activeTreatments.updateTotalIOBTreatments()
|
val bolusIob = iobCobCalculator.calculateIobFromBolus().round()
|
||||||
val bolusIob = activePlugin.activeTreatments.lastCalculationTreatments.round()
|
|
||||||
activePlugin.activeTreatments.updateTotalIOBTempBasals()
|
|
||||||
val basalIob = activePlugin.activeTreatments.lastCalculationTempBasals.round()
|
val basalIob = activePlugin.activeTreatments.lastCalculationTempBasals.round()
|
||||||
status += DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U"
|
status += DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U"
|
||||||
if (sp.getBoolean(R.string.key_xdripstatus_detailediob, true)) {
|
if (sp.getBoolean(R.string.key_xdripstatus_detailediob, true)) {
|
||||||
|
@ -147,7 +139,7 @@ class StatusLinePlugin @Inject constructor(
|
||||||
status += " " + (if (bgi >= 0) "+" else "") + DecimalFormatter.to2Decimal(bgi)
|
status += " " + (if (bgi >= 0) "+" else "") + DecimalFormatter.to2Decimal(bgi)
|
||||||
}
|
}
|
||||||
// COB
|
// COB
|
||||||
status += " " + iobCobCalculatorPlugin.getCobInfo(false, "StatusLinePlugin").generateCOBString()
|
status += " " + iobCobCalculator.getCobInfo(false, "StatusLinePlugin").generateCOBString()
|
||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -9,6 +9,7 @@ import info.nightscout.androidaps.data.IobTotal
|
||||||
import info.nightscout.androidaps.data.MealData
|
import info.nightscout.androidaps.data.MealData
|
||||||
import info.nightscout.androidaps.data.Profile
|
import info.nightscout.androidaps.data.Profile
|
||||||
import info.nightscout.androidaps.database.AppRepository
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
|
import info.nightscout.androidaps.database.entities.Bolus
|
||||||
import info.nightscout.androidaps.database.entities.GlucoseValue
|
import info.nightscout.androidaps.database.entities.GlucoseValue
|
||||||
import info.nightscout.androidaps.db.TemporaryBasal
|
import info.nightscout.androidaps.db.TemporaryBasal
|
||||||
import info.nightscout.androidaps.events.*
|
import info.nightscout.androidaps.events.*
|
||||||
|
@ -27,6 +28,7 @@ import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.DecimalFormatter
|
import info.nightscout.androidaps.utils.DecimalFormatter
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
import info.nightscout.androidaps.utils.T
|
import info.nightscout.androidaps.utils.T
|
||||||
|
import info.nightscout.androidaps.utils.extensions.iobCalc
|
||||||
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.androidaps.utils.sharedPreferences.SP
|
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||||
|
@ -64,7 +66,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
.neverVisible(true)
|
.neverVisible(true)
|
||||||
.alwaysEnabled(true),
|
.alwaysEnabled(true),
|
||||||
aapsLogger, resourceHelper, injector
|
aapsLogger, resourceHelper, injector
|
||||||
), IobCobCalculatorInterface {
|
), IobCobCalculator {
|
||||||
|
|
||||||
private val disposable = CompositeDisposable()
|
private val disposable = CompositeDisposable()
|
||||||
private var iobTable = LongSparseArray<IobTotal?>() // oldest at index 0
|
private var iobTable = LongSparseArray<IobTotal?>() // oldest at index 0
|
||||||
|
@ -404,7 +406,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
//og.debug(">>> calculateFromTreatmentsAndTemps Cache hit " + new Date(time).toLocaleString());
|
//og.debug(">>> calculateFromTreatmentsAndTemps Cache hit " + new Date(time).toLocaleString());
|
||||||
return cacheHit
|
return cacheHit
|
||||||
} // else log.debug(">>> calculateFromTreatmentsAndTemps Cache miss " + new Date(time).toLocaleString());
|
} // else log.debug(">>> calculateFromTreatmentsAndTemps Cache miss " + new Date(time).toLocaleString());
|
||||||
val bolusIob = treatmentsPlugin.getCalculationToTimeTreatments(time).round()
|
val bolusIob = calculateIobFromBolusToTime(time).round()
|
||||||
val basalIob = treatmentsPlugin.getCalculationToTimeTempBasals(time, true, now).round()
|
val basalIob = treatmentsPlugin.getCalculationToTimeTempBasals(time, true, now).round()
|
||||||
// OpenAPSSMB only
|
// OpenAPSSMB only
|
||||||
// Add expected zero temp basal for next 240 minutes
|
// Add expected zero temp basal for next 240 minutes
|
||||||
|
@ -425,7 +427,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
return iobTotal
|
return iobTotal
|
||||||
}
|
}
|
||||||
|
|
||||||
fun calculateAbsInsulinFromTreatmentsAndTempsSynchronized(fromTime: Long): IobTotal {
|
override fun calculateAbsInsulinFromTreatmentsAndTempsSynchronized(fromTime: Long): IobTotal {
|
||||||
synchronized(dataLock) {
|
synchronized(dataLock) {
|
||||||
val now = System.currentTimeMillis()
|
val now = System.currentTimeMillis()
|
||||||
val time = roundUpTime(fromTime)
|
val time = roundUpTime(fromTime)
|
||||||
|
@ -434,7 +436,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
//log.debug(">>> calculateFromTreatmentsAndTemps Cache hit " + new Date(time).toLocaleString());
|
//log.debug(">>> calculateFromTreatmentsAndTemps Cache hit " + new Date(time).toLocaleString());
|
||||||
return cacheHit
|
return cacheHit
|
||||||
} // else log.debug(">>> calculateFromTreatmentsAndTemps Cache miss " + new Date(time).toLocaleString());
|
} // else log.debug(">>> calculateFromTreatmentsAndTemps Cache miss " + new Date(time).toLocaleString());
|
||||||
val bolusIob = treatmentsPlugin.getCalculationToTimeTreatments(time).round()
|
val bolusIob = calculateIobFromBolusToTime(time).round()
|
||||||
val basalIob = treatmentsPlugin.getAbsoluteIOBTempBasals(time).round()
|
val basalIob = treatmentsPlugin.getAbsoluteIOBTempBasals(time).round()
|
||||||
val iobTotal = IobTotal.combine(bolusIob, basalIob).round()
|
val iobTotal = IobTotal.combine(bolusIob, basalIob).round()
|
||||||
if (time < System.currentTimeMillis()) {
|
if (time < System.currentTimeMillis()) {
|
||||||
|
@ -446,7 +448,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
|
|
||||||
private fun calculateFromTreatmentsAndTemps(time: Long, lastAutosensResult: AutosensResult, exercise_mode: Boolean, half_basal_exercise_target: Int, isTempTarget: Boolean): IobTotal {
|
private fun calculateFromTreatmentsAndTemps(time: Long, lastAutosensResult: AutosensResult, exercise_mode: Boolean, half_basal_exercise_target: Int, isTempTarget: Boolean): IobTotal {
|
||||||
val now = DateUtil.now()
|
val now = DateUtil.now()
|
||||||
val bolusIob = treatmentsPlugin.getCalculationToTimeTreatments(time).round()
|
val bolusIob = calculateIobFromBolusToTime(time).round()
|
||||||
val basalIob = treatmentsPlugin.getCalculationToTimeTempBasals(time, now, lastAutosensResult, exercise_mode, half_basal_exercise_target, isTempTarget).round()
|
val basalIob = treatmentsPlugin.getCalculationToTimeTempBasals(time, now, lastAutosensResult, exercise_mode, half_basal_exercise_target, isTempTarget).round()
|
||||||
// OpenAPSSMB only
|
// OpenAPSSMB only
|
||||||
// Add expected zero temp basal for next 240 minutes
|
// Add expected zero temp basal for next 240 minutes
|
||||||
|
@ -474,7 +476,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getBasalData(profile: Profile, fromTime: Long): BasalData {
|
override fun getBasalData(profile: Profile, fromTime: Long): BasalData {
|
||||||
synchronized(dataLock) {
|
synchronized(dataLock) {
|
||||||
val now = System.currentTimeMillis()
|
val now = System.currentTimeMillis()
|
||||||
val time = roundUpTime(fromTime)
|
val time = roundUpTime(fromTime)
|
||||||
|
@ -512,7 +514,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getLastAutosensDataSynchronized(reason: String): AutosensData? {
|
override fun getLastAutosensDataSynchronized(reason: String): AutosensData? {
|
||||||
if (thread?.isAlive == true) {
|
if (thread?.isAlive == true) {
|
||||||
aapsLogger.debug(LTag.AUTOSENS, "AUTOSENSDATA is waiting for calculation thread: $reason")
|
aapsLogger.debug(LTag.AUTOSENS, "AUTOSENSDATA is waiting for calculation thread: $reason")
|
||||||
try {
|
try {
|
||||||
|
@ -529,26 +531,21 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
var displayCob: Double? = null
|
var displayCob: Double? = null
|
||||||
var futureCarbs = 0.0
|
var futureCarbs = 0.0
|
||||||
val now = DateUtil.now()
|
val now = DateUtil.now()
|
||||||
val treatments = treatmentsPlugin.treatmentsFromHistory
|
val carbs = repository.getCarbsDataFromTime(now, true).blockingGet()
|
||||||
if (autosensData != null) {
|
if (autosensData != null) {
|
||||||
displayCob = autosensData.cob
|
displayCob = autosensData.cob
|
||||||
for (treatment in treatments) {
|
carbs.forEach { carb ->
|
||||||
if (!treatment.isValid) continue
|
if (roundUpTime(carb.timestamp) > roundUpTime(autosensData.time) && carb.timestamp <= now) {
|
||||||
if (roundUpTime(treatment.date) > roundUpTime(autosensData.time) && treatment.date <= now && treatment.carbs > 0) {
|
displayCob += carb.amount
|
||||||
displayCob += treatment.carbs
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (treatment in treatments) {
|
// Future carbs
|
||||||
if (!treatment.isValid) continue
|
carbs.forEach { carb -> if (carb.timestamp > now) futureCarbs += carb.amount }
|
||||||
if (treatment.date > now && treatment.carbs > 0) {
|
|
||||||
futureCarbs += treatment.carbs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return CobInfo(displayCob, futureCarbs)
|
return CobInfo(displayCob, futureCarbs)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun slowAbsorptionPercentage(timeInMinutes: Int): Double {
|
override fun slowAbsorptionPercentage(timeInMinutes: Int): Double {
|
||||||
var sum = 0.0
|
var sum = 0.0
|
||||||
var count = 0
|
var count = 0
|
||||||
val valuesToProcess = timeInMinutes / 5
|
val valuesToProcess = timeInMinutes / 5
|
||||||
|
@ -594,32 +591,20 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
return if (autosensDataTable.size() > 0) dateUtil.dateAndTimeAndSecondsString(autosensDataTable.valueAt(autosensDataTable.size() - 1).time) else "autosensDataTable empty"
|
return if (autosensDataTable.size() > 0) dateUtil.dateAndTimeAndSecondsString(autosensDataTable.valueAt(autosensDataTable.size() - 1).time) else "autosensDataTable empty"
|
||||||
}
|
}
|
||||||
|
|
||||||
val mealData: MealData
|
override val mealData: MealData
|
||||||
get() {
|
get() {
|
||||||
val result = MealData()
|
val result = MealData()
|
||||||
val profile = profileFunction.getProfile() ?: return result
|
|
||||||
val now = System.currentTimeMillis()
|
val now = System.currentTimeMillis()
|
||||||
val diaAgo = now - java.lang.Double.valueOf(profile.dia * T.hours(1).msecs()).toLong()
|
|
||||||
val maxAbsorptionHours: Double = if (sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled()) {
|
val maxAbsorptionHours: Double = if (sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled()) {
|
||||||
sp.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME)
|
sp.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME)
|
||||||
} else {
|
} else {
|
||||||
sp.getDouble(R.string.key_absorption_cutoff, Constants.DEFAULT_MAX_ABSORPTION_TIME)
|
sp.getDouble(R.string.key_absorption_cutoff, Constants.DEFAULT_MAX_ABSORPTION_TIME)
|
||||||
}
|
}
|
||||||
val absorptionTimeAgo = now - java.lang.Double.valueOf(maxAbsorptionHours * T.hours(1).msecs()).toLong()
|
val absorptionTimeAgo = now - (maxAbsorptionHours * T.hours(1).msecs()).toLong()
|
||||||
val treatments = treatmentsPlugin.treatmentsFromHistory
|
repository.getCarbsDataFromTimeToTime(absorptionTimeAgo + 1, now, true).blockingGet().forEach {
|
||||||
for (treatment in treatments) {
|
if (it.amount > 0) {
|
||||||
if (!treatment.isValid) continue
|
result.carbs += it.amount
|
||||||
val t = treatment.date
|
if (it.timestamp > result.lastCarbTime) result.lastCarbTime = it.timestamp
|
||||||
if (t in (diaAgo + 1)..now) {
|
|
||||||
if (treatment.insulin > 0 && treatment.mealBolus) {
|
|
||||||
result.boluses += treatment.insulin
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (t in (absorptionTimeAgo + 1)..now) {
|
|
||||||
if (treatment.carbs >= 1) {
|
|
||||||
result.carbs += treatment.carbs
|
|
||||||
if (t > result.lastCarbTime) result.lastCarbTime = t
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val autosensData = getLastAutosensDataSynchronized("getMealData()")
|
val autosensData = getLastAutosensDataSynchronized("getMealData()")
|
||||||
|
@ -647,7 +632,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
return array
|
return array
|
||||||
}
|
}
|
||||||
|
|
||||||
fun calculateIobArrayForSMB(lastAutosensResult: AutosensResult, exercise_mode: Boolean, half_basal_exercise_target: Int, isTempTarget: Boolean): Array<IobTotal> {
|
override fun calculateIobArrayForSMB(lastAutosensResult: AutosensResult, exercise_mode: Boolean, half_basal_exercise_target: Int, isTempTarget: Boolean): Array<IobTotal> {
|
||||||
// predict IOB out to DIA plus 30m
|
// predict IOB out to DIA plus 30m
|
||||||
val now = DateUtil.now()
|
val now = DateUtil.now()
|
||||||
val len = 4 * 60 / 5
|
val len = 4 * 60 / 5
|
||||||
|
@ -660,7 +645,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
return array
|
return array
|
||||||
}
|
}
|
||||||
|
|
||||||
fun iobArrayToString(array: Array<IobTotal>): String {
|
override fun iobArrayToString(array: Array<IobTotal>): String {
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
sb.append("[")
|
sb.append("[")
|
||||||
for (i in array) {
|
for (i in array) {
|
||||||
|
@ -689,7 +674,7 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
fun runCalculation(from: String, end: Long, bgDataReload: Boolean, limitDataToOldestAvailable: Boolean, cause: Event) {
|
fun runCalculation(from: String, end: Long, bgDataReload: Boolean, limitDataToOldestAvailable: Boolean, cause: Event) {
|
||||||
aapsLogger.debug(LTag.AUTOSENS, "Starting calculation thread: " + from + " to " + dateUtil.dateAndTimeAndSecondsString(end))
|
aapsLogger.debug(LTag.AUTOSENS, "Starting calculation thread: " + from + " to " + dateUtil.dateAndTimeAndSecondsString(end))
|
||||||
if (thread == null || thread?.state == Thread.State.TERMINATED) {
|
if (thread == null || thread?.state == Thread.State.TERMINATED) {
|
||||||
thread = if (sensitivityOref1Plugin.isEnabled()) IobCobOref1Thread(injector, this, treatmentsPlugin, from, end, bgDataReload, limitDataToOldestAvailable, cause) else IobCobThread(injector, this, treatmentsPlugin, from, end, bgDataReload, limitDataToOldestAvailable, cause)
|
thread = if (sensitivityOref1Plugin.isEnabled()) IobCobOref1Thread(injector, this, from, end, bgDataReload, limitDataToOldestAvailable, cause) else IobCobThread(injector, this, from, end, bgDataReload, limitDataToOldestAvailable, cause)
|
||||||
thread?.start()
|
thread?.start()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -752,19 +737,15 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
/*
|
/*
|
||||||
* Return last BgReading from database or null if db is empty
|
* Return last BgReading from database or null if db is empty
|
||||||
*/
|
*/
|
||||||
fun lastBg(): GlucoseValue? {
|
override fun lastBg(): GlucoseValue? {
|
||||||
val bgList = bgReadings
|
val bgList = bgReadings
|
||||||
for (i in bgList.indices) if (bgList[i].value >= 39) return bgList[i]
|
for (i in bgList.indices) if (bgList[i].value >= 39) return bgList[i]
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
override fun actualBg(): GlucoseValue? {
|
||||||
* Return bg reading if not old ( <9 min )
|
|
||||||
* or null if older
|
|
||||||
*/
|
|
||||||
fun actualBg(): GlucoseValue? {
|
|
||||||
val lastBg = lastBg() ?: return null
|
val lastBg = lastBg() ?: return null
|
||||||
return if (lastBg.timestamp > System.currentTimeMillis() - 9 * 60 * 1000) lastBg else null
|
return if (lastBg.timestamp > System.currentTimeMillis() - T.mins(9).msecs()) lastBg else null
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -796,4 +777,36 @@ open class IobCobCalculatorPlugin @Inject constructor(
|
||||||
return if (upper >= arr.size) arr[lower.toInt()] else arr[lower.toInt()] * (1 - weight) + arr[upper.toInt()] * weight
|
return if (upper >= arr.size) arr[lower.toInt()] else arr[lower.toInt()] * (1 - weight) + arr[upper.toInt()] * weight
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun calculateIobFromBolus(): IobTotal = calculateIobFromBolusToTime(dateUtil._now())
|
||||||
|
|
||||||
|
override fun calculateIobFromBolusToTime(timestamp: Long): IobTotal {
|
||||||
|
val total = IobTotal(timestamp)
|
||||||
|
val profile = profileFunction.getProfile() ?: return total
|
||||||
|
val dia = profile.dia
|
||||||
|
val divisor = sp.getDouble(R.string.key_openapsama_bolussnooze_dia_divisor, 2.0)
|
||||||
|
|
||||||
|
val boluses = repository.getBolusesDataFromTime(timestamp, true).blockingGet()
|
||||||
|
|
||||||
|
boluses.forEach { t ->
|
||||||
|
if (t.isValid && t.timestamp < timestamp) {
|
||||||
|
val tIOB = t.iobCalc(activePlugin, timestamp, dia)
|
||||||
|
total.iob += tIOB.iobContrib
|
||||||
|
total.activity += tIOB.activityContrib
|
||||||
|
if (t.amount > 0 && t.timestamp > total.lastBolusTime) total.lastBolusTime = t.timestamp
|
||||||
|
if (t.type != Bolus.Type.SMB) {
|
||||||
|
// instead of dividing the DIA that only worked on the bilinear curves,
|
||||||
|
// multiply the time the treatment is seen active.
|
||||||
|
val timeSinceTreatment = timestamp - t.timestamp
|
||||||
|
val snoozeTime = t.timestamp + (timeSinceTreatment * divisor).toLong()
|
||||||
|
val bIOB = t.iobCalc(activePlugin, snoozeTime, dia)
|
||||||
|
total.bolussnooze += bIOB.iobContrib
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
total.plus(treatmentsPlugin.getCalculationToTimeExtendedBoluses(timestamp))
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -23,7 +23,6 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutos
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
|
||||||
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin
|
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin
|
||||||
import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin
|
import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin
|
||||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
|
|
||||||
import info.nightscout.androidaps.utils.*
|
import info.nightscout.androidaps.utils.*
|
||||||
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
|
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
|
||||||
import info.nightscout.androidaps.utils.extensions.target
|
import info.nightscout.androidaps.utils.extensions.target
|
||||||
|
@ -39,7 +38,6 @@ import kotlin.math.roundToLong
|
||||||
class IobCobOref1Thread internal constructor(
|
class IobCobOref1Thread internal constructor(
|
||||||
private val injector: HasAndroidInjector,
|
private val injector: HasAndroidInjector,
|
||||||
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin, // cannot be injected : HistoryBrowser uses different instance
|
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin, // cannot be injected : HistoryBrowser uses different instance
|
||||||
private val treatmentsPlugin: TreatmentsPlugin, // cannot be injected : HistoryBrowser uses different instance
|
|
||||||
private val from: String,
|
private val from: String,
|
||||||
private val end: Long,
|
private val end: Long,
|
||||||
private val bgDataReload: Boolean,
|
private val bgDataReload: Boolean,
|
||||||
|
@ -191,12 +189,12 @@ class IobCobOref1Thread internal constructor(
|
||||||
aapsLogger.debug(LTag.AUTOSENS, ">>>>> bucketed_data.size()=" + bucketedData.size + " i=" + i + " hourAgoData=" + "null")
|
aapsLogger.debug(LTag.AUTOSENS, ">>>>> bucketed_data.size()=" + bucketedData.size + " i=" + i + " hourAgoData=" + "null")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val recentCarbTreatments = treatmentsPlugin.getCarbTreatments5MinBackFromHistory(bgTime)
|
val recentCarbTreatments = repository.getCarbsDataFromTimeToTime(bgTime - T.mins(5).msecs(), bgTime, true).blockingGet()
|
||||||
for (recentCarbTreatment in recentCarbTreatments) {
|
for (recentCarbTreatment in recentCarbTreatments) {
|
||||||
autosensData.carbsFromBolus += recentCarbTreatment.carbs
|
autosensData.carbsFromBolus += recentCarbTreatment.amount
|
||||||
val isAAPSOrWeighted = sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled()
|
val isAAPSOrWeighted = sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled()
|
||||||
autosensData.activeCarbsList.add(autosensData.CarbsInPast(recentCarbTreatment, isAAPSOrWeighted))
|
autosensData.activeCarbsList.add(autosensData.CarbsInPast(recentCarbTreatment, isAAPSOrWeighted))
|
||||||
autosensData.pastSensitivity += "[" + DecimalFormatter.to0Decimal(recentCarbTreatment.carbs) + "g]"
|
autosensData.pastSensitivity += "[" + DecimalFormatter.to0Decimal(recentCarbTreatment.amount) + "g]"
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we are absorbing carbs
|
// if we are absorbing carbs
|
||||||
|
|
|
@ -6,7 +6,9 @@ import android.os.SystemClock
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.Constants
|
import info.nightscout.androidaps.Constants
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.events.Event
|
import info.nightscout.androidaps.events.Event
|
||||||
|
import info.nightscout.androidaps.events.EventAutosensCalculationFinished
|
||||||
import info.nightscout.androidaps.interfaces.PluginType
|
import info.nightscout.androidaps.interfaces.PluginType
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
|
@ -18,11 +20,9 @@ import info.nightscout.androidaps.plugins.general.overview.notifications.Notific
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin.Companion.roundUpTime
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin.Companion.roundUpTime
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensData
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensData
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensBgLoaded
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensBgLoaded
|
||||||
import info.nightscout.androidaps.events.EventAutosensCalculationFinished
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
|
||||||
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin
|
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin
|
||||||
import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin
|
import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin
|
||||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
|
|
||||||
import info.nightscout.androidaps.utils.*
|
import info.nightscout.androidaps.utils.*
|
||||||
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
|
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
|
@ -37,7 +37,6 @@ import kotlin.math.roundToLong
|
||||||
class IobCobThread @Inject internal constructor(
|
class IobCobThread @Inject internal constructor(
|
||||||
private val injector: HasAndroidInjector,
|
private val injector: HasAndroidInjector,
|
||||||
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin, // cannot be injected : HistoryBrowser uses different instance
|
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin, // cannot be injected : HistoryBrowser uses different instance
|
||||||
private val treatmentsPlugin: TreatmentsPlugin, // cannot be injected : HistoryBrowser uses different instance
|
|
||||||
private val from: String,
|
private val from: String,
|
||||||
private val end: Long,
|
private val end: Long,
|
||||||
private val bgDataReload: Boolean,
|
private val bgDataReload: Boolean,
|
||||||
|
@ -57,6 +56,7 @@ class IobCobThread @Inject internal constructor(
|
||||||
@Inject lateinit var profiler: Profiler
|
@Inject lateinit var profiler: Profiler
|
||||||
@Inject lateinit var fabricPrivacy: FabricPrivacy
|
@Inject lateinit var fabricPrivacy: FabricPrivacy
|
||||||
@Inject lateinit var dateUtil: DateUtil
|
@Inject lateinit var dateUtil: DateUtil
|
||||||
|
@Inject lateinit var repository: AppRepository
|
||||||
|
|
||||||
private var mWakeLock: PowerManager.WakeLock? = null
|
private var mWakeLock: PowerManager.WakeLock? = null
|
||||||
|
|
||||||
|
@ -188,12 +188,12 @@ class IobCobThread @Inject internal constructor(
|
||||||
aapsLogger.debug(LTag.AUTOSENS, ">>>>> bucketed_data.size()=" + bucketedData.size + " i=" + i + " hourAgoData=" + "null")
|
aapsLogger.debug(LTag.AUTOSENS, ">>>>> bucketed_data.size()=" + bucketedData.size + " i=" + i + " hourAgoData=" + "null")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val recentCarbTreatments = treatmentsPlugin.getCarbTreatments5MinBackFromHistory(bgTime)
|
val recentCarbTreatments = repository.getCarbsDataFromTimeToTime(bgTime - T.mins(5).msecs(), bgTime, true).blockingGet()
|
||||||
for (recentCarbTreatment in recentCarbTreatments) {
|
for (recentCarbTreatment in recentCarbTreatments) {
|
||||||
autosensData.carbsFromBolus += recentCarbTreatment.carbs
|
autosensData.carbsFromBolus += recentCarbTreatment.amount
|
||||||
val isAAPSOrWeighted = sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled()
|
val isAAPSOrWeighted = sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled()
|
||||||
autosensData.activeCarbsList.add(autosensData.CarbsInPast(recentCarbTreatment, isAAPSOrWeighted))
|
autosensData.activeCarbsList.add(autosensData.CarbsInPast(recentCarbTreatment, isAAPSOrWeighted))
|
||||||
autosensData.pastSensitivity += "[" + DecimalFormatter.to0Decimal(recentCarbTreatment.carbs) + "g]"
|
autosensData.pastSensitivity += "[" + DecimalFormatter.to0Decimal(recentCarbTreatment.amount) + "g]"
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we are absorbing carbs
|
// if we are absorbing carbs
|
||||||
|
|
|
@ -40,7 +40,7 @@ import javax.inject.Singleton
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
class VirtualPumpPlugin @Inject constructor(
|
open class VirtualPumpPlugin @Inject constructor(
|
||||||
injector: HasAndroidInjector,
|
injector: HasAndroidInjector,
|
||||||
aapsLogger: AAPSLogger,
|
aapsLogger: AAPSLogger,
|
||||||
private val rxBus: RxBusWrapper,
|
private val rxBus: RxBusWrapper,
|
||||||
|
@ -204,8 +204,10 @@ class VirtualPumpPlugin @Inject constructor(
|
||||||
aapsLogger.debug(LTag.PUMP, "Delivering treatment insulin: " + detailedBolusInfo.insulin + "U carbs: " + detailedBolusInfo.carbs + "g " + result)
|
aapsLogger.debug(LTag.PUMP, "Delivering treatment insulin: " + detailedBolusInfo.insulin + "U carbs: " + detailedBolusInfo.carbs + "g " + result)
|
||||||
rxBus.send(EventVirtualPumpUpdateGui())
|
rxBus.send(EventVirtualPumpUpdateGui())
|
||||||
lastDataTime = System.currentTimeMillis()
|
lastDataTime = System.currentTimeMillis()
|
||||||
|
if (detailedBolusInfo.insulin > 0)
|
||||||
pumpSync.syncBolusWithPumpId(dateUtil._now(), detailedBolusInfo.insulin, detailedBolusInfo.bolusType, dateUtil._now(), pumpType
|
pumpSync.syncBolusWithPumpId(dateUtil._now(), detailedBolusInfo.insulin, detailedBolusInfo.bolusType, dateUtil._now(), pumpType
|
||||||
?: PumpType.GENERIC_AAPS, serialNumber())
|
?: PumpType.GENERIC_AAPS, serialNumber())
|
||||||
|
if (detailedBolusInfo.carbs > 0)
|
||||||
pumpSync.syncCarbsWithTimestamp(dateUtil._now(), detailedBolusInfo.carbs, dateUtil._now(), pumpType
|
pumpSync.syncCarbsWithTimestamp(dateUtil._now(), detailedBolusInfo.carbs, dateUtil._now(), pumpType
|
||||||
?: PumpType.GENERIC_AAPS, serialNumber())
|
?: PumpType.GENERIC_AAPS, serialNumber())
|
||||||
return result
|
return result
|
||||||
|
|
|
@ -2,7 +2,7 @@ package info.nightscout.androidaps.plugins.sensitivity
|
||||||
|
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase
|
import info.nightscout.androidaps.interfaces.PluginBase
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription
|
import info.nightscout.androidaps.interfaces.PluginDescription
|
||||||
import info.nightscout.androidaps.interfaces.SensitivityInterface
|
import info.nightscout.androidaps.interfaces.SensitivityInterface
|
||||||
|
@ -24,7 +24,7 @@ abstract class AbstractSensitivityPlugin(
|
||||||
val sp: SP
|
val sp: SP
|
||||||
) : PluginBase(pluginDescription, aapsLogger, resourceHelper, injector), SensitivityInterface {
|
) : PluginBase(pluginDescription, aapsLogger, resourceHelper, injector), SensitivityInterface {
|
||||||
|
|
||||||
abstract override fun detectSensitivity(plugin: IobCobCalculatorInterface, fromTime: Long, toTime: Long): AutosensResult
|
abstract override fun detectSensitivity(plugin: IobCobCalculator, fromTime: Long, toTime: Long): AutosensResult
|
||||||
|
|
||||||
fun fillResult(ratio: Double, carbsAbsorbed: Double, pastSensitivity: String,
|
fun fillResult(ratio: Double, carbsAbsorbed: Double, pastSensitivity: String,
|
||||||
ratioLimit: String, sensResult: String, deviationsArraySize: Int): AutosensResult {
|
ratioLimit: String, sensResult: String, deviationsArraySize: Int): AutosensResult {
|
||||||
|
|
|
@ -8,7 +8,7 @@ import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.database.entities.TherapyEvent
|
import info.nightscout.androidaps.database.entities.TherapyEvent
|
||||||
import info.nightscout.androidaps.db.ProfileSwitch
|
import info.nightscout.androidaps.db.ProfileSwitch
|
||||||
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
|
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription
|
import info.nightscout.androidaps.interfaces.PluginDescription
|
||||||
import info.nightscout.androidaps.interfaces.PluginType
|
import info.nightscout.androidaps.interfaces.PluginType
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
|
@ -48,7 +48,7 @@ open class SensitivityAAPSPlugin @Inject constructor(
|
||||||
injector!!, aapsLogger!!, resourceHelper!!, sp!!
|
injector!!, aapsLogger!!, resourceHelper!!, sp!!
|
||||||
) {
|
) {
|
||||||
|
|
||||||
override fun detectSensitivity(plugin: IobCobCalculatorInterface, fromTime: Long, toTime: Long): AutosensResult {
|
override fun detectSensitivity(plugin: IobCobCalculator, fromTime: Long, toTime: Long): AutosensResult {
|
||||||
val autosensDataTable = plugin.getAutosensDataTable()
|
val autosensDataTable = plugin.getAutosensDataTable()
|
||||||
val age = sp.getString(R.string.key_age, "")
|
val age = sp.getString(R.string.key_age, "")
|
||||||
var defaultHours = 24
|
var defaultHours = 24
|
||||||
|
|
|
@ -8,7 +8,7 @@ import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.database.entities.TherapyEvent
|
import info.nightscout.androidaps.database.entities.TherapyEvent
|
||||||
import info.nightscout.androidaps.db.ProfileSwitch
|
import info.nightscout.androidaps.db.ProfileSwitch
|
||||||
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
|
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription
|
import info.nightscout.androidaps.interfaces.PluginDescription
|
||||||
import info.nightscout.androidaps.interfaces.PluginType
|
import info.nightscout.androidaps.interfaces.PluginType
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
|
@ -51,7 +51,7 @@ open class SensitivityOref1Plugin @Inject constructor(
|
||||||
injector!!, aapsLogger!!, resourceHelper!!, sp!!
|
injector!!, aapsLogger!!, resourceHelper!!, sp!!
|
||||||
) {
|
) {
|
||||||
|
|
||||||
override fun detectSensitivity(plugin: IobCobCalculatorInterface, fromTime: Long, toTime: Long): AutosensResult {
|
override fun detectSensitivity(plugin: IobCobCalculator, fromTime: Long, toTime: Long): AutosensResult {
|
||||||
// todo this method is called from the IobCobCalculatorPlugin, which leads to a circular
|
// todo this method is called from the IobCobCalculatorPlugin, which leads to a circular
|
||||||
// dependency, this should be avoided
|
// dependency, this should be avoided
|
||||||
val autosensDataTable = plugin.getAutosensDataTable()
|
val autosensDataTable = plugin.getAutosensDataTable()
|
||||||
|
|
|
@ -9,7 +9,7 @@ import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.database.entities.TherapyEvent
|
import info.nightscout.androidaps.database.entities.TherapyEvent
|
||||||
import info.nightscout.androidaps.db.ProfileSwitch
|
import info.nightscout.androidaps.db.ProfileSwitch
|
||||||
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
|
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription
|
import info.nightscout.androidaps.interfaces.PluginDescription
|
||||||
import info.nightscout.androidaps.interfaces.PluginType
|
import info.nightscout.androidaps.interfaces.PluginType
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
|
@ -47,7 +47,7 @@ open class SensitivityWeightedAveragePlugin @Inject constructor(
|
||||||
injector, aapsLogger, resourceHelper, sp
|
injector, aapsLogger, resourceHelper, sp
|
||||||
) {
|
) {
|
||||||
|
|
||||||
override fun detectSensitivity(plugin: IobCobCalculatorInterface, fromTime: Long, toTime: Long): AutosensResult {
|
override fun detectSensitivity(plugin: IobCobCalculator, fromTime: Long, toTime: Long): AutosensResult {
|
||||||
val autosensDataTable = plugin.getAutosensDataTable()
|
val autosensDataTable = plugin.getAutosensDataTable()
|
||||||
val age = sp.getString(R.string.key_age, "")
|
val age = sp.getString(R.string.key_age, "")
|
||||||
var defaultHours = 24
|
var defaultHours = 24
|
||||||
|
|
|
@ -10,6 +10,7 @@ import com.google.firebase.analytics.FirebaseAnalytics;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
@ -26,6 +27,8 @@ import info.nightscout.androidaps.data.NonOverlappingIntervals;
|
||||||
import info.nightscout.androidaps.data.Profile;
|
import info.nightscout.androidaps.data.Profile;
|
||||||
import info.nightscout.androidaps.data.ProfileIntervals;
|
import info.nightscout.androidaps.data.ProfileIntervals;
|
||||||
import info.nightscout.androidaps.database.AppRepository;
|
import info.nightscout.androidaps.database.AppRepository;
|
||||||
|
import info.nightscout.androidaps.database.entities.Bolus;
|
||||||
|
import info.nightscout.androidaps.database.entities.Carbs;
|
||||||
import info.nightscout.androidaps.db.ExtendedBolus;
|
import info.nightscout.androidaps.db.ExtendedBolus;
|
||||||
import info.nightscout.androidaps.db.ProfileSwitch;
|
import info.nightscout.androidaps.db.ProfileSwitch;
|
||||||
import info.nightscout.androidaps.db.Source;
|
import info.nightscout.androidaps.db.Source;
|
||||||
|
@ -85,10 +88,6 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
|
|
||||||
protected TreatmentServiceInterface service;
|
protected TreatmentServiceInterface service;
|
||||||
|
|
||||||
private IobTotal lastTreatmentCalculation;
|
|
||||||
private IobTotal lastTempBasalsCalculation;
|
|
||||||
|
|
||||||
private final ArrayList<Treatment> treatments = new ArrayList<>();
|
|
||||||
private final Intervals<TemporaryBasal> tempBasals = new NonOverlappingIntervals<>();
|
private final Intervals<TemporaryBasal> tempBasals = new NonOverlappingIntervals<>();
|
||||||
private final Intervals<ExtendedBolus> extendedBoluses = new NonOverlappingIntervals<>();
|
private final Intervals<ExtendedBolus> extendedBoluses = new NonOverlappingIntervals<>();
|
||||||
private final ProfileIntervals<ProfileSwitch> profiles = new ProfileIntervals<>();
|
private final ProfileIntervals<ProfileSwitch> profiles = new ProfileIntervals<>();
|
||||||
|
@ -147,9 +146,8 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
.observeOn(aapsSchedulers.getIo())
|
.observeOn(aapsSchedulers.getIo())
|
||||||
.subscribe(event -> {
|
.subscribe(event -> {
|
||||||
getAapsLogger().debug(LTag.DATATREATMENTS, "EventReloadTreatmentData");
|
getAapsLogger().debug(LTag.DATATREATMENTS, "EventReloadTreatmentData");
|
||||||
initializeTreatmentData(range());
|
//initializeTreatmentData(range());
|
||||||
initializeExtendedBolusData(range());
|
initializeExtendedBolusData(range());
|
||||||
updateTotalIOBTreatments();
|
|
||||||
rxBus.send(event.getNext());
|
rxBus.send(event.getNext());
|
||||||
},
|
},
|
||||||
fabricPrivacy::logException
|
fabricPrivacy::logException
|
||||||
|
@ -166,7 +164,6 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
.subscribe(event -> {
|
.subscribe(event -> {
|
||||||
getAapsLogger().debug(LTag.DATATREATMENTS, "EventReloadTempBasalData");
|
getAapsLogger().debug(LTag.DATATREATMENTS, "EventReloadTempBasalData");
|
||||||
initializeTempBasalData(range());
|
initializeTempBasalData(range());
|
||||||
updateTotalIOBTempBasals();
|
|
||||||
},
|
},
|
||||||
fabricPrivacy::logException
|
fabricPrivacy::logException
|
||||||
));
|
));
|
||||||
|
@ -192,19 +189,10 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
|
|
||||||
public void initializeData(long range) {
|
public void initializeData(long range) {
|
||||||
initializeTempBasalData(range);
|
initializeTempBasalData(range);
|
||||||
initializeTreatmentData(range);
|
|
||||||
initializeExtendedBolusData(range);
|
initializeExtendedBolusData(range);
|
||||||
initializeProfileSwitchData(range);
|
initializeProfileSwitchData(range);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initializeTreatmentData(long range) {
|
|
||||||
getAapsLogger().debug(LTag.DATATREATMENTS, "initializeTreatmentData");
|
|
||||||
synchronized (treatments) {
|
|
||||||
treatments.clear();
|
|
||||||
treatments.addAll(getService().getTreatmentDataFromTime(DateUtil.now() - range, false));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeTempBasalData(long range) {
|
private void initializeTempBasalData(long range) {
|
||||||
getAapsLogger().debug(LTag.DATATREATMENTS, "initializeTempBasalData");
|
getAapsLogger().debug(LTag.DATATREATMENTS, "initializeTempBasalData");
|
||||||
synchronized (tempBasals) {
|
synchronized (tempBasals) {
|
||||||
|
@ -229,12 +217,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IobTotal getLastCalculationTreatments() {
|
public IobTotal getCalculationToTimeExtendedBoluses(long time) {
|
||||||
return lastTreatmentCalculation;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IobTotal getCalculationToTimeTreatments(long time) {
|
|
||||||
IobTotal total = new IobTotal(time);
|
IobTotal total = new IobTotal(time);
|
||||||
|
|
||||||
Profile profile = profileFunction.getProfile();
|
Profile profile = profileFunction.getProfile();
|
||||||
|
@ -243,29 +226,6 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
|
|
||||||
PumpInterface pumpInterface = activePlugin.getActivePump();
|
PumpInterface pumpInterface = activePlugin.getActivePump();
|
||||||
|
|
||||||
double dia = profile.getDia();
|
|
||||||
|
|
||||||
synchronized (treatments) {
|
|
||||||
for (int pos = 0; pos < treatments.size(); pos++) {
|
|
||||||
Treatment t = treatments.get(pos);
|
|
||||||
if (!t.isValid) continue;
|
|
||||||
if (t.date > time) continue;
|
|
||||||
Iob tIOB = t.iobCalc(time, dia);
|
|
||||||
total.iob += tIOB.getIobContrib();
|
|
||||||
total.activity += tIOB.getActivityContrib();
|
|
||||||
if (t.insulin > 0 && t.date > total.lastBolusTime)
|
|
||||||
total.lastBolusTime = t.date;
|
|
||||||
if (!t.isSMB) {
|
|
||||||
// instead of dividing the DIA that only worked on the bilinear curves,
|
|
||||||
// multiply the time the treatment is seen active.
|
|
||||||
long timeSinceTreatment = time - t.date;
|
|
||||||
long snoozeTime = t.date + (long) (timeSinceTreatment * sp.getDouble(R.string.key_openapsama_bolussnooze_dia_divisor, 2.0));
|
|
||||||
Iob bIOB = t.iobCalc(snoozeTime, dia);
|
|
||||||
total.bolussnooze += bIOB.getIobContrib();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pumpInterface.isFakingTempsByExtendedBoluses())
|
if (!pumpInterface.isFakingTempsByExtendedBoluses())
|
||||||
synchronized (extendedBoluses) {
|
synchronized (extendedBoluses) {
|
||||||
for (int pos = 0; pos < extendedBoluses.size(); pos++) {
|
for (int pos = 0; pos < extendedBoluses.size(); pos++) {
|
||||||
|
@ -278,19 +238,6 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateTotalIOBTreatments() {
|
|
||||||
lastTreatmentCalculation = getCalculationToTimeTreatments(System.currentTimeMillis());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Treatment> getTreatmentsFromHistory() {
|
|
||||||
synchronized (treatments) {
|
|
||||||
return new ArrayList<>(treatments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all Treatments after specified timestamp. Also returns invalid entries (required to
|
* Returns all Treatments after specified timestamp. Also returns invalid entries (required to
|
||||||
* map "Fill Canula" entries to history (and not to add double bolus for it)
|
* map "Fill Canula" entries to history (and not to add double bolus for it)
|
||||||
|
@ -298,8 +245,15 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
* @param fromTimestamp
|
* @param fromTimestamp
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public List<Treatment> getTreatmentsFromHistoryAfterTimestamp(long fromTimestamp) {
|
public List<Treatment> getTreatmentsFromHistoryAfterTimestamp(long fromTimestamp) {
|
||||||
|
return repository.getBolusesIncludingInvalidFromTimeToTime(fromTimestamp, dateUtil._now(), true)
|
||||||
|
.blockingGet()
|
||||||
|
.stream()
|
||||||
|
.map(bolus -> new Treatment(getInjector(), bolus))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
/*
|
||||||
List<Treatment> in5minback = new ArrayList<>();
|
List<Treatment> in5minback = new ArrayList<>();
|
||||||
|
|
||||||
long time = System.currentTimeMillis();
|
long time = System.currentTimeMillis();
|
||||||
|
@ -307,27 +261,13 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
// getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: AllTreatmentsInDb: " + new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(treatments));
|
// getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: AllTreatmentsInDb: " + new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(treatments));
|
||||||
|
|
||||||
for (Treatment t : treatments) {
|
for (Treatment t : treatments) {
|
||||||
if (t.date <= time && t.date >= fromTimestamp)
|
if (t.date >= fromTimestamp && t.date <= time)
|
||||||
in5minback.add(t);
|
in5minback.add(t);
|
||||||
}
|
}
|
||||||
// getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: FilteredTreatments: AfterTime={}, Items={} " + fromTimestamp + " " + new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(in5minback));
|
// getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: FilteredTreatments: AfterTime={}, Items={} " + fromTimestamp + " " + new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(in5minback));
|
||||||
return in5minback;
|
return in5minback;
|
||||||
}
|
}
|
||||||
}
|
*/
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Treatment> getCarbTreatments5MinBackFromHistory(long time) {
|
|
||||||
List<Treatment> in5minback = new ArrayList<>();
|
|
||||||
synchronized (treatments) {
|
|
||||||
for (Treatment t : treatments) {
|
|
||||||
if (!t.isValid)
|
|
||||||
continue;
|
|
||||||
if (t.date <= time && t.date > time - 5 * 60 * 1000 && t.carbs > 0)
|
|
||||||
in5minback.add(t);
|
|
||||||
}
|
|
||||||
return in5minback;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -399,7 +339,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IobTotal getLastCalculationTempBasals() {
|
public IobTotal getLastCalculationTempBasals() {
|
||||||
return lastTempBasalsCalculation;
|
return getCalculationToTimeTempBasals(DateUtil.now());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -537,11 +477,6 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateTotalIOBTempBasals() {
|
|
||||||
lastTempBasalsCalculation = getCalculationToTimeTempBasals(DateUtil.now());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public TemporaryBasal getTempBasalFromHistory(long time) {
|
public TemporaryBasal getTempBasalFromHistory(long time) {
|
||||||
|
@ -692,10 +627,12 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
||||||
if (extendedBoluses.size() > 0)
|
if (extendedBoluses.size() > 0)
|
||||||
oldestTime = Math.min(oldestTime, extendedBoluses.get(0).date);
|
oldestTime = Math.min(oldestTime, extendedBoluses.get(0).date);
|
||||||
}
|
}
|
||||||
synchronized (treatments) {
|
Bolus oldestBolus = repository.getOldestBolusRecord();
|
||||||
if (treatments.size() > 0)
|
if (oldestBolus != null)
|
||||||
oldestTime = Math.min(oldestTime, treatments.get(treatments.size() - 1).date);
|
oldestTime = Math.min(oldestTime, oldestBolus.getTimestamp());
|
||||||
}
|
Carbs oldestCarbs = repository.getOldestCarbsRecord();
|
||||||
|
if (oldestCarbs != null)
|
||||||
|
oldestTime = Math.min(oldestTime, oldestCarbs.getTimestamp());
|
||||||
oldestTime -= 15 * 60 * 1000L; // allow 15 min before
|
oldestTime -= 15 * 60 * 1000L; // allow 15 min before
|
||||||
return oldestTime;
|
return oldestTime;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.logging.LTag
|
import info.nightscout.androidaps.logging.LTag
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissBolusProgressIfRunning
|
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissBolusProgressIfRunning
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification
|
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
|
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
|
||||||
|
@ -61,8 +60,7 @@ open class CommandQueue @Inject constructor(
|
||||||
private val buildHelper: BuildHelper,
|
private val buildHelper: BuildHelper,
|
||||||
private val dateUtil: DateUtil,
|
private val dateUtil: DateUtil,
|
||||||
private val repository: AppRepository,
|
private val repository: AppRepository,
|
||||||
private val fabricPrivacy: FabricPrivacy,
|
private val fabricPrivacy: FabricPrivacy
|
||||||
private val nsUpload: NSUpload
|
|
||||||
) : CommandQueueProvider {
|
) : CommandQueueProvider {
|
||||||
|
|
||||||
private val disposable = CompositeDisposable()
|
private val disposable = CompositeDisposable()
|
||||||
|
@ -175,7 +173,7 @@ open class CommandQueue @Inject constructor(
|
||||||
|
|
||||||
override fun independentConnect(reason: String, callback: Callback?) {
|
override fun independentConnect(reason: String, callback: Callback?) {
|
||||||
aapsLogger.debug(LTag.PUMPQUEUE, "Starting new queue")
|
aapsLogger.debug(LTag.PUMPQUEUE, "Starting new queue")
|
||||||
val tempCommandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, activePlugin, context, sp, buildHelper, dateUtil, repository, fabricPrivacy, nsUpload)
|
val tempCommandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, activePlugin, context, sp, buildHelper, dateUtil, repository, fabricPrivacy)
|
||||||
tempCommandQueue.readStatus(reason, callback)
|
tempCommandQueue.readStatus(reason, callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
package info.nightscout.androidaps.utils.extensions
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.Constants
|
|
||||||
import info.nightscout.androidaps.database.entities.GlucoseValue
|
|
||||||
import info.nightscout.androidaps.utils.DecimalFormatter
|
|
||||||
|
|
||||||
fun GlucoseValue.valueToUnits(units: String): Double =
|
|
||||||
if (units == Constants.MGDL) value
|
|
||||||
else value * Constants.MGDL_TO_MMOLL
|
|
||||||
|
|
||||||
fun GlucoseValue.valueToUnitsString(units: String): String =
|
|
||||||
if (units == Constants.MGDL) DecimalFormatter.to0Decimal(value)
|
|
||||||
else DecimalFormatter.to1Decimal(value * Constants.MGDL_TO_MMOLL)
|
|
|
@ -42,7 +42,7 @@ class TddCalculator @Inject constructor(
|
||||||
private val dateUtil: DateUtil,
|
private val dateUtil: DateUtil,
|
||||||
uploadQueue: UploadQueueInterface,
|
uploadQueue: UploadQueueInterface,
|
||||||
databaseHelper: DatabaseHelperInterface,
|
databaseHelper: DatabaseHelperInterface,
|
||||||
repository: AppRepository
|
private val repository: AppRepository
|
||||||
) : TreatmentsPlugin(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, context, sp, profileFunction, activePlugin, nsUpload, fabricPrivacy, dateUtil, uploadQueue, databaseHelper, repository) {
|
) : TreatmentsPlugin(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, context, sp, profileFunction, activePlugin, nsUpload, fabricPrivacy, dateUtil, uploadQueue, databaseHelper, repository) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -56,13 +56,16 @@ class TddCalculator @Inject constructor(
|
||||||
initializeData(range)
|
initializeData(range)
|
||||||
|
|
||||||
val result = LongSparseArray<TDD>()
|
val result = LongSparseArray<TDD>()
|
||||||
for (t in treatmentsFromHistory) {
|
repository.getBolusesDataFromTimeToTime(startTime, endTime, true).blockingGet().forEach { t->
|
||||||
if (!t.isValid) continue
|
val midnight = MidnightTime.calc(t.timestamp)
|
||||||
if (t.date < startTime || t.date > endTime) continue
|
|
||||||
val midnight = MidnightTime.calc(t.date)
|
|
||||||
val tdd = result[midnight] ?: TDD(midnight, 0.0, 0.0, 0.0)
|
val tdd = result[midnight] ?: TDD(midnight, 0.0, 0.0, 0.0)
|
||||||
tdd.bolus += t.insulin
|
tdd.bolus += t.amount
|
||||||
tdd.carbs += t.carbs
|
result.put(midnight, tdd)
|
||||||
|
}
|
||||||
|
repository.getCarbsDataFromTimeToTime(startTime, endTime, true).blockingGet().forEach { t->
|
||||||
|
val midnight = MidnightTime.calc(t.timestamp)
|
||||||
|
val tdd = result[midnight] ?: TDD(midnight, 0.0, 0.0, 0.0)
|
||||||
|
tdd.carbs += t.amount
|
||||||
result.put(midnight, tdd)
|
result.put(midnight, tdd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@ import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
|
||||||
import info.nightscout.androidaps.queue.Callback
|
import info.nightscout.androidaps.queue.Callback
|
||||||
import info.nightscout.androidaps.utils.CarbTimer
|
import info.nightscout.androidaps.utils.CarbTimer
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
|
@ -57,7 +56,7 @@ class BolusWizard @Inject constructor(
|
||||||
@Inject lateinit var activePlugin: ActivePluginProvider
|
@Inject lateinit var activePlugin: ActivePluginProvider
|
||||||
@Inject lateinit var commandQueue: CommandQueueProvider
|
@Inject lateinit var commandQueue: CommandQueueProvider
|
||||||
@Inject lateinit var loopPlugin: LoopPlugin
|
@Inject lateinit var loopPlugin: LoopPlugin
|
||||||
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
|
@Inject lateinit var iobCobCalculator: IobCobCalculator
|
||||||
@Inject lateinit var dateUtil: DateUtil
|
@Inject lateinit var dateUtil: DateUtil
|
||||||
@Inject lateinit var config: Config
|
@Inject lateinit var config: Config
|
||||||
@Inject lateinit var uel: UserEntryLogger
|
@Inject lateinit var uel: UserEntryLogger
|
||||||
|
@ -206,9 +205,7 @@ class BolusWizard @Inject constructor(
|
||||||
|
|
||||||
// Insulin from IOB
|
// Insulin from IOB
|
||||||
// IOB calculation
|
// IOB calculation
|
||||||
activePlugin.activeTreatments.updateTotalIOBTreatments()
|
val bolusIob = iobCobCalculator.calculateIobFromBolus().round()
|
||||||
val bolusIob = activePlugin.activeTreatments.lastCalculationTreatments.round()
|
|
||||||
activePlugin.activeTreatments.updateTotalIOBTempBasals()
|
|
||||||
val basalIob = activePlugin.activeTreatments.lastCalculationTempBasals.round()
|
val basalIob = activePlugin.activeTreatments.lastCalculationTempBasals.round()
|
||||||
|
|
||||||
insulinFromBolusIOB = if (includeBolusIOB) -bolusIob.iob else 0.0
|
insulinFromBolusIOB = if (includeBolusIOB) -bolusIob.iob else 0.0
|
||||||
|
@ -300,7 +297,7 @@ class BolusWizard @Inject constructor(
|
||||||
}
|
}
|
||||||
if (insulinFromCOB > 0) {
|
if (insulinFromCOB > 0) {
|
||||||
actions.add(resourceHelper.gs(R.string.cobvsiob) + ": " + resourceHelper.gs(R.string.formatsignedinsulinunits, insulinFromBolusIOB + insulinFromBasalIOB + insulinFromCOB + insulinFromBG).formatColor(resourceHelper, R.color.cobAlert))
|
actions.add(resourceHelper.gs(R.string.cobvsiob) + ": " + resourceHelper.gs(R.string.formatsignedinsulinunits, insulinFromBolusIOB + insulinFromBasalIOB + insulinFromCOB + insulinFromBG).formatColor(resourceHelper, R.color.cobAlert))
|
||||||
val absorptionRate = iobCobCalculatorPlugin.slowAbsorptionPercentage(60)
|
val absorptionRate = iobCobCalculator.slowAbsorptionPercentage(60)
|
||||||
if (absorptionRate > .25)
|
if (absorptionRate > .25)
|
||||||
actions.add(resourceHelper.gs(R.string.slowabsorptiondetected, resourceHelper.gc(R.color.cobAlert), (absorptionRate * 100).toInt()))
|
actions.add(resourceHelper.gs(R.string.slowabsorptiondetected, resourceHelper.gc(R.color.cobAlert), (absorptionRate * 100).toInt()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import info.nightscout.androidaps.database.entities.GlucoseValue
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
||||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
|
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
|
||||||
|
@ -99,7 +98,6 @@ class QuickWizardEntry @Inject constructor(private val injector: HasAndroidInjec
|
||||||
bolusIOB = true
|
bolusIOB = true
|
||||||
}
|
}
|
||||||
// Basal IOB
|
// Basal IOB
|
||||||
treatmentsPlugin.updateTotalIOBTempBasals()
|
|
||||||
val basalIob = treatmentsPlugin.lastCalculationTempBasals.round()
|
val basalIob = treatmentsPlugin.lastCalculationTempBasals.round()
|
||||||
var basalIOB = false
|
var basalIOB = false
|
||||||
if (useBasalIOB() == YES) {
|
if (useBasalIOB() == YES) {
|
||||||
|
|
|
@ -4,7 +4,6 @@ import android.content.Context
|
||||||
import dagger.android.AndroidInjector
|
import dagger.android.AndroidInjector
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.Config
|
import info.nightscout.androidaps.Config
|
||||||
import info.nightscout.androidaps.MainApp
|
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.TestBaseWithProfile
|
import info.nightscout.androidaps.TestBaseWithProfile
|
||||||
import info.nightscout.androidaps.dana.DanaPump
|
import info.nightscout.androidaps.dana.DanaPump
|
||||||
|
@ -63,7 +62,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
||||||
@Mock lateinit var commandQueue: CommandQueueProvider
|
@Mock lateinit var commandQueue: CommandQueueProvider
|
||||||
@Mock lateinit var detailedBolusInfoStorage: DetailedBolusInfoStorage
|
@Mock lateinit var detailedBolusInfoStorage: DetailedBolusInfoStorage
|
||||||
@Mock lateinit var context: Context
|
@Mock lateinit var context: Context
|
||||||
@Mock lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
|
@Mock lateinit var iobCobCalculator: IobCobCalculator
|
||||||
@Mock lateinit var glimpPlugin: GlimpPlugin
|
@Mock lateinit var glimpPlugin: GlimpPlugin
|
||||||
@Mock lateinit var sensitivityOref1Plugin: SensitivityOref1Plugin
|
@Mock lateinit var sensitivityOref1Plugin: SensitivityOref1Plugin
|
||||||
@Mock lateinit var profiler: Profiler
|
@Mock lateinit var profiler: Profiler
|
||||||
|
@ -73,6 +72,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
||||||
@Mock lateinit var loggerUtils: LoggerUtils
|
@Mock lateinit var loggerUtils: LoggerUtils
|
||||||
@Mock lateinit var databaseHelper: DatabaseHelperInterface
|
@Mock lateinit var databaseHelper: DatabaseHelperInterface
|
||||||
@Mock lateinit var repository: AppRepository
|
@Mock lateinit var repository: AppRepository
|
||||||
|
@Mock lateinit var pumpSync: PumpSync
|
||||||
|
|
||||||
private lateinit var danaPump: DanaPump
|
private lateinit var danaPump: DanaPump
|
||||||
|
|
||||||
|
@ -136,18 +136,18 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
||||||
`when`(activePlugin.activePump).thenReturn(virtualPumpPlugin)
|
`when`(activePlugin.activePump).thenReturn(virtualPumpPlugin)
|
||||||
constraintChecker = ConstraintChecker(activePlugin)
|
constraintChecker = ConstraintChecker(activePlugin)
|
||||||
|
|
||||||
val glucoseStatusProvider = GlucoseStatusProvider(aapsLogger = aapsLogger, iobCobCalculatorPlugin = iobCobCalculatorPlugin)
|
val glucoseStatusProvider = GlucoseStatusProvider(aapsLogger = aapsLogger, iobCobCalculator = iobCobCalculator)
|
||||||
|
|
||||||
|
|
||||||
danaPump = DanaPump(aapsLogger, sp, injector)
|
danaPump = DanaPump(aapsLogger, sp, injector)
|
||||||
hardLimits = HardLimits(aapsLogger, rxBus, sp, resourceHelper, context, nsUpload)
|
hardLimits = HardLimits(aapsLogger, rxBus, sp, resourceHelper, context, repository)
|
||||||
objectivesPlugin = ObjectivesPlugin(injector, aapsLogger, resourceHelper, activePlugin, sp, Config(), uel)
|
objectivesPlugin = ObjectivesPlugin(injector, aapsLogger, resourceHelper, activePlugin, sp, Config(), uel)
|
||||||
comboPlugin = ComboPlugin(injector, aapsLogger, rxBus, resourceHelper, profileFunction, treatmentsInterface, sp, commandQueue, context, databaseHelper)
|
comboPlugin = ComboPlugin(injector, aapsLogger, rxBus, resourceHelper, profileFunction, treatmentsInterface, sp, commandQueue, context, databaseHelper)
|
||||||
danaRPlugin = DanaRPlugin(injector, aapsLogger, aapsSchedulers, rxBus, context, resourceHelper, constraintChecker, activePlugin, sp, commandQueue, danaPump, dateUtil, fabricPrivacy)
|
danaRPlugin = DanaRPlugin(injector, aapsLogger, aapsSchedulers, rxBus, context, resourceHelper, constraintChecker, activePlugin, sp, commandQueue, danaPump, dateUtil, fabricPrivacy)
|
||||||
danaRSPlugin = DanaRSPlugin(injector, aapsLogger, aapsSchedulers, rxBus, context, resourceHelper, constraintChecker, profileFunction, activePluginProvider, sp, commandQueue, danaPump, detailedBolusInfoStorage, fabricPrivacy, dateUtil)
|
danaRSPlugin = DanaRSPlugin(injector, aapsLogger, aapsSchedulers, rxBus, context, resourceHelper, constraintChecker, profileFunction, activePluginProvider, sp, commandQueue, danaPump, detailedBolusInfoStorage, fabricPrivacy, dateUtil)
|
||||||
insightPlugin = LocalInsightPlugin(injector, aapsLogger, rxBus, resourceHelper, treatmentsInterface, sp, commandQueue, profileFunction, nsUpload, context, uploadQueue, Config(), dateUtil, databaseHelper, repository)
|
insightPlugin = LocalInsightPlugin(injector, aapsLogger, rxBus, resourceHelper, treatmentsInterface, sp, commandQueue, profileFunction, nsUpload, context, uploadQueue, Config(), dateUtil, databaseHelper, pumpSync)
|
||||||
openAPSSMBPlugin = OpenAPSSMBPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsInterface, iobCobCalculatorPlugin, hardLimits, profiler, sp, dateUtil, repository, glucoseStatusProvider)
|
openAPSSMBPlugin = OpenAPSSMBPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsInterface, iobCobCalculator, hardLimits, profiler, sp, dateUtil, repository, glucoseStatusProvider)
|
||||||
openAPSAMAPlugin = OpenAPSAMAPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsInterface, iobCobCalculatorPlugin, hardLimits, profiler, fabricPrivacy, dateUtil, repository, glucoseStatusProvider)
|
openAPSAMAPlugin = OpenAPSAMAPlugin(injector, aapsLogger, rxBus, constraintChecker, resourceHelper, profileFunction, context, activePlugin, treatmentsInterface, iobCobCalculator, hardLimits, profiler, fabricPrivacy, dateUtil, repository, glucoseStatusProvider)
|
||||||
safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, BuildHelper(Config(), loggerUtils), treatmentsInterface, Config())
|
safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, BuildHelper(Config(), loggerUtils), treatmentsInterface, Config())
|
||||||
val constraintsPluginsList = ArrayList<PluginBase>()
|
val constraintsPluginsList = ArrayList<PluginBase>()
|
||||||
constraintsPluginsList.add(safetyPlugin)
|
constraintsPluginsList.add(safetyPlugin)
|
||||||
|
|
|
@ -27,9 +27,14 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
import org.mockito.Mockito.`when`
|
import org.mockito.Mockito.`when`
|
||||||
|
import org.powermock.core.classloader.annotations.PrepareForTest
|
||||||
|
import org.powermock.modules.junit4.PowerMockRunner
|
||||||
|
|
||||||
|
@RunWith(PowerMockRunner::class)
|
||||||
|
@PrepareForTest(ConstraintChecker::class, ReceiverStatusStore::class)
|
||||||
class LoopPluginTest : TestBase() {
|
class LoopPluginTest : TestBase() {
|
||||||
|
|
||||||
@Mock lateinit var sp: SP
|
@Mock lateinit var sp: SP
|
||||||
|
|
|
@ -7,13 +7,13 @@ import info.nightscout.androidaps.Config
|
||||||
import info.nightscout.androidaps.Constants
|
import info.nightscout.androidaps.Constants
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.TestBaseWithProfile
|
import info.nightscout.androidaps.TestBaseWithProfile
|
||||||
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
||||||
import info.nightscout.androidaps.interfaces.Constraint
|
import info.nightscout.androidaps.interfaces.Constraint
|
||||||
import info.nightscout.androidaps.interfaces.PumpDescription
|
import info.nightscout.androidaps.interfaces.PumpDescription
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
|
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
|
||||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
|
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
|
||||||
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
|
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
|
||||||
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin
|
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin
|
||||||
import info.nightscout.androidaps.plugins.source.GlimpPlugin
|
import info.nightscout.androidaps.plugins.source.GlimpPlugin
|
||||||
|
@ -43,7 +43,7 @@ class SafetyPluginTest : TestBaseWithProfile() {
|
||||||
@Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin
|
@Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin
|
||||||
@Mock lateinit var glimpPlugin: GlimpPlugin
|
@Mock lateinit var glimpPlugin: GlimpPlugin
|
||||||
@Mock lateinit var context: Context
|
@Mock lateinit var context: Context
|
||||||
@Mock lateinit var nsUpload: NSUpload
|
@Mock lateinit var repository: AppRepository
|
||||||
|
|
||||||
private lateinit var hardLimits: HardLimits
|
private lateinit var hardLimits: HardLimits
|
||||||
private lateinit var safetyPlugin: SafetyPlugin
|
private lateinit var safetyPlugin: SafetyPlugin
|
||||||
|
@ -75,7 +75,7 @@ class SafetyPluginTest : TestBaseWithProfile() {
|
||||||
|
|
||||||
`when`(activePlugin.activePump).thenReturn(virtualPumpPlugin)
|
`when`(activePlugin.activePump).thenReturn(virtualPumpPlugin)
|
||||||
`when`(virtualPumpPlugin.pumpDescription).thenReturn(pumpDescription)
|
`when`(virtualPumpPlugin.pumpDescription).thenReturn(pumpDescription)
|
||||||
hardLimits = HardLimits(aapsLogger, rxBus, sp, resourceHelper, context, nsUpload)
|
hardLimits = HardLimits(aapsLogger, rxBus, sp, resourceHelper, context, repository)
|
||||||
safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, buildHelper, treatmentsInterface, Config())
|
safetyPlugin = SafetyPlugin(injector, aapsLogger, resourceHelper, sp, rxBus, constraintChecker, openAPSAMAPlugin, openAPSSMBPlugin, sensitivityOref1Plugin, activePlugin, hardLimits, buildHelper, treatmentsInterface, Config())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,7 @@ import info.nightscout.androidaps.data.PumpEnactResult
|
||||||
import info.nightscout.androidaps.database.AppRepository
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.database.entities.GlucoseValue
|
import info.nightscout.androidaps.database.entities.GlucoseValue
|
||||||
import info.nightscout.androidaps.database.transactions.InsertTemporaryTargetAndCancelCurrentTransaction
|
import info.nightscout.androidaps.database.transactions.InsertTemporaryTargetAndCancelCurrentTransaction
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.*
|
||||||
import info.nightscout.androidaps.interfaces.CommandQueueProvider
|
|
||||||
import info.nightscout.androidaps.interfaces.Constraint
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginType
|
|
||||||
import info.nightscout.androidaps.interfaces.PumpDescription
|
|
||||||
import info.nightscout.androidaps.logging.UserEntryLogger
|
import info.nightscout.androidaps.logging.UserEntryLogger
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
|
@ -70,7 +66,7 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
|
||||||
@Mock lateinit var activePlugin: ActivePluginProvider
|
@Mock lateinit var activePlugin: ActivePluginProvider
|
||||||
@Mock lateinit var commandQueue: CommandQueueProvider
|
@Mock lateinit var commandQueue: CommandQueueProvider
|
||||||
@Mock lateinit var loopPlugin: LoopPlugin
|
@Mock lateinit var loopPlugin: LoopPlugin
|
||||||
@Mock lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
|
@Mock lateinit var iobCobCalculator: IobCobCalculator
|
||||||
@Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin
|
@Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin
|
||||||
@Mock lateinit var localProfilePlugin: LocalProfilePlugin
|
@Mock lateinit var localProfilePlugin: LocalProfilePlugin
|
||||||
@Mock lateinit var treatmentService: TreatmentService
|
@Mock lateinit var treatmentService: TreatmentService
|
||||||
|
@ -102,10 +98,10 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
|
||||||
val bgList: MutableList<GlucoseValue> = ArrayList()
|
val bgList: MutableList<GlucoseValue> = ArrayList()
|
||||||
bgList.add(reading)
|
bgList.add(reading)
|
||||||
|
|
||||||
`when`(iobCobCalculatorPlugin.dataLock).thenReturn(Unit)
|
`when`(iobCobCalculator.dataLock).thenReturn(Any())
|
||||||
`when`(iobCobCalculatorPlugin.bgReadings).thenReturn(bgList)
|
`when`(iobCobCalculator.bgReadings).thenReturn(bgList)
|
||||||
`when`(iobCobCalculatorPlugin.getCobInfo(false, "SMS COB")).thenReturn(CobInfo(10.0, 2.0))
|
`when`(iobCobCalculator.getCobInfo(false, "SMS COB")).thenReturn(CobInfo(10.0, 2.0))
|
||||||
`when`(iobCobCalculatorPlugin.lastBg()).thenReturn(reading)
|
`when`(iobCobCalculator.lastBg()).thenReturn(reading)
|
||||||
|
|
||||||
PowerMockito.spy(DateUtil::class.java)
|
PowerMockito.spy(DateUtil::class.java)
|
||||||
PowerMockito.mockStatic(SmsManager::class.java)
|
PowerMockito.mockStatic(SmsManager::class.java)
|
||||||
|
@ -117,9 +113,9 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
|
||||||
repository.runTransactionForResult(anyObject<InsertTemporaryTargetAndCancelCurrentTransaction>())
|
repository.runTransactionForResult(anyObject<InsertTemporaryTargetAndCancelCurrentTransaction>())
|
||||||
).thenReturn(Single.just(InsertTemporaryTargetAndCancelCurrentTransaction.TransactionResult().apply {
|
).thenReturn(Single.just(InsertTemporaryTargetAndCancelCurrentTransaction.TransactionResult().apply {
|
||||||
}))
|
}))
|
||||||
val glucoseStatusProvider = GlucoseStatusProvider(aapsLogger = aapsLogger, iobCobCalculatorPlugin = iobCobCalculatorPlugin)
|
val glucoseStatusProvider = GlucoseStatusProvider(aapsLogger = aapsLogger, iobCobCalculator = iobCobCalculator)
|
||||||
|
|
||||||
smsCommunicatorPlugin = SmsCommunicatorPlugin(injector, aapsLogger, resourceHelper, aapsSchedulers, sp, constraintChecker, rxBus, profileFunction, fabricPrivacy, activePlugin, commandQueue, loopPlugin, iobCobCalculatorPlugin, xdripCalibrations, otp, Config(), DateUtil(context), uel, nsUpload, glucoseStatusProvider, repository)
|
smsCommunicatorPlugin = SmsCommunicatorPlugin(injector, aapsLogger, resourceHelper, aapsSchedulers, sp, constraintChecker, rxBus, profileFunction, fabricPrivacy, activePlugin, commandQueue, loopPlugin, iobCobCalculator, xdripCalibrations, otp, Config(), DateUtil(context), uel, glucoseStatusProvider, repository)
|
||||||
smsCommunicatorPlugin.setPluginEnabled(PluginType.GENERAL, true)
|
smsCommunicatorPlugin.setPluginEnabled(PluginType.GENERAL, true)
|
||||||
Mockito.doAnswer { invocation: InvocationOnMock ->
|
Mockito.doAnswer { invocation: InvocationOnMock ->
|
||||||
val callback = invocation.getArgument<Callback>(1)
|
val callback = invocation.getArgument<Callback>(1)
|
||||||
|
@ -172,7 +168,7 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
|
||||||
`when`(virtualPumpPlugin.pumpDescription).thenReturn(PumpDescription())
|
`when`(virtualPumpPlugin.pumpDescription).thenReturn(PumpDescription())
|
||||||
`when`(virtualPumpPlugin.model()).thenReturn(PumpType.GENERIC_AAPS)
|
`when`(virtualPumpPlugin.model()).thenReturn(PumpType.GENERIC_AAPS)
|
||||||
|
|
||||||
`when`(treatmentsInterface.lastCalculationTreatments).thenReturn(IobTotal(0))
|
`when`(iobCobCalculator.calculateIobFromBolus()).thenReturn(IobTotal(0))
|
||||||
`when`(treatmentsInterface.lastCalculationTempBasals).thenReturn(IobTotal(0))
|
`when`(treatmentsInterface.lastCalculationTempBasals).thenReturn(IobTotal(0))
|
||||||
`when`(treatmentsInterface.service).thenReturn(treatmentService)
|
`when`(treatmentsInterface.service).thenReturn(treatmentService)
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.TestBase
|
import info.nightscout.androidaps.TestBase
|
||||||
import info.nightscout.androidaps.interfaces.CommandQueueProvider
|
import info.nightscout.androidaps.interfaces.CommandQueueProvider
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
|
import info.nightscout.androidaps.interfaces.PumpSync
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType
|
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType
|
||||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
|
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
|
||||||
|
@ -34,12 +35,13 @@ class VirtualPumpPluginUTest : TestBase() {
|
||||||
@Mock lateinit var treatmentsPlugin: TreatmentsPlugin
|
@Mock lateinit var treatmentsPlugin: TreatmentsPlugin
|
||||||
@Mock lateinit var commandQueue: CommandQueueProvider
|
@Mock lateinit var commandQueue: CommandQueueProvider
|
||||||
@Mock lateinit var dateUtil: DateUtil
|
@Mock lateinit var dateUtil: DateUtil
|
||||||
|
@Mock lateinit var pumpSync: PumpSync
|
||||||
|
|
||||||
lateinit var virtualPumpPlugin: VirtualPumpPlugin
|
lateinit var virtualPumpPlugin: VirtualPumpPlugin
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun prepareMocks() {
|
fun prepareMocks() {
|
||||||
virtualPumpPlugin = VirtualPumpPlugin({ AndroidInjector { } }, aapsLogger, rxBus, fabricPrivacy, resourceHelper, aapsSchedulers, sp, profileFunction, treatmentsPlugin, commandQueue, Config(), dateUtil)
|
virtualPumpPlugin = VirtualPumpPlugin({ AndroidInjector { } }, aapsLogger, rxBus, fabricPrivacy, resourceHelper, aapsSchedulers, sp, profileFunction, treatmentsPlugin, commandQueue, pumpSync, Config(), dateUtil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -3,7 +3,7 @@ package info.nightscout.androidaps.plugins.sensitivity
|
||||||
import dagger.android.AndroidInjector
|
import dagger.android.AndroidInjector
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.TestBase
|
import info.nightscout.androidaps.TestBase
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription
|
import info.nightscout.androidaps.interfaces.PluginDescription
|
||||||
import info.nightscout.androidaps.interfaces.SensitivityInterface
|
import info.nightscout.androidaps.interfaces.SensitivityInterface
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
|
@ -26,7 +26,7 @@ class AbstractSensitivityPluginTest : TestBase() {
|
||||||
|
|
||||||
private inner class SensitivityTestClass(pluginDescription: PluginDescription, aapsLogger: AAPSLogger, resourceHelper: ResourceHelper, sp: SP) : AbstractSensitivityPlugin(pluginDescription, HasAndroidInjector { AndroidInjector { } }, aapsLogger, resourceHelper, sp) {
|
private inner class SensitivityTestClass(pluginDescription: PluginDescription, aapsLogger: AAPSLogger, resourceHelper: ResourceHelper, sp: SP) : AbstractSensitivityPlugin(pluginDescription, HasAndroidInjector { AndroidInjector { } }, aapsLogger, resourceHelper, sp) {
|
||||||
|
|
||||||
override fun detectSensitivity(plugin: IobCobCalculatorInterface, fromTime: Long, toTime: Long): AutosensResult {
|
override fun detectSensitivity(plugin: IobCobCalculator, fromTime: Long, toTime: Long): AutosensResult {
|
||||||
return AutosensResult()
|
return AutosensResult()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,21 +3,23 @@ package info.nightscout.androidaps.plugins.source
|
||||||
import dagger.android.AndroidInjector
|
import dagger.android.AndroidInjector
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.TestBase
|
import info.nightscout.androidaps.TestBase
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
|
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
|
|
||||||
class GlimpPluginTest : TestBase() {
|
class GlimpPluginTest : TestBase() {
|
||||||
|
|
||||||
private lateinit var glimpPlugin: GlimpPlugin
|
private lateinit var glimpPlugin: GlimpPlugin
|
||||||
|
|
||||||
@Mock lateinit var resourceHelper: ResourceHelper
|
@Mock lateinit var resourceHelper: ResourceHelper
|
||||||
|
@Mock lateinit var sp: SP
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setup() {
|
fun setup() {
|
||||||
glimpPlugin = GlimpPlugin(HasAndroidInjector { AndroidInjector { } }, resourceHelper, aapsLogger)
|
glimpPlugin = GlimpPlugin(HasAndroidInjector { AndroidInjector { } }, resourceHelper, aapsLogger, sp)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test fun advancedFilteringSupported() {
|
@Test fun advancedFilteringSupported() {
|
||||||
|
|
|
@ -3,8 +3,8 @@ package info.nightscout.androidaps.plugins.source
|
||||||
import dagger.android.AndroidInjector
|
import dagger.android.AndroidInjector
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.TestBase
|
import info.nightscout.androidaps.TestBase
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
|
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
@ -18,10 +18,11 @@ class MM640GPluginTest : TestBase() {
|
||||||
private lateinit var mM640gPlugin: MM640gPlugin
|
private lateinit var mM640gPlugin: MM640gPlugin
|
||||||
|
|
||||||
@Mock lateinit var resourceHelper: ResourceHelper
|
@Mock lateinit var resourceHelper: ResourceHelper
|
||||||
|
@Mock lateinit var sp: SP
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setup() {
|
fun setup() {
|
||||||
mM640gPlugin = MM640gPlugin(HasAndroidInjector { AndroidInjector { } }, resourceHelper, aapsLogger)
|
mM640gPlugin = MM640gPlugin(HasAndroidInjector { AndroidInjector { } }, resourceHelper, aapsLogger, sp)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test fun advancedFilteringSupported() {
|
@Test fun advancedFilteringSupported() {
|
||||||
|
|
|
@ -10,7 +10,7 @@ import info.nightscout.androidaps.TestBaseWithProfile
|
||||||
import info.nightscout.androidaps.TestPumpPlugin
|
import info.nightscout.androidaps.TestPumpPlugin
|
||||||
import info.nightscout.androidaps.core.R
|
import info.nightscout.androidaps.core.R
|
||||||
import info.nightscout.androidaps.data.DetailedBolusInfo
|
import info.nightscout.androidaps.data.DetailedBolusInfo
|
||||||
import info.nightscout.androidaps.database.entities.Bolus
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
||||||
import info.nightscout.androidaps.interfaces.Constraint
|
import info.nightscout.androidaps.interfaces.Constraint
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
|
@ -51,6 +51,7 @@ class CommandQueueTest : TestBaseWithProfile() {
|
||||||
@Mock lateinit var sp: SP
|
@Mock lateinit var sp: SP
|
||||||
@Mock lateinit var loggerUtils: LoggerUtils
|
@Mock lateinit var loggerUtils: LoggerUtils
|
||||||
@Mock lateinit var powerManager: PowerManager
|
@Mock lateinit var powerManager: PowerManager
|
||||||
|
@Mock lateinit var repository: AppRepository
|
||||||
|
|
||||||
class CommandQueueMocked(
|
class CommandQueueMocked(
|
||||||
injector: HasAndroidInjector,
|
injector: HasAndroidInjector,
|
||||||
|
@ -64,8 +65,10 @@ class CommandQueueTest : TestBaseWithProfile() {
|
||||||
context: Context,
|
context: Context,
|
||||||
sp: SP,
|
sp: SP,
|
||||||
buildHelper: BuildHelper,
|
buildHelper: BuildHelper,
|
||||||
|
dateUtil: DateUtil,
|
||||||
|
repository: AppRepository,
|
||||||
fabricPrivacy: FabricPrivacy
|
fabricPrivacy: FabricPrivacy
|
||||||
) : CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, activePlugin, context, sp, buildHelper, fabricPrivacy) {
|
) : CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, activePlugin, context, sp, buildHelper, dateUtil, repository, fabricPrivacy) {
|
||||||
|
|
||||||
override fun notifyAboutNewCommand() {}
|
override fun notifyAboutNewCommand() {}
|
||||||
|
|
||||||
|
@ -101,7 +104,7 @@ class CommandQueueTest : TestBaseWithProfile() {
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun prepare() {
|
fun prepare() {
|
||||||
commandQueue = CommandQueueMocked(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, lazyActivePlugin, context, sp, BuildHelper(Config(), loggerUtils), fabricPrivacy)
|
commandQueue = CommandQueueMocked(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, lazyActivePlugin, context, sp, BuildHelper(Config(), loggerUtils), dateUtil, repository, fabricPrivacy)
|
||||||
testPumpPlugin = TestPumpPlugin(injector)
|
testPumpPlugin = TestPumpPlugin(injector)
|
||||||
|
|
||||||
testPumpPlugin.pumpDescription.basalMinimumRate = 0.1
|
testPumpPlugin.pumpDescription.basalMinimumRate = 0.1
|
||||||
|
@ -127,7 +130,7 @@ class CommandQueueTest : TestBaseWithProfile() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun commandIsPickedUp() {
|
fun commandIsPickedUp() {
|
||||||
val commandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, lazyActivePlugin, context, sp, BuildHelper(Config(), loggerUtils), fabricPrivacy)
|
val commandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, lazyActivePlugin, context, sp, BuildHelper(Config(), loggerUtils), dateUtil, repository, fabricPrivacy)
|
||||||
// start with empty queue
|
// start with empty queue
|
||||||
Assert.assertEquals(0, commandQueue.size())
|
Assert.assertEquals(0, commandQueue.size())
|
||||||
|
|
||||||
|
@ -215,7 +218,7 @@ class CommandQueueTest : TestBaseWithProfile() {
|
||||||
Assert.assertEquals(0, commandQueue.size())
|
Assert.assertEquals(0, commandQueue.size())
|
||||||
val smb = DetailedBolusInfo()
|
val smb = DetailedBolusInfo()
|
||||||
smb.lastKnownBolusTime = DateUtil.now()
|
smb.lastKnownBolusTime = DateUtil.now()
|
||||||
smb.bolusType = Bolus.Type.SMB
|
smb.bolusType = DetailedBolusInfo.BolusType.SMB
|
||||||
commandQueue.bolus(smb, null)
|
commandQueue.bolus(smb, null)
|
||||||
commandQueue.bolus(DetailedBolusInfo(), null)
|
commandQueue.bolus(DetailedBolusInfo(), null)
|
||||||
Assert.assertEquals(2, commandQueue.size())
|
Assert.assertEquals(2, commandQueue.size())
|
||||||
|
@ -235,7 +238,7 @@ class CommandQueueTest : TestBaseWithProfile() {
|
||||||
// when
|
// when
|
||||||
commandQueue.bolus(DetailedBolusInfo(), null)
|
commandQueue.bolus(DetailedBolusInfo(), null)
|
||||||
val smb = DetailedBolusInfo()
|
val smb = DetailedBolusInfo()
|
||||||
smb.bolusType = Bolus.Type.SMB
|
smb.bolusType = DetailedBolusInfo.BolusType.SMB
|
||||||
val queued: Boolean = commandQueue.bolus(smb, null)
|
val queued: Boolean = commandQueue.bolus(smb, null)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
|
@ -250,7 +253,7 @@ class CommandQueueTest : TestBaseWithProfile() {
|
||||||
|
|
||||||
// when
|
// when
|
||||||
val bolus = DetailedBolusInfo()
|
val bolus = DetailedBolusInfo()
|
||||||
bolus.bolusType = Bolus.Type.SMB
|
bolus.bolusType = DetailedBolusInfo.BolusType.SMB
|
||||||
bolus.lastKnownBolusTime = 0
|
bolus.lastKnownBolusTime = 0
|
||||||
val queued: Boolean = commandQueue.bolus(bolus, null)
|
val queued: Boolean = commandQueue.bolus(bolus, null)
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.Config
|
import info.nightscout.androidaps.Config
|
||||||
import info.nightscout.androidaps.TestBaseWithProfile
|
import info.nightscout.androidaps.TestBaseWithProfile
|
||||||
import info.nightscout.androidaps.TestPumpPlugin
|
import info.nightscout.androidaps.TestPumpPlugin
|
||||||
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
||||||
import info.nightscout.androidaps.interfaces.Constraint
|
import info.nightscout.androidaps.interfaces.Constraint
|
||||||
import info.nightscout.androidaps.interfaces.PumpDescription
|
import info.nightscout.androidaps.interfaces.PumpDescription
|
||||||
|
@ -44,6 +45,7 @@ class QueueThreadTest : TestBaseWithProfile() {
|
||||||
@Mock lateinit var sp: SP
|
@Mock lateinit var sp: SP
|
||||||
@Mock lateinit var loggerUtils: LoggerUtils
|
@Mock lateinit var loggerUtils: LoggerUtils
|
||||||
@Mock lateinit var powerManager: PowerManager
|
@Mock lateinit var powerManager: PowerManager
|
||||||
|
@Mock lateinit var repository: AppRepository
|
||||||
|
|
||||||
val injector = HasAndroidInjector {
|
val injector = HasAndroidInjector {
|
||||||
AndroidInjector {
|
AndroidInjector {
|
||||||
|
@ -58,13 +60,13 @@ class QueueThreadTest : TestBaseWithProfile() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var pumpPlugin: TestPumpPlugin
|
private lateinit var pumpPlugin: TestPumpPlugin
|
||||||
lateinit var commandQueue: CommandQueue
|
private lateinit var commandQueue: CommandQueue
|
||||||
lateinit var sut: QueueThread
|
private lateinit var sut: QueueThread
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun prepare() {
|
fun prepare() {
|
||||||
pumpPlugin = TestPumpPlugin(injector)
|
pumpPlugin = TestPumpPlugin(injector)
|
||||||
commandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, lazyActivePlugin, context, sp, BuildHelper(Config(), loggerUtils), fabricPrivacy)
|
commandQueue = CommandQueue(injector, aapsLogger, rxBus, aapsSchedulers, resourceHelper, constraintChecker, profileFunction, lazyActivePlugin, context, sp, BuildHelper(Config(), loggerUtils), dateUtil, repository, fabricPrivacy)
|
||||||
|
|
||||||
val pumpDescription = PumpDescription()
|
val pumpDescription = PumpDescription()
|
||||||
pumpDescription.basalMinimumRate = 0.1
|
pumpDescription.basalMinimumRate = 0.1
|
||||||
|
|
|
@ -3,19 +3,14 @@ package info.nightscout.androidaps.utils.wizard
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import dagger.android.AndroidInjector
|
import dagger.android.AndroidInjector
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.TestBase
|
|
||||||
import info.nightscout.androidaps.Constants
|
import info.nightscout.androidaps.Constants
|
||||||
|
import info.nightscout.androidaps.TestBase
|
||||||
import info.nightscout.androidaps.data.IobTotal
|
import info.nightscout.androidaps.data.IobTotal
|
||||||
import info.nightscout.androidaps.data.Profile
|
import info.nightscout.androidaps.data.Profile
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.*
|
||||||
import info.nightscout.androidaps.interfaces.CommandQueueProvider
|
|
||||||
import info.nightscout.androidaps.interfaces.Constraint
|
|
||||||
import info.nightscout.androidaps.interfaces.PumpDescription
|
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
||||||
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
|
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
|
||||||
|
@ -44,7 +39,7 @@ class BolusWizardTest : TestBase() {
|
||||||
@Mock lateinit var activePlugin: ActivePluginProvider
|
@Mock lateinit var activePlugin: ActivePluginProvider
|
||||||
@Mock lateinit var commandQueue: CommandQueueProvider
|
@Mock lateinit var commandQueue: CommandQueueProvider
|
||||||
@Mock lateinit var loopPlugin: LoopPlugin
|
@Mock lateinit var loopPlugin: LoopPlugin
|
||||||
@Mock lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
|
@Mock lateinit var iobCobCalculator: IobCobCalculator
|
||||||
@Mock lateinit var treatmentsPlugin: TreatmentsPlugin
|
@Mock lateinit var treatmentsPlugin: TreatmentsPlugin
|
||||||
@Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin
|
@Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin
|
||||||
|
|
||||||
|
@ -59,8 +54,8 @@ class BolusWizardTest : TestBase() {
|
||||||
it.activePlugin = activePlugin
|
it.activePlugin = activePlugin
|
||||||
it.commandQueue = commandQueue
|
it.commandQueue = commandQueue
|
||||||
it.loopPlugin = loopPlugin
|
it.loopPlugin = loopPlugin
|
||||||
it.iobCobCalculatorPlugin = iobCobCalculatorPlugin
|
it.iobCobCalculator = iobCobCalculator
|
||||||
it.glucoseStatusProvider = GlucoseStatusProvider(aapsLogger = aapsLogger, iobCobCalculatorPlugin = iobCobCalculatorPlugin)
|
it.glucoseStatusProvider = GlucoseStatusProvider(aapsLogger = aapsLogger, iobCobCalculator = iobCobCalculator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,9 +69,9 @@ class BolusWizardTest : TestBase() {
|
||||||
`when`(profile.ic).thenReturn(insulinToCarbRatio)
|
`when`(profile.ic).thenReturn(insulinToCarbRatio)
|
||||||
|
|
||||||
`when`(profileFunction.getUnits()).thenReturn(Constants.MGDL)
|
`when`(profileFunction.getUnits()).thenReturn(Constants.MGDL)
|
||||||
`when`(iobCobCalculatorPlugin.dataLock).thenReturn(Unit)
|
`when`(iobCobCalculator.dataLock).thenReturn(Any())
|
||||||
`when`(activePlugin.activeTreatments).thenReturn(treatmentsPlugin)
|
`when`(activePlugin.activeTreatments).thenReturn(treatmentsPlugin)
|
||||||
`when`(treatmentsPlugin.lastCalculationTreatments).thenReturn(IobTotal(System.currentTimeMillis()))
|
`when`(iobCobCalculator.calculateIobFromBolus()).thenReturn(IobTotal(System.currentTimeMillis()))
|
||||||
`when`(treatmentsPlugin.lastCalculationTempBasals).thenReturn(IobTotal(System.currentTimeMillis()))
|
`when`(treatmentsPlugin.lastCalculationTempBasals).thenReturn(IobTotal(System.currentTimeMillis()))
|
||||||
`when`(activePlugin.activePump).thenReturn(virtualPumpPlugin)
|
`when`(activePlugin.activePump).thenReturn(virtualPumpPlugin)
|
||||||
val pumpDescription = PumpDescription()
|
val pumpDescription = PumpDescription()
|
||||||
|
@ -93,9 +88,9 @@ class BolusWizardTest : TestBase() {
|
||||||
/** Should calculate the same bolus when different blood glucose but both in target range */
|
/** Should calculate the same bolus when different blood glucose but both in target range */
|
||||||
fun shouldCalculateTheSameBolusWhenBGsInRange() {
|
fun shouldCalculateTheSameBolusWhenBGsInRange() {
|
||||||
val profile = setupProfile(4.0, 8.0, 20.0, 12.0)
|
val profile = setupProfile(4.0, 8.0, 20.0, 12.0)
|
||||||
var bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 4.2, 0.0, 100.0, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
var bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 4.2, 0.0, 100, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
||||||
val bolusForBg42 = bw.calculatedTotalInsulin
|
val bolusForBg42 = bw.calculatedTotalInsulin
|
||||||
bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 5.4, 0.0, 100.0, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 5.4, 0.0, 100, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
||||||
val bolusForBg54 = bw.calculatedTotalInsulin
|
val bolusForBg54 = bw.calculatedTotalInsulin
|
||||||
Assert.assertEquals(bolusForBg42, bolusForBg54, 0.01)
|
Assert.assertEquals(bolusForBg42, bolusForBg54, 0.01)
|
||||||
}
|
}
|
||||||
|
@ -103,9 +98,9 @@ class BolusWizardTest : TestBase() {
|
||||||
@Test
|
@Test
|
||||||
fun shouldCalculateHigherBolusWhenHighBG() {
|
fun shouldCalculateHigherBolusWhenHighBG() {
|
||||||
val profile = setupProfile(4.0, 8.0, 20.0, 12.0)
|
val profile = setupProfile(4.0, 8.0, 20.0, 12.0)
|
||||||
var bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 9.8, 0.0, 100.0, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
var bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 9.8, 0.0, 100, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
||||||
val bolusForHighBg = bw.calculatedTotalInsulin
|
val bolusForHighBg = bw.calculatedTotalInsulin
|
||||||
bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 5.4, 0.0, 100.0, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 5.4, 0.0, 100, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
||||||
val bolusForBgInRange = bw.calculatedTotalInsulin
|
val bolusForBgInRange = bw.calculatedTotalInsulin
|
||||||
Assert.assertTrue(bolusForHighBg > bolusForBgInRange)
|
Assert.assertTrue(bolusForHighBg > bolusForBgInRange)
|
||||||
}
|
}
|
||||||
|
@ -113,9 +108,9 @@ class BolusWizardTest : TestBase() {
|
||||||
@Test
|
@Test
|
||||||
fun shouldCalculateLowerBolusWhenLowBG() {
|
fun shouldCalculateLowerBolusWhenLowBG() {
|
||||||
val profile = setupProfile(4.0, 8.0, 20.0, 12.0)
|
val profile = setupProfile(4.0, 8.0, 20.0, 12.0)
|
||||||
var bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 3.6, 0.0, 100.0, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
var bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 3.6, 0.0, 100, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
||||||
val bolusForLowBg = bw.calculatedTotalInsulin
|
val bolusForLowBg = bw.calculatedTotalInsulin
|
||||||
bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 5.4, 0.0, 100.0, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 5.4, 0.0, 100, useBg = true, useCob = true, includeBolusIOB = true, includeBasalIOB = true, useSuperBolus = false, useTT = false, useTrend = false, useAlarm = false)
|
||||||
val bolusForBgInRange = bw.calculatedTotalInsulin
|
val bolusForBgInRange = bw.calculatedTotalInsulin
|
||||||
Assert.assertTrue(bolusForLowBg < bolusForBgInRange)
|
Assert.assertTrue(bolusForLowBg < bolusForBgInRange)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import com.google.common.base.Optional
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.automation.R
|
import info.nightscout.androidaps.automation.R
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
import info.nightscout.androidaps.interfaces.TreatmentsInterface
|
import info.nightscout.androidaps.interfaces.TreatmentsInterface
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
|
@ -39,7 +39,7 @@ abstract class Trigger(val injector: HasAndroidInjector) {
|
||||||
@Inject lateinit var locationDataContainer: LastLocationDataContainer
|
@Inject lateinit var locationDataContainer: LastLocationDataContainer
|
||||||
@Inject lateinit var treatmentsInterface: TreatmentsInterface
|
@Inject lateinit var treatmentsInterface: TreatmentsInterface
|
||||||
@Inject lateinit var activePlugin: ActivePluginProvider
|
@Inject lateinit var activePlugin: ActivePluginProvider
|
||||||
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorInterface
|
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculator
|
||||||
@Inject lateinit var glucoseStatusProvider: GlucoseStatusProvider
|
@Inject lateinit var glucoseStatusProvider: GlucoseStatusProvider
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import info.nightscout.androidaps.automation.R
|
||||||
import info.nightscout.androidaps.data.PumpEnactResult
|
import info.nightscout.androidaps.data.PumpEnactResult
|
||||||
import info.nightscout.androidaps.database.AppRepository
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.database.transactions.InsertTherapyEventAnnouncementTransaction
|
import info.nightscout.androidaps.database.transactions.InsertTherapyEventAnnouncementTransaction
|
||||||
|
import info.nightscout.androidaps.database.transactions.Transaction
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.general.automation.elements.InputString
|
import info.nightscout.androidaps.plugins.general.automation.elements.InputString
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
||||||
|
@ -20,6 +21,7 @@ import org.mockito.ArgumentMatchers
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
import org.mockito.Mockito
|
import org.mockito.Mockito
|
||||||
import org.mockito.Mockito.`when`
|
import org.mockito.Mockito.`when`
|
||||||
|
import org.mockito.Mockito.any
|
||||||
import org.powermock.core.classloader.annotations.PrepareForTest
|
import org.powermock.core.classloader.annotations.PrepareForTest
|
||||||
import org.powermock.modules.junit4.PowerMockRunner
|
import org.powermock.modules.junit4.PowerMockRunner
|
||||||
|
|
||||||
|
@ -37,6 +39,7 @@ class ActionNotificationTest : TestBase() {
|
||||||
if (it is ActionNotification) {
|
if (it is ActionNotification) {
|
||||||
it.resourceHelper = resourceHelper
|
it.resourceHelper = resourceHelper
|
||||||
it.rxBus = rxBus
|
it.rxBus = rxBus
|
||||||
|
it.repository = repository
|
||||||
}
|
}
|
||||||
if (it is PumpEnactResult) {
|
if (it is PumpEnactResult) {
|
||||||
it.resourceHelper = resourceHelper
|
it.resourceHelper = resourceHelper
|
||||||
|
@ -73,7 +76,7 @@ class ActionNotificationTest : TestBase() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
Mockito.verify(rxBus, Mockito.times(2)).send(anyObject())
|
Mockito.verify(rxBus, Mockito.times(2)).send(anyObject())
|
||||||
Mockito.verify(repository, Mockito.times(1)).runTransaction(anyObject() as InsertTherapyEventAnnouncementTransaction)
|
//Mockito.verify(repository, Mockito.times(1)).runTransaction(any(Transaction::class.java))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test fun hasDialogTest() {
|
@Test fun hasDialogTest() {
|
||||||
|
|
|
@ -10,7 +10,6 @@ import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.interfaces.*
|
import info.nightscout.androidaps.interfaces.*
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.general.automation.elements.InputTempTarget
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.triggers.Trigger
|
import info.nightscout.androidaps.plugins.general.automation.triggers.Trigger
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||||
|
@ -18,7 +17,6 @@ import org.junit.Before
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
import org.mockito.Mockito.`when`
|
import org.mockito.Mockito.`when`
|
||||||
import org.powermock.core.classloader.annotations.PrepareForTest
|
import org.powermock.core.classloader.annotations.PrepareForTest
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
@PrepareForTest(RxBusWrapper::class, ActionsTestBase.TestLoopPlugin::class, AppRepository::class)
|
@PrepareForTest(RxBusWrapper::class, ActionsTestBase.TestLoopPlugin::class, AppRepository::class)
|
||||||
open class ActionsTestBase : TestBaseWithProfile() {
|
open class ActionsTestBase : TestBaseWithProfile() {
|
||||||
|
@ -57,7 +55,7 @@ open class ActionsTestBase : TestBaseWithProfile() {
|
||||||
if (it is ActionStopTempTarget) {
|
if (it is ActionStopTempTarget) {
|
||||||
it.aapsLogger = aapsLogger
|
it.aapsLogger = aapsLogger
|
||||||
it.resourceHelper = resourceHelper
|
it.resourceHelper = resourceHelper
|
||||||
it.activePlugin = activePlugin
|
it.dateUtil = dateUtil
|
||||||
it.repository = repository
|
it.repository = repository
|
||||||
}
|
}
|
||||||
if (it is ActionStartTempTarget) {
|
if (it is ActionStartTempTarget) {
|
||||||
|
|
|
@ -27,7 +27,7 @@ class TriggerBgTest : TriggerTestBase() {
|
||||||
@Before
|
@Before
|
||||||
fun prepare() {
|
fun prepare() {
|
||||||
`when`(profileFunction.getUnits()).thenReturn(Constants.MGDL)
|
`when`(profileFunction.getUnits()).thenReturn(Constants.MGDL)
|
||||||
`when`(iobCobCalculatorPlugin.dataLock).thenReturn(Unit)
|
`when`(iobCobCalculatorPlugin.dataLock).thenReturn(Any())
|
||||||
PowerMockito.mockStatic(DateUtil::class.java)
|
PowerMockito.mockStatic(DateUtil::class.java)
|
||||||
`when`(DateUtil.now()).thenReturn(now)
|
`when`(DateUtil.now()).thenReturn(now)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ class TriggerDeltaTest : TriggerTestBase() {
|
||||||
fun mock() {
|
fun mock() {
|
||||||
PowerMockito.mockStatic(DateUtil::class.java)
|
PowerMockito.mockStatic(DateUtil::class.java)
|
||||||
PowerMockito.`when`(DateUtil.now()).thenReturn(now)
|
PowerMockito.`when`(DateUtil.now()).thenReturn(now)
|
||||||
`when`(iobCobCalculatorPlugin.dataLock).thenReturn(Unit)
|
`when`(iobCobCalculatorPlugin.dataLock).thenReturn(Any())
|
||||||
`when`(profileFunction.getUnits()).thenReturn(Constants.MGDL)
|
`when`(profileFunction.getUnits()).thenReturn(Constants.MGDL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,14 +7,10 @@ import info.nightscout.androidaps.TestBaseWithProfile
|
||||||
import info.nightscout.androidaps.TestPumpPlugin
|
import info.nightscout.androidaps.TestPumpPlugin
|
||||||
import info.nightscout.androidaps.database.AppRepository
|
import info.nightscout.androidaps.database.AppRepository
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription
|
import info.nightscout.androidaps.interfaces.PluginDescription
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.general.automation.AutomationPlugin
|
import info.nightscout.androidaps.plugins.general.automation.AutomationPlugin
|
||||||
import info.nightscout.androidaps.plugins.general.automation.elements.InputBg
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.elements.InputTempTarget
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.elements.StaticLabel
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
||||||
import info.nightscout.androidaps.receivers.ReceiverStatusStore
|
import info.nightscout.androidaps.receivers.ReceiverStatusStore
|
||||||
import info.nightscout.androidaps.services.LastLocationDataContainer
|
import info.nightscout.androidaps.services.LastLocationDataContainer
|
||||||
|
@ -30,7 +26,7 @@ open class TriggerTestBase : TestBaseWithProfile() {
|
||||||
@Mock lateinit var sp: SP
|
@Mock lateinit var sp: SP
|
||||||
@Mock lateinit var locationDataContainer: LastLocationDataContainer
|
@Mock lateinit var locationDataContainer: LastLocationDataContainer
|
||||||
@Mock lateinit var activePlugin: ActivePluginProvider
|
@Mock lateinit var activePlugin: ActivePluginProvider
|
||||||
@Mock lateinit var iobCobCalculatorPlugin: IobCobCalculatorInterface
|
@Mock lateinit var iobCobCalculatorPlugin: IobCobCalculator
|
||||||
@Mock lateinit var context: Context
|
@Mock lateinit var context: Context
|
||||||
@Mock lateinit var automationPlugin: AutomationPlugin
|
@Mock lateinit var automationPlugin: AutomationPlugin
|
||||||
@Mock lateinit var repository: AppRepository
|
@Mock lateinit var repository: AppRepository
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
package info.nightscout.androidaps.data
|
||||||
|
|
||||||
|
import android.graphics.Color
|
||||||
|
import info.nightscout.androidaps.core.R
|
||||||
|
import info.nightscout.androidaps.database.entities.Bolus
|
||||||
|
import info.nightscout.androidaps.interfaces.ActivePluginProvider
|
||||||
|
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface
|
||||||
|
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries
|
||||||
|
import info.nightscout.androidaps.utils.DecimalFormatter.toPumpSupportedBolus
|
||||||
|
import info.nightscout.androidaps.utils.DefaultValueHelper
|
||||||
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class BolusDataPoint @Inject constructor(
|
||||||
|
val data: Bolus,
|
||||||
|
private val resourceHelper: ResourceHelper,
|
||||||
|
private val activePlugin: ActivePluginProvider,
|
||||||
|
private val defaultValueHelper: DefaultValueHelper
|
||||||
|
) : DataPointWithLabelInterface {
|
||||||
|
|
||||||
|
private var yValue = 0.0
|
||||||
|
|
||||||
|
override fun getX(): Double = data.timestamp.toDouble()
|
||||||
|
override fun getY(): Double = if (data.type == Bolus.Type.SMB) defaultValueHelper.determineLowLine() else yValue
|
||||||
|
override fun getLabel(): String = toPumpSupportedBolus(data.amount, activePlugin.activePump, resourceHelper)
|
||||||
|
override fun getDuration(): Long = 0
|
||||||
|
override fun getSize(): Float = 2f
|
||||||
|
|
||||||
|
override fun getShape(): PointsWithLabelGraphSeries.Shape =
|
||||||
|
if (data.type == Bolus.Type.SMB) PointsWithLabelGraphSeries.Shape.SMB
|
||||||
|
else PointsWithLabelGraphSeries.Shape.BOLUS
|
||||||
|
|
||||||
|
override fun getColor(): Int =
|
||||||
|
if (data.type == Bolus.Type.SMB) resourceHelper.gc(R.color.tempbasal)
|
||||||
|
else if (data.isValid) Color.CYAN
|
||||||
|
else resourceHelper.gc(android.R.color.holo_red_light)
|
||||||
|
|
||||||
|
override fun setY(y: Double) {
|
||||||
|
yValue = y
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package info.nightscout.androidaps.data
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.core.R
|
||||||
|
import info.nightscout.androidaps.database.entities.Carbs
|
||||||
|
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface
|
||||||
|
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries
|
||||||
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class CarbsDataPoint @Inject constructor(
|
||||||
|
val data: Carbs,
|
||||||
|
private val resourceHelper: ResourceHelper
|
||||||
|
) : DataPointWithLabelInterface {
|
||||||
|
|
||||||
|
private var yValue = 0.0
|
||||||
|
|
||||||
|
override fun getX(): Double = data.timestamp.toDouble()
|
||||||
|
override fun getY(): Double = yValue
|
||||||
|
override fun getLabel(): String = resourceHelper.gs(R.string.format_carbs, data.amount.toInt())
|
||||||
|
override fun getDuration(): Long = 0
|
||||||
|
override fun getSize(): Float = 2f
|
||||||
|
|
||||||
|
override fun getShape(): PointsWithLabelGraphSeries.Shape = PointsWithLabelGraphSeries.Shape.BOLUS
|
||||||
|
|
||||||
|
override fun getColor(): Int =
|
||||||
|
if (data.isValid) resourceHelper.gc(R.color.carbs)
|
||||||
|
else resourceHelper.gc(android.R.color.holo_red_light)
|
||||||
|
|
||||||
|
override fun setY(y: Double) {
|
||||||
|
yValue = y
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,6 @@ package info.nightscout.androidaps.data
|
||||||
|
|
||||||
class MealData {
|
class MealData {
|
||||||
|
|
||||||
var boluses = 0.0
|
|
||||||
var carbs = 0.0
|
var carbs = 0.0
|
||||||
var mealCOB = 0.0
|
var mealCOB = 0.0
|
||||||
var slopeFromMaxDeviation = 0.0
|
var slopeFromMaxDeviation = 0.0
|
||||||
|
|
|
@ -20,6 +20,7 @@ import info.nightscout.androidaps.Constants;
|
||||||
import info.nightscout.androidaps.core.R;
|
import info.nightscout.androidaps.core.R;
|
||||||
import info.nightscout.androidaps.data.Iob;
|
import info.nightscout.androidaps.data.Iob;
|
||||||
import info.nightscout.androidaps.data.Profile;
|
import info.nightscout.androidaps.data.Profile;
|
||||||
|
import info.nightscout.androidaps.database.entities.Bolus;
|
||||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
||||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction;
|
import info.nightscout.androidaps.interfaces.ProfileFunction;
|
||||||
|
@ -79,6 +80,17 @@ public class Treatment implements DataPointWithLabelInterface, DbObjectBase {
|
||||||
injector.androidInjector().inject(this);
|
injector.androidInjector().inject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Treatment(HasAndroidInjector injector, Bolus bolus) {
|
||||||
|
this(injector);
|
||||||
|
date = bolus.getTimestamp();
|
||||||
|
isValid = bolus.isValid();
|
||||||
|
pumpId = (bolus.getInterfaceIDs().getPumpId() != null) ? bolus.getInterfaceIDs().getPumpId() : 0;
|
||||||
|
source = (bolus.getInterfaceIDs().getPumpId() != null) ? Source.PUMP : Source.USER;
|
||||||
|
_id = bolus.getInterfaceIDs().getNightscoutId();
|
||||||
|
insulin = bolus.getAmount();
|
||||||
|
isSMB = bolus.getType() == Bolus.Type.SMB;
|
||||||
|
}
|
||||||
|
|
||||||
public static Treatment createFromJson(JSONObject json) throws JSONException {
|
public static Treatment createFromJson(JSONObject json) throws JSONException {
|
||||||
Treatment treatment = new Treatment();
|
Treatment treatment = new Treatment();
|
||||||
treatment.source = Source.NIGHTSCOUT;
|
treatment.source = Source.NIGHTSCOUT;
|
||||||
|
@ -243,7 +255,8 @@ public class Treatment implements DataPointWithLabelInterface, DbObjectBase {
|
||||||
@Override
|
@Override
|
||||||
public String getLabel() {
|
public String getLabel() {
|
||||||
String label = "";
|
String label = "";
|
||||||
if (insulin > 0) label += DecimalFormatter.INSTANCE.toPumpSupportedBolus(insulin, activePlugin.getActivePump(), resourceHelper);
|
if (insulin > 0)
|
||||||
|
label += DecimalFormatter.INSTANCE.toPumpSupportedBolus(insulin, activePlugin.getActivePump(), resourceHelper);
|
||||||
if (carbs > 0)
|
if (carbs > 0)
|
||||||
label += "~" + resourceHelper.gs(R.string.format_carbs, (int) carbs);
|
label += "~" + resourceHelper.gs(R.string.format_carbs, (int) carbs);
|
||||||
return label;
|
return label;
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
package info.nightscout.androidaps.interfaces
|
||||||
|
|
||||||
|
import androidx.collection.LongSparseArray
|
||||||
|
import info.nightscout.androidaps.data.IobTotal
|
||||||
|
import info.nightscout.androidaps.data.MealData
|
||||||
|
import info.nightscout.androidaps.data.Profile
|
||||||
|
import info.nightscout.androidaps.database.entities.GlucoseValue
|
||||||
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
|
||||||
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.BasalData
|
||||||
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.CobInfo
|
||||||
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensData
|
||||||
|
|
||||||
|
interface IobCobCalculator {
|
||||||
|
|
||||||
|
val dataLock: Any
|
||||||
|
var bgReadings: List<GlucoseValue>
|
||||||
|
|
||||||
|
val mealData: MealData
|
||||||
|
fun getAutosensDataTable(): LongSparseArray<AutosensData>
|
||||||
|
fun calculateIobArrayInDia(profile: Profile): Array<IobTotal>
|
||||||
|
fun lastDataTime(): String
|
||||||
|
fun getAutosensData(fromTime: Long): AutosensData?
|
||||||
|
fun getLastAutosensData(reason: String): AutosensData?
|
||||||
|
fun getLastAutosensDataSynchronized(reason: String): AutosensData?
|
||||||
|
fun calculateAbsInsulinFromTreatmentsAndTempsSynchronized(fromTime: Long): IobTotal
|
||||||
|
fun calculateFromTreatmentsAndTempsSynchronized(time: Long, profile: Profile?): IobTotal
|
||||||
|
fun getBasalData(profile: Profile, fromTime: Long): BasalData
|
||||||
|
fun calculateIobArrayForSMB(lastAutosensResult: AutosensResult, exercise_mode: Boolean, half_basal_exercise_target: Int, isTempTarget: Boolean): Array<IobTotal>
|
||||||
|
fun iobArrayToString(array: Array<IobTotal>): String
|
||||||
|
fun slowAbsorptionPercentage(timeInMinutes: Int): Double
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return last valid (>39) GlucoseValue from database or null if db is empty
|
||||||
|
*
|
||||||
|
* @return GlucoseValue or null
|
||||||
|
*/
|
||||||
|
fun lastBg(): GlucoseValue?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate CobInfo to now()
|
||||||
|
*
|
||||||
|
* @param _synchronized access autosens data synchronized (wait for result if calculation is running)
|
||||||
|
* @param reason caller identification
|
||||||
|
* @return CobInfo
|
||||||
|
*/
|
||||||
|
fun getCobInfo(_synchronized: Boolean, reason: String): CobInfo
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide last GlucoseValue or null if none exists withing last 9 minutes
|
||||||
|
*
|
||||||
|
* @return GlucoseValue or null
|
||||||
|
*/
|
||||||
|
fun actualBg(): GlucoseValue?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate IobTotal from boluses and extended boluses to now().
|
||||||
|
* NOTE: Only isValid == true boluses are included
|
||||||
|
* NOTE: if faking by TBR by extended boluses is enabled, extended boluses are not included
|
||||||
|
* and are calculated towards temporary basals
|
||||||
|
*
|
||||||
|
* @return calculated iob
|
||||||
|
*/
|
||||||
|
fun calculateIobFromBolus(): IobTotal
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate IobTotal from boluses and extended to provided timestamp.
|
||||||
|
* NOTE: Only isValid == true boluses are included
|
||||||
|
* NOTE: if faking by TBR by extended boluses is enabled, extended boluses are not included
|
||||||
|
* and are calculated towards temporary basals
|
||||||
|
*
|
||||||
|
* @param timestamp timestamp in milliseconds
|
||||||
|
* @return calculated iob
|
||||||
|
*/
|
||||||
|
fun calculateIobFromBolusToTime(timestamp: Long): IobTotal
|
||||||
|
}
|
|
@ -1,22 +0,0 @@
|
||||||
package info.nightscout.androidaps.interfaces
|
|
||||||
|
|
||||||
import androidx.collection.LongSparseArray
|
|
||||||
import info.nightscout.androidaps.data.IobTotal
|
|
||||||
import info.nightscout.androidaps.data.Profile
|
|
||||||
import info.nightscout.androidaps.database.entities.GlucoseValue
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.CobInfo
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensData
|
|
||||||
|
|
||||||
interface IobCobCalculatorInterface {
|
|
||||||
|
|
||||||
val dataLock: Any
|
|
||||||
var bgReadings: List<GlucoseValue>
|
|
||||||
|
|
||||||
fun getAutosensDataTable(): LongSparseArray<AutosensData>
|
|
||||||
fun calculateIobArrayInDia(profile: Profile): Array<IobTotal>
|
|
||||||
fun lastDataTime(): String
|
|
||||||
fun getAutosensData(fromTime: Long): AutosensData?
|
|
||||||
fun getLastAutosensData(reason: String): AutosensData?
|
|
||||||
fun getCobInfo(_synchronized: Boolean, reason: String): CobInfo
|
|
||||||
fun calculateFromTreatmentsAndTempsSynchronized(time: Long, profile: Profile?): IobTotal
|
|
||||||
}
|
|
|
@ -1,7 +1,6 @@
|
||||||
package info.nightscout.androidaps.interfaces
|
package info.nightscout.androidaps.interfaces
|
||||||
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult
|
||||||
import org.json.JSONObject
|
|
||||||
|
|
||||||
interface SensitivityInterface : ConfigExportImportInterface {
|
interface SensitivityInterface : ConfigExportImportInterface {
|
||||||
|
|
||||||
|
@ -18,7 +17,7 @@ interface SensitivityInterface : ConfigExportImportInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
val id: SensitivityType
|
val id: SensitivityType
|
||||||
fun detectSensitivity(plugin: IobCobCalculatorInterface, fromTime: Long, toTime: Long): AutosensResult
|
fun detectSensitivity(plugin: IobCobCalculator, fromTime: Long, toTime: Long): AutosensResult
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val MIN_HOURS = 1.0
|
const val MIN_HOURS = 1.0
|
||||||
|
|
|
@ -22,22 +22,13 @@ public interface TreatmentsInterface {
|
||||||
|
|
||||||
TreatmentServiceInterface getService();
|
TreatmentServiceInterface getService();
|
||||||
|
|
||||||
void updateTotalIOBTreatments();
|
|
||||||
|
|
||||||
void updateTotalIOBTempBasals();
|
|
||||||
|
|
||||||
IobTotal getLastCalculationTreatments();
|
|
||||||
|
|
||||||
IobTotal getCalculationToTimeTreatments(long time);
|
|
||||||
|
|
||||||
IobTotal getLastCalculationTempBasals();
|
IobTotal getLastCalculationTempBasals();
|
||||||
|
|
||||||
IobTotal getCalculationToTimeTempBasals(long time);
|
IobTotal getCalculationToTimeTempBasals(long time);
|
||||||
|
|
||||||
List<Treatment> getTreatmentsFromHistory();
|
IobTotal getCalculationToTimeExtendedBoluses(long time);
|
||||||
|
|
||||||
List<Treatment> getCarbTreatments5MinBackFromHistory(long time);
|
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
List<Treatment> getTreatmentsFromHistoryAfterTimestamp(long timestamp);
|
List<Treatment> getTreatmentsFromHistoryAfterTimestamp(long timestamp);
|
||||||
|
|
||||||
long getLastBolusTime();
|
long getLastBolusTime();
|
||||||
|
|
|
@ -10,7 +10,7 @@ import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
open class ConstraintChecker @Inject constructor(private val activePlugin: ActivePluginProvider) : ConstraintsInterface {
|
class ConstraintChecker @Inject constructor(private val activePlugin: ActivePluginProvider) : ConstraintsInterface {
|
||||||
|
|
||||||
fun isLoopInvocationAllowed(): Constraint<Boolean> =
|
fun isLoopInvocationAllowed(): Constraint<Boolean> =
|
||||||
isLoopInvocationAllowed(Constraint(true))
|
isLoopInvocationAllowed(Constraint(true))
|
||||||
|
|
|
@ -2,11 +2,6 @@ package info.nightscout.androidaps.plugins.general.nsclient;
|
||||||
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
@ -15,20 +10,16 @@ import java.util.Date;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import info.nightscout.androidaps.Constants;
|
|
||||||
import info.nightscout.androidaps.core.R;
|
import info.nightscout.androidaps.core.R;
|
||||||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||||
import info.nightscout.androidaps.data.IobTotal;
|
import info.nightscout.androidaps.data.IobTotal;
|
||||||
import info.nightscout.androidaps.data.Profile;
|
import info.nightscout.androidaps.data.Profile;
|
||||||
import info.nightscout.androidaps.database.entities.Bolus;
|
|
||||||
import info.nightscout.androidaps.database.entities.BolusCalculatorResult;
|
|
||||||
import info.nightscout.androidaps.database.entities.Carbs;
|
|
||||||
import info.nightscout.androidaps.database.entities.TherapyEvent;
|
import info.nightscout.androidaps.database.entities.TherapyEvent;
|
||||||
import info.nightscout.androidaps.db.DbRequest;
|
import info.nightscout.androidaps.db.DbRequest;
|
||||||
import info.nightscout.androidaps.db.ExtendedBolus;
|
import info.nightscout.androidaps.db.ExtendedBolus;
|
||||||
import info.nightscout.androidaps.db.ProfileSwitch;
|
import info.nightscout.androidaps.db.ProfileSwitch;
|
||||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface;
|
import info.nightscout.androidaps.interfaces.IobCobCalculator;
|
||||||
import info.nightscout.androidaps.interfaces.LoopInterface;
|
import info.nightscout.androidaps.interfaces.LoopInterface;
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction;
|
import info.nightscout.androidaps.interfaces.ProfileFunction;
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
|
@ -171,7 +162,7 @@ public class NSUpload {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void uploadDeviceStatus(LoopInterface loopPlugin, IobCobCalculatorInterface iobCobCalculatorPlugin, ProfileFunction profileFunction, PumpInterface pumpInterface, ReceiverStatusStore receiverStatusStore, String version) {
|
public void uploadDeviceStatus(LoopInterface loopPlugin, IobCobCalculator iobCobCalculatorPlugin, ProfileFunction profileFunction, PumpInterface pumpInterface, ReceiverStatusStore receiverStatusStore, String version) {
|
||||||
Profile profile = profileFunction.getProfile();
|
Profile profile = profileFunction.getProfile();
|
||||||
String profileName = profileFunction.getProfileName();
|
String profileName = profileFunction.getProfileName();
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package info.nightscout.androidaps.plugins.iob.iobCobCalculator
|
package info.nightscout.androidaps.plugins.iob.iobCobCalculator
|
||||||
|
|
||||||
import dagger.Reusable
|
import dagger.Reusable
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.logging.LTag
|
import info.nightscout.androidaps.logging.LTag
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
|
@ -10,14 +10,14 @@ import javax.inject.Inject
|
||||||
import kotlin.math.roundToLong
|
import kotlin.math.roundToLong
|
||||||
|
|
||||||
@Reusable
|
@Reusable
|
||||||
class GlucoseStatusProvider @Inject constructor(private val aapsLogger: AAPSLogger, private val iobCobCalculatorPlugin: IobCobCalculatorInterface) {
|
class GlucoseStatusProvider @Inject constructor(private val aapsLogger: AAPSLogger, private val iobCobCalculator: IobCobCalculator) {
|
||||||
|
|
||||||
val glucoseStatusData: GlucoseStatus?
|
val glucoseStatusData: GlucoseStatus?
|
||||||
get() = getGlucoseStatusData()
|
get() = getGlucoseStatusData()
|
||||||
|
|
||||||
fun getGlucoseStatusData(allowOldData: Boolean = false): GlucoseStatus? {
|
fun getGlucoseStatusData(allowOldData: Boolean = false): GlucoseStatus? {
|
||||||
synchronized(iobCobCalculatorPlugin.dataLock) {
|
synchronized(iobCobCalculator.dataLock) {
|
||||||
val data = iobCobCalculatorPlugin.bgReadings
|
val data = iobCobCalculator.bgReadings
|
||||||
val sizeRecords = data.size
|
val sizeRecords = data.size
|
||||||
if (sizeRecords == 0) {
|
if (sizeRecords == 0) {
|
||||||
aapsLogger.debug(LTag.GLUCOSE, "sizeRecords==0")
|
aapsLogger.debug(LTag.GLUCOSE, "sizeRecords==0")
|
||||||
|
|
|
@ -12,6 +12,7 @@ import dagger.android.HasAndroidInjector;
|
||||||
import info.nightscout.androidaps.Constants;
|
import info.nightscout.androidaps.Constants;
|
||||||
import info.nightscout.androidaps.core.R;
|
import info.nightscout.androidaps.core.R;
|
||||||
import info.nightscout.androidaps.data.Profile;
|
import info.nightscout.androidaps.data.Profile;
|
||||||
|
import info.nightscout.androidaps.database.entities.Carbs;
|
||||||
import info.nightscout.androidaps.db.Treatment;
|
import info.nightscout.androidaps.db.Treatment;
|
||||||
import info.nightscout.androidaps.interfaces.ProfileFunction;
|
import info.nightscout.androidaps.interfaces.ProfileFunction;
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||||
|
@ -47,17 +48,17 @@ public class AutosensData implements DataPointWithLabelInterface {
|
||||||
public double min5minCarbImpact;
|
public double min5minCarbImpact;
|
||||||
double remaining;
|
double remaining;
|
||||||
|
|
||||||
public CarbsInPast(Treatment t, boolean isAAPSOrWeighted) {
|
public CarbsInPast(Carbs t, boolean isAAPSOrWeighted) {
|
||||||
time = t.date;
|
time = t.getTimestamp();
|
||||||
carbs = t.carbs;
|
carbs = t.getAmount();
|
||||||
remaining = t.carbs;
|
remaining = t.getAmount();
|
||||||
if (isAAPSOrWeighted) {
|
if (isAAPSOrWeighted) {
|
||||||
double maxAbsorptionHours = sp.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME);
|
double maxAbsorptionHours = sp.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME);
|
||||||
Profile profile = profileFunction.getProfile(t.date);
|
Profile profile = profileFunction.getProfile(t.getTimestamp());
|
||||||
double sens = profile.getIsfMgdl(t.date);
|
double sens = profile.getIsfMgdl(t.getTimestamp());
|
||||||
double ic = profile.getIc(t.date);
|
double ic = profile.getIc(t.getTimestamp());
|
||||||
min5minCarbImpact = t.carbs / (maxAbsorptionHours * 60 / 5) * sens / ic;
|
min5minCarbImpact = t.getAmount() / (maxAbsorptionHours * 60 / 5) * sens / ic;
|
||||||
aapsLogger.debug(LTag.AUTOSENS, "Min 5m carbs impact for " + carbs + "g @" + dateUtil.dateAndTimeString(t.date) + " for " + maxAbsorptionHours + "h calculated to " + min5minCarbImpact + " ISF: " + sens + " IC: " + ic);
|
aapsLogger.debug(LTag.AUTOSENS, "Min 5m carbs impact for " + carbs + "g @" + dateUtil.dateAndTimeString(t.getTimestamp()) + " for " + maxAbsorptionHours + "h calculated to " + min5minCarbImpact + " ISF: " + sens + " IC: " + ic);
|
||||||
} else {
|
} else {
|
||||||
min5minCarbImpact = sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact);
|
min5minCarbImpact = sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,72 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.pump.common.data;
|
|
||||||
|
|
||||||
import com.google.gson.annotations.Expose;
|
|
||||||
|
|
||||||
public class TempBasalPair {
|
|
||||||
|
|
||||||
@Expose
|
|
||||||
protected double insulinRate = 0.0d;
|
|
||||||
@Expose
|
|
||||||
protected int durationMinutes = 0;
|
|
||||||
@Expose
|
|
||||||
protected boolean isPercent = false;
|
|
||||||
|
|
||||||
private Long start;
|
|
||||||
private Long end;
|
|
||||||
|
|
||||||
public TempBasalPair() {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public TempBasalPair(double insulinRate, boolean isPercent, int durationMinutes) {
|
|
||||||
this.insulinRate = insulinRate;
|
|
||||||
this.isPercent = isPercent;
|
|
||||||
this.durationMinutes = durationMinutes;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public double getInsulinRate() {
|
|
||||||
return insulinRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void setInsulinRate(double insulinRate) {
|
|
||||||
this.insulinRate = insulinRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public int getDurationMinutes() {
|
|
||||||
return durationMinutes;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void setDurationMinutes(int durationMinutes) {
|
|
||||||
this.durationMinutes = durationMinutes;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public boolean isPercent() {
|
|
||||||
return isPercent;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void setIsPercent(boolean yesIsPercent) {
|
|
||||||
this.isPercent = yesIsPercent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStartTime(Long startTime) {
|
|
||||||
this.start = startTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void setEndTime(Long endTime) {
|
|
||||||
this.end = endTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "TempBasalPair [" + "Rate=" + insulinRate + ", DurationMinutes=" + durationMinutes + ", IsPercent="
|
|
||||||
+ isPercent + "]";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,3 +1,3 @@
|
||||||
package info.nightscout.androidaps.plugins.pump.common.data
|
package info.nightscout.androidaps.plugins.pump.common.defs
|
||||||
|
|
||||||
class DoseSettings constructor(val step: Double, val durationStep: Int, val maxDuration: Int, val minDose: Double, val maxDose: Double = Double.MAX_VALUE)
|
class DoseSettings constructor(val step: Double, val durationStep: Int, val maxDuration: Int, val minDose: Double, val maxDose: Double = Double.MAX_VALUE)
|
|
@ -1,100 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.pump.common.defs;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by andy on 02/05/2018.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public enum DoseStepSize {
|
|
||||||
|
|
||||||
ComboBasal( //
|
|
||||||
new DoseStepSizeEntry(0f, 1f, 0.01f), //
|
|
||||||
new DoseStepSizeEntry(1f, 10f, 0.05f), //
|
|
||||||
new DoseStepSizeEntry(10f, Double.MAX_VALUE, 0.1f)), //
|
|
||||||
|
|
||||||
InsightBolus(
|
|
||||||
new DoseStepSizeEntry(0f, 2f, 0.05f), //
|
|
||||||
new DoseStepSizeEntry(2f, 5f, 0.1f), //
|
|
||||||
new DoseStepSizeEntry(5f, 10f, 0.2f), //
|
|
||||||
new DoseStepSizeEntry(10f, Double.MAX_VALUE, 0.5f)),
|
|
||||||
|
|
||||||
InsightBasal(
|
|
||||||
new DoseStepSizeEntry(0f, 5f, 0.01f),
|
|
||||||
new DoseStepSizeEntry(5f, Double.MAX_VALUE, 0.1f)),
|
|
||||||
|
|
||||||
MedtronicVeoBasal( //
|
|
||||||
new DoseStepSizeEntry(0f, 1f, 0.025f), //
|
|
||||||
new DoseStepSizeEntry(1f, 10f, 0.05f), //
|
|
||||||
new DoseStepSizeEntry(10f, Double.MAX_VALUE, 0.1f)), //
|
|
||||||
|
|
||||||
YpsopumpBasal( //
|
|
||||||
new DoseStepSizeEntry(0.0f, 1f, 0.01f), //
|
|
||||||
new DoseStepSizeEntry(1f, 2f, 0.02f), //
|
|
||||||
new DoseStepSizeEntry(2f, 15f, 0.1f), //
|
|
||||||
new DoseStepSizeEntry(15f, 40f, 0.5f)
|
|
||||||
)
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
DoseStepSizeEntry[] entries;
|
|
||||||
|
|
||||||
|
|
||||||
DoseStepSize(DoseStepSizeEntry... entries) {
|
|
||||||
this.entries = entries;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public double getStepSizeForAmount(double amount) {
|
|
||||||
for (DoseStepSizeEntry entry : entries) {
|
|
||||||
if (entry.from <= amount && entry.to > amount)
|
|
||||||
return entry.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// should never come to this
|
|
||||||
return entries[entries.length - 1].value;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String getDescription() {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
boolean first = true;
|
|
||||||
for (DoseStepSizeEntry entry : entries) {
|
|
||||||
|
|
||||||
if (first) {
|
|
||||||
first = false;
|
|
||||||
} else {
|
|
||||||
sb.append(", ");
|
|
||||||
}
|
|
||||||
|
|
||||||
sb.append(String.format(Locale.ENGLISH, "%.3f", entry.value));
|
|
||||||
sb.append(" {");
|
|
||||||
sb.append(String.format(Locale.ENGLISH,"%.3f", entry.from));
|
|
||||||
sb.append("-");
|
|
||||||
|
|
||||||
if (entry.to == Double.MAX_VALUE) {
|
|
||||||
sb.append("~}");
|
|
||||||
} else {
|
|
||||||
sb.append(String.format(Locale.ENGLISH, "%.3f", entry.to));
|
|
||||||
sb.append("}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static class DoseStepSizeEntry {
|
|
||||||
double from;
|
|
||||||
double to;
|
|
||||||
double value;
|
|
||||||
|
|
||||||
// to = this value is not included, but would actually mean <, so for rates between 0.025-0.975 u/h, we would have [from=0, to=10]
|
|
||||||
DoseStepSizeEntry(double from, double to, double value) {
|
|
||||||
this.from = from;
|
|
||||||
this.to = to;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
package info.nightscout.androidaps.plugins.pump.common.defs
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
enum class DoseStepSize(private val entries: Array<DoseStepSizeEntry>) {
|
||||||
|
|
||||||
|
ComboBasal(arrayOf(
|
||||||
|
DoseStepSizeEntry(0.0, 1.0, 0.01),
|
||||||
|
DoseStepSizeEntry(1.0, 10.0, 0.05),
|
||||||
|
DoseStepSizeEntry(10.0, Double.MAX_VALUE, 0.1))),
|
||||||
|
InsightBolus(arrayOf(
|
||||||
|
DoseStepSizeEntry(0.0, 2.0, 0.05),
|
||||||
|
DoseStepSizeEntry(2.0, 5.0, 0.1),
|
||||||
|
DoseStepSizeEntry(5.0, 10.0, 0.2),
|
||||||
|
DoseStepSizeEntry(10.0, Double.MAX_VALUE, 0.5))),
|
||||||
|
InsightBasal(arrayOf(
|
||||||
|
DoseStepSizeEntry(0.0, 5.0, 0.01),
|
||||||
|
DoseStepSizeEntry(5.0, Double.MAX_VALUE, 0.1))),
|
||||||
|
MedtronicVeoBasal(arrayOf(
|
||||||
|
DoseStepSizeEntry(0.0, 1.0, 0.025),
|
||||||
|
DoseStepSizeEntry(1.0, 10.0, 0.05),
|
||||||
|
DoseStepSizeEntry(10.0, Double.MAX_VALUE, 0.1))),
|
||||||
|
YpsopumpBasal(arrayOf(
|
||||||
|
DoseStepSizeEntry(0.0, 1.0, 0.01),
|
||||||
|
DoseStepSizeEntry(1.0, 2.0, 0.02),
|
||||||
|
DoseStepSizeEntry(2.0, 15.0, 0.1),
|
||||||
|
DoseStepSizeEntry(15.0, 40.0, 0.5))
|
||||||
|
);
|
||||||
|
|
||||||
|
fun getStepSizeForAmount(amount: Double): Double {
|
||||||
|
for (entry in entries)
|
||||||
|
if (entry.from <= amount && entry.to > amount) return entry.value
|
||||||
|
|
||||||
|
// should never come to this
|
||||||
|
return entries[entries.size - 1].value
|
||||||
|
}
|
||||||
|
|
||||||
|
val description: String
|
||||||
|
get() = StringBuilder().also { sb ->
|
||||||
|
var first = true
|
||||||
|
for (entry in entries) {
|
||||||
|
if (first) first = false else sb.append(", ")
|
||||||
|
|
||||||
|
sb.append(String.format(Locale.ENGLISH, "%.3f", entry.value))
|
||||||
|
.append(" {")
|
||||||
|
.append(String.format(Locale.ENGLISH, "%.3f", entry.from))
|
||||||
|
.append("-")
|
||||||
|
if (entry.to == Double.MAX_VALUE) sb.append("~}")
|
||||||
|
else sb.append(String.format(Locale.ENGLISH, "%.3f", entry.to)).append("}")
|
||||||
|
}
|
||||||
|
}.toString()
|
||||||
|
|
||||||
|
// to = this value is not included, but would actually mean <, so for rates between 0.025-0.975 u/h, we would have [from=0, to=10]
|
||||||
|
internal class DoseStepSizeEntry(var from: Double, var to: Double, var value: Double)
|
||||||
|
|
||||||
|
}
|
|
@ -1,10 +1,5 @@
|
||||||
package info.nightscout.androidaps.plugins.pump.common.defs
|
package info.nightscout.androidaps.plugins.pump.common.defs
|
||||||
|
|
||||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpCapability
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by andy on 03/05/2018.
|
|
||||||
*/
|
|
||||||
enum class PumpCapability {
|
enum class PumpCapability {
|
||||||
|
|
||||||
Bolus, // isBolusCapable
|
Bolus, // isBolusCapable
|
||||||
|
@ -35,7 +30,10 @@ enum class PumpCapability {
|
||||||
|
|
||||||
var children: ArrayList<PumpCapability> = ArrayList()
|
var children: ArrayList<PumpCapability> = ArrayList()
|
||||||
|
|
||||||
constructor() { children.add(this)}
|
constructor() {
|
||||||
|
children.add(this)
|
||||||
|
}
|
||||||
|
|
||||||
constructor(list: Array<PumpCapability>) {
|
constructor(list: Array<PumpCapability>) {
|
||||||
children.addAll(list)
|
children.addAll(list)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.pump.common.defs;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.core.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by andy on 6/11/18.
|
|
||||||
*/
|
|
||||||
public enum PumpDeviceState {
|
|
||||||
|
|
||||||
NeverContacted(R.string.pump_status_never_contacted), //
|
|
||||||
Sleeping(R.string.pump_status_sleeping), //
|
|
||||||
WakingUp(R.string.pump_status_waking_up), //
|
|
||||||
Active(R.string.pump_status_active), //
|
|
||||||
ErrorWhenCommunicating(R.string.pump_status_error_comm), //
|
|
||||||
TimeoutWhenCommunicating(R.string.pump_status_timeout_comm), //
|
|
||||||
// ProblemContacting(R.string.medtronic_pump_status_problem_contacting), //
|
|
||||||
PumpUnreachable(R.string.pump_status_pump_unreachable), //
|
|
||||||
InvalidConfiguration(R.string.pump_status_invalid_config);
|
|
||||||
|
|
||||||
Integer resourceId;
|
|
||||||
|
|
||||||
PumpDeviceState(int resourceId) {
|
|
||||||
this.resourceId = resourceId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getResourceId() {
|
|
||||||
return resourceId;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.pump.common.defs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by andy on 10/15/18.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public enum PumpDriverState {
|
|
||||||
|
|
||||||
NotInitialized, //
|
|
||||||
Connecting, //
|
|
||||||
Connected, //
|
|
||||||
Initialized, //
|
|
||||||
Ready,
|
|
||||||
Busy, //
|
|
||||||
Suspended, //
|
|
||||||
;
|
|
||||||
|
|
||||||
public static boolean isConnected(PumpDriverState pumpState) {
|
|
||||||
return pumpState == Connected || pumpState == Initialized || pumpState == Busy || pumpState == Suspended;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static boolean isInitialized(PumpDriverState pumpState) {
|
|
||||||
return pumpState == Initialized || pumpState == Busy || pumpState == Suspended;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.pump.common.defs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by andy on 5/12/18.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public enum PumpStatusType {
|
|
||||||
Running("normal"), //
|
|
||||||
Suspended("suspended") //
|
|
||||||
;
|
|
||||||
|
|
||||||
private final String statusString;
|
|
||||||
|
|
||||||
|
|
||||||
PumpStatusType(String statusString) {
|
|
||||||
this.statusString = statusString;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String getStatus() {
|
|
||||||
return statusString;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
package info.nightscout.androidaps.plugins.pump.common.defs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by andy on 02/05/2018.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public enum PumpTempBasalType {
|
|
||||||
Percent, //
|
|
||||||
Absolute,
|
|
||||||
}
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.plugins.pump.common.defs
|
||||||
|
|
||||||
|
enum class PumpTempBasalType {
|
||||||
|
|
||||||
|
Percent,
|
||||||
|
Absolute
|
||||||
|
}
|
|
@ -3,7 +3,6 @@ package info.nightscout.androidaps.plugins.pump.common.defs
|
||||||
import info.nightscout.androidaps.core.R
|
import info.nightscout.androidaps.core.R
|
||||||
import info.nightscout.androidaps.database.embedments.InterfaceIDs
|
import info.nightscout.androidaps.database.embedments.InterfaceIDs
|
||||||
import info.nightscout.androidaps.plugins.common.ManufacturerType
|
import info.nightscout.androidaps.plugins.common.ManufacturerType
|
||||||
import info.nightscout.androidaps.plugins.pump.common.data.DoseSettings
|
|
||||||
import info.nightscout.androidaps.utils.Round
|
import info.nightscout.androidaps.utils.Round
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
|
@ -9,7 +9,7 @@ import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
open class ReceiverStatusStore @Inject constructor(val context: Context, val rxBus: RxBusWrapper) {
|
class ReceiverStatusStore @Inject constructor(val context: Context, val rxBus: RxBusWrapper) {
|
||||||
|
|
||||||
var lastNetworkEvent: EventNetworkChange? = null
|
var lastNetworkEvent: EventNetworkChange? = null
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,19 @@
|
||||||
package info.nightscout.androidaps.utils.extensions
|
package info.nightscout.androidaps.utils.extensions
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.Constants
|
||||||
import info.nightscout.androidaps.database.entities.GlucoseValue
|
import info.nightscout.androidaps.database.entities.GlucoseValue
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
|
import info.nightscout.androidaps.utils.DecimalFormatter
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
|
|
||||||
|
fun GlucoseValue.valueToUnits(units: String): Double =
|
||||||
|
if (units == Constants.MGDL) value
|
||||||
|
else value * Constants.MGDL_TO_MMOLL
|
||||||
|
|
||||||
|
fun GlucoseValue.valueToUnitsString(units: String): String =
|
||||||
|
if (units == Constants.MGDL) DecimalFormatter.to0Decimal(value)
|
||||||
|
else DecimalFormatter.to1Decimal(value * Constants.MGDL_TO_MMOLL)
|
||||||
|
|
||||||
fun GlucoseValue.toJson(): JSONObject =
|
fun GlucoseValue.toJson(): JSONObject =
|
||||||
JSONObject()
|
JSONObject()
|
||||||
.put("device", sourceSensor.text)
|
.put("device", sourceSensor.text)
|
||||||
|
|
|
@ -31,11 +31,11 @@ class DetailedBolusInfoTest : TestBase() {
|
||||||
val detailedBolusInfo = DetailedBolusInfo()
|
val detailedBolusInfo = DetailedBolusInfo()
|
||||||
detailedBolusInfo.bolusCalculatorResult = createBolusCalculatorResult()
|
detailedBolusInfo.bolusCalculatorResult = createBolusCalculatorResult()
|
||||||
detailedBolusInfo.context = context
|
detailedBolusInfo.context = context
|
||||||
detailedBolusInfo.eventType = TherapyEvent.Type.BOLUS_WIZARD
|
detailedBolusInfo.eventType = DetailedBolusInfo.EventType.BOLUS_WIZARD
|
||||||
val serialized = detailedBolusInfo.toJsonString()
|
val serialized = detailedBolusInfo.toJsonString()
|
||||||
val deserialized = DetailedBolusInfo.fromJsonString(serialized)
|
val deserialized = DetailedBolusInfo.fromJsonString(serialized)
|
||||||
Assert.assertEquals(1L, deserialized.bolusCalculatorResult?.timestamp)
|
Assert.assertEquals(1L, deserialized.bolusCalculatorResult?.timestamp)
|
||||||
Assert.assertEquals(TherapyEvent.Type.BOLUS_WIZARD, deserialized.eventType)
|
Assert.assertEquals(DetailedBolusInfo.EventType.BOLUS_WIZARD, deserialized.eventType)
|
||||||
// Context should be excluded
|
// Context should be excluded
|
||||||
Assert.assertNull(deserialized.context)
|
Assert.assertNull(deserialized.context)
|
||||||
}
|
}
|
||||||
|
@ -46,11 +46,11 @@ class DetailedBolusInfoTest : TestBase() {
|
||||||
detailedBolusInfo.timestamp = 1000
|
detailedBolusInfo.timestamp = 1000
|
||||||
detailedBolusInfo.notes = "note"
|
detailedBolusInfo.notes = "note"
|
||||||
detailedBolusInfo.mgdlGlucose = 180.0
|
detailedBolusInfo.mgdlGlucose = 180.0
|
||||||
detailedBolusInfo.glucoseType = TherapyEvent.MeterType.FINGER
|
detailedBolusInfo.glucoseType = DetailedBolusInfo.MeterType.FINGER
|
||||||
|
|
||||||
val therapyEvent = detailedBolusInfo.createTherapyEvent()
|
val therapyEvent = detailedBolusInfo.createTherapyEvent()
|
||||||
Assert.assertEquals(1000L, therapyEvent.timestamp)
|
Assert.assertEquals(1000L, therapyEvent.timestamp)
|
||||||
Assert.assertEquals(TherapyEvent.Type.NOTE, therapyEvent.type)
|
Assert.assertEquals(TherapyEvent.Type.MEAL_BOLUS, therapyEvent.type)
|
||||||
Assert.assertEquals(TherapyEvent.GlucoseUnit.MGDL, therapyEvent.glucoseUnit)
|
Assert.assertEquals(TherapyEvent.GlucoseUnit.MGDL, therapyEvent.glucoseUnit)
|
||||||
Assert.assertEquals("note", therapyEvent.note)
|
Assert.assertEquals("note", therapyEvent.note)
|
||||||
Assert.assertEquals(180.0, therapyEvent.glucose)
|
Assert.assertEquals(180.0, therapyEvent.glucose)
|
||||||
|
@ -61,7 +61,7 @@ class DetailedBolusInfoTest : TestBase() {
|
||||||
fun generateBolus() {
|
fun generateBolus() {
|
||||||
val detailedBolusInfo = DetailedBolusInfo()
|
val detailedBolusInfo = DetailedBolusInfo()
|
||||||
detailedBolusInfo.timestamp = 1000
|
detailedBolusInfo.timestamp = 1000
|
||||||
detailedBolusInfo.bolusType = Bolus.Type.SMB
|
detailedBolusInfo.bolusType = DetailedBolusInfo.BolusType.SMB
|
||||||
detailedBolusInfo.insulin = 7.0
|
detailedBolusInfo.insulin = 7.0
|
||||||
|
|
||||||
val bolus = detailedBolusInfo.createBolus()
|
val bolus = detailedBolusInfo.createBolus()
|
||||||
|
@ -111,6 +111,7 @@ class DetailedBolusInfoTest : TestBase() {
|
||||||
wasTempTargetUsed = true,
|
wasTempTargetUsed = true,
|
||||||
totalInsulin = 15.0,
|
totalInsulin = 15.0,
|
||||||
percentageCorrection = 50,
|
percentageCorrection = 50,
|
||||||
profileName = "profile"
|
profileName = "profile",
|
||||||
|
note = ""
|
||||||
)
|
)
|
||||||
}
|
}
|
|
@ -10,6 +10,6 @@ class MealDataTest {
|
||||||
|
|
||||||
@Test fun canCreateObject() {
|
@Test fun canCreateObject() {
|
||||||
val md = MealData()
|
val md = MealData()
|
||||||
Assert.assertEquals(0.0, md.boluses, 0.01)
|
Assert.assertEquals(0.0, md.carbs, 0.01)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,7 +2,7 @@ package info.nightscout.androidaps.plugins.iob.iobCalculator
|
||||||
|
|
||||||
import info.nightscout.androidaps.TestBase
|
import info.nightscout.androidaps.TestBase
|
||||||
import info.nightscout.androidaps.database.entities.GlucoseValue
|
import info.nightscout.androidaps.database.entities.GlucoseValue
|
||||||
import info.nightscout.androidaps.interfaces.IobCobCalculatorInterface
|
import info.nightscout.androidaps.interfaces.IobCobCalculator
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.asRounded
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.asRounded
|
||||||
|
@ -28,7 +28,7 @@ import java.util.*
|
||||||
class GlucoseStatusTest : TestBase() {
|
class GlucoseStatusTest : TestBase() {
|
||||||
|
|
||||||
@Mock lateinit var dateUtil: DateUtil
|
@Mock lateinit var dateUtil: DateUtil
|
||||||
@Mock lateinit var iobCobCalculatorPlugin: IobCobCalculatorInterface
|
@Mock lateinit var iobCobCalculatorPlugin: IobCobCalculator
|
||||||
|
|
||||||
@Test fun toStringShouldBeOverloaded() {
|
@Test fun toStringShouldBeOverloaded() {
|
||||||
val glucoseStatus = GlucoseStatus(glucose = 0.0, noise = 0.0, delta = 0.0, shortAvgDelta = 0.0, longAvgDelta = 0.0, date = 0)
|
val glucoseStatus = GlucoseStatus(glucose = 0.0, noise = 0.0, delta = 0.0, shortAvgDelta = 0.0, longAvgDelta = 0.0, date = 0)
|
||||||
|
@ -106,7 +106,7 @@ class GlucoseStatusTest : TestBase() {
|
||||||
fun initMocking() {
|
fun initMocking() {
|
||||||
PowerMockito.mockStatic(DateUtil::class.java)
|
PowerMockito.mockStatic(DateUtil::class.java)
|
||||||
PowerMockito.`when`(DateUtil.now()).thenReturn(1514766900000L + T.mins(1).msecs())
|
PowerMockito.`when`(DateUtil.now()).thenReturn(1514766900000L + T.mins(1).msecs())
|
||||||
`when`(iobCobCalculatorPlugin.dataLock).thenReturn(Unit)
|
`when`(iobCobCalculatorPlugin.dataLock).thenReturn(Any())
|
||||||
}
|
}
|
||||||
|
|
||||||
// [{"mgdl":214,"mills":1521895773113,"device":"xDrip-DexcomG5","direction":"Flat","filtered":191040,"unfiltered":205024,"noise":1,"rssi":100},{"mgdl":219,"mills":1521896073352,"device":"xDrip-DexcomG5","direction":"Flat","filtered":200160,"unfiltered":209760,"noise":1,"rssi":100},{"mgdl":222,"mills":1521896372890,"device":"xDrip-DexcomG5","direction":"Flat","filtered":207360,"unfiltered":212512,"noise":1,"rssi":100},{"mgdl":220,"mills":1521896673062,"device":"xDrip-DexcomG5","direction":"Flat","filtered":211488,"unfiltered":210688,"noise":1,"rssi":100},{"mgdl":193,"mills":1521896972933,"device":"xDrip-DexcomG5","direction":"Flat","filtered":212384,"unfiltered":208960,"noise":1,"rssi":100},{"mgdl":181,"mills":1521897273336,"device":"xDrip-DexcomG5","direction":"SingleDown","filtered":210592,"unfiltered":204320,"noise":1,"rssi":100},{"mgdl":176,"mills":1521897572875,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":206720,"unfiltered":197440,"noise":1,"rssi":100},{"mgdl":168,"mills":1521897872929,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":201024,"unfiltered":187904,"noise":1,"rssi":100},{"mgdl":161,"mills":1521898172814,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":193376,"unfiltered":178144,"noise":1,"rssi":100},{"mgdl":148,"mills":1521898472879,"device":"xDrip-DexcomG5","direction":"SingleDown","filtered":183264,"unfiltered":161216,"noise":1,"rssi":100},{"mgdl":139,"mills":1521898772862,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":170784,"unfiltered":148928,"noise":1,"rssi":100},{"mgdl":132,"mills":1521899072896,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":157248,"unfiltered":139552,"noise":1,"rssi":100},{"mgdl":125,"mills":1521899372834,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":144416,"unfiltered":129616.00000000001,"noise":1,"rssi":100},{"mgdl":128,"mills":1521899973456,"device":"xDrip-DexcomG5","direction":"Flat","filtered":130240.00000000001,"unfiltered":133536,"noise":1,"rssi":100},{"mgdl":132,"mills":1521900573287,"device":"xDrip-DexcomG5","direction":"Flat","filtered":133504,"unfiltered":138720,"noise":1,"rssi":100},{"mgdl":127,"mills":1521900873711,"device":"xDrip-DexcomG5","direction":"Flat","filtered":136480,"unfiltered":132992,"noise":1,"rssi":100},{"mgdl":127,"mills":1521901180151,"device":"xDrip-DexcomG5","direction":"Flat","filtered":136896,"unfiltered":132128,"noise":1,"rssi":100},{"mgdl":125,"mills":1521901473582,"device":"xDrip-DexcomG5","direction":"Flat","filtered":134624,"unfiltered":129696,"noise":1,"rssi":100},{"mgdl":120,"mills":1521901773597,"device":"xDrip-DexcomG5","direction":"Flat","filtered":130704.00000000001,"unfiltered":123376,"noise":1,"rssi":100},{"mgdl":116,"mills":1521902075855,"device":"xDrip-DexcomG5","direction":"Flat","filtered":126272,"unfiltered":118448,"noise":1,"rssi":100}]
|
// [{"mgdl":214,"mills":1521895773113,"device":"xDrip-DexcomG5","direction":"Flat","filtered":191040,"unfiltered":205024,"noise":1,"rssi":100},{"mgdl":219,"mills":1521896073352,"device":"xDrip-DexcomG5","direction":"Flat","filtered":200160,"unfiltered":209760,"noise":1,"rssi":100},{"mgdl":222,"mills":1521896372890,"device":"xDrip-DexcomG5","direction":"Flat","filtered":207360,"unfiltered":212512,"noise":1,"rssi":100},{"mgdl":220,"mills":1521896673062,"device":"xDrip-DexcomG5","direction":"Flat","filtered":211488,"unfiltered":210688,"noise":1,"rssi":100},{"mgdl":193,"mills":1521896972933,"device":"xDrip-DexcomG5","direction":"Flat","filtered":212384,"unfiltered":208960,"noise":1,"rssi":100},{"mgdl":181,"mills":1521897273336,"device":"xDrip-DexcomG5","direction":"SingleDown","filtered":210592,"unfiltered":204320,"noise":1,"rssi":100},{"mgdl":176,"mills":1521897572875,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":206720,"unfiltered":197440,"noise":1,"rssi":100},{"mgdl":168,"mills":1521897872929,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":201024,"unfiltered":187904,"noise":1,"rssi":100},{"mgdl":161,"mills":1521898172814,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":193376,"unfiltered":178144,"noise":1,"rssi":100},{"mgdl":148,"mills":1521898472879,"device":"xDrip-DexcomG5","direction":"SingleDown","filtered":183264,"unfiltered":161216,"noise":1,"rssi":100},{"mgdl":139,"mills":1521898772862,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":170784,"unfiltered":148928,"noise":1,"rssi":100},{"mgdl":132,"mills":1521899072896,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":157248,"unfiltered":139552,"noise":1,"rssi":100},{"mgdl":125,"mills":1521899372834,"device":"xDrip-DexcomG5","direction":"FortyFiveDown","filtered":144416,"unfiltered":129616.00000000001,"noise":1,"rssi":100},{"mgdl":128,"mills":1521899973456,"device":"xDrip-DexcomG5","direction":"Flat","filtered":130240.00000000001,"unfiltered":133536,"noise":1,"rssi":100},{"mgdl":132,"mills":1521900573287,"device":"xDrip-DexcomG5","direction":"Flat","filtered":133504,"unfiltered":138720,"noise":1,"rssi":100},{"mgdl":127,"mills":1521900873711,"device":"xDrip-DexcomG5","direction":"Flat","filtered":136480,"unfiltered":132992,"noise":1,"rssi":100},{"mgdl":127,"mills":1521901180151,"device":"xDrip-DexcomG5","direction":"Flat","filtered":136896,"unfiltered":132128,"noise":1,"rssi":100},{"mgdl":125,"mills":1521901473582,"device":"xDrip-DexcomG5","direction":"Flat","filtered":134624,"unfiltered":129696,"noise":1,"rssi":100},{"mgdl":120,"mills":1521901773597,"device":"xDrip-DexcomG5","direction":"Flat","filtered":130704.00000000001,"unfiltered":123376,"noise":1,"rssi":100},{"mgdl":116,"mills":1521902075855,"device":"xDrip-DexcomG5","direction":"Flat","filtered":126272,"unfiltered":118448,"noise":1,"rssi":100}]
|
||||||
|
|
|
@ -43,7 +43,7 @@ open class DanaRTestBase : TestBase() {
|
||||||
@Mock lateinit var commandQueue: CommandQueueProvider
|
@Mock lateinit var commandQueue: CommandQueueProvider
|
||||||
@Mock lateinit var detailedBolusInfoStorage: DetailedBolusInfoStorage
|
@Mock lateinit var detailedBolusInfoStorage: DetailedBolusInfoStorage
|
||||||
@Mock lateinit var constraintChecker: ConstraintChecker
|
@Mock lateinit var constraintChecker: ConstraintChecker
|
||||||
@Mock lateinit var nsUpload: NSUpload
|
@Mock lateinit var pumpSync: PumpSync
|
||||||
|
|
||||||
lateinit var testPumpPlugin: TestPumpPlugin
|
lateinit var testPumpPlugin: TestPumpPlugin
|
||||||
|
|
||||||
|
@ -73,9 +73,9 @@ open class DanaRTestBase : TestBase() {
|
||||||
it.configBuilder = configBuilder
|
it.configBuilder = configBuilder
|
||||||
it.detailedBolusInfoStorage = detailedBolusInfoStorage
|
it.detailedBolusInfoStorage = detailedBolusInfoStorage
|
||||||
it.constraintChecker = constraintChecker
|
it.constraintChecker = constraintChecker
|
||||||
it.nsUpload = nsUpload
|
|
||||||
it.databaseHelper = databaseHelper
|
it.databaseHelper = databaseHelper
|
||||||
it.commandQueue = commandQueue
|
it.commandQueue = commandQueue
|
||||||
|
it.pumpSync = pumpSync
|
||||||
}
|
}
|
||||||
if (it is TemporaryBasal) {
|
if (it is TemporaryBasal) {
|
||||||
it.aapsLogger = aapsLogger
|
it.aapsLogger = aapsLogger
|
||||||
|
|
|
@ -3,7 +3,7 @@ package info.nightscout.androidaps.danars.comm
|
||||||
import dagger.android.AndroidInjector
|
import dagger.android.AndroidInjector
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.danars.DanaRSTestBase
|
import info.nightscout.androidaps.danars.DanaRSTestBase
|
||||||
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
import info.nightscout.androidaps.interfaces.PumpSync
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
|
@ -13,7 +13,7 @@ import org.powermock.modules.junit4.PowerMockRunner
|
||||||
@RunWith(PowerMockRunner::class)
|
@RunWith(PowerMockRunner::class)
|
||||||
class DanaRsPacketNotifyAlarmTest : DanaRSTestBase() {
|
class DanaRsPacketNotifyAlarmTest : DanaRSTestBase() {
|
||||||
|
|
||||||
@Mock lateinit var nsUpload: NSUpload
|
@Mock lateinit var pumpSync: PumpSync
|
||||||
|
|
||||||
private val packetInjector = HasAndroidInjector {
|
private val packetInjector = HasAndroidInjector {
|
||||||
AndroidInjector {
|
AndroidInjector {
|
||||||
|
@ -21,7 +21,8 @@ class DanaRsPacketNotifyAlarmTest : DanaRSTestBase() {
|
||||||
it.aapsLogger = aapsLogger
|
it.aapsLogger = aapsLogger
|
||||||
it.rxBus = rxBus
|
it.rxBus = rxBus
|
||||||
it.resourceHelper = resourceHelper
|
it.resourceHelper = resourceHelper
|
||||||
it.nsUpload = nsUpload
|
it.pumpSync = pumpSync
|
||||||
|
it.danaPump = danaPump
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -281,16 +281,29 @@ open class AppRepository @Inject internal constructor(
|
||||||
fun findBolusByPumpIds(pumpId: Long, pumpType: InterfaceIDs.PumpType, pumpSerial: String): Bolus? =
|
fun findBolusByPumpIds(pumpId: Long, pumpType: InterfaceIDs.PumpType, pumpSerial: String): Bolus? =
|
||||||
database.bolusDao.findByPumpIds(pumpId, pumpType, pumpSerial)
|
database.bolusDao.findByPumpIds(pumpId, pumpType, pumpSerial)
|
||||||
|
|
||||||
|
fun getOldestBolusRecord(): Bolus? =
|
||||||
|
database.bolusDao.getOldestBolusRecord()
|
||||||
|
|
||||||
fun getBolusesDataFromTime(timestamp: Long, ascending: Boolean): Single<List<Bolus>> =
|
fun getBolusesDataFromTime(timestamp: Long, ascending: Boolean): Single<List<Bolus>> =
|
||||||
database.bolusDao.getBolusesFromTime(timestamp)
|
database.bolusDao.getBolusesFromTime(timestamp)
|
||||||
.map { if (!ascending) it.reversed() else it }
|
.map { if (!ascending) it.reversed() else it }
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
|
|
||||||
|
fun getBolusesDataFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single<List<Bolus>> =
|
||||||
|
database.bolusDao.getBolusesFromTime(from, to)
|
||||||
|
.map { if (!ascending) it.reversed() else it }
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
|
||||||
fun getBolusesIncludingInvalidFromTime(timestamp: Long, ascending: Boolean): Single<List<Bolus>> =
|
fun getBolusesIncludingInvalidFromTime(timestamp: Long, ascending: Boolean): Single<List<Bolus>> =
|
||||||
database.bolusDao.getBolusesIncludingInvalidFromTime(timestamp)
|
database.bolusDao.getBolusesIncludingInvalidFromTime(timestamp)
|
||||||
.map { if (!ascending) it.reversed() else it }
|
.map { if (!ascending) it.reversed() else it }
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
|
|
||||||
|
fun getBolusesIncludingInvalidFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single<List<Bolus>> =
|
||||||
|
database.bolusDao.getBolusesIncludingInvalidFromTimeToTime(from, to)
|
||||||
|
.map { if (!ascending) it.reversed() else it }
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
|
||||||
fun deleteAllBoluses() =
|
fun deleteAllBoluses() =
|
||||||
database.bolusDao.deleteAllEntries()
|
database.bolusDao.deleteAllEntries()
|
||||||
|
|
||||||
|
@ -321,16 +334,29 @@ open class AppRepository @Inject internal constructor(
|
||||||
fun getCarbsByTimestamp(timestamp: Long): Carbs? =
|
fun getCarbsByTimestamp(timestamp: Long): Carbs? =
|
||||||
database.carbsDao.findByTimestamp(timestamp)
|
database.carbsDao.findByTimestamp(timestamp)
|
||||||
|
|
||||||
|
fun getOldestCarbsRecord(): Carbs? =
|
||||||
|
database.carbsDao.getOldestCarbsRecord()
|
||||||
|
|
||||||
fun getCarbsDataFromTime(timestamp: Long, ascending: Boolean): Single<List<Carbs>> =
|
fun getCarbsDataFromTime(timestamp: Long, ascending: Boolean): Single<List<Carbs>> =
|
||||||
database.carbsDao.getCarbsFromTime(timestamp)
|
database.carbsDao.getCarbsFromTime(timestamp)
|
||||||
.map { if (!ascending) it.reversed() else it }
|
.map { if (!ascending) it.reversed() else it }
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
|
|
||||||
|
fun getCarbsDataFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single<List<Carbs>> =
|
||||||
|
database.carbsDao.getCarbsFromTimeToTime(from, to)
|
||||||
|
.map { if (!ascending) it.reversed() else it }
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
|
||||||
fun getCarbsIncludingInvalidFromTime(timestamp: Long, ascending: Boolean): Single<List<Carbs>> =
|
fun getCarbsIncludingInvalidFromTime(timestamp: Long, ascending: Boolean): Single<List<Carbs>> =
|
||||||
database.carbsDao.getCarbsIncludingInvalidFromTime(timestamp)
|
database.carbsDao.getCarbsIncludingInvalidFromTime(timestamp)
|
||||||
.map { if (!ascending) it.reversed() else it }
|
.map { if (!ascending) it.reversed() else it }
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
|
|
||||||
|
fun getCarbsIncludingInvalidFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single<List<Carbs>> =
|
||||||
|
database.carbsDao.getCarbsIncludingInvalidFromTimeToTime(from, to)
|
||||||
|
.map { if (!ascending) it.reversed() else it }
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
|
||||||
fun deleteAllCarbs() =
|
fun deleteAllCarbs() =
|
||||||
database.carbsDao.deleteAllEntries()
|
database.carbsDao.deleteAllEntries()
|
||||||
|
|
||||||
|
|
|
@ -21,12 +21,21 @@ internal interface BolusDao : TraceableDao<Bolus> {
|
||||||
@Query("SELECT * FROM $TABLE_BOLUSES WHERE pumpId = :pumpId AND pumpType = :pumpType AND pumpSerial = :pumpSerial AND referenceId IS NULL")
|
@Query("SELECT * FROM $TABLE_BOLUSES WHERE pumpId = :pumpId AND pumpType = :pumpType AND pumpSerial = :pumpSerial AND referenceId IS NULL")
|
||||||
fun findByPumpIds(pumpId: Long, pumpType: InterfaceIDs.PumpType, pumpSerial: String): Bolus?
|
fun findByPumpIds(pumpId: Long, pumpType: InterfaceIDs.PumpType, pumpSerial: String): Bolus?
|
||||||
|
|
||||||
|
@Query("SELECT * FROM $TABLE_BOLUSES WHERE isValid = 1 AND referenceId IS NULL ORDER BY id ASC LIMIT 1")
|
||||||
|
fun getOldestBolusRecord(): Bolus?
|
||||||
|
|
||||||
@Query("SELECT * FROM $TABLE_BOLUSES WHERE isValid = 1 AND timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
|
@Query("SELECT * FROM $TABLE_BOLUSES WHERE isValid = 1 AND timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
|
||||||
fun getBolusesFromTime(timestamp: Long): Single<List<Bolus>>
|
fun getBolusesFromTime(timestamp: Long): Single<List<Bolus>>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM $TABLE_BOLUSES WHERE isValid = 1 AND timestamp >= :start AND timestamp <= :end AND referenceId IS NULL ORDER BY id DESC")
|
||||||
|
fun getBolusesFromTime(start: Long, end: Long): Single<List<Bolus>>
|
||||||
|
|
||||||
@Query("SELECT * FROM $TABLE_BOLUSES WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
|
@Query("SELECT * FROM $TABLE_BOLUSES WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
|
||||||
fun getBolusesIncludingInvalidFromTime(timestamp: Long): Single<List<Bolus>>
|
fun getBolusesIncludingInvalidFromTime(timestamp: Long): Single<List<Bolus>>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM $TABLE_BOLUSES WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC")
|
||||||
|
fun getBolusesIncludingInvalidFromTimeToTime(from: Long, to: Long): Single<List<Bolus>>
|
||||||
|
|
||||||
// This query will be used with v3 to get all changed records
|
// This query will be used with v3 to get all changed records
|
||||||
@Query("SELECT * FROM $TABLE_BOLUSES WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_BOLUSES WHERE id > :id) ORDER BY id ASC")
|
@Query("SELECT * FROM $TABLE_BOLUSES WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_BOLUSES WHERE id > :id) ORDER BY id ASC")
|
||||||
fun getModifiedFrom(id: Long): Single<List<Bolus>>
|
fun getModifiedFrom(id: Long): Single<List<Bolus>>
|
||||||
|
|
|
@ -23,12 +23,21 @@ internal interface CarbsDao : TraceableDao<Carbs> {
|
||||||
@Query("SELECT * FROM $TABLE_CARBS WHERE timestamp = :timestamp AND referenceId IS NULL")
|
@Query("SELECT * FROM $TABLE_CARBS WHERE timestamp = :timestamp AND referenceId IS NULL")
|
||||||
fun findByTimestamp(timestamp: Long): Carbs?
|
fun findByTimestamp(timestamp: Long): Carbs?
|
||||||
|
|
||||||
|
@Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND referenceId IS NULL ORDER BY id ASC LIMIT 1")
|
||||||
|
fun getOldestCarbsRecord(): Carbs?
|
||||||
|
|
||||||
@Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
|
@Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
|
||||||
fun getCarbsFromTime(timestamp: Long): Single<List<Carbs>>
|
fun getCarbsFromTime(timestamp: Long): Single<List<Carbs>>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC")
|
||||||
|
fun getCarbsFromTimeToTime(from: Long, to: Long): Single<List<Carbs>>
|
||||||
|
|
||||||
@Query("SELECT * FROM $TABLE_CARBS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
|
@Query("SELECT * FROM $TABLE_CARBS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC")
|
||||||
fun getCarbsIncludingInvalidFromTime(timestamp: Long): Single<List<Carbs>>
|
fun getCarbsIncludingInvalidFromTime(timestamp: Long): Single<List<Carbs>>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM $TABLE_CARBS WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC")
|
||||||
|
fun getCarbsIncludingInvalidFromTimeToTime(from: Long, to: Long): Single<List<Carbs>>
|
||||||
|
|
||||||
// This query will be used with v3 to get all changed records
|
// This query will be used with v3 to get all changed records
|
||||||
@Query("SELECT * FROM $TABLE_CARBS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_CARBS WHERE id > :id) ORDER BY id ASC")
|
@Query("SELECT * FROM $TABLE_CARBS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_CARBS WHERE id > :id) ORDER BY id ASC")
|
||||||
fun getModifiedFrom(id: Long): Single<List<Carbs>>
|
fun getModifiedFrom(id: Long): Single<List<Carbs>>
|
||||||
|
|
|
@ -157,7 +157,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
||||||
|
|
||||||
|
|
||||||
public boolean isInitialized() {
|
public boolean isInitialized() {
|
||||||
return PumpDriverState.isInitialized(pumpState);
|
return pumpState.isInitialized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -174,7 +174,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
||||||
public boolean isConnected() {
|
public boolean isConnected() {
|
||||||
if (displayConnectionMessages)
|
if (displayConnectionMessages)
|
||||||
aapsLogger.debug(LTag.PUMP, "isConnected [PumpPluginAbstract].");
|
aapsLogger.debug(LTag.PUMP, "isConnected [PumpPluginAbstract].");
|
||||||
return PumpDriverState.isConnected(pumpState);
|
return pumpState.isConnected();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
package info.nightscout.androidaps.plugins.pump.common.defs
|
||||||
|
|
||||||
|
enum class PumpDriverState {
|
||||||
|
|
||||||
|
NotInitialized,
|
||||||
|
Connecting,
|
||||||
|
Connected,
|
||||||
|
Initialized,
|
||||||
|
Ready, Busy,
|
||||||
|
Suspended;
|
||||||
|
|
||||||
|
fun isConnected(): Boolean = this == Connected || this == Initialized || this == Busy || this == Suspended
|
||||||
|
fun isInitialized(): Boolean = this == Initialized || this == Busy || this == Suspended
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package info.nightscout.androidaps.plugins.pump.common.defs
|
||||||
|
|
||||||
|
enum class PumpStatusType(val status: String) {
|
||||||
|
|
||||||
|
Running("normal"),
|
||||||
|
Suspended("suspended");
|
||||||
|
}
|
|
@ -16,7 +16,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||||
* <p>
|
* <p>
|
||||||
* Just need a class to keep the pair together, for parcel transport.
|
* Just need a class to keep the pair together, for parcel transport.
|
||||||
*/
|
*/
|
||||||
public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair {
|
public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.common.defs.TempBasalPair {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This constructor is for use with PumpHistoryDecoder
|
* This constructor is for use with PumpHistoryDecoder
|
||||||
|
@ -30,11 +30,11 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
||||||
int rateInt = ByteUtil.asUINT8(rateByte);
|
int rateInt = ByteUtil.asUINT8(rateByte);
|
||||||
|
|
||||||
if (isPercent)
|
if (isPercent)
|
||||||
this.insulinRate = rateByte;
|
this.setInsulinRate(rateByte);
|
||||||
else
|
else
|
||||||
this.insulinRate = rateInt * 0.025;
|
this.setInsulinRate(rateInt * 0.025);
|
||||||
this.durationMinutes = startTimeByte * 30;
|
this.setDurationMinutes(startTimeByte * 30);
|
||||||
this.isPercent = isPercent;
|
this.setPercent(isPercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,12 +47,12 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
||||||
*/
|
*/
|
||||||
public TempBasalPair(byte rateByte0, byte rateByte1, int startTimeByte, boolean isPercent) {
|
public TempBasalPair(byte rateByte0, byte rateByte1, int startTimeByte, boolean isPercent) {
|
||||||
if (isPercent) {
|
if (isPercent) {
|
||||||
this.insulinRate = rateByte0;
|
this.setInsulinRate(rateByte0);
|
||||||
} else {
|
} else {
|
||||||
this.insulinRate = ByteUtil.toInt(rateByte1, rateByte0) * 0.025;
|
this.setInsulinRate(ByteUtil.toInt(rateByte1, rateByte0) * 0.025);
|
||||||
}
|
}
|
||||||
this.durationMinutes = startTimeByte * 30;
|
this.setDurationMinutes(startTimeByte * 30);
|
||||||
this.isPercent = isPercent;
|
this.setPercent(isPercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TempBasalPair(AAPSLogger aapsLogger, byte[] response) {
|
public TempBasalPair(AAPSLogger aapsLogger, byte[] response) {
|
||||||
|
@ -60,20 +60,20 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
||||||
|
|
||||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Received TempBasal response: " + ByteUtil.getHex(response));
|
aapsLogger.debug(LTag.PUMPBTCOMM, "Received TempBasal response: " + ByteUtil.getHex(response));
|
||||||
|
|
||||||
isPercent = response[0] == 1;
|
setPercent(response[0] == 1);
|
||||||
|
|
||||||
if (isPercent) {
|
if (isPercent()) {
|
||||||
insulinRate = response[1];
|
setInsulinRate(response[1]);
|
||||||
} else {
|
} else {
|
||||||
int strokes = MedtronicUtil.makeUnsignedShort(response[2], response[3]);
|
int strokes = MedtronicUtil.makeUnsignedShort(response[2], response[3]);
|
||||||
|
|
||||||
insulinRate = strokes / 40.0d;
|
setInsulinRate(strokes / 40.0d);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.length < 6) {
|
if (response.length < 6) {
|
||||||
durationMinutes = ByteUtil.asUINT8(response[4]);
|
setDurationMinutes(ByteUtil.asUINT8(response[4]));
|
||||||
} else {
|
} else {
|
||||||
durationMinutes = MedtronicUtil.makeUnsignedShort(response[4], response[5]);
|
setDurationMinutes(MedtronicUtil.makeUnsignedShort(response[4], response[5]));
|
||||||
}
|
}
|
||||||
|
|
||||||
aapsLogger.warn(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "TempBasalPair (with %d byte response): %s", response.length, toString()));
|
aapsLogger.warn(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "TempBasalPair (with %d byte response): %s", response.length, toString()));
|
||||||
|
@ -92,8 +92,8 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
||||||
|
|
||||||
list.add((byte) 5);
|
list.add((byte) 5);
|
||||||
|
|
||||||
byte[] insulinRate = MedtronicUtil.getBasalStrokes(this.insulinRate, true);
|
byte[] insulinRate = MedtronicUtil.getBasalStrokes(this.getInsulinRate(), true);
|
||||||
byte timeMin = (byte) MedtronicUtil.getIntervalFromMinutes(durationMinutes);
|
byte timeMin = (byte) MedtronicUtil.getIntervalFromMinutes(getDurationMinutes());
|
||||||
|
|
||||||
// list.add((byte) 0); // ?
|
// list.add((byte) 0); // ?
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCancelTBR() {
|
public boolean isCancelTBR() {
|
||||||
return (MedtronicUtil.isSame(insulinRate, 0.0d) && durationMinutes == 0);
|
return (MedtronicUtil.isSame(getInsulinRate(), 0.0d) && getDurationMinutes() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -129,17 +129,17 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
||||||
return "Cancel TBR";
|
return "Cancel TBR";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPercent) {
|
if (isPercent()) {
|
||||||
return String.format(Locale.ENGLISH, "Rate: %.0f%%, Duration: %d min", insulinRate, durationMinutes);
|
return String.format(Locale.ENGLISH, "Rate: %.0f%%, Duration: %d min", getInsulinRate(), getDurationMinutes());
|
||||||
} else {
|
} else {
|
||||||
return String.format(Locale.ENGLISH, "Rate: %.3f U, Duration: %d min", insulinRate, durationMinutes);
|
return String.format(Locale.ENGLISH, "Rate: %.3f U, Duration: %d min", getInsulinRate(), getDurationMinutes());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@NonNull @Override
|
@NonNull @Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "TempBasalPair [" + "Rate=" + insulinRate + ", DurationMinutes=" + durationMinutes + ", IsPercent="
|
return "TempBasalPair [" + "Rate=" + getInsulinRate() + ", DurationMinutes=" + getDurationMinutes() + ", IsPercent="
|
||||||
+ isPercent + "]";
|
+ isPercent() + "]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType;
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification;
|
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification;
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
|
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
|
||||||
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
|
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair;
|
import info.nightscout.androidaps.plugins.pump.common.defs.TempBasalPair;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange;
|
import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||||
|
|
|
@ -33,7 +33,7 @@ import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNo
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
|
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress;
|
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress;
|
||||||
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
|
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair;
|
import info.nightscout.androidaps.plugins.pump.common.defs.TempBasalPair;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||||
import info.nightscout.androidaps.plugins.pump.omnipod.common.definition.OmnipodCommandType;
|
import info.nightscout.androidaps.plugins.pump.omnipod.common.definition.OmnipodCommandType;
|
||||||
|
|
|
@ -29,7 +29,7 @@ import info.nightscout.androidaps.db.OmnipodHistoryRecord;
|
||||||
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
|
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||||
import info.nightscout.androidaps.logging.LTag;
|
import info.nightscout.androidaps.logging.LTag;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair;
|
import info.nightscout.androidaps.plugins.pump.common.defs.TempBasalPair;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup;
|
import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.utils.ProfileUtil;
|
import info.nightscout.androidaps.plugins.pump.common.utils.ProfileUtil;
|
||||||
|
|
|
@ -23,7 +23,7 @@ import info.nightscout.androidaps.interfaces.CommandQueueProvider;
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||||
import info.nightscout.androidaps.logging.AAPSLoggerTest;
|
import info.nightscout.androidaps.logging.AAPSLoggerTest;
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair;
|
import info.nightscout.androidaps.plugins.pump.common.defs.TempBasalPair;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodErosManager;
|
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodErosManager;
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package info.nightscout.androidaps.plugins.pump.common.defs
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.core.R
|
||||||
|
|
||||||
|
enum class PumpDeviceState(var resourceId: Int) {
|
||||||
|
|
||||||
|
NeverContacted(R.string.pump_status_never_contacted),
|
||||||
|
Sleeping(R.string.pump_status_sleeping),
|
||||||
|
WakingUp(R.string.pump_status_waking_up),
|
||||||
|
Active(R.string.pump_status_active),
|
||||||
|
ErrorWhenCommunicating(R.string.pump_status_error_comm),
|
||||||
|
TimeoutWhenCommunicating(R.string.pump_status_timeout_comm),
|
||||||
|
|
||||||
|
// ProblemContacting(R.string.medtronic_pump_status_problem_contacting),
|
||||||
|
PumpUnreachable(R.string.pump_status_pump_unreachable),
|
||||||
|
InvalidConfiguration(R.string.pump_status_invalid_config);
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package info.nightscout.androidaps.plugins.pump.common.defs
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose
|
||||||
|
|
||||||
|
open class TempBasalPair {
|
||||||
|
|
||||||
|
@Expose var insulinRate = 0.0
|
||||||
|
@Expose var durationMinutes = 0
|
||||||
|
@Expose var isPercent = false
|
||||||
|
private var start: Long? = null
|
||||||
|
private var end: Long? = null
|
||||||
|
|
||||||
|
constructor()
|
||||||
|
constructor(insulinRate: Double, isPercent: Boolean, durationMinutes: Int) {
|
||||||
|
this.insulinRate = insulinRate
|
||||||
|
this.isPercent = isPercent
|
||||||
|
this.durationMinutes = durationMinutes
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setStartTime(startTime: Long?) {
|
||||||
|
start = startTime
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setEndTime(endTime: Long?) {
|
||||||
|
end = endTime
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return ("TempBasalPair [" + "Rate=" + insulinRate + ", DurationMinutes=" + durationMinutes + ", IsPercent="
|
||||||
|
+ isPercent + "]")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue