SMOOTHING: reset trend arrow on smoothing
This commit is contained in:
parent
70a57ec475
commit
fa7b73bc8b
|
@ -16,6 +16,7 @@ android {
|
||||||
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation project(':database:entities')
|
||||||
implementation project(':app-wear-shared:shared')
|
implementation project(':app-wear-shared:shared')
|
||||||
implementation project(':core:interfaces')
|
implementation project(':core:interfaces')
|
||||||
implementation project(':core:ui')
|
implementation project(':core:ui')
|
||||||
|
|
|
@ -2,6 +2,7 @@ package info.nightscout.smoothing
|
||||||
|
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.annotations.OpenForTesting
|
import info.nightscout.androidaps.annotations.OpenForTesting
|
||||||
|
import info.nightscout.database.entities.GlucoseValue
|
||||||
import info.nightscout.interfaces.iob.InMemoryGlucoseValue
|
import info.nightscout.interfaces.iob.InMemoryGlucoseValue
|
||||||
import info.nightscout.interfaces.plugin.PluginBase
|
import info.nightscout.interfaces.plugin.PluginBase
|
||||||
import info.nightscout.interfaces.plugin.PluginDescription
|
import info.nightscout.interfaces.plugin.PluginDescription
|
||||||
|
@ -13,8 +14,7 @@ import info.nightscout.shared.interfaces.ResourceHelper
|
||||||
import info.nightscout.shared.utils.T
|
import info.nightscout.shared.utils.T
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
import kotlin.math.max
|
import kotlin.math.abs
|
||||||
import kotlin.math.round
|
|
||||||
|
|
||||||
@OpenForTesting
|
@OpenForTesting
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -32,7 +32,6 @@ class AvgSmoothingPlugin @Inject constructor(
|
||||||
aapsLogger, rh, injector
|
aapsLogger, rh, injector
|
||||||
), Smoothing {
|
), Smoothing {
|
||||||
|
|
||||||
@Suppress("LocalVariableName")
|
|
||||||
override fun smooth(data: MutableList<InMemoryGlucoseValue>): MutableList<InMemoryGlucoseValue> {
|
override fun smooth(data: MutableList<InMemoryGlucoseValue>): MutableList<InMemoryGlucoseValue> {
|
||||||
if (data.lastIndex < 4)
|
if (data.lastIndex < 4)
|
||||||
{
|
{
|
||||||
|
@ -44,20 +43,19 @@ class AvgSmoothingPlugin @Inject constructor(
|
||||||
// Check if value's are in a valid range
|
// Check if value's are in a valid range
|
||||||
// Bucketed is always calculated to 5 min, we still check if our data is evenly spaced with an allowance of 30 seconds
|
// Bucketed is always calculated to 5 min, we still check if our data is evenly spaced with an allowance of 30 seconds
|
||||||
if (isValid(data[i].value) && isValid(data[i - 1].value) && isValid(data[i + 1].value)
|
if (isValid(data[i].value) && isValid(data[i - 1].value) && isValid(data[i + 1].value)
|
||||||
&& Math.abs(data[i].timestamp - data[i - 1].timestamp - (data[i + 1].timestamp - data[i].timestamp)) < T.secs(30).msecs())
|
&& abs(data[i].timestamp - data[i - 1].timestamp - (data[i + 1].timestamp - data[i].timestamp)) < T.secs(30).msecs()
|
||||||
{
|
) {
|
||||||
// We could further improve this by adding a weight to the neighbours, for simplicity this is not done.
|
// We could further improve this by adding a weight to the neighbours, for simplicity this is not done.
|
||||||
data[i].smoothed = ((data[i - 1].value + data[i].value + data[i + 1].value) / 3.0)
|
data[i].smoothed = ((data[i - 1].value + data[i].value + data[i + 1].value) / 3.0)
|
||||||
}
|
data[i].trendArrow = GlucoseValue.TrendArrow.NONE
|
||||||
else
|
} else {
|
||||||
{
|
|
||||||
// data[i].smoothed = data[i].value
|
// data[i].smoothed = data[i].value
|
||||||
val currentTime = data[i].timestamp
|
val currentTime = data[i].timestamp
|
||||||
val value = data[i].value
|
val value = data[i].value
|
||||||
aapsLogger.debug(LTag.GLUCOSE, "Value: $value at $currentTime not smoothed")
|
aapsLogger.debug(LTag.GLUCOSE, "Value: $value at $currentTime not smoothed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// We leave the data we can not smooth as is, alternativly we could provide raw value's to the smoothed value's:
|
// We leave the data we can not smooth as is, alternatively we could provide raw value's to the smoothed value's:
|
||||||
// data[data.lastIndex].smoothed = data[data.lastIndex].value
|
// data[data.lastIndex].smoothed = data[data.lastIndex].value
|
||||||
// data[0].smoothed = data[0].value
|
// data[0].smoothed = data[0].value
|
||||||
return data
|
return data
|
||||||
|
|
|
@ -2,6 +2,7 @@ package info.nightscout.smoothing
|
||||||
|
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.annotations.OpenForTesting
|
import info.nightscout.androidaps.annotations.OpenForTesting
|
||||||
|
import info.nightscout.database.entities.GlucoseValue
|
||||||
import info.nightscout.interfaces.iob.InMemoryGlucoseValue
|
import info.nightscout.interfaces.iob.InMemoryGlucoseValue
|
||||||
import info.nightscout.interfaces.plugin.PluginBase
|
import info.nightscout.interfaces.plugin.PluginBase
|
||||||
import info.nightscout.interfaces.plugin.PluginDescription
|
import info.nightscout.interfaces.plugin.PluginDescription
|
||||||
|
@ -118,7 +119,8 @@ class ExponentialSmoothingPlugin @Inject constructor(
|
||||||
//ssD.clear() // MP reset doubly smoothed delta array
|
//ssD.clear() // MP reset doubly smoothed delta array
|
||||||
|
|
||||||
if (!insufficientSmoothingData) { //MP Build doubly smoothed array only if there is enough valid readings
|
if (!insufficientSmoothingData) { //MP Build doubly smoothed array only if there is enough valid readings
|
||||||
for (i in o2_sBG.indices) { //MP calculated doubly smoothed bg of all o1/o2 smoothed data available; o2 & o1 smoothbg array sizes are equal in size, so only one is used as a condition here
|
for (i in o2_sBG.indices) { //MP calculated doubly smoothed bg of all o1/o2 smoothed data available; o2 & o1 smooth bg array sizes are equal in size, so only one is used as a condition
|
||||||
|
// here
|
||||||
ssBG.add(o1_weight * o1_sBG[i] + (1 - o1_weight) * o2_sBG[i]) //MP build array of doubly smoothed bgs
|
ssBG.add(o1_weight * o1_sBG[i] + (1 - o1_weight) * o2_sBG[i]) //MP build array of doubly smoothed bgs
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -128,11 +130,13 @@ class ExponentialSmoothingPlugin @Inject constructor(
|
||||||
*/
|
*/
|
||||||
for (i in 0 until minOf(ssBG.size, data.size)) { // noise at the beginning of the smoothing window is the greatest, so only include the 10 most recent values in the output
|
for (i in 0 until minOf(ssBG.size, data.size)) { // noise at the beginning of the smoothing window is the greatest, so only include the 10 most recent values in the output
|
||||||
data[i].smoothed = max(round(ssBG[i]), 39.0) //Make 39 the smallest value as smaller values trigger errors (xDrip error state = 38)
|
data[i].smoothed = max(round(ssBG[i]), 39.0) //Make 39 the smallest value as smaller values trigger errors (xDrip error state = 38)
|
||||||
|
data[i].trendArrow = GlucoseValue.TrendArrow.NONE
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i in 0 until data.size) { // noise at the beginning of the smoothing window is the greatest, so only include the 10 most recent values in the output
|
for (i in 0 until data.size) { // noise at the beginning of the smoothing window is the greatest, so only include the 10 most recent values in the output
|
||||||
data[i].smoothed = max(data[i].value, 39.0) // if insufficient smoothing data, copy 'value' into 'smoothed' data column so that it isn't empty; Make 39 the smallest value as smaller
|
data[i].smoothed = max(data[i].value, 39.0) // if insufficient smoothing data, copy 'value' into 'smoothed' data column so that it isn't empty; Make 39 the smallest value as smaller
|
||||||
// values trigger errors (xDrip error state = 38)
|
// values trigger errors (xDrip error state = 38)
|
||||||
|
data[i].trendArrow = GlucoseValue.TrendArrow.NONE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,7 @@ class RandomBgPlugin @Inject constructor(
|
||||||
value = bgMgdl,
|
value = bgMgdl,
|
||||||
raw = 0.0,
|
raw = 0.0,
|
||||||
noise = null,
|
noise = null,
|
||||||
trendArrow = GlucoseValue.TrendArrow.NONE,
|
trendArrow = GlucoseValue.TrendArrow.values().toList().shuffled().first(),
|
||||||
sourceSensor = GlucoseValue.SourceSensor.RANDOM
|
sourceSensor = GlucoseValue.SourceSensor.RANDOM
|
||||||
)
|
)
|
||||||
disposable += repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null))
|
disposable += repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null))
|
||||||
|
|
Loading…
Reference in a new issue