From 3d68b2817960ae850a2e467ebd77c9d2db3065f8 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 21 Apr 2020 10:32:14 +0200 Subject: [PATCH 1/2] objective 11 automation --- .../dependencyInjection/AppComponent.kt | 9 +++++---- .../dependencyInjection/AppModule.kt | 1 + .../interfaces/ConstraintsInterface.kt | 5 +++++ .../configBuilder/ConstraintChecker.kt | 13 +++++++++++++ .../objectives/ObjectivesPlugin.kt | 10 ++++++++++ .../objectives/objectives/Objective10.java | 19 +++++++++++++++++++ .../general/actions/ActionsFragment.kt | 4 +--- .../general/automation/AutomationPlugin.kt | 7 +++++++ app/src/main/res/values/objectives.xml | 2 ++ 9 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective10.java diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt index 392056e8c8..2bcf212b2b 100644 --- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt +++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt @@ -80,12 +80,13 @@ interface AppComponent : AndroidInjector { fun injectObjective1(objective1: Objective1) fun injectObjective2(objective2: Objective2) fun injectObjective3(objective3: Objective3) - fun injectObjective3(objective4: Objective4) + fun injectObjective4(objective4: Objective4) fun injectObjective5(objective5: Objective5) fun injectObjective6(objective6: Objective6) - fun injectObjective6(objective7: Objective7) - fun injectObjective6(objective8: Objective8) - fun injectObjective6(objective9: Objective9) + fun injectObjective7(objective7: Objective7) + fun injectObjective8(objective8: Objective8) + fun injectObjective9(objective9: Objective9) + fun injectObjective10(objective10: Objective10) fun injectAutomationEvent(automationEvent: AutomationEvent) diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppModule.kt index 4eb2708a3f..76ff40ab2a 100644 --- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppModule.kt @@ -161,6 +161,7 @@ open class AppModule { @ContributesAndroidInjector fun objective7Injector(): Objective7 @ContributesAndroidInjector fun objective8Injector(): Objective8 @ContributesAndroidInjector fun objective9Injector(): Objective9 + @ContributesAndroidInjector fun objective10Injector(): Objective10 @ContributesAndroidInjector fun automationEventInjector(): AutomationEvent diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.kt b/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.kt index 0634bbb139..1afa1f4738 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.kt +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.kt @@ -76,4 +76,9 @@ interface ConstraintsInterface { fun applyMaxIOBConstraints(maxIob: Constraint): Constraint { return maxIob } + + @JvmDefault + fun isAutomationEnabled(value: Constraint): Constraint { + return value + } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConstraintChecker.kt b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConstraintChecker.kt index 78a30a9720..111dcd5b79 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConstraintChecker.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConstraintChecker.kt @@ -54,6 +54,9 @@ class ConstraintChecker @Inject constructor(private val activePlugin: ActivePlug fun getMaxIOBAllowed(): Constraint = applyMaxIOBConstraints(Constraint(Constants.REALLYHIGHIOB)) + fun isAutomationEnabled(): Constraint = + isAutomationEnabled(Constraint(true)) + override fun isLoopInvocationAllowed(value: Constraint): Constraint { val constraintsPlugins = activePlugin.getSpecificPluginsListByInterface(ConstraintsInterface::class.java) for (p in constraintsPlugins) { @@ -193,4 +196,14 @@ class ConstraintChecker @Inject constructor(private val activePlugin: ActivePlug } return maxIob } + + override fun isAutomationEnabled(value: Constraint): Constraint { + val constraintsPlugins = activePlugin.getSpecificPluginsListByInterface(ConstraintsInterface::class.java) + for (p in constraintsPlugins) { + val constraint = p as ConstraintsInterface + if (!p.isEnabled(PluginType.CONSTRAINTS)) continue + constraint.isAutomationEnabled(value) + } + return value + } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt index 78c1412a17..a5eb85a582 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt @@ -50,6 +50,7 @@ class ObjectivesPlugin @Inject constructor( const val AUTOSENS_OBJECTIVE = 7 const val AMA_OBJECTIVE = 8 const val SMB_OBJECTIVE = 9 + const val AUTO_OBJECTIVE = 10 } public override fun onStart() { @@ -94,6 +95,7 @@ class ObjectivesPlugin @Inject constructor( objectives.add(Objective7(injector)) objectives.add(Objective8(injector)) objectives.add(Objective9(injector)) + objectives.add(Objective10(injector)) } fun reset() { @@ -133,6 +135,8 @@ class ObjectivesPlugin @Inject constructor( sp.putLong("Objectives_" + "ama" + "_accomplished", DateUtil.now()) sp.putLong("Objectives_" + "smb" + "_started", DateUtil.now()) sp.putLong("Objectives_" + "smb" + "_accomplished", DateUtil.now()) + sp.putLong("Objectives_" + "auto" + "_started", DateUtil.now()) + sp.putLong("Objectives_" + "auto" + "_accomplished", DateUtil.now()) setupObjectives() OKDialog.show(activity, resourceHelper.gs(R.string.objectives), resourceHelper.gs(R.string.codeaccepted)) } else { @@ -178,4 +182,10 @@ class ObjectivesPlugin @Inject constructor( maxIob.set(aapsLogger, 0.0, String.format(resourceHelper.gs(R.string.objectivenotfinished), MAXIOB_ZERO_CL_OBJECTIVE + 1), this) return maxIob } + + override fun isAutomationEnabled(value: Constraint): Constraint { + if (!objectives[AUTO_OBJECTIVE].isStarted) + value.set(aapsLogger, false, String.format(resourceHelper.gs(R.string.objectivenotstarted), AUTO_OBJECTIVE + 1), this) + return value + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective10.java b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective10.java new file mode 100644 index 0000000000..a9257f15a2 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective10.java @@ -0,0 +1,19 @@ +package info.nightscout.androidaps.plugins.constraints.objectives.objectives; + +import java.util.List; + +import dagger.android.HasAndroidInjector; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.utils.T; + +public class Objective10 extends Objective { + + public Objective10(HasAndroidInjector injector) { + super(injector, "auto", R.string.objectives_auto_objective, R.string.objectives_auto_gate); + } + + @Override + protected void setupTasks(List tasks) { + tasks.add(new MinimumDurationTask(T.days(28).msecs())); + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt index 278cdd950c..6c4432c0a8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt @@ -184,9 +184,7 @@ class ActionsFragment : DaggerFragment() { @Synchronized fun updateGui() { - actions_profileswitch?.visibility = - if (activePlugin.activeProfileInterface.profile != null) View.VISIBLE - else View.GONE + actions_profileswitch?.visibility = (activePlugin.activeProfileInterface.profile != null).toVisibility() val profile = profileFunction.getProfile() val pump = activePlugin.activePump diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt index 6e1aad8871..9a1c4d5c3a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt @@ -18,6 +18,7 @@ import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker import info.nightscout.androidaps.plugins.general.automation.actions.* import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationDataChanged import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationUpdateGui @@ -50,6 +51,7 @@ class AutomationPlugin @Inject constructor( private val fabricPrivacy: FabricPrivacy, private val loopPlugin: LoopPlugin, private val rxBus: RxBusWrapper, + private val constraintChecker: ConstraintChecker, aapsLogger: AAPSLogger ) : PluginBase(PluginDescription() .mainType(PluginType.GENERAL) @@ -181,6 +183,11 @@ class AutomationPlugin @Inject constructor( aapsLogger.debug(LTag.AUTOMATION, "Loop deactivated") return } + val enabled = constraintChecker.isAutomationEnabled() + if (!enabled.value()) { + executionLog.add(enabled.getMostLimitedReasons(aapsLogger)) + return + } aapsLogger.debug(LTag.AUTOMATION, "processActions") for (event in automationEvents) { diff --git a/app/src/main/res/values/objectives.xml b/app/src/main/res/values/objectives.xml index 7fada71a72..0c2adb8717 100644 --- a/app/src/main/res/values/objectives.xml +++ b/app/src/main/res/values/objectives.xml @@ -32,7 +32,9 @@ 1 week successful daytime looping with regular carb entry Enabling additional features for daytime use, such as advanced meal assist Enabling additional features for daytime use, such as SMB + Enabling automation You must read the wiki and rise maxIOB to get SMBs working fine! A good start is maxIOB=average mealbolus + 3 x max daily basal + Read the wiki how automation works. Setup your first simple rules. Instead of action let AAPS display only notification. When you are sure automation is triggered at the right time replace notification by real action. BG available in NS Pump status available in NS Manual enacts From 8cc51abae91e298031f16c78db965a780b9c8402 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 21 Apr 2020 10:52:40 +0200 Subject: [PATCH 2/2] allow start of objective when all previous are finished --- .../plugins/constraints/objectives/ObjectivesFragment.kt | 2 +- .../plugins/constraints/objectives/ObjectivesPlugin.kt | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesFragment.kt index 651fe0c4ac..d891a89dda 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesFragment.kt @@ -161,7 +161,7 @@ class ObjectivesFragment : DaggerFragment() { holder.accomplished.visibility = View.GONE holder.unFinish.visibility = View.GONE holder.unStart.visibility = View.GONE - if (position == 0 || objectivesPlugin.objectives[position - 1].isAccomplished) + if (position == 0 || objectivesPlugin.allPriorAccomplished(position)) holder.start.visibility = View.VISIBLE else holder.start.visibility = View.GONE diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt index a5eb85a582..209a74f44a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesPlugin.kt @@ -144,6 +144,14 @@ class ObjectivesPlugin @Inject constructor( } } + fun allPriorAccomplished(position: Int) : Boolean { + var accomplished = true + for (i in 0 until position) { + accomplished = accomplished && objectives[i].isAccomplished + } + return accomplished + } + /** * Constraints interface */