From 13b48d1014c53fea26d1c41c3aa4bd922c1095a6 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 6 Aug 2022 13:09:01 +0200 Subject: [PATCH] DynISF: move calc to kotlin, cleanup --- .../OpenAPSSMBDynamicISF/determine-basal.js | 363 ++++++------------ .../DetermineBasalAdapterSMBDynamicISFJS.kt | 64 ++- .../general/overview/OverviewFragment.kt | 2 +- .../nightscout/androidaps/widget/Widget.kt | 4 +- app/src/main/res/values/strings.xml | 3 +- app/src/main/res/xml/pref_openapssmb.xml | 2 +- .../res/xml/pref_openapssmbdynamicisf.xml | 4 +- 7 files changed, 178 insertions(+), 264 deletions(-) diff --git a/app/src/main/assets/OpenAPSSMBDynamicISF/determine-basal.js b/app/src/main/assets/OpenAPSSMBDynamicISF/determine-basal.js index 24b8c29718..f3ff906aac 100644 --- a/app/src/main/assets/OpenAPSSMBDynamicISF/determine-basal.js +++ b/app/src/main/assets/OpenAPSSMBDynamicISF/determine-basal.js @@ -203,206 +203,97 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ // 80 mg/dL with low_temptarget_lowers_sensitivity would give 1.5x basal, but is limited to autosens_max (1.2x by default) } + //********************************************************************************* + //** Start of Dynamic ISF code for predictions ** + //********************************************************************************* - var profile_sens = round(profile.sens,1) - var sens = profile.sens; + console.error("---------------------------------------------------------"); + console.error( " Dynamic ISF version Beta 1.6.5 "); + console.error("---------------------------------------------------------"); - var now = new Date().getHours(); - if (now < 1){ - now = 1;} - else { - console.error("Time now is "+now+"; "); - } - //********************************************************************************* - //** Start of Dynamic ISF code for predictions ** - //********************************************************************************* + var variable_sens = profile.variable_sens; + var TDD = profile.TDD; + var insulinDivisor = profile.insulinDivisor; - console.error("---------------------------------------------------------"); - console.error( " Dynamic ISF version Beta 1.6.5 "); - console.error("---------------------------------------------------------"); + //********************************************************************************* + //** End of Dynamic ISF code for predictions ** + //********************************************************************************* - if (meal_data.TDDAIMI7){ - var tdd7 = meal_data.TDDAIMI7; - } - else{ - var tdd7 = ((basal * 12)*100)/21; - } - console.error("7-day average TDD is: " +tdd7+ "; "); - - if (meal_data.TDDLast24){ - var tdd_24 = meal_data.TDDLast24; - } - else { - var tdd_24 = (( basal * 24 ) * 2.8); - } - - if (meal_data.TDDPUMP){ - var tdd_pump = ( (meal_data.TDDPUMP / now ) * 24); - } - else { - var tdd_pump = (( basal * 24 ) * 2.8); - } - console.log("Rolling TDD for last 24 hours is: "+tdd_24+"; "); - - /*var tdd_pump_now = meal_data.TDDPUMP; - var tdd_pump = ( tdd_pump_now / (now / 24));*/ - //var TDD = (tdd7 * 0.4) + (tdd_pump * 0.6); - - var tdd1 = meal_data.TDDAIMI1; - var tdd_4 = meal_data.TDDLast4; - var tdd8to4 = meal_data.TDD4to8; - var tdd_last8_wt = ( ( ( 1.4 * tdd_4) + ( 0.6 * tdd8to4) ) * 3 ); - - console.error("Rolling 8 hours weight average: "+tdd_last8_wt+"; "); - console.error("1-day average TDD is: "+tdd1+"; "); - console.error("7-day average TDD is: " +tdd7+ "; "); - - //TDD = ( tdd_last8_wt * 0.6) + ( tdd7 * 0.4 ); - - var TDD = ( tdd_last8_wt * 0.33 ) + ( tdd7 * 0.34 ) + (tdd1 * 0.33); - console.log("TDD = " +TDD+ " using average of 7-day, 1-day and weighted 8hr average"); - - - //var ins_val = 75; - var insulin = profile.insulinType; - console.log("Insulin Peak = "+profile.insulinPeak+"; "); - //console.log("Initial insulin value for ISF: "+ins_val+"; "); - //console.log("Current value for insulin: "+insulin+"; "); - - var ins_val; - if (profile.insulinPeak > 65) { // lyumjev peak: 45 - ins_val = 55; - } else if (profile.insulinPeak > 50 ){ // ultra rapid peak: 55 - ins_val = 65; + if ( high_temptarget_raises_sensitivity && profile.temptargetSet && target_bg > normalTarget + || profile.low_temptarget_lowers_sensitivity && profile.temptargetSet && target_bg < normalTarget ) { + // w/ target 100, temp target 110 = .89, 120 = 0.8, 140 = 0.67, 160 = .57, and 200 = .44 + // e.g.: Sensitivity ratio set to 0.8 based on temp target of 120; Adjusting basal from 1.65 to 1.35; ISF from 58.9 to 73.6 + //sensitivityRatio = 2/(2+(target_bg-normalTarget)/40); + var c = halfBasalTarget - normalTarget; + sensitivityRatio = c/(c+target_bg-normalTarget); + // limit sensitivityRatio to profile.autosens_max (1.2x by default) + sensitivityRatio = Math.min(sensitivityRatio, profile.autosens_max); + sensitivityRatio = round(sensitivityRatio,2); + console.log("Sensitivity ratio set to "+sensitivityRatio+" based on temp target of "+target_bg+"; "); + } else if (typeof autosens_data !== 'undefined' && autosens_data) { + sensitivityRatio = autosens_data.ratio; + console.log("Autosens ratio: "+sensitivityRatio+"; "); + } + if (sensitivityRatio) { + basal = profile.current_basal * sensitivityRatio; + basal = round_basal(basal, profile); + if (basal !== profile_current_basal) { + console.log("Adjusting basal from "+profile_current_basal+" to "+basal+"; "); } else { - ins_val = 75; // rapid peak: 75 + console.log("Basal unchanged: "+basal+"; "); } - console.log("For "+profile.insulinType+" (insulin peak: "+profile.insulinPeak+") divisor is: "+ins_val+"; "); + } - console.log("Insulin value for ISF based on profile: "+ins_val+"; "); - - var dynISFadjust = profile.DynISFAdjust; - dynISFadjust = ( dynISFadjust / 100 ); - TDD = ( dynISFadjust * TDD ); - - var variable_sens = 1800 / ( TDD * (Math.log(( bg / ins_val ) + 1 ) ) ); - - variable_sens = round(variable_sens,1); - - - if (dynISFadjust > 1 ) { - console.log("TDD adjustment factor is: " +dynISFadjust+"; "); - console.log("TDD adjusted to "+TDD+" using adjustment factor of "+dynISFadjust+"; "); - console.log("Current sensitivity for predictions is " +variable_sens+" based on current bg"); - } - else if (dynISFadjust < 1 ){ - console.log("TDD adjustment factor is: " +dynISFadjust+"; "); - console.log("TDD adjusted to "+TDD+" using adjustment factor of "+dynISFadjust+"; "); - console.log("Current sensitivity for predictions is " +variable_sens+" based on current bg"); - } else { - console.log("Current sensitivity for predictions is " +variable_sens+" based on current bg"); - } - sens = variable_sens; - - //********************************************************************************* - //** End of Dynamic ISF code for predictions ** - //********************************************************************************* - - - if ( high_temptarget_raises_sensitivity && profile.temptargetSet && target_bg > normalTarget || profile.low_temptarget_lowers_sensitivity && profile.temptargetSet && target_bg < normalTarget ) { - // w/ target 100, temp target 110 = .89, 120 = 0.8, 140 = 0.67, 160 = .57, and 200 = .44 - // e.g.: Sensitivity ratio set to 0.8 based on temp target of 120; Adjusting basal from 1.65 to 1.35; ISF from 58.9 to 73.6 - //sensitivityRatio = 2/(2+(target_bg-normalTarget)/40); - var c = halfBasalTarget - normalTarget; - sensitivityRatio = c/(c+target_bg-normalTarget); - // limit sensitivityRatio to profile.autosens_max (1.2x by default) - sensitivityRatio = Math.min(sensitivityRatio, profile.autosens_max); - sensitivityRatio = round(sensitivityRatio,2); - console.log("Sensitivity ratio set to "+sensitivityRatio+" based on temp target of "+target_bg+"; "); - sens = sens / sensitivityRatio ; - sens = round(sens, 1); - console.log("ISF from "+variable_sens+" to "+sens+ "due to temp target; "); - } - else { - sensitivityRatio = ( meal_data.TDD24 / tdd7 ); - } - if (sensitivityRatio > 1) { - sensitivityRatio = Math.min(sensitivityRatio, profile.autosens_max); - sensitivityRatio = round(sensitivityRatio,2); - console.log("Sensitivity ratio: "+sensitivityRatio+"; "); - } - else if( sensitivityRatio < 1) { - sensitivityRatio = Math.max(sensitivityRatio, profile.autosens_min); - sensitivityRatio = round(sensitivityRatio,2); - console.log("Sensitivity ratio: "+sensitivityRatio+"; "); - } - else { - console.log("Sensitivity ratio: "+sensitivityRatio+"; "); - } - - - if (sensitivityRatio && profile.openapsama_useautosens === true) { - basal = profile.current_basal * sensitivityRatio; - basal = round_basal(basal, profile); - if (basal !== profile_current_basal) { - console.log("Adjusting basal from "+profile_current_basal+" to "+basal+"; "); + // adjust min, max, and target BG for sensitivity, such that 50% increase in ISF raises target from 100 to 120 + if (profile.temptargetSet) { + //console.log("Temp Target set, not adjusting with autosens; "); + } else if (typeof autosens_data !== 'undefined' && autosens_data) { + if ( profile.sensitivity_raises_target && autosens_data.ratio < 1 || profile.resistance_lowers_target && autosens_data.ratio > 1 ) { + // with a target of 100, default 0.7-1.2 autosens min/max range would allow a 93-117 target range + min_bg = round((min_bg - 60) / autosens_data.ratio) + 60; + max_bg = round((max_bg - 60) / autosens_data.ratio) + 60; + var new_target_bg = round((target_bg - 60) / autosens_data.ratio) + 60; + // don't allow target_bg below 80 + new_target_bg = Math.max(80, new_target_bg); + if (target_bg === new_target_bg) { + console.log("target_bg unchanged: "+new_target_bg+"; "); } else { - console.log("Autosens disabled. Basal unchanged: "+basal+"; "); + console.log("target_bg from "+target_bg+" to "+new_target_bg+"; "); } + target_bg = new_target_bg; } + } - // adjust min, max, and target BG for sensitivity, such that 50% increase in ISF raises target from 100 to 120 - if (profile.temptargetSet) { - //console.log("Temp Target set, not adjusting with autosens; "); - } else { - if ( profile.sensitivity_raises_target && sensitivityRatio < 1 && profile.openapsama_useautosens === true || profile.resistance_lowers_target && sensitivityRatio > 1 && profile.openapsama_useautosens === true) { - // with a target of 100, default 0.7-1.2 autosens min/max range would allow a 93-117 target range - min_bg = round((min_bg - 60) / sensitivityRatio) + 60; - max_bg = round((max_bg - 60) / sensitivityRatio) + 60; - var new_target_bg = round((target_bg - 60) / sensitivityRatio) + 60; - // don't allow target_bg below 80 - new_target_bg = Math.max(80, new_target_bg); - if (target_bg === new_target_bg) { - console.log("target_bg unchanged: "+new_target_bg+"; "); - } else { - console.log("target_bg from "+target_bg+" to "+new_target_bg+"; "); - } - target_bg = new_target_bg; - } - } + if (typeof iob_data === 'undefined' ) { + rT.error ='Error: iob_data undefined. '; + return rT; + } + var iobArray = iob_data; + if (typeof(iob_data.length) && iob_data.length > 1) { + iob_data = iobArray[0]; + //console.error(JSON.stringify(iob_data[0])); + } - if (typeof iob_data === 'undefined' ) { - rT.error ='Error: iob_data undefined. '; - return rT; - } + if (typeof iob_data.activity === 'undefined' || typeof iob_data.iob === 'undefined' ) { + rT.error ='Error: iob_data missing some property. '; + return rT; + } - var iobArray = iob_data; - if (typeof(iob_data.length) && iob_data.length > 1) { - iob_data = iobArray[0]; - //console.error(JSON.stringify(iob_data[0])); - } + var tick; - if (typeof iob_data.activity === 'undefined' || typeof iob_data.iob === 'undefined' ) { - rT.error ='Error: iob_data missing some property. '; - return rT; - } + if (glucose_status.delta > -0.5) { + tick = "+" + round(glucose_status.delta,0); + } else { + tick = round(glucose_status.delta,0); + } + //var minDelta = Math.min(glucose_status.delta, glucose_status.short_avgdelta, glucose_status.long_avgdelta); + var minDelta = Math.min(glucose_status.delta, glucose_status.short_avgdelta); + var minAvgDelta = Math.min(glucose_status.short_avgdelta, glucose_status.long_avgdelta); + var maxDelta = Math.max(glucose_status.delta, glucose_status.short_avgdelta, glucose_status.long_avgdelta); - var tick; - - if (glucose_status.delta > -0.5) { - tick = "+" + round(glucose_status.delta,0); - } else { - tick = round(glucose_status.delta,0); - } - //var minDelta = Math.min(glucose_status.delta, glucose_status.short_avgdelta, glucose_status.long_avgdelta); - var minDelta = Math.min(glucose_status.delta, glucose_status.short_avgdelta); - var minAvgDelta = Math.min(glucose_status.short_avgdelta, glucose_status.long_avgdelta); - var maxDelta = Math.max(glucose_status.delta, glucose_status.short_avgdelta, glucose_status.long_avgdelta); - - - console.error("; CR:",profile.carb_ratio); + var sens = variable_sens // compare currenttemp to iob_data.lastTemp and cancel temp if they don't match var lastTempAge; @@ -413,7 +304,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ } //console.error("currenttemp:",currenttemp,"lastTemp:",JSON.stringify(iob_data.lastTemp),"lastTempAge:",lastTempAge,"m"); var tempModulus = (lastTempAge + currenttemp.duration) % 30; - console.error("currenttemp:",currenttemp,"lastTempAge:",lastTempAge,"m","tempModulus:",tempModulus,"m"); + console.error("currenttemp:",round(currenttemp.rate,2),"lastTempAge:",lastTempAge,"m","tempModulus:",tempModulus,"m"); rT.temp = 'absolute'; rT.deliverAt = deliverAt; if ( microBolusAllowed && currenttemp && iob_data.lastTemp && currenttemp.rate !== iob_data.lastTemp.rate && lastTempAge > 10 && currenttemp.duration ) { @@ -822,39 +713,36 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ console.error("UAM Impact:",uci,"mg/dL per 5m; UAM Duration:",UAMduration,"hours"); - console.log("EventualBG is" +eventualBG+" ;"); + console.log("EventualBG is" +eventualBG+" ;"); - minIOBPredBG = Math.max(39,minIOBPredBG); - minCOBPredBG = Math.max(39,minCOBPredBG); - minUAMPredBG = Math.max(39,minUAMPredBG); - minPredBG = round(minIOBPredBG); + minIOBPredBG = Math.max(39,minIOBPredBG); + minCOBPredBG = Math.max(39,minCOBPredBG); + minUAMPredBG = Math.max(39,minUAMPredBG); + minPredBG = round(minIOBPredBG); - var fSensBG = Math.min(minPredBG,bg); + var fSensBG = Math.min(minPredBG,bg); - if (bg > target_bg && glucose_status.delta < 3 && glucose_status.delta > -3 && glucose_status.short_avgdelta > -3 && glucose_status.short_avgdelta < 3 && eventualBG > target_bg && eventualBG < bg ) { - var future_sens = ( 1800 / (Math.log((((fSensBG * 0.5) + (bg * 0.5))/ins_val)+1)*TDD)); - //var future_sens_old = ( 277700 / (TDD * ((bg * 0.5) + (eventualBG * 0.5 )))); - console.log("Future state sensitivity is " +future_sens+" based on eventual and current bg due to flat glucose level above target"); - rT.reason += "Dosing sensitivity: " +future_sens+" using eventual BG;"; + if (bg > target_bg && glucose_status.delta < 3 && glucose_status.delta > -3 && glucose_status.short_avgdelta > -3 && glucose_status.short_avgdelta < 3 && eventualBG > target_bg && eventualBG < bg ) { + var future_sens = ( 1800 / (Math.log((((fSensBG * 0.5) + (bg * 0.5))/insulinDivisor)+1)*TDD)); + //var future_sens_old = ( 277700 / (TDD * ((bg * 0.5) + (eventualBG * 0.5 )))); + console.log("Future state sensitivity is " +future_sens+" based on eventual and current bg due to flat glucose level above target"); + rT.reason += "Dosing sensitivity: " +future_sens+" using eventual BG;"; + } + + else if( glucose_status.delta > 0 && eventualBG > target_bg || eventualBG > bg) { + var future_sens = ( 1800 / (Math.log((bg/insulinDivisor)+1)*TDD)); + //var future_sens_old = ( 277700 / (TDD * bg)); + console.log("Future state sensitivity is " +future_sens+" using current bg due to small delta or variation"); + rT.reason += "Dosing sensitivity: " +future_sens+" using current BG;"; } - else if( glucose_status.delta > 0 && eventualBG > target_bg || eventualBG > bg ) { - var future_sens = ( 1800 / (Math.log((bg/ins_val)+1)*TDD)); - //var future_sens_old = ( 277700 / (TDD * bg)); - console.log("Future state sensitivity is " +future_sens+" using current bg due to small delta or variation"); - rT.reason += "Dosing sensitivity: " +future_sens+" using current BG;"; - } - - else { - var future_sens = ( 1800 / (Math.log((fSensBG/ins_val)+1)*TDD)); - //var future_sens_old = ( 277700 / (TDD * eventualBG)); - console.log("Future state sensitivity is " +future_sens+" based on eventual bg due to -ve delta"); - rT.reason += "Dosing sensitivity: " +future_sens+" using eventual BG;"; - } - future_sens = round(future_sens,1); - - - + else { + var future_sens = ( 1800 / (Math.log((fSensBG/insulinDivisor)+1)*TDD)); + //var future_sens_old = ( 277700 / (TDD * eventualBG)); + console.log("Future state sensitivity is " +future_sens+" based on eventual bg due to -ve delta"); + rT.reason += "Dosing sensitivity: " +future_sens+" using eventual BG;"; + } + future_sens = round(future_sens,1); var fractionCarbsLeft = meal_data.mealCOB/meal_data.carbs; @@ -1079,25 +967,22 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ } } - - - // calculate 30m low-temp required to get projected BG up to target - // multiply by 2 to low-temp faster for increased hypo safety - - var insulinReq = 2 * Math.min(0, (eventualBG - target_bg) / future_sens); - insulinReq = round( insulinReq , 2); - // calculate naiveInsulinReq based on naive_eventualBG - var naiveInsulinReq = Math.min(0, (naive_eventualBG - target_bg) / sens); - naiveInsulinReq = round( naiveInsulinReq , 2); - if (minDelta < 0 && minDelta > expectedDelta) { - // if we're barely falling, newinsulinReq should be barely negative - var newinsulinReq = round(( insulinReq * (minDelta / expectedDelta) ), 2); - //console.error("Increasing insulinReq from " + insulinReq + " to " + newinsulinReq); - insulinReq = newinsulinReq; - } - // rate required to deliver insulinReq less insulin over 30m: - var rate = basal + (2 * insulinReq); - rate = round_basal(rate, profile); + // calculate 30m low-temp required to get projected BG up to target + // multiply by 2 to low-temp faster for increased hypo safety + var insulinReq = 2 * Math.min(0, (eventualBG - target_bg) / future_sens); + insulinReq = round( insulinReq , 2); + // calculate naiveInsulinReq based on naive_eventualBG + var naiveInsulinReq = Math.min(0, (naive_eventualBG - target_bg) / sens); + naiveInsulinReq = round( naiveInsulinReq , 2); + if (minDelta < 0 && minDelta > expectedDelta) { + // if we're barely falling, newinsulinReq should be barely negative + var newinsulinReq = round(( insulinReq * (minDelta / expectedDelta) ), 2); + //console.error("Increasing insulinReq from " + insulinReq + " to " + newinsulinReq); + insulinReq = newinsulinReq; + } + // rate required to deliver insulinReq less insulin over 30m: + var rate = basal + (2 * insulinReq); + rate = round_basal(rate, profile); // if required temp < existing temp basal var insulinScheduled = currenttemp.duration * (currenttemp.rate - basal) / 60; @@ -1185,14 +1070,14 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ } } else { // otherwise, calculate 30m high-temp required to get projected BG down to target - // insulinReq is the additional insulin required to get minPredBG down to target_bg - //console.error(minPredBG,eventualBG); - insulinReq = round( (Math.min(minPredBG,eventualBG) - target_bg) / future_sens, 2); - // if that would put us over max_iob, then reduce accordingly - if (insulinReq > max_iob-iob_data.iob) { - rT.reason += "max_iob " + max_iob + ", "; - insulinReq = max_iob-iob_data.iob; - } + // insulinReq is the additional insulin required to get minPredBG down to target_bg + //console.error(minPredBG,eventualBG); + insulinReq = round( (Math.min(minPredBG,eventualBG) - target_bg) / future_sens, 2); + // if that would put us over max_iob, then reduce accordingly + if (insulinReq > max_iob-iob_data.iob) { + rT.reason += "max_iob " + max_iob + ", "; + insulinReq = max_iob-iob_data.iob; + } // rate required to deliver insulinReq more insulin over 30m: rate = basal + (2 * insulinReq); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMBDynamicISF/DetermineBasalAdapterSMBDynamicISFJS.kt b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMBDynamicISF/DetermineBasalAdapterSMBDynamicISFJS.kt index d5a33606eb..234735a214 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMBDynamicISF/DetermineBasalAdapterSMBDynamicISFJS.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMBDynamicISF/DetermineBasalAdapterSMBDynamicISFJS.kt @@ -22,6 +22,7 @@ import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.utils.Round import info.nightscout.androidaps.utils.stats.TddCalculator import info.nightscout.shared.SafeParse import info.nightscout.shared.logging.AAPSLogger @@ -36,6 +37,7 @@ import java.io.IOException import java.lang.reflect.InvocationTargetException import java.nio.charset.StandardCharsets import javax.inject.Inject +import kotlin.math.ln class DetermineBasalAdapterSMBDynamicISFJS internal constructor(private val scriptReader: ScriptReader, private val injector: HasAndroidInjector) : DetermineBasalAdapterInterface { @@ -194,10 +196,6 @@ class DetermineBasalAdapterSMBDynamicISFJS internal constructor(private val scri this.profile.put("current_basal_safety_multiplier", sp.getDouble(R.string.key_openapsama_current_basal_safety_multiplier, 4.0)) this.profile.put("lgsThreshold", Profile.toMgdl(sp.getDouble(R.string.key_lgs_threshold, 65.0))) - val insulin = activePlugin.activeInsulin - val insulinType = insulin.friendlyName - val insulinPeak = insulin.peak - //mProfile.put("high_temptarget_raises_sensitivity", SP.getBoolean(R.string.key_high_temptarget_raises_sensitivity, SMBDefaults.high_temptarget_raises_sensitivity)); this.profile.put("high_temptarget_raises_sensitivity", sp.getBoolean(R.string.key_high_temptarget_raises_sensitivity, SMBDefaults.high_temptarget_raises_sensitivity)) //mProfile.put("low_temptarget_lowers_sensitivity", SP.getBoolean(R.string.key_low_temptarget_lowers_sensitivity, SMBDefaults.low_temptarget_lowers_sensitivity)); @@ -227,9 +225,6 @@ class DetermineBasalAdapterSMBDynamicISFJS internal constructor(private val scri this.profile.put("enableSMB_after_carbs", smbEnabled && sp.getBoolean(R.string.key_enableSMB_after_carbs, false) && advancedFiltering) this.profile.put("maxSMBBasalMinutes", sp.getInt(R.string.key_smbmaxminutes, SMBDefaults.maxSMBBasalMinutes)) this.profile.put("maxUAMSMBBasalMinutes", sp.getInt(R.string.key_uamsmbmaxminutes, SMBDefaults.maxUAMSMBBasalMinutes)) - this.profile.put("DynISFAdjust", SafeParse.stringToDouble(sp.getString(R.string.key_DynISFAdjust, "100"))) - this.profile.put("insulinType", insulinType) - this.profile.put("insulinPeak", insulinPeak) this.profile.put("maxUAMSMBBasalMinutes", sp.getInt(R.string.key_uamsmbmaxminutes, SMBDefaults.maxUAMSMBBasalMinutes)) //set the min SMB amount to be the amount set by the pump. this.profile.put("bolus_increment", pumpBolusStep) @@ -237,8 +232,7 @@ class DetermineBasalAdapterSMBDynamicISFJS internal constructor(private val scri this.profile.put("current_basal", basalRate) this.profile.put("temptargetSet", tempTargetSet) this.profile.put("autosens_max", SafeParse.stringToDouble(sp.getString(R.string.key_openapsama_autosens_max, "1.2"))) - this.profile.put("autosens_min", SafeParse.stringToDouble(sp.getString(R.string.key_openapsama_autosens_min, "0.8"))) - this.profile.put("openapsama_useautosens", sp.getBoolean(R.string.key_openapsama_useautosens, false)) + this.profile.put("autosens_min", SafeParse.stringToDouble(sp.getString(R.string.key_openapsama_autosens_min, "0.7"))) //set the min SMB amount to be the amount set by the pump. if (profileFunction.getUnits() == GlucoseUnit.MMOL) { this.profile.put("out_units", "mmol/L") @@ -270,19 +264,53 @@ class DetermineBasalAdapterSMBDynamicISFJS internal constructor(private val scri this.mealData.put("lastBolusTime", mealData.lastBolusTime) this.mealData.put("lastCarbTime", mealData.lastCarbTime) - this.mealData.put("TDDAIMI1", tddCalculator.averageTDD(tddCalculator.calculate(1))?.totalAmount) - this.mealData.put("TDDAIMI7", tddCalculator.averageTDD(tddCalculator.calculate(7))?.totalAmount) - this.mealData.put("TDDLast4", tddCalculator.calculateDaily(-4, 0).totalAmount) - this.mealData.put("TDD4to8", tddCalculator.calculateDaily(-8, -4).totalAmount) - this.mealData.put("TDD24", tddCalculator.calculateDaily(-24, 0).totalAmount) + val tdd1D = tddCalculator.averageTDD(tddCalculator.calculate(1))?.totalAmount + val tdd7D = tddCalculator.averageTDD(tddCalculator.calculate(7))?.totalAmount + val tddLast24H = tddCalculator.calculateDaily(-24, 0).totalAmount + val tddLast4H = tddCalculator.calculateDaily(-4, 0).totalAmount + val tddLast8to4H = tddCalculator.calculateDaily(-8, -4).totalAmount + val tddWeightedFromLast8H = ((1.4 * tddLast4H) + (0.6 * tddLast8to4H)) * 3 +// console.error("Rolling 8 hours weight average: " + tdd_last8_wt + "; "); +// console.error("1-day average TDD is: " + tdd1 + "; "); +// console.error("7-day average TDD is: " + tdd7 + "; "); + var tdd = + if (tdd1D != null && tdd7D != null) (tddWeightedFromLast8H * 0.33) + (tdd7D * 0.34) + (tdd1D * 0.33) + else tddWeightedFromLast8H +// console.log("TDD = " + TDD + " using average of 7-day, 1-day and weighted 8hr average"); - if (constraintChecker.isAutosensModeEnabled().value()) { - autosensData.put("ratio", autosensDataRatio) - } else { - autosensData.put("ratio", 1.0) +// console.log("Insulin Peak = " + insulin.peak + "; "); + + val insulin = activePlugin.activeInsulin + val insulinDivisor = when { + insulin.peak > 65 -> 55 // lyumjev peak: 45 + insulin.peak > 50 -> 65 // ultra rapid peak: 55 + else -> 75 // rapid peak: 75 } +// console.log("For " + insulin.friendlyName + " (insulin peak: " + insulin.peak + ") insulin divisor is: " + ins_val + "; "); + + val dynISFadjust = SafeParse.stringToDouble(sp.getString(R.string.key_DynISFAdjust, "100")) / 100.0 + tdd *= dynISFadjust + + var variableSensitivity = 1800 / (tdd * (ln((glucoseStatus.glucose / insulinDivisor) + 1))) + variableSensitivity = Round.roundTo(variableSensitivity, 0.1) + + if (dynISFadjust != 1.0) { +// console.log("TDD adjusted to " + TDD + " using adjustment factor of " + dynISFadjust + "; "); + } +// console.log("Current sensitivity for predictions is " + variable_sens + " based on current bg"); + + this.profile.put("variable_sens", variableSensitivity) + this.profile.put("insulinDivisor", insulinDivisor) + this.profile.put("TDD", tdd) + + + if (sp.getBoolean(R.string.key_adjust_sensitivity, false) && tdd7D != null) + autosensData.put("ratio", tddLast24H / tdd7D) + else + autosensData.put("ratio", 1.0) + this.microBolusAllowed = microBolusAllowed smbAlwaysAllowed = advancedFiltering currentTime = now diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt index 8a954c30ab..54a2bbcb40 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt @@ -1084,7 +1084,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList private fun updateSensitivity() { _binding ?: return - if (sp.getBoolean(R.string.key_openapsama_useautosens, false) && constraintChecker.isAutosensModeEnabled().value()) { + if (constraintChecker.isAutosensModeEnabled().value()) { binding.infoLayout.sensitivityIcon.setImageResource(R.drawable.ic_swap_vert_black_48dp_green) } else { binding.infoLayout.sensitivityIcon.setImageResource(R.drawable.ic_x_swap_vert) diff --git a/app/src/main/java/info/nightscout/androidaps/widget/Widget.kt b/app/src/main/java/info/nightscout/androidaps/widget/Widget.kt index caf2bc46f4..3d8c1e62cd 100644 --- a/app/src/main/java/info/nightscout/androidaps/widget/Widget.kt +++ b/app/src/main/java/info/nightscout/androidaps/widget/Widget.kt @@ -204,7 +204,7 @@ class Widget : AppWidgetProvider() { } } - fun updateProfile(views: RemoteViews) { + private fun updateProfile(views: RemoteViews) { val profileTextColor = profileFunction.getProfile()?.let { if (it is ProfileSealed.EPS) { @@ -226,7 +226,7 @@ class Widget : AppWidgetProvider() { } private fun updateSensitivity(views: RemoteViews) { - if (sp.getBoolean(R.string.key_openapsama_useautosens, false) && constraintChecker.isAutosensModeEnabled().value()) + if (constraintChecker.isAutosensModeEnabled().value()) views.setImageViewResource(R.id.sensitivity_icon, R.drawable.ic_swap_vert_black_48dp_green) else views.setImageViewResource(R.id.sensitivity_icon, R.drawable.ic_x_swap_vert) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9704987c13..b0ad42ca77 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1251,6 +1251,7 @@ Blocked by connectivity options (No Watch Connected) Error asking for permissions - + dynisf_adjust_sensitivity + Adjust sensitivity and BG diff --git a/app/src/main/res/xml/pref_openapssmb.xml b/app/src/main/res/xml/pref_openapssmb.xml index ebe3e0ec92..3bc1e985db 100644 --- a/app/src/main/res/xml/pref_openapssmb.xml +++ b/app/src/main/res/xml/pref_openapssmb.xml @@ -30,7 +30,7 @@ + android:key="@string/key_adjust_sensitivity" + android:title="@string/dynisf_adjust_sensitivity" />