diff --git a/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt b/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt index 3321c508e6..26e345574b 100644 --- a/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt @@ -52,6 +52,7 @@ import info.nightscout.sensitivity.SensitivityAAPSPlugin import info.nightscout.sensitivity.SensitivityOref1Plugin import info.nightscout.sensitivity.SensitivityWeightedAveragePlugin import info.nightscout.smoothing.ExponentialSmoothingPlugin +import info.nightscout.smoothing.AvgSmoothingPlugin import info.nightscout.smoothing.NoSmoothingPlugin import info.nightscout.source.AidexPlugin import info.nightscout.source.DexcomPlugin @@ -448,6 +449,12 @@ abstract class PluginsListModule { @IntKey(605) abstract fun bindExponentialSmoothingPlugin(plugin: ExponentialSmoothingPlugin): PluginBase + @Binds + @AllConfigs + @IntoMap + @IntKey(610) + abstract fun bindAvgSmoothingPlugin(plugin: AvgSmoothingPlugin): PluginBase + @Qualifier annotation class AllConfigs diff --git a/plugins/smoothing/src/main/java/info/nightscout/smoothing/AvgSmoothingPlugin.kt b/plugins/smoothing/src/main/java/info/nightscout/smoothing/AvgSmoothingPlugin.kt new file mode 100644 index 0000000000..9a5ed0bcb2 --- /dev/null +++ b/plugins/smoothing/src/main/java/info/nightscout/smoothing/AvgSmoothingPlugin.kt @@ -0,0 +1,60 @@ +package info.nightscout.smoothing + +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.annotations.OpenForTesting +import info.nightscout.interfaces.iob.InMemoryGlucoseValue +import info.nightscout.interfaces.plugin.PluginBase +import info.nightscout.interfaces.plugin.PluginDescription +import info.nightscout.interfaces.plugin.PluginType +import info.nightscout.interfaces.smoothing.Smoothing +import info.nightscout.rx.logging.AAPSLogger +import info.nightscout.shared.interfaces.ResourceHelper +import javax.inject.Inject +import javax.inject.Singleton +import kotlin.math.max +import kotlin.math.round + +@OpenForTesting +@Singleton +class AvgSmoothingPlugin @Inject constructor( + injector: HasAndroidInjector, + aapsLogger: AAPSLogger, + rh: ResourceHelper +) : PluginBase( + PluginDescription() + .mainType(PluginType.SMOOTHING) + .pluginIcon(info.nightscout.core.ui.R.drawable.ic_timeline_24) + .pluginName(R.string.avg_smoothing_name) + .shortName(R.string.smoothing_shortname) + .description(R.string.description_avg_smoothing), + aapsLogger, rh, injector +), Smoothing { + + @Suppress("LocalVariableName") + override fun smooth(data: MutableList): MutableList { + + for (i in data.lastIndex -1 downTo 1) { + // TODO: Bucketed is always calculated to 5 min (CHECK!), Maybe add a separate timecheck? + // TODO: We could further improve this by adding a weight to the neighbours + if (isValid(data[i].value) && isValid(data[i - 1].value) && isValid(data[i + 1].value)) + { + var result = ((data[i - 1].value + data[i].value + data[i + 1].value) / 3.0) + data[i].smoothed = result + aapsLogger.debug("RESULT $result") + } + else + { + // TODO: Decide what to do here + data[i].smoothed = data[i].value + } + } + + // append data we cannot smooth + data[data.lastIndex].smoothed = data[data.lastIndex].value + data[0].smoothed = data[0].value + return data + } + private fun isValid(n: Double): Boolean { + return n > 39 && n < 401 + } +} \ No newline at end of file diff --git a/plugins/smoothing/src/main/res/values/strings.xml b/plugins/smoothing/src/main/res/values/strings.xml index e1c6048431..20f2010255 100644 --- a/plugins/smoothing/src/main/res/values/strings.xml +++ b/plugins/smoothing/src/main/res/values/strings.xml @@ -4,6 +4,8 @@ SMOOTH Exponential smoothing "Second-order exponential smoothing algorithm" + Average smoothing + "(Weighted) Average smoothing, newest data is not affected" No smoothing "No smoothing performed on input glucose data" \ No newline at end of file