diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.java deleted file mode 100644 index c3a19cb1f6..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.java +++ /dev/null @@ -1,318 +0,0 @@ -package info.nightscout.androidaps.plugins.aps.openAPSSMB; - -import android.content.Context; - -import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.SwitchPreference; - -import org.jetbrains.annotations.NotNull; -import org.json.JSONException; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import dagger.android.HasAndroidInjector; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.data.IobTotal; -import info.nightscout.androidaps.data.MealData; -import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.db.TempTarget; -import info.nightscout.androidaps.interfaces.APSInterface; -import info.nightscout.androidaps.interfaces.ActivePluginProvider; -import info.nightscout.androidaps.interfaces.Constraint; -import info.nightscout.androidaps.interfaces.ConstraintsInterface; -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.interfaces.PumpInterface; -import info.nightscout.androidaps.logging.AAPSLogger; -import info.nightscout.androidaps.logging.LTag; -import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui; -import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateResultGui; -import info.nightscout.androidaps.plugins.aps.loop.APSResult; -import info.nightscout.androidaps.plugins.aps.loop.ScriptReader; -import info.nightscout.androidaps.plugins.bus.RxBusWrapper; -import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker; -import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult; -import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus; -import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin; -import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensData; -import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; -import info.nightscout.androidaps.utils.DateUtil; -import info.nightscout.androidaps.utils.FabricPrivacy; -import info.nightscout.androidaps.utils.HardLimits; -import info.nightscout.androidaps.utils.Profiler; -import info.nightscout.androidaps.utils.Round; -import info.nightscout.androidaps.utils.resources.ResourceHelper; -import info.nightscout.androidaps.utils.sharedPreferences.SP; - -@Singleton -public class OpenAPSSMBPlugin extends PluginBase implements APSInterface, ConstraintsInterface { - private final ConstraintChecker constraintChecker; - private final ResourceHelper resourceHelper; - private final ProfileFunction profileFunction; - private final Context context; - private final RxBusWrapper rxBus; - private final ActivePluginProvider activePlugin; - private final TreatmentsPlugin treatmentsPlugin; - private final IobCobCalculatorPlugin iobCobCalculatorPlugin; - private final HardLimits hardLimits; - private final Profiler profiler; - private final FabricPrivacy fabricPrivacy; - private final SP sp; - - // last values - DetermineBasalAdapterSMBJS lastDetermineBasalAdapterSMBJS = null; - long lastAPSRun = 0; - DetermineBasalResultSMB lastAPSResult = null; - AutosensResult lastAutosensResult = null; - - @Inject - public OpenAPSSMBPlugin( - HasAndroidInjector injector, - AAPSLogger aapsLogger, - RxBusWrapper rxBus, - ConstraintChecker constraintChecker, - ResourceHelper resourceHelper, - ProfileFunction profileFunction, - Context context, - ActivePluginProvider activePlugin, - TreatmentsPlugin treatmentsPlugin, - IobCobCalculatorPlugin iobCobCalculatorPlugin, - HardLimits hardLimits, - Profiler profiler, - FabricPrivacy fabricPrivacy, - SP sp - ) { - super(new PluginDescription() - .mainType(PluginType.APS) - .fragmentClass(OpenAPSSMBFragment.class.getName()) - .pluginIcon(R.drawable.ic_generic_icon) - .pluginName(R.string.openapssmb) - .shortName(R.string.smb_shortname) - .preferencesId(R.xml.pref_openapssmb) - .description(R.string.description_smb) - .setDefault(), - aapsLogger, resourceHelper, injector - ); - this.constraintChecker = constraintChecker; - this.resourceHelper = resourceHelper; - this.profileFunction = profileFunction; - this.rxBus = rxBus; - this.context = context; - this.activePlugin = activePlugin; - this.treatmentsPlugin = treatmentsPlugin; - this.iobCobCalculatorPlugin = iobCobCalculatorPlugin; - this.hardLimits = hardLimits; - this.profiler = profiler; - this.fabricPrivacy = fabricPrivacy; - this.sp = sp; - } - - @Override - public boolean specialEnableCondition() { - try { - PumpInterface pump = activePlugin.getActivePump(); - return pump.getPumpDescription().isTempBasalCapable; - } catch (Exception ignored) { - // may fail during initialization - return true; - } - } - - @Override - public boolean specialShowInListCondition() { - PumpInterface pump = activePlugin.getActivePump(); - return pump.getPumpDescription().isTempBasalCapable; - } - - @Override - public void preprocessPreferences(@NotNull PreferenceFragmentCompat preferenceFragment) { - super.preprocessPreferences(preferenceFragment); - boolean smbAlwaysEnabled = sp.getBoolean(R.string.key_enableSMB_always, false); - - SwitchPreference withCOB = preferenceFragment.findPreference(resourceHelper.gs(R.string.key_enableSMB_with_COB)); - if (withCOB != null) { - withCOB.setVisible(!smbAlwaysEnabled); - } - SwitchPreference withTempTarget = preferenceFragment.findPreference(resourceHelper.gs(R.string.key_enableSMB_with_temptarget)); - if (withTempTarget != null) { - withTempTarget.setVisible(!smbAlwaysEnabled); - } - SwitchPreference afterCarbs = preferenceFragment.findPreference(resourceHelper.gs(R.string.key_enableSMB_after_carbs)); - if (afterCarbs != null) { - afterCarbs.setVisible(!smbAlwaysEnabled); - } - } - - @Override - public APSResult getLastAPSResult() { - return lastAPSResult; - } - - @Override - public long getLastAPSRun() { - return lastAPSRun; - } - - @Override - public void invoke(String initiator, boolean tempBasalFallback) { - getAapsLogger().debug(LTag.APS, "invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback); - lastAPSResult = null; - DetermineBasalAdapterSMBJS determineBasalAdapterSMBJS; - determineBasalAdapterSMBJS = new DetermineBasalAdapterSMBJS(new ScriptReader(context), getInjector()); - - GlucoseStatus glucoseStatus = new GlucoseStatus(getInjector()).getGlucoseStatusData(); - Profile profile = profileFunction.getProfile(); - PumpInterface pump = activePlugin.getActivePump(); - - if (profile == null) { - rxBus.send(new EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.noprofileselected))); - getAapsLogger().debug(LTag.APS, resourceHelper.gs(R.string.noprofileselected)); - return; - } - - if (!isEnabled(PluginType.APS)) { - rxBus.send(new EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openapsma_disabled))); - getAapsLogger().debug(LTag.APS, resourceHelper.gs(R.string.openapsma_disabled)); - return; - } - - if (glucoseStatus == null) { - rxBus.send(new EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openapsma_noglucosedata))); - getAapsLogger().debug(LTag.APS, resourceHelper.gs(R.string.openapsma_noglucosedata)); - return; - } - - Constraint inputConstraints = new Constraint<>(0d); // fake. only for collecting all results - - Constraint maxBasalConstraint = constraintChecker.getMaxBasalAllowed(profile); - inputConstraints.copyReasons(maxBasalConstraint); - double maxBasal = maxBasalConstraint.value(); - double minBg = profile.getTargetLowMgdl(); - double maxBg = profile.getTargetHighMgdl(); - double targetBg = profile.getTargetMgdl(); - - minBg = Round.roundTo(minBg, 0.1d); - maxBg = Round.roundTo(maxBg, 0.1d); - - long start = System.currentTimeMillis(); - long startPart = System.currentTimeMillis(); - - MealData mealData = iobCobCalculatorPlugin.getMealData(); - profiler.log(LTag.APS, "getMealData()", startPart); - - Constraint maxIOBAllowedConstraint = constraintChecker.getMaxIOBAllowed(); - inputConstraints.copyReasons(maxIOBAllowedConstraint); - double maxIob = maxIOBAllowedConstraint.value(); - - minBg = hardLimits.verifyHardLimits(minBg, "minBg", hardLimits.getVERY_HARD_LIMIT_MIN_BG()[0], hardLimits.getVERY_HARD_LIMIT_MIN_BG()[1]); - maxBg = hardLimits.verifyHardLimits(maxBg, "maxBg", hardLimits.getVERY_HARD_LIMIT_MAX_BG()[0], hardLimits.getVERY_HARD_LIMIT_MAX_BG()[1]); - targetBg = hardLimits.verifyHardLimits(targetBg, "targetBg", hardLimits.getVERY_HARD_LIMIT_TARGET_BG()[0], hardLimits.getVERY_HARD_LIMIT_TARGET_BG()[1]); - - boolean isTempTarget = false; - TempTarget tempTarget = treatmentsPlugin.getTempTargetFromHistory(System.currentTimeMillis()); - if (tempTarget != null) { - isTempTarget = true; - minBg = hardLimits.verifyHardLimits(tempTarget.low, "minBg", hardLimits.getVERY_HARD_LIMIT_TEMP_MIN_BG()[0], hardLimits.getVERY_HARD_LIMIT_TEMP_MIN_BG()[1]); - maxBg = hardLimits.verifyHardLimits(tempTarget.high, "maxBg", hardLimits.getVERY_HARD_LIMIT_TEMP_MAX_BG()[0], hardLimits.getVERY_HARD_LIMIT_TEMP_MAX_BG()[1]); - targetBg = hardLimits.verifyHardLimits(tempTarget.target(), "targetBg", hardLimits.getVERY_HARD_LIMIT_TEMP_TARGET_BG()[0], hardLimits.getVERY_HARD_LIMIT_TEMP_TARGET_BG()[1]); - } - - - if (!hardLimits.checkOnlyHardLimits(profile.getDia(), "dia", hardLimits.minDia(), hardLimits.maxDia())) - return; - if (!hardLimits.checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", hardLimits.minIC(), hardLimits.maxIC())) - return; - if (!hardLimits.checkOnlyHardLimits(profile.getIsfMgdl(), "sens", hardLimits.getMINISF(), hardLimits.getMAXISF())) - return; - if (!hardLimits.checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.02, hardLimits.maxBasal())) - return; - if (!hardLimits.checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, hardLimits.maxBasal())) - return; - - startPart = System.currentTimeMillis(); - if (constraintChecker.isAutosensModeEnabled().value()) { - AutosensData autosensData = iobCobCalculatorPlugin.getLastAutosensDataSynchronized("OpenAPSPlugin"); - if (autosensData == null) { - rxBus.send(new EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openaps_noasdata))); - return; - } - lastAutosensResult = autosensData.autosensResult; - } else { - lastAutosensResult = new AutosensResult(); - lastAutosensResult.sensResult = "autosens disabled"; - } - - IobTotal[] iobArray = iobCobCalculatorPlugin.calculateIobArrayForSMB(lastAutosensResult, SMBDefaults.exercise_mode, SMBDefaults.half_basal_exercise_target, isTempTarget); - profiler.log(LTag.APS, "calculateIobArrayInDia()", startPart); - - startPart = System.currentTimeMillis(); - Constraint smbAllowed = new Constraint<>(!tempBasalFallback); - constraintChecker.isSMBModeEnabled(smbAllowed); - inputConstraints.copyReasons(smbAllowed); - - Constraint advancedFiltering = new Constraint<>(!tempBasalFallback); - constraintChecker.isAdvancedFilteringEnabled(advancedFiltering); - inputConstraints.copyReasons(advancedFiltering); - - Constraint uam = new Constraint<>(true); - constraintChecker.isUAMEnabled(uam); - inputConstraints.copyReasons(uam); - - profiler.log(LTag.APS, "detectSensitivityandCarbAbsorption()", startPart); - profiler.log(LTag.APS, "SMB data gathering", start); - - start = System.currentTimeMillis(); - determineBasalAdapterSMBJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, activePlugin.getActivePump().getBaseBasalRate(), iobArray, glucoseStatus, mealData, - lastAutosensResult.ratio, //autosensDataRatio - isTempTarget, - smbAllowed.value(), - uam.value(), - advancedFiltering.value(), - activePlugin.getActiveBgSource().getClass().getSimpleName().equals("DexcomPlugin") - ); - - long now = System.currentTimeMillis(); - - DetermineBasalResultSMB determineBasalResultSMB = determineBasalAdapterSMBJS.invoke(); - profiler.log(LTag.APS, "SMB calculation", start); - if (determineBasalResultSMB == null) { - getAapsLogger().error(LTag.APS, "SMB calculation returned null"); - lastDetermineBasalAdapterSMBJS = null; - lastAPSResult = null; - lastAPSRun = 0; - } else { - // TODO still needed with oref1? - // Fix bug determine basal - if (determineBasalResultSMB.getRate() == 0d && determineBasalResultSMB.getDuration() == 0 && !treatmentsPlugin.isTempBasalInProgress()) - determineBasalResultSMB.setTempBasalRequested(false); - - determineBasalResultSMB.setIob(iobArray[0]); - - try { - determineBasalResultSMB.getJson().put("timestamp", DateUtil.toISOString(now)); - } catch (JSONException e) { - getAapsLogger().error(LTag.APS, "Unhandled exception", e); - } - - determineBasalResultSMB.setInputConstraints(inputConstraints); - - lastDetermineBasalAdapterSMBJS = determineBasalAdapterSMBJS; - lastAPSResult = determineBasalResultSMB; - lastAPSRun = now; - } - rxBus.send(new EventOpenAPSUpdateGui()); - - //deviceStatus.suggested = determineBasalResultAMA.json; - } - - @NotNull - @Override - public Constraint isSuperBolusEnabled(Constraint value) { - value.set(getAapsLogger(), false); - return value; - } - -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.kt new file mode 100644 index 0000000000..18e9e455e1 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.kt @@ -0,0 +1,202 @@ +package info.nightscout.androidaps.plugins.aps.openAPSSMB + +import android.content.Context +import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreference +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.R +import info.nightscout.androidaps.data.Profile +import info.nightscout.androidaps.interfaces.* +import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.logging.LTag +import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateGui +import info.nightscout.androidaps.plugins.aps.events.EventOpenAPSUpdateResultGui +import info.nightscout.androidaps.plugins.aps.loop.ScriptReader +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker +import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult +import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus +import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin +import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin +import info.nightscout.androidaps.utils.DateUtil +import info.nightscout.androidaps.utils.HardLimits +import info.nightscout.androidaps.utils.Profiler +import info.nightscout.androidaps.utils.Round +import info.nightscout.androidaps.utils.resources.ResourceHelper +import info.nightscout.androidaps.utils.sharedPreferences.SP +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class OpenAPSSMBPlugin @Inject constructor( + injector: HasAndroidInjector, + aapsLogger: AAPSLogger, + private val rxBus: RxBusWrapper, + private val constraintChecker: ConstraintChecker, + resourceHelper: ResourceHelper, + private val profileFunction: ProfileFunction, + private val context: Context, + private val activePlugin: ActivePluginProvider, + private val treatmentsPlugin: TreatmentsPlugin, + private val iobCobCalculatorPlugin: IobCobCalculatorPlugin, + private val hardLimits: HardLimits, + private val profiler: Profiler, + private val sp: SP +) : PluginBase(PluginDescription() + .mainType(PluginType.APS) + .fragmentClass(OpenAPSSMBFragment::class.java.name) + .pluginIcon(R.drawable.ic_generic_icon) + .pluginName(R.string.openapssmb) + .shortName(R.string.smb_shortname) + .preferencesId(R.xml.pref_openapssmb) + .description(R.string.description_smb) + .setDefault(), + aapsLogger, resourceHelper, injector +), APSInterface, ConstraintsInterface { + + // last values + override var lastAPSRun: Long = 0 + override var lastAPSResult: DetermineBasalResultSMB? = null + var lastDetermineBasalAdapterSMBJS: DetermineBasalAdapterSMBJS? = null + var lastAutosensResult = AutosensResult() + + override fun specialEnableCondition(): Boolean { + return try { + activePlugin.activePump.pumpDescription.isTempBasalCapable + } catch (ignored: Exception) { + // may fail during initialization + true + } + } + + override fun specialShowInListCondition(): Boolean { + val pump = activePlugin.activePump + return pump.pumpDescription.isTempBasalCapable + } + + override fun preprocessPreferences(preferenceFragment: PreferenceFragmentCompat) { + super.preprocessPreferences(preferenceFragment) + val smbAlwaysEnabled = sp.getBoolean(R.string.key_enableSMB_always, false) + preferenceFragment.findPreference(resourceHelper.gs(R.string.key_enableSMB_with_COB))?.isVisible = !smbAlwaysEnabled + preferenceFragment.findPreference(resourceHelper.gs(R.string.key_enableSMB_with_temptarget))?.isVisible = !smbAlwaysEnabled + preferenceFragment.findPreference(resourceHelper.gs(R.string.key_enableSMB_after_carbs))?.isVisible = !smbAlwaysEnabled + } + + override fun invoke(initiator: String, tempBasalFallback: Boolean) { + aapsLogger.debug(LTag.APS, "invoke from $initiator tempBasalFallback: $tempBasalFallback") + lastAPSResult = null + val glucoseStatus = GlucoseStatus(injector).glucoseStatusData + val profile = profileFunction.getProfile() + val pump = activePlugin.activePump + if (profile == null) { + rxBus.send(EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.noprofileselected))) + aapsLogger.debug(LTag.APS, resourceHelper.gs(R.string.noprofileselected)) + return + } + if (!isEnabled(PluginType.APS)) { + rxBus.send(EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openapsma_disabled))) + aapsLogger.debug(LTag.APS, resourceHelper.gs(R.string.openapsma_disabled)) + return + } + if (glucoseStatus == null) { + rxBus.send(EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openapsma_noglucosedata))) + aapsLogger.debug(LTag.APS, resourceHelper.gs(R.string.openapsma_noglucosedata)) + return + } + + val inputConstraints = Constraint(0.0) // fake. only for collecting all results + val maxBasal = constraintChecker.getMaxBasalAllowed(profile).also { + inputConstraints.copyReasons(it) + }.value() + var start = System.currentTimeMillis() + var startPart = System.currentTimeMillis() + profiler.log(LTag.APS, "getMealData()", startPart) + val maxIob = constraintChecker.getMaxIOBAllowed().also { maxIOBAllowedConstraint -> + inputConstraints.copyReasons(maxIOBAllowedConstraint) + }.value() + + var minBg = hardLimits.verifyHardLimits(Round.roundTo(profile.targetLowMgdl, 0.1), "minBg", hardLimits.VERY_HARD_LIMIT_MIN_BG[0].toDouble(), hardLimits.VERY_HARD_LIMIT_MIN_BG[1].toDouble()) + var maxBg = hardLimits.verifyHardLimits(Round.roundTo(profile.targetHighMgdl, 0.1), "maxBg", hardLimits.VERY_HARD_LIMIT_MAX_BG[0].toDouble(), hardLimits.VERY_HARD_LIMIT_MAX_BG[1].toDouble()) + var targetBg = hardLimits.verifyHardLimits(profile.targetMgdl, "targetBg", hardLimits.VERY_HARD_LIMIT_TARGET_BG[0].toDouble(), hardLimits.VERY_HARD_LIMIT_TARGET_BG[1].toDouble()) + var isTempTarget = false + treatmentsPlugin.getTempTargetFromHistory(System.currentTimeMillis())?.let { tempTarget -> + isTempTarget = true + minBg = hardLimits.verifyHardLimits(tempTarget.low, "minBg", hardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[0].toDouble(), hardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[1].toDouble()) + maxBg = hardLimits.verifyHardLimits(tempTarget.high, "maxBg", hardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[0].toDouble(), hardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[1].toDouble()) + targetBg = hardLimits.verifyHardLimits(tempTarget.target(), "targetBg", hardLimits.VERY_HARD_LIMIT_TEMP_TARGET_BG[0].toDouble(), hardLimits.VERY_HARD_LIMIT_TEMP_TARGET_BG[1].toDouble()) + } + if (!hardLimits.checkOnlyHardLimits(profile.dia, "dia", hardLimits.minDia(), hardLimits.maxDia())) return + if (!hardLimits.checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", hardLimits.minIC(), hardLimits.maxIC())) return + if (!hardLimits.checkOnlyHardLimits(profile.isfMgdl, "sens", hardLimits.MINISF, hardLimits.MAXISF)) return + if (!hardLimits.checkOnlyHardLimits(profile.maxDailyBasal, "max_daily_basal", 0.02, hardLimits.maxBasal())) return + if (!hardLimits.checkOnlyHardLimits(pump.baseBasalRate, "current_basal", 0.01, hardLimits.maxBasal())) return + startPart = System.currentTimeMillis() + if (constraintChecker.isAutosensModeEnabled().value()) { + val autosensData = iobCobCalculatorPlugin.getLastAutosensDataSynchronized("OpenAPSPlugin") + if (autosensData == null) { + rxBus.send(EventOpenAPSUpdateResultGui(resourceHelper.gs(R.string.openaps_noasdata))) + return + } + lastAutosensResult = autosensData.autosensResult + } else { + lastAutosensResult.sensResult = "autosens disabled" + } + val iobArray = iobCobCalculatorPlugin.calculateIobArrayForSMB(lastAutosensResult, SMBDefaults.exercise_mode, SMBDefaults.half_basal_exercise_target, isTempTarget) + profiler.log(LTag.APS, "calculateIobArrayInDia()", startPart) + startPart = System.currentTimeMillis() + val smbAllowed = Constraint(!tempBasalFallback).also { + constraintChecker.isSMBModeEnabled(it) + inputConstraints.copyReasons(it) + } + val advancedFiltering = Constraint(!tempBasalFallback).also { + constraintChecker.isAdvancedFilteringEnabled(it) + inputConstraints.copyReasons(it) + } + val uam = Constraint(true).also { + constraintChecker.isUAMEnabled(it) + inputConstraints.copyReasons(it) + } + profiler.log(LTag.APS, "detectSensitivityAndCarbAbsorption()", startPart) + profiler.log(LTag.APS, "SMB data gathering", start) + start = System.currentTimeMillis() + + DetermineBasalAdapterSMBJS(ScriptReader(context), injector).also { determineBasalAdapterSMBJS -> + determineBasalAdapterSMBJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, + activePlugin.activePump.baseBasalRate, + iobArray, + glucoseStatus, + iobCobCalculatorPlugin.mealData, + lastAutosensResult.ratio, + isTempTarget, + smbAllowed.value(), + uam.value(), + advancedFiltering.value(), + activePlugin.activeBgSource.javaClass.simpleName == "DexcomPlugin") + val now = System.currentTimeMillis() + val determineBasalResultSMB = determineBasalAdapterSMBJS.invoke() + profiler.log(LTag.APS, "SMB calculation", start) + if (determineBasalResultSMB == null) { + aapsLogger.error(LTag.APS, "SMB calculation returned null") + lastDetermineBasalAdapterSMBJS = null + lastAPSResult = null + lastAPSRun = 0 + } else { + // TODO still needed with oref1? + // Fix bug determine basal + if (determineBasalResultSMB.rate == 0.0 && determineBasalResultSMB.duration == 0 && !treatmentsPlugin.isTempBasalInProgress) determineBasalResultSMB.tempBasalRequested = false + determineBasalResultSMB.iob = iobArray[0] + determineBasalResultSMB.json?.put("timestamp", DateUtil.toISOString(now)) + determineBasalResultSMB.inputConstraints = inputConstraints + lastDetermineBasalAdapterSMBJS = determineBasalAdapterSMBJS + lastAPSResult = determineBasalResultSMB + lastAPSRun = now + } + } + rxBus.send(EventOpenAPSUpdateGui()) + } + + override fun isSuperBolusEnabled(value: Constraint): Constraint { + value[aapsLogger] = false + return value + } +} \ No newline at end of file diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java b/core/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java deleted file mode 100644 index 5cbdddac9f..0000000000 --- a/core/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java +++ /dev/null @@ -1,15 +0,0 @@ -package info.nightscout.androidaps.interfaces; - - -import info.nightscout.androidaps.plugins.aps.loop.APSResult; - -/** - * Created by mike on 10.06.2016. - */ -public interface APSInterface { - APSResult getLastAPSResult(); - - long getLastAPSRun(); - - void invoke(String initiator, boolean tempBasalFallback); -} diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.kt new file mode 100644 index 0000000000..38eb6dac20 --- /dev/null +++ b/core/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.kt @@ -0,0 +1,10 @@ +package info.nightscout.androidaps.interfaces + +import info.nightscout.androidaps.plugins.aps.loop.APSResult + +interface APSInterface { + + val lastAPSResult: APSResult? + val lastAPSRun: Long + operator fun invoke(initiator: String, tempBasalFallback: Boolean) +} \ No newline at end of file