diff --git a/app/build.gradle b/app/build.gradle
index ffa92cddd2..da06e17acd 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -105,7 +105,7 @@ android {
defaultConfig {
multiDexEnabled true
versionCode 1500
- version "3.0.0.2-dev-n"
+ version "3.0.0.2-autotune-dev-n0"
buildConfigField "String", "VERSION", '"' + version + '"'
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"'
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneFragment.kt
index 9fcc4b8db2..0f2834c90e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneFragment.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneFragment.kt
@@ -100,7 +100,6 @@ class AutotuneFragment : DaggerFragment() {
)
binding.autotuneRun.setOnClickListener {
val daysBack = SafeParse.stringToInt(binding.tuneDays.text)
- autotunePlugin.calculationRunning = true
autotunePlugin.lastNbDays = daysBack.toString()
log("Run Autotune $profileName, $daysBack days")
Thread {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt
index 925d290ee4..a634ee876c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt
@@ -59,14 +59,28 @@ open class AutotuneIob @Inject constructor(
initializeTreatmentData(from - range(), to)
initializeTempBasalData(from - range(), to, tunedProfile)
initializeExtendedBolusData(from - range(), to, tunedProfile)
- tempBasals = ArrayList(tempBasals.toList().sortedWith { o1: TemporaryBasal, o2: TemporaryBasal -> (o2.timestamp - o1.timestamp).toInt() })
- // Without Neutral TBR, Autotune Web will ignore iob for periods without TBR running
- addNeutralTempBasal(from - range(), to, tunedProfile)
- nsTreatments = ArrayList(nsTreatments.toList().sortedWith { o1: NsTreatment, o2: NsTreatment -> (o2.date - o1.date).toInt() })
- boluses = ArrayList(boluses.toList().sortedWith { o1: Bolus, o2: Bolus -> (o2.timestamp - o1.timestamp).toInt() })
+ sortTempBasal()
+ addNeutralTempBasal(from - range(), to, tunedProfile) // Without Neutral TBR, Autotune Web will ignore iob for periods without TBR running
+ sortNsTreatments()
+ sortBoluses()
aapsLogger.debug(LTag.AUTOTUNE, "Nb Treatments: " + nsTreatments.size + " Nb meals: " + meals.size)
}
+ @Synchronized
+ private fun sortTempBasal() {
+ tempBasals = ArrayList(tempBasals.toList().sortedWith { o1: TemporaryBasal, o2: TemporaryBasal -> (o2.timestamp - o1.timestamp).toInt() })
+ }
+
+ @Synchronized
+ private fun sortNsTreatments() {
+ nsTreatments = ArrayList(nsTreatments.toList().sortedWith { o1: NsTreatment, o2: NsTreatment -> (o2.date - o1.date).toInt() })
+ }
+
+ @Synchronized
+ private fun sortBoluses() {
+ boluses = ArrayList(boluses.toList().sortedWith { o1: Bolus, o2: Bolus -> (o2.timestamp - o1.timestamp).toInt() })
+ }
+
private fun initializeBgreadings(from: Long, to: Long) {
glucose = repository.compatGetBgReadingsDataFromTime(from, to, false).blockingGet()
}
@@ -146,6 +160,7 @@ open class AutotuneIob @Inject constructor(
// addNeutralTempBasal will add a fake neutral TBR (100%) to have correct basal rate in exported file for periods without TBR running
// to be able to compare results between oref0 algo and aaps
+ @Synchronized
private fun addNeutralTempBasal(from: Long, to: Long, tunedProfile: ATProfile) {
var previousStart = to
for (i in tempBasals.indices) {
@@ -180,6 +195,7 @@ open class AutotuneIob @Inject constructor(
// toSplittedTimestampTB will split all TBR across hours in different TBR with correct absolute value to be sure to have correct basal rate
// even if profile rate is not the same
+ @Synchronized
private fun toSplittedTimestampTB(tb: TemporaryBasal, tunedProfile: ATProfile) {
var splittedTimestamp = tb.timestamp
val cutInMilliSec = T.mins(60).msecs() //30 min to compare with oref0, 60 min to improve accuracy
@@ -295,7 +311,7 @@ open class AutotuneIob @Inject constructor(
return result
}
-
+ @Synchronized
fun glucoseToJSON(): String {
val glucoseJson = JSONArray()
for (bgreading in glucose)
@@ -303,6 +319,7 @@ open class AutotuneIob @Inject constructor(
return glucoseJson.toString(2)
}
+ @Synchronized
fun bolusesToJSON(): String {
val bolusesJson = JSONArray()
for (bolus in boluses)
@@ -310,6 +327,7 @@ open class AutotuneIob @Inject constructor(
return bolusesJson.toString(2)
}
+ @Synchronized
fun nsHistoryToJSON(): String {
val json = JSONArray()
for (t in nsTreatments) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePlugin.kt
index e379f22026..6a4f3d6a94 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePlugin.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePlugin.kt
@@ -22,6 +22,7 @@ import info.nightscout.androidaps.utils.MidnightTime
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.interfaces.BuildHelper
import info.nightscout.shared.logging.AAPSLogger
+import info.nightscout.shared.logging.LTag
import info.nightscout.shared.sharedPreferences.SP
import org.json.JSONException
import org.json.JSONObject
@@ -65,7 +66,7 @@ class AutotunePlugin @Inject constructor(
), Autotune {
@Volatile override var lastRunSuccess: Boolean = false
@Volatile var result: String = ""
- @Volatile var calculationRunning: Boolean = false
+ @Volatile override var calculationRunning: Boolean = false
@Volatile var lastRun: Long = 0
@Volatile var selectedProfile = ""
@Volatile var lastNbDays: String = ""
@@ -76,9 +77,12 @@ class AutotunePlugin @Inject constructor(
private lateinit var profile: Profile
val autotuneStartHour: Int = 4
- @Synchronized
override fun aapsAutotune(daysBack: Int, autoSwitch: Boolean, profileToTune: String) {
lastRunSuccess = false
+ if (calculationRunning) {
+ aapsLogger.debug(LTag.AUTOMATION, "Autotune run detected, Autotune Run Cancelled")
+ return
+ }
calculationRunning = true
tunedProfile = null
updateButtonVisibility = View.GONE
diff --git a/automation/src/main/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionRunAutotune.kt b/automation/src/main/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionRunAutotune.kt
index c2687fffed..b1da120478 100644
--- a/automation/src/main/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionRunAutotune.kt
+++ b/automation/src/main/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionRunAutotune.kt
@@ -42,13 +42,19 @@ class ActionRunAutotune(injector: HasAndroidInjector) : Action(injector) {
val profileName = if (inputProfileName.value == rh.gs(R.string.active)) "" else inputProfileName.value
var message = if (autoSwitch) R.string.autotune_run_with_autoswitch else R.string.autotune_run_without_autoswitch
Thread {
- autotunePlugin.atLog("[Automation] Run Autotune $profileName, ${daysBack.value} days, Autoswitch $autoSwitch")
- autotunePlugin.aapsAutotune(daysBack.value, autoSwitch, profileName)
- if (!autotunePlugin.lastRunSuccess) {
- message = R.string.autotune_run_with_error
- aapsLogger.error(LTag.AUTOMATION, "Error during Autotune Run")
+ if (!autotunePlugin.calculationRunning) {
+ autotunePlugin.atLog("[Automation] Run Autotune $profileName, ${daysBack.value} days, Autoswitch $autoSwitch")
+ autotunePlugin.aapsAutotune(daysBack.value, autoSwitch, profileName)
+ if (!autotunePlugin.lastRunSuccess) {
+ message = R.string.autotune_run_with_error
+ aapsLogger.error(LTag.AUTOMATION, "Error during Autotune Run")
+ }
+ callback.result(PumpEnactResult(injector).success(autotunePlugin.lastRunSuccess).comment(message)).run()
+ } else {
+ message = R.string.autotune_run_cancelled
+ aapsLogger.debug(LTag.AUTOMATION, "Autotune run detected, Autotune Run Cancelled")
+ callback.result(PumpEnactResult(injector).success(false).comment(message)).run()
}
- callback.result(PumpEnactResult(injector).success(autotunePlugin.lastRunSuccess).comment(message)).run()
}.start()
return
}
diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/Autotune.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/Autotune.kt
index 83ebcd2530..93c20f71d5 100644
--- a/core/src/main/java/info/nightscout/androidaps/interfaces/Autotune.kt
+++ b/core/src/main/java/info/nightscout/androidaps/interfaces/Autotune.kt
@@ -6,4 +6,5 @@ interface Autotune {
fun atLog(message: String)
var lastRunSuccess: Boolean
+ var calculationRunning: Boolean
}
\ No newline at end of file
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index 30974f7512..3f5832b0cd 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -600,6 +600,7 @@
Autotune runned without profile switch
Autotune runned and profile automatically switched
Error during last Autotune run
+ Another run of Autotune is detected, run cancelled
- %1$d day