From 0b68835763ccea023ef17f23dfb7d8f9afd28e1a Mon Sep 17 00:00:00 2001 From: Mike Plante Date: Wed, 17 Apr 2024 00:24:58 -0400 Subject: [PATCH 1/6] Rename smbIsAlwaysOff to smbIsScheduledOff Also rewords "Last Hour SMBs are Off" to "First Hour SMBs are Resumed" to hopefully be a little clearer, and hides "Schedule when SMBs are Off" switch when "Disable SMBs" is switched on instead of disabling it when "Disable SMBs" is switched off. --- .../Core_Data.xcdatamodel/contents | 6 ++-- .../javascript/bundle/determine-basal.js | 2 +- FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift | 4 +-- FreeAPS/Sources/Models/Oref2_variables.swift | 8 ++--- .../OverrideProfilesStateModel.swift | 24 +++++++-------- .../View/OverrideProfilesRootView.swift | 30 ++++++++++--------- 6 files changed, 38 insertions(+), 36 deletions(-) diff --git a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents index 575d66a48..5ac720436 100644 --- a/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents +++ b/Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -66,8 +66,8 @@ - + @@ -85,8 +85,8 @@ - + diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index b1ca770b8..e6a3ec755 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={2982:(e,t,a)=>{var r=a(3531);function n(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function o(e,t){return"mmol/L"===t.out_units?n(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,m,d,c,g,h,p,v,B){var f=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(f=b),v.smbIsOff;const M=v.advancedSettings,_=v.isfAndCr,y=v.isf,x=v.cr,S=v.smbIsAlwaysOff;v.start,v.end;const D=v.smbMinutes,w=v.uamMinutes;var G=h.useNewFormula,C=0,T=f,U=new Date;c&&(U=new Date(c));var O=0,R="",A="",I="",F="",P="",j="",E=0,q=0,W=0,k=0,L=0,z=0;const N=v.weightedAverage;var H=1,Z=i.sens,$=i.carb_ratio;v.useOverride&&(H=v.overridePercentage/100,_?(Z/=H,$/=H):(x&&($/=H),y&&(Z/=H)));const J=i.weightPercentage,K=v.average_total_data;function Q(e,t){var a=e.getTime();return new Date(a+36e5*t)}function V(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?n(Math.floor(a)*t,5):0}function X(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function Y(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ee=Math.min(i.autosens_min,i.autosens_max),te=Math.max(i.autosens_min,i.autosens_max);function ae(e,t){var a=0,r=t,n=(e-t)/36e5,o=0,i=n,s=0;do{if(n>0){var l=X(r),u=p[0].rate;for(let e=0;e=(s=Y(p[e+1].start,p[e].start))?o=s:n=(s=24-Y(p[e].start,t))?o=s:nm)if(e+1=(s=Y(d,l))?o=s:n=(s=Y("23:59:59",l))?o=s:n0&&n1)&&(G=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(G){let e=g.length-1;var re=new Date(g[e].timestamp),ne=new Date(g[0].timestamp);"TempBasalDuration"==g[0]._type&&(ne=new Date),(O=(ne-re)/36e5)<23.9&&O>21?(L=ae(re,(oe=24-O,ie=re.getTime(),new Date(ie-36e5*oe))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+L.toPrecision(5)+" U. "):O<21?(G=!1,enableDynamicCR=!1):F=""}}else console.log("Pumphistory is empty!"),G=!1,enableDynamicCR=!1;var oe,ie,se;if(G){for(let e=0;e0){E=e,z=g[e].rate;var le=g[e-1]["duration (min)"]/60,ue=le,me=new Date(g[e-1].timestamp),de=new Date(me),ce=0;do{if(e--,0==e){de=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){de=new Date(g[e].timestamp);break}var ge=e-2;if(ge>=0&&"Rewind"==g[ge]._type){let e=g[ge].timestamp;for(;ge-1>=0&&"Prime"==g[ge-=1]._type;)ce=(g[ge].timestamp-e)/36e5;ce>=le&&(de=new Date(e),ce=0)}}while(e>0);var he=(de-me)/36e5;he0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(L+=ae(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var pe=new Date(a);let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){pe=new Date(g[r].timestamp);break}}while(r>0);0==e&&"TempBasalDuration"==g[0]._type&&(pe=new Date,t=g[e]["duration (min)"]/60),(pe-a)/36e5-t>0&&(L+=ae(pe,Q(a,t)))}var ve={TDD:n(q=k+W+L,5),bolus:n(k,5),temp_basal:n(W,5),scheduled_basal:n(L,5)};O>21?(A=". Bolus insulin: "+k.toPrecision(5)+" U",I=". Temporary basal insulin: "+W.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+L.toPrecision(5)+" U",P=F+" TDD past 24h is: "+q.toPrecision(5)+" U"+A+I+R,j=", TDD: "+n(q,2)+" U, "+n(k/q*100,0)+"% Bolus "+n((W+L)/q*100,0)+"% Basal"):j=", TDD: Not enough pumpData (< 21h)"}const Be=e.glucose,fe=h.enableDynamicCR,be=h.adjustmentFactor,Me=f;var _e,ye=!1,xe="",Se=1;K>0&&(Se=N/K),Se>1?(Se=n(Se=Math.min(Se,i.autosens_max),2),i.autosens_max):Se<1&&(Se=n(Se=Math.max(Se,i.autosens_min),2),i.autosens_min),_e=", Basal ratio: "+Se,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(ye=!0),Me>=118&&ye&&(G=!1,xe="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+Be+" mg/dl ("+(.0555*Be).toPrecision(2)+" mmol/l)",Ce="",Te="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),se=q,J<1&&N>0&&(q=N,console.log("Using weighted TDD average: "+n(q,2)+" U, instead of past 24 h ("+n(se,2)+" U), weight: "+J),Te=", Weighted TDD: "+n(q,2)+" U");const Fe=h.sigmoid;var Pe="";if(G){var je=Z*be*q*Math.log(Be/Ae+1)/1800;Ce=", Logarithmic formula"}if(G&&Fe){const e=ee,t=te-e,a=.0555*(Be-f);var Ee=Se,qe=te-1;1==te&&(qe=te+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),n=a*be*Ee+r;je=t/(1+Math.exp(-n))+e,Ce=", Sigmoid function"}var We=$;const ke=n($,1);var Le="",ze="";if(G&&q>0){if(Le=", Dynamic ISF/CR: On/",je>te?(xe=", Dynamic ISF limited by autosens_max setting: "+te+" ("+n(je,2)+"), ",ze=", Autosens/Dynamic Limit: "+te+" ("+n(je,2)+")",je=te):je-.5?"+"+n(e.delta,0):n(e.delta,0);var et=Math.min(e.delta,e.short_avgdelta),tt=Math.min(e.short_avgdelta,e.long_avgdelta),at=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);if((Xe<=10||38===Xe||Ye>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high"),Xe>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Xe&&"fakecgm"==e.device&&(console.error("CGM data is unchanged ("+o(Xe,i)+"+"+o(e.delta,i)+") for 5m w/ "+o(e.short_avgdelta,i)+" mg/dL ~15m change & "+o(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")),Ve>12||Ve<-5?He.reason="If current system time "+U+" is correct, then BG data is too old. The last BG data was read "+Ve+"m ago at "+Qe:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Xe&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+o(Xe,i)+"+"+o(e.delta,i)+") for 5m w/ "+o(e.short_avgdelta,i)+" mg/dL ~15m change & "+o(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Xe&&(Xe<=10||38===Xe||Ye>=3||Ve>12||Ve<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var rt,nt,ot,it,st=i.max_iob;if(void 0!==f&&(nt=f),void 0!==i.max_bg&&(ot=f),void 0!==i.enableSMB_high_bg_target&&(it=i.enableSMB_high_bg_target),void 0===f)return He.error="Error: could not determine target_bg. ",He;rt=f;var lt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ut=100,mt=160;if(mt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+o(e,i)+" "+i.out_units),mt=e}else console.log("Default Half Basal Target used: "+o(mt,i)+" "+i.out_units);if(lt&&i.temptargetSet&&rt>ut||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&rt=rt&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+n(Se,2)+", TDD 24h = "+n(se,2)+"U, Weighted average TDD = "+n(N,2)+"U, (Weight percentage = "+J+"), Total data of TDDs (up to 14 days) average = "+n(K,2)+"U. "),Je!==$e*H?process.stderr.write("Adjusting basal from "+$e*H+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=n((nt-60)/s.ratio)+60,ot=n((ot-60)/s.ratio)+60;var ct=n((rt-60)/s.ratio)+60;rt===(ct=Math.max(80,ct))?process.stderr.write("target_bg unchanged: "+o(ct,i)+"; "):process.stderr.write("target_bg from "+o(ct,i)+" to "+o(ct,i)+"; "),rt=ct}var gt=o(rt,i);rt!=f&&(gt=0!==b&&6!==b&&b!==rt?o(f,i)+"→"+o(b,i)+"→"+o(rt,i):o(f,i)+"→"+o(rt,i));var ht=200,pt=200,vt=200;if(e.noise>=2){var Bt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw),ht=n(Math.min(200,nt*Bt)),pt=n(Math.min(200,rt*Bt)),vt=n(Math.min(200,ot*Bt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+o(ct,i)+" to "+o(pt,i)+"; "),nt=ht,rt=pt,ot=vt}T=nt-.5*(nt-40),T=Math.min(Math.max(i.threshold_setting,T,60),120),console.error("Threshold set to ${convert_bg(threshold, profile)}");var ft="",bt=(n(Z,1),Z);if(void 0!==s&&s&&((bt=n(bt=Z/sensitivityRatio,1))!==Z?process.stderr.write("ISF from "+o(Z,i)+" to "+o(bt,i)):process.stderr.write("ISF unchanged: "+o(bt,i)),ft+="Autosens ratio: "+n(sensitivityRatio,2)+", ISF: "+o(Z,i)+"→"+o(bt,i)),console.error("CR:"+$),void 0===a)return He.error="Error: iob_data undefined. ",He;var Mt,_t=a;if(a.length,a.length>1&&(a=_t[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var yt=((Mt=void 0!==a.lastTemp?n((new Date(U).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+Mt+"m, tempModulus:"+yt+"m"),He.temp="absolute",He.deliverAt=Ze,m&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&Mt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var xt=Mt-a.lastTemp.duration;if(xt>5&&Mt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+xt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var St=n(-a.activity*bt*5,2),Dt=n(6*(et-St));Dt<0&&(Dt=n(6*(tt-St)))<0&&(Dt=n(6*(e.long_avgdelta-St)));var wt,Gt=(wt=a.iob>0?n(Xe-a.iob*bt):n(Xe-a.iob*Math.min(bt,Z)))+Dt;if(void 0===Gt||isNaN(Gt))return He.error="Error: could not calculate eventualBG. Sensitivity: "+bt+" Deviation: "+Dt,He;var Ct,Tt,Ut=function(e,t,a){return n(a+(e-t)/24,1)}(rt,Gt,St);He={temp:"absolute",bg:Xe,tick:Ke,eventualBG:Gt,insulinReq:0,reservoir:d,deliverAt:Ze,sensitivityRatio,CR:n($,1),TDD:se,insulin:ve,current_target:rt,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:et,expectedDelta:Ut,minGuardBG:Tt,minPredBG:Ct,threshold:o(T,i)};var Ot=[],Rt=[],At=[],It=[];Ot.push(Xe),Rt.push(Xe),It.push(Xe),At.push(Xe);let Ft=!1;S?(console.error("SMBs are always off."),Ft=!1):Ft=function(e,t,a,r,n,i,s,l){if(s.smbIsOff){let e=new Date(l.getHours()),t=s.start,a=s.end;if(t=t&&ea&&(e>=t||e100?(console.error("SMB disabled due to high temptarget of "+n),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&n<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+o(n,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,m,l,Xe,rt,it,v,U);var Pt,jt=i.enableUAM,Et=0;Et=n(et-St,1);var qt=n(et-St,1);csf=bt/$,console.error("profile.sens:"+o(Z,i)+", sens:"+o(bt,i)+", CSF:"+n(csf,1));var Wt=n(30*csf*5/60,1);Et>Wt&&(console.error("Limiting carb impact from "+Et+" to "+Wt+"mg/dL/5m (30g/h)"),Et=Wt);var kt=3;sensitivityRatio&&(kt/=sensitivityRatio);var Lt=kt;if(l.carbs){kt=Math.max(kt,l.mealCOB/20);var zt=n((new Date(U).getTime()-l.lastCarbTime)/6e4),Nt=(l.carbs-l.mealCOB)/l.carbs;Lt=n(Lt=kt+1.5*zt/60,1),console.error("Last carbs "+zt+" minutes ago; remainingCATime:"+Lt+"hours; "+n(100*Nt,1)+"% carbs absorbed")}var Ht=Math.max(0,Et/5*60*Lt/2)/csf,Zt=90,$t=1;i.remainingCarbsCap&&(Zt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&($t=Math.min(1,i.remainingCarbsFraction));var Jt=1-$t,Kt=Math.max(0,l.mealCOB-Ht-l.carbs*Jt),Qt=(Kt=Math.min(Zt,Kt))*csf*5/60/(Lt/2),Vt=n(l.slopeFromMaxDeviation,2),Xt=n(l.slopeFromMinDeviation,2),Yt=Math.min(Vt,-Xt/3);Pt=0===Et?0:Math.min(60*Lt/5/2,Math.max(0,l.mealCOB*csf/Et)),console.error("Carb Impact:"+Et+"mg/dL per 5m; CI Duration:"+n(5*Pt/60*2,1)+"hours; remaining CI ("+Lt/2+"h peak):"+n(Qt,1)+"mg/dL per 5m");var ea,ta,aa,ra,na=999,oa=999,ia=999,sa=999,la=999,ua=999,ma=999,da=Gt,ca=Xe,ga=Xe,ha=0,pa=[],va=[];try{_t.forEach((function(e){var t=n(-e.activity*bt*5,2),a=n(-e.iobWithZeroTemp.activity*bt*5,2),r=wt,o=Et*(1-Math.min(1,Rt.length/12));!0===(G&&!Fe)?(da=Rt[Rt.length-1]+n(-e.activity*(1800/(q*be*Math.log(Math.max(Rt[Rt.length-1],39)/Ae+1)))*5,2)+o,r=It[It.length-1]+n(-e.iobWithZeroTemp.activity*(1800/(q*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+n(da,2)+" , ZTpredBG: "+n(r,2))):(da=Rt[Rt.length-1]+t+o,r=It[It.length-1]+a);var i=Math.max(0,Math.max(0,Et)*(1-Ot.length/Math.max(2*Pt,1))),s=Math.min(Ot.length,12*Lt-Ot.length),l=Math.max(0,s/(Lt/2*12)*Qt);pa.push(n(l,0)),va.push(n(i,0)),COBpredBG=Ot[Ot.length-1]+t+Math.min(0,o)+i+l;var u=Math.max(0,qt+At.length*Yt),m=Math.max(0,qt*(1-At.length/Math.max(36,1))),d=Math.min(u,m);d>0&&(ha=n(5*(At.length+1)/60,1)),!0===(G&&!Fe)?(UAMpredBG=At[At.length-1]+n(-e.activity*(1800/(q*be*Math.log(Math.max(At[At.length-1],39)/Ae+1)))*5,2)+Math.min(0,o)+d,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+n(UAMpredBG,2))):UAMpredBG=At[At.length-1]+t+Math.min(0,o)+d,Rt.length<48&&Rt.push(da),Ot.length<48&&Ot.push(COBpredBG),At.length<48&&At.push(UAMpredBG),It.length<48&&It.push(r),COBpredBG18&&daca&&(ca=da),(Pt||Qt>0)&&Ot.length>18&&COBpredBG0)&&COBpredBG>ca&&(ga=COBpredBG),jt&&At.length>12&&UAMpredBGca&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+va.join(" ")),console.error("remainingCIs: "+pa.join(" "))),He.predBGs={},Rt.forEach((function(e,t,a){a[t]=n(Math.min(401,Math.max(39,e)))}));for(var Ba=Rt.length-1;Ba>12&&Rt[Ba-1]===Rt[Ba];Ba--)Rt.pop();for(He.predBGs.IOB=Rt,ta=n(Rt[Rt.length-1]),It.forEach((function(e,t,a){a[t]=n(Math.min(401,Math.max(39,e)))})),Ba=It.length-1;Ba>6&&!(It[Ba-1]>=It[Ba]||It[Ba]<=rt);Ba--)It.pop();if(He.predBGs.ZT=It,n(It[It.length-1]),l.mealCOB>0&&(Et>0||Qt>0)){for(Ot.forEach((function(e,t,a){a[t]=n(Math.min(1500,Math.max(39,e)))})),Ba=Ot.length-1;Ba>12&&Ot[Ba-1]===Ot[Ba];Ba--)Ot.pop();He.predBGs.COB=Ot,aa=n(Ot[Ot.length-1]),Gt=Math.max(Gt,n(Ot[Ot.length-1])),console.error("COBpredBG: "+n(Ot[Ot.length-1]))}if(Et>0||Qt>0){if(jt){for(At.forEach((function(e,t,a){a[t]=n(Math.min(401,Math.max(39,e)))})),Ba=At.length-1;Ba>12&&At[Ba-1]===At[Ba];Ba--)At.pop();He.predBGs.UAM=At,ra=n(At[At.length-1]),At[At.length-1]&&(Gt=Math.max(Gt,n(At[At.length-1])))}He.eventualBG=Gt}console.error("UAM Impact:"+qt+"mg/dL per 5m; UAM Duration:"+ha+"hours"),na=Math.max(39,na),oa=Math.max(39,oa),ia=Math.max(39,ia),Ct=n(na);var fa=l.mealCOB/l.carbs;ea=n(ia<999&&oa<999?(1-fa)*UAMpredBG+fa*COBpredBG:oa<999?(da+COBpredBG)/2:ia<999?(da+UAMpredBG)/2:da),ma>ea&&(ea=ma),Tt=n(Tt=Pt||Qt>0?jt?fa*sa+(1-fa)*la:sa:jt?la:ua);var ba=ia;if(maia&&(ba=(ia+ma)/2);if(ba=n(ba),l.carbs)if(!jt&&oa<999)Ct=n(Math.max(na,oa));else if(oa<999){var _a=fa*oa+(1-fa)*ba;Ct=n(Math.max(na,oa,_a))}else Ct=jt?ba:Tt;else jt&&(Ct=n(Math.max(na,ba)));Ct=Math.min(Ct,ea),process.stderr.write("minPredBG: "+Ct+" minIOBPredBG: "+na+" minZTGuardBG: "+ma),oa<999&&process.stderr.write(" minCOBPredBG: "+oa),ia<999&&process.stderr.write(" minUAMPredBG: "+ia),console.error(" avgPredBG:"+ea+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),ga>Xe&&(Ct=Math.min(Ct,ga)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=o(St,i),He.deviation=o(Dt,i),He.ISF=o(bt,i),He.CR=n($,1),He.target_bg=o(rt,i),He.TDD=n(se,2),He.current_target=n(rt,0);var ya=He.CR;ke!=He.CR&&(ya=ke+"→"+He.CR),He.reason=ft+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+ya+", Target: "+gt+", minPredBG "+o(Ct,i)+", minGuardBG "+o(Tt,i)+", IOBpredBG "+o(ta,i),aa>0&&(He.reason+=", COBpredBG "+o(aa,i)),ra>0&&(He.reason+=", UAMpredBG "+o(ra,i)),He.reason+=j,He.reason+="; ";var xa=wt;xa<40&&(xa=Math.min(Tt,xa));var Sa,Da=T-xa,wa=240,Ga=240;if(l.mealCOB>0&&(Et>0||Qt>0)){for(Ba=0;BaSa*Xe&&(console.error("maxDelta "+o(at,i)+" > "+100*Sa+"% of BG "+o(Xe,i)+" - disabling SMB"),He.reason+="maxDelta "+o(at,i)+" > "+100*Sa+"% of BG "+o(Xe,i)+" - SMB disabled!, ",Ft=!1),console.error("BG projected to remain above "+o(nt,i)+" for "+wa+"minutes"),(Ga<240||wa<60)&&console.error("BG projected to remain above "+o(T,i)+" for "+Ga+"minutes");var Ca=Ga,Ta=i.current_basal*H*bt*Ca/60,Ua=Math.max(0,l.mealCOB-.25*l.carbs),Oa=(Da-Ta)/csf-Ua;Ta=n(Ta),Oa=n(Oa),console.error("naive_eventualBG:",wt,"bgUndershoot:",Da,"zeroTempDuration:",Ca,"zeroTempEffect:",Ta,"carbsReq:",Oa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Oa>=i.carbsReqThreshold&&Ga<=45&&(He.carbsReq=Oa,He.reason+=Oa+" add'l carbs req w/in "+Ga+"m; ");var Ra=0;if(Xe0&&et>Ut)He.reason+="IOB "+a.iob+" < "+n(-i.current_basal*H*20/60,2),He.reason+=" and minDelta "+o(et,i)+" > expectedDelta "+o(Ut,i)+"; ";else if(Xe=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Aa=0,Ia=Je,Fa=0;if(GtUt&&et>0&&!Oa)return wt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>et?He.reason+=", but Delta "+o(Ke,i)+" > expectedDelta "+o(Ut,i):He.reason+=", but Min. Delta "+et.toFixed(2)+" > Exp. Delta "+o(Ut,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Aa=n(Aa=2*Math.min(0,(Gt-rt)/bt),2);var Pa=Math.min(0,(wt-rt)/bt);Pa=n(Pa,2),et<0&&et>Ut&&(Aa=n(Aa*(et/Ut),2)),Ia=r(Ia=Je+2*Aa,i),Fa=t.duration*(t.rate-Je)/60;var ja=Math.min(Aa,Pa);if(console.log("naiveInsulinReq:"+Pa),Fa5&&Ia>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+Ia+"U/hr. ",He;if(Ia<=0){if((Ra=n((Da=rt-wt)/bt*60/i.current_basal*H))<0?Ra=0:(Ra=30*n(Ra/30),Ra=Math.min(120,Math.max(0,Ra))),Ra>0)return He.reason+=", setting "+Ra+"m zero temp. ",u.setTempBasal(Ia,Ra,i,He,t)}else He.reason+=", setting "+Ia+"U/hr. ";return u.setTempBasal(Ia,30,i,He,t)}if(et=2||Ut+-1*et>=2)&&(He.manualBolusErrorString=et>=0&&Ut>0?3:et<0&&Ut<=0||et<0&&Ut>=0?4:5),He.insulinForManualBolus=n((He.eventualBG-He.target_bg)/bt,2),!m||!Ft))return e.delta "+o(nt,i)+" but Delta "+o(Ke,i)+" < Exp. Delta "+o(Ut,i):He.reason+="Eventual BG "+o(Gt,i)+" > "+o(nt,i)+" but Min. Delta "+et.toFixed(2)+" < Exp. Delta "+o(Ut,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Gt,Ct)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=n((He.eventualBG-He.target_bg)/bt,2),He.minPredBG=Ct),!m||!Ft))return He.reason+=o(Gt,i)+"-"+o(Ct,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Gt>=ot&&(He.reason+="Eventual BG "+o(Gt,i)+" >= "+o(ot,i)+", ",Gt>ot&&(He.insulinForManualBolus=n((Gt-rt)/bt,2))),a.iob>st)return He.reason+="IOB "+n(a.iob,2)+" > max_iob "+st,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Aa=n((Math.min(Ct,Gt)-rt)/bt,2),C=n((Gt-rt)/bt,2),Aa>st-a.iob?(console.error("SMB limited by maxIOB: "+st-a.iob+" (. insulinReq: "+Aa+" U)"),He.reason+="max_iob "+st+", ",Aa=st-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Aa+" U)."),C>st-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+st-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+st+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),Ia=r(Ia=Je+2*Aa,i),Aa=n(Aa,3),He.insulinReq=Aa;var Ea=n((new Date(U).getTime()-a.lastBolusTime)/6e4,1);if(m&&Ft&&Xe>T){var qa=30;void 0!==i.maxSMBBasalMinutes&&(qa=i.maxSMBBasalMinutes);var Wa=30;void 0!==i.maxUAMSMBBasalMinutes&&(Wa=i.maxUAMSMBBasalMinutes),v.useOverride&&M&&D!==qa&&(console.error("SMB Max Minutes - setting overriden from "+qa+" to "+D),qa=D),v.useOverride&&M&&w!==Wa&&(console.error("UAM Max Minutes - setting overriden from "+Wa+" to "+w),Wa=w);var ka=n(l.mealCOB/$,3),La=0;void 0===qa?(La=n(i.current_basal*H*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Aa>La&&console.error("SMB limited by maxBolus: "+La+" ( "+Aa+" U)")):a.iob>ka&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+ka),Wa?(console.error("maxUAMSMBBasalMinutes: "+Wa+", profile.current_basal: "+i.current_basal*H),La=n(i.current_basal*H*Wa/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),La=n(i.current_basal*H*30/60,1)),Aa>La?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Wa+"m ]: "+La+"U ( "+Aa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Aa+"U )")):(console.error(".maxSMBBasalMinutes: "+qa+", profile.current_basal: "+i.current_basal*H),Aa>(La=n(i.current_basal*H*qa/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+qa+"m ]: "+La+"U ( insulinReq: "+Aa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Aa+"U )"));var za=i.bolus_increment,Na=1/za,Ha=Math.min(i.smb_delivery_ratio,1);.5!=Ha&&console.error("SMB Delivery Ratio changed from default 0.5 to "+n(Ha,2));var Za=Math.min(Aa*Ha,La);Za=Math.floor(Za*Na)/Na,Ra=n((rt-(wt+na)/2)/bt*60/i.current_basal*H),Aa>0&&Za=30?(Ra=30*n(Ra/30),Ra=Math.min(60,Math.max(0,Ra))):($a=n(Je*Ra/30,2),Ra=30),He.reason+=" insulinReq "+Aa,Za>=La&&(He.reason+="; maxBolus "+La),Ra>0&&(He.reason+="; setting "+Ra+"m low temp of "+$a+"U/h"),He.reason+=". ";var Ja=3;i.SMBInterval&&(Ja=Math.min(10,Math.max(1,i.SMBInterval)));var Ka=n(Ja-Ea,0),Qa=n(60*(Ja-Ea),0)%60;if(console.error("naive_eventualBG "+wt+","+Ra+"m "+$a+"U/h temp needed; last bolus "+Ea+"m ago; maxBolus: "+La),Ea>Ja?Za>0&&(He.units=Za,He.reason+="Microbolusing "+Za+"U. "):He.reason+="Waiting "+Ka+"m "+Qa+"s to microbolus again. ",Ra>0)return He.rate=$a,He.duration=Ra,He}var Va=u.getMaxSafeBasal(i);return 400==Xe?u.setTempBasal(i.current_basal,30,i,He,t):(Ia>Va&&(He.reason+="adj. req. rate: "+Ia+" to maxSafeBasal: "+n(Va,2)+", ",Ia=r(Va,i)),(Fa=t.duration*(t.rate-Je)/60)>=2*Aa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)):t.duration>5&&r(Ia,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+Ia+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)))}},3531:(e,t,a)=>{var r=a(2296);e.exports=function(e,t){var a=20;return void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40),e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},1873:(e,t,a)=>{var r=a(9325).Symbol;e.exports=r},4932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,n=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},2552:(e,t,a)=>{var r=a(1873),n=a(659),o=a(9350),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?n(e):o(e)}},7556:(e,t,a)=>{var r=a(1873),n=a(4932),o=a(6449),i=a(4394),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(o(t))return n(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-1/0?"-0":a}},4128:(e,t,a)=>{var r=a(1800),n=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(n,""):e}},4840:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},659:(e,t,a)=>{var r=a(1873),n=Object.prototype,o=n.hasOwnProperty,i=n.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=o.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var n=i.call(e);return r&&(t?e[s]=a:delete e[s]),n}},9350:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},9325:(e,t,a)=>{var r=a(4840),n="object"==typeof self&&self&&self.Object===Object&&self,o=r||n||Function("return this")();e.exports=o},1800:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},2296:(e,t,a)=>{var r=a(7133),n=a(7556),o=a(1489),i=a(3222);e.exports=function(e,t,a){e=i(e),t=n(t);var s=e.length,l=a=void 0===a?s:r(o(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},6449:e=>{var t=Array.isArray;e.exports=t},3805:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},346:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},4394:(e,t,a)=>{var r=a(2552),n=a(346);e.exports=function(e){return"symbol"==typeof e||n(e)&&"[object Symbol]"==r(e)}},7400:(e,t,a)=>{var r=a(6993),n=1/0;e.exports=function(e){return e?(e=r(e))===n||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},1489:(e,t,a)=>{var r=a(7400);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},6993:(e,t,a)=>{var r=a(4128),n=a(3805),o=a(4394),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(o(e))return NaN;if(n(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=n(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},3222:(e,t,a)=>{var r=a(7556);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var n=t[r];if(void 0!==n)return n.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,a),o.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(2982);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={2982:(e,t,a)=>{var r=a(3531);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v,B){var f=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(f=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr;v.smbIsScheduledOff,v.start;v.end;const D=v.smbMinutes,w=v.uamMinutes;var G=h.useNewFormula,T=0,C=f,U=new Date;c&&(U=new Date(c));var O=0,A="",R="",I="",F="",j="",P="",E=0,q=0,W=0,k=0,L=0,z=0;const N=v.weightedAverage;var H=1,Z=i.sens,$=i.carb_ratio;v.useOverride&&(H=v.overridePercentage/100,y?(Z/=H,$/=H):(S&&($/=H),x&&(Z/=H)));const J=i.weightPercentage,K=v.average_total_data;function Q(e,t){var a=e.getTime();return new Date(a+36e5*t)}function V(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function X(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function Y(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ee=Math.min(i.autosens_min,i.autosens_max),te=Math.max(i.autosens_min,i.autosens_max);function ae(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=X(r),u=p[0].rate;for(let e=0;e=(s=Y(p[e+1].start,p[e].start))?n=s:o=(s=24-Y(p[e].start,t))?n=s:od)if(e+1=(s=Y(m,l))?n=s:o=(s=Y("23:59:59",l))?n=s:o0&&o1)&&(G=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(G){let e=g.length-1;var re=new Date(g[e].timestamp),oe=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(oe=new Date),(O=(oe-re)/36e5)<23.9&&O>21)L=ae(re,(ne=24-O,ie=re.getTime(),new Date(ie-36e5*ne))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+L.toPrecision(5)+" U. ";else O<21?(G=!1,enableDynamicCR=!1):F=""}}else console.log("Pumphistory is empty!"),G=!1,enableDynamicCR=!1;var ne,ie;if(G){for(let e=0;e0){E=e,z=g[e].rate;var se=g[e-1]["duration (min)"]/60,le=se,ue=new Date(g[e-1].timestamp),de=new Date(ue),me=0;do{if(e--,0==e){de=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){de=new Date(g[e].timestamp);break}var ce=e-2;if(ce>=0&&"Rewind"==g[ce]._type){let e=g[ce].timestamp;for(;ce-1>=0&&"Prime"==g[ce-=1]._type;)me=(g[ce].timestamp-e)/36e5;me>=se&&(de=new Date(e),me=0)}}while(e>0);var ge=(de-ue)/36e5;ge0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(L+=ae(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var he=new Date(a);let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){he=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(he=new Date,t=g[e]["duration (min)"]/60),(he-a)/36e5-t>0){L+=ae(he,Q(a,t))}}var pe={TDD:o(q=k+W+L,5),bolus:o(k,5),temp_basal:o(W,5),scheduled_basal:o(L,5)};O>21?(R=". Bolus insulin: "+k.toPrecision(5)+" U",I=". Temporary basal insulin: "+W.toPrecision(5)+" U",A=". Insulin with scheduled basal rate: "+L.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+q.toPrecision(5)+" U")+R+I+A,P=", TDD: "+o(q,2)+" U, "+o(k/q*100,0)+"% Bolus "+o((W+L)/q*100,0)+"% Basal"):P=", TDD: Not enough pumpData (< 21h)"}var ve;const Be=e.glucose,fe=h.enableDynamicCR,be=h.adjustmentFactor,Me=f;var _e=!1,ye="",xe=1,Se="";K>0&&(xe=N/K),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(G=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+Be+" mg/dl ("+(.0555*Be).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Ae=h.useCustomPeakTime;var Re=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Ae?(Re=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Re)):(Re=120-Ie,console.log("insulinFactor set to : "+Re)),ve=q,J<1&&N>0&&(q=N,console.log("Using weighted TDD average: "+o(q,2)+" U, instead of past 24 h ("+o(ve,2)+" U), weight: "+J),Ce=", Weighted TDD: "+o(q,2)+" U");const Fe=h.sigmoid;var je="";if(G){var Pe=Z*be*q*Math.log(Be/Re+1)/1800;Te=", Logarithmic formula"}if(G&&Fe){const e=ee,t=te-e,a=.0555*(Be-f);var Ee=xe,qe=te-1;1==te&&(qe=te+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=$;const ke=o($,1);var Le="",ze="";if(G&&q>0){if(Le=", Dynamic ISF/CR: On/",Pe>te?(ye=", Dynamic ISF limited by autosens_max setting: "+te+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+te+" ("+o(Pe,2)+")",Pe=te):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var et=Math.min(e.delta,e.short_avgdelta),tt=Math.min(e.short_avgdelta,e.long_avgdelta),at=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Xe<=10||38===Xe||Ye>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Xe>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Xe&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Xe,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Xe&&!0),Ve>12||Ve<-5?He.reason="If current system time "+U+" is correct, then BG data is too old. The last BG data was read "+Ve+"m ago at "+Qe:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Xe&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Xe,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Xe&&(Xe<=10||38===Xe||Ye>=3||Ve>12||Ve<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var rt,ot,nt,it,st=i.max_iob;if(void 0!==f&&(ot=f),void 0!==i.max_bg&&(nt=f),void 0!==i.enableSMB_high_bg_target&&(it=i.enableSMB_high_bg_target),void 0===f)return He.error="Error: could not determine target_bg. ",He;rt=f;var lt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ut=100,dt=160;if(dt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),dt=e}else console.log("Default Half Basal Target used: "+n(dt,i)+" "+i.out_units);if(lt&&i.temptargetSet&&rt>ut||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&rt=rt&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ve,2)+"U, Weighted average TDD = "+o(N,2)+"U, (Weight percentage = "+J+"), Total data of TDDs (up to 14 days) average = "+o(K,2)+"U. "),Je!==$e*H?process.stderr.write("Adjusting basal from "+$e*H+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){ot=o((ot-60)/s.ratio)+60,nt=o((nt-60)/s.ratio)+60;var ct=o((rt-60)/s.ratio)+60;rt===(ct=Math.max(80,ct))?process.stderr.write("target_bg unchanged: "+n(ct,i)+"; "):process.stderr.write("target_bg from "+n(ct,i)+" to "+n(ct,i)+"; "),rt=ct}var gt=n(rt,i);rt!=f&&(gt=0!==b&&6!==b&&b!==rt?n(f,i)+"→"+n(b,i)+"→"+n(rt,i):n(f,i)+"→"+n(rt,i));var ht=200,pt=200,vt=200;if(e.noise>=2){var Bt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ht=o(Math.min(200,ot*Bt)),pt=o(Math.min(200,rt*Bt)),vt=o(Math.min(200,nt*Bt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(ct,i)+" to "+n(pt,i)+"; "),ot=ht,rt=pt,nt=vt}C=ot-.5*(ot-40),C=Math.min(Math.max(i.threshold_setting,C,60),120),console.error("Threshold set to ${convert_bg(threshold, profile)}");var ft="",bt=(o(Z,1),Z);if(void 0!==s&&s&&((bt=o(bt=Z/sensitivityRatio,1))!==Z?process.stderr.write("ISF from "+n(Z,i)+" to "+n(bt,i)):process.stderr.write("ISF unchanged: "+n(bt,i)),ft+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(Z,i)+"→"+n(bt,i)),console.error("CR:"+$),void 0===a)return He.error="Error: iob_data undefined. ",He;var Mt,_t=a;if(a.length,a.length>1&&(a=_t[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var yt=((Mt=void 0!==a.lastTemp?o((new Date(U).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+Mt+"m, tempModulus:"+yt+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&Mt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var xt=Mt-a.lastTemp.duration;if(xt>5&&Mt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+xt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var St=o(-a.activity*bt*5,2),Dt=o(6*(et-St));Dt<0&&(Dt=o(6*(tt-St)))<0&&(Dt=o(6*(e.long_avgdelta-St)));var wt=Xe,Gt=(wt=a.iob>0?o(Xe-a.iob*bt):o(Xe-a.iob*Math.min(bt,Z)))+Dt;if(void 0===Gt||isNaN(Gt))return He.error="Error: could not calculate eventualBG. Sensitivity: "+bt+" Deviation: "+Dt,He;var Tt,Ct,Ut=function(e,t,a){return o(a+(e-t)/24,1)}(rt,Gt,St);He={temp:"absolute",bg:Xe,tick:Ke,eventualBG:Gt,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o($,1),TDD:ve,insulin:pe,current_target:rt,insulinForManualBolus:T,manualBolusErrorString:0,minDelta:et,expectedDelta:Ut,minGuardBG:Ct,minPredBG:Tt,threshold:n(C,i)};var Ot=[],At=[],Rt=[],It=[];Ot.push(Xe),At.push(Xe),It.push(Xe),Rt.push(Xe);let Ft=!1;M?(console.error("SMBs are always off."),Ft=!1):Ft=function(e,t,a,r,o,i,s,l){if(s.smbIsScheduledOff){let e=new Date(l.getHours()),t=s.start,a=s.end;if(t=t&&ea&&(e>=t||e100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Xe,rt,it,v,U);var jt=i.enableUAM,Pt=0,Et=0;Pt=o(et-St,1);var qt=o(et-St,1);csf=bt/$,console.error("profile.sens:"+n(Z,i)+", sens:"+n(bt,i)+", CSF:"+o(csf,1));var Wt=o(30*csf*5/60,1);Pt>Wt&&(console.error("Limiting carb impact from "+Pt+" to "+Wt+"mg/dL/5m (30g/h)"),Pt=Wt);var kt=3;sensitivityRatio&&(kt/=sensitivityRatio);var Lt=kt;if(l.carbs){kt=Math.max(kt,l.mealCOB/20);var zt=o((new Date(U).getTime()-l.lastCarbTime)/6e4),Nt=(l.carbs-l.mealCOB)/l.carbs;Lt=o(Lt=kt+1.5*zt/60,1),console.error("Last carbs "+zt+" minutes ago; remainingCATime:"+Lt+"hours; "+o(100*Nt,1)+"% carbs absorbed")}var Ht=Math.max(0,Pt/5*60*Lt/2)/csf,Zt=90,$t=1;i.remainingCarbsCap&&(Zt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&($t=Math.min(1,i.remainingCarbsFraction));var Jt=1-$t,Kt=Math.max(0,l.mealCOB-Ht-l.carbs*Jt),Qt=(Kt=Math.min(Zt,Kt))*csf*5/60/(Lt/2),Vt=o(l.slopeFromMaxDeviation,2),Xt=o(l.slopeFromMinDeviation,2),Yt=Math.min(Vt,-Xt/3);Et=0===Pt?0:Math.min(60*Lt/5/2,Math.max(0,l.mealCOB*csf/Pt)),console.error("Carb Impact:"+Pt+"mg/dL per 5m; CI Duration:"+o(5*Et/60*2,1)+"hours; remaining CI ("+Lt/2+"h peak):"+o(Qt,1)+"mg/dL per 5m");var ea,ta,aa,ra,oa=999,na=999,ia=999,sa=999,la=999,ua=999,da=999,ma=Gt,ca=Xe,ga=Xe,ha=0,pa=[],va=[];try{_t.forEach((function(e){var t=o(-e.activity*bt*5,2),a=o(-e.iobWithZeroTemp.activity*bt*5,2),r=wt,n=Pt*(1-Math.min(1,At.length/12));if(!0===(G&&!Fe))ma=At[At.length-1]+o(-e.activity*(1800/(q*be*Math.log(Math.max(At[At.length-1],39)/Re+1)))*5,2)+n,r=It[It.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(q*be*Math.log(Math.max(It[It.length-1],39)/Re+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ma,2)+" , ZTpredBG: "+o(r,2));else ma=At[At.length-1]+t+n,r=It[It.length-1]+a;var i=Math.max(0,Math.max(0,Pt)*(1-Ot.length/Math.max(2*Et,1))),s=Math.min(Ot.length,12*Lt-Ot.length),l=Math.max(0,s/(Lt/2*12)*Qt);i+l,pa.push(o(l,0)),va.push(o(i,0)),COBpredBG=Ot[Ot.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,qt+Rt.length*Yt),d=Math.max(0,qt*(1-Rt.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(ha=o(5*(Rt.length+1)/60,1)),!0===(G&&!Fe))UAMpredBG=Rt[Rt.length-1]+o(-e.activity*(1800/(q*be*Math.log(Math.max(Rt[Rt.length-1],39)/Re+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Rt[Rt.length-1]+t+Math.min(0,n)+m;At.length<48&&At.push(ma),Ot.length<48&&Ot.push(COBpredBG),Rt.length<48&&Rt.push(UAMpredBG),It.length<48&&It.push(r),COBpredBG18&&maca&&(ca=ma),(Et||Qt>0)&&Ot.length>18&&COBpredBG0)&&COBpredBG>ca&&(ga=COBpredBG),jt&&Rt.length>12&&UAMpredBGca&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+va.join(" ")),console.error("remainingCIs: "+pa.join(" "))),He.predBGs={},At.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var Ba=At.length-1;Ba>12&&At[Ba-1]===At[Ba];Ba--)At.pop();for(He.predBGs.IOB=At,ta=o(At[At.length-1]),It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ba=It.length-1;Ba>6&&!(It[Ba-1]>=It[Ba]||It[Ba]<=rt);Ba--)It.pop();if(He.predBGs.ZT=It,o(It[It.length-1]),l.mealCOB>0&&(Pt>0||Qt>0)){for(Ot.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),Ba=Ot.length-1;Ba>12&&Ot[Ba-1]===Ot[Ba];Ba--)Ot.pop();He.predBGs.COB=Ot,aa=o(Ot[Ot.length-1]),Gt=Math.max(Gt,o(Ot[Ot.length-1])),console.error("COBpredBG: "+o(Ot[Ot.length-1]))}if(Pt>0||Qt>0){if(jt){for(Rt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ba=Rt.length-1;Ba>12&&Rt[Ba-1]===Rt[Ba];Ba--)Rt.pop();He.predBGs.UAM=Rt,ra=o(Rt[Rt.length-1]),Rt[Rt.length-1]&&(Gt=Math.max(Gt,o(Rt[Rt.length-1])))}He.eventualBG=Gt}console.error("UAM Impact:"+qt+"mg/dL per 5m; UAM Duration:"+ha+"hours"),oa=Math.max(39,oa),na=Math.max(39,na),ia=Math.max(39,ia),Tt=o(oa);var fa=l.mealCOB/l.carbs;ea=o(ia<999&&na<999?(1-fa)*UAMpredBG+fa*COBpredBG:na<999?(ma+COBpredBG)/2:ia<999?(ma+UAMpredBG)/2:ma),da>ea&&(ea=da),Ct=o(Ct=Et||Qt>0?jt?fa*sa+(1-fa)*la:sa:jt?la:ua);var ba=ia;if(daia&&(ba=(ia+da)/2);if(ba=o(ba),l.carbs)if(!jt&&na<999)Tt=o(Math.max(oa,na));else if(na<999){var _a=fa*na+(1-fa)*ba;Tt=o(Math.max(oa,na,_a))}else Tt=jt?ba:Ct;else jt&&(Tt=o(Math.max(oa,ba)));Tt=Math.min(Tt,ea),process.stderr.write("minPredBG: "+Tt+" minIOBPredBG: "+oa+" minZTGuardBG: "+da),na<999&&process.stderr.write(" minCOBPredBG: "+na),ia<999&&process.stderr.write(" minUAMPredBG: "+ia),console.error(" avgPredBG:"+ea+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),ga>Xe&&(Tt=Math.min(Tt,ga)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(St,i),He.deviation=n(Dt,i),He.ISF=n(bt,i),He.CR=o($,1),He.target_bg=n(rt,i),He.TDD=o(ve,2),He.current_target=o(rt,0);var ya=He.CR;ke!=He.CR&&(ya=ke+"→"+He.CR),He.reason=ft+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+ya+", Target: "+gt+", minPredBG "+n(Tt,i)+", minGuardBG "+n(Ct,i)+", IOBpredBG "+n(ta,i),aa>0&&(He.reason+=", COBpredBG "+n(aa,i)),ra>0&&(He.reason+=", UAMpredBG "+n(ra,i)),He.reason+=P,He.reason+="; ";var xa=wt;xa<40&&(xa=Math.min(Ct,xa));var Sa,Da=C-xa,wa=240,Ga=240;if(l.mealCOB>0&&(Pt>0||Qt>0)){for(Ba=0;BaSa*Xe&&(console.error("maxDelta "+n(at,i)+" > "+100*Sa+"% of BG "+n(Xe,i)+" - disabling SMB"),He.reason+="maxDelta "+n(at,i)+" > "+100*Sa+"% of BG "+n(Xe,i)+" - SMB disabled!, ",Ft=!1),console.error("BG projected to remain above "+n(ot,i)+" for "+wa+"minutes"),(Ga<240||wa<60)&&console.error("BG projected to remain above "+n(C,i)+" for "+Ga+"minutes");var Ta=Ga,Ca=i.current_basal*H*bt*Ta/60,Ua=Math.max(0,l.mealCOB-.25*l.carbs),Oa=(Da-Ca)/csf-Ua;Ca=o(Ca),Oa=o(Oa),console.error("naive_eventualBG:",wt,"bgUndershoot:",Da,"zeroTempDuration:",Ta,"zeroTempEffect:",Ca,"carbsReq:",Oa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Oa>=i.carbsReqThreshold&&Ga<=45&&(He.carbsReq=Oa,He.reason+=Oa+" add'l carbs req w/in "+Ga+"m; ");var Aa=0;if(Xe0&&et>Ut)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*H*20/60,2),He.reason+=" and minDelta "+n(et,i)+" > expectedDelta "+n(Ut,i)+"; ";else if(Xe=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Ra=0,Ia=Je,Fa=0;if(GtUt&&et>0&&!Oa)return wt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>et?He.reason+=", but Delta "+n(Ke,i)+" > expectedDelta "+n(Ut,i):He.reason+=", but Min. Delta "+et.toFixed(2)+" > Exp. Delta "+n(Ut,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Ra=o(Ra=2*Math.min(0,(Gt-rt)/bt),2);var ja=Math.min(0,(wt-rt)/bt);if(ja=o(ja,2),et<0&&et>Ut)Ra=o(Ra*(et/Ut),2);Ia=r(Ia=Je+2*Ra,i),Fa=t.duration*(t.rate-Je)/60;var Pa=Math.min(Ra,ja);if(console.log("naiveInsulinReq:"+ja),Fa5&&Ia>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+Ia+"U/hr. ",He;if(Ia<=0){if((Aa=o(60*((Da=rt-wt)/bt)/i.current_basal*H))<0?Aa=0:(Aa=30*o(Aa/30),Aa=Math.min(120,Math.max(0,Aa))),Aa>0)return He.reason+=", setting "+Aa+"m zero temp. ",u.setTempBasal(Ia,Aa,i,He,t)}else He.reason+=", setting "+Ia+"U/hr. ";return u.setTempBasal(Ia,30,i,He,t)}if(et=2||Ut+-1*et>=2)&&(He.manualBolusErrorString=et>=0&&Ut>0?3:et<0&&Ut<=0||et<0&&Ut>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/bt,2),!d||!Ft))return e.delta "+n(ot,i)+" but Delta "+n(Ke,i)+" < Exp. Delta "+n(Ut,i):He.reason+="Eventual BG "+n(Gt,i)+" > "+n(ot,i)+" but Min. Delta "+et.toFixed(2)+" < Exp. Delta "+n(Ut,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Gt,Tt)ot&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/bt,2),He.minPredBG=Tt),!d||!Ft))return He.reason+=n(Gt,i)+"-"+n(Tt,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Gt>=nt&&(He.reason+="Eventual BG "+n(Gt,i)+" >= "+n(nt,i)+", ",Gt>nt&&(He.insulinForManualBolus=o((Gt-rt)/bt,2))),a.iob>st)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+st,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Ra=o((Math.min(Tt,Gt)-rt)/bt,2),T=o((Gt-rt)/bt,2),Ra>st-a.iob?(console.error("SMB limited by maxIOB: "+st-a.iob+" (. insulinReq: "+Ra+" U)"),He.reason+="max_iob "+st+", ",Ra=st-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Ra+" U)."),T>st-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+st-a.iob+" (. insulinForManualBolus: "+T+" U)"),He.reason+="max_iob "+st+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+T+" U)."),Ia=r(Ia=Je+2*Ra,i),Ra=o(Ra,3),He.insulinReq=Ra;var Ea=o((new Date(U).getTime()-a.lastBolusTime)/6e4,1);if(d&&Ft&&Xe>C){var qa=30;void 0!==i.maxSMBBasalMinutes&&(qa=i.maxSMBBasalMinutes);var Wa=30;void 0!==i.maxUAMSMBBasalMinutes&&(Wa=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&D!==qa&&(console.error("SMB Max Minutes - setting overriden from "+qa+" to "+D),qa=D),v.useOverride&&_&&w!==Wa&&(console.error("UAM Max Minutes - setting overriden from "+Wa+" to "+w),Wa=w);var ka=o(l.mealCOB/$,3),La=0;void 0===qa?(La=o(i.current_basal*H*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Ra>La&&console.error("SMB limited by maxBolus: "+La+" ( "+Ra+" U)")):a.iob>ka&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+ka),Wa?(console.error("maxUAMSMBBasalMinutes: "+Wa+", profile.current_basal: "+i.current_basal*H),La=o(i.current_basal*H*Wa/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),La=o(i.current_basal*H*30/60,1)),Ra>La?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Wa+"m ]: "+La+"U ( "+Ra+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Ra+"U )")):(console.error(".maxSMBBasalMinutes: "+qa+", profile.current_basal: "+i.current_basal*H),Ra>(La=o(i.current_basal*H*qa/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+qa+"m ]: "+La+"U ( insulinReq: "+Ra+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Ra+"U )"));var za=i.bolus_increment,Na=1/za,Ha=Math.min(i.smb_delivery_ratio,1);.5!=Ha&&console.error("SMB Delivery Ratio changed from default 0.5 to "+o(Ha,2));var Za=Math.min(Ra*Ha,La);Za=Math.floor(Za*Na)/Na,Aa=o(60*((rt-(wt+oa)/2)/bt)/i.current_basal*H),Ra>0&&Za=30?(Aa=30*o(Aa/30),Aa=Math.min(60,Math.max(0,Aa))):($a=o(Je*Aa/30,2),Aa=30),He.reason+=" insulinReq "+Ra,Za>=La&&(He.reason+="; maxBolus "+La),Aa>0&&(He.reason+="; setting "+Aa+"m low temp of "+$a+"U/h"),He.reason+=". ";var Ja=3;i.SMBInterval&&(Ja=Math.min(10,Math.max(1,i.SMBInterval)));var Ka=o(Ja-Ea,0),Qa=o(60*(Ja-Ea),0)%60;if(console.error("naive_eventualBG "+wt+","+Aa+"m "+$a+"U/h temp needed; last bolus "+Ea+"m ago; maxBolus: "+La),Ea>Ja?Za>0&&(He.units=Za,He.reason+="Microbolusing "+Za+"U. "):He.reason+="Waiting "+Ka+"m "+Qa+"s to microbolus again. ",Aa>0)return He.rate=$a,He.duration=Aa,He}var Va=u.getMaxSafeBasal(i);return 400==Xe?u.setTempBasal(i.current_basal,30,i,He,t):(Ia>Va&&(He.reason+="adj. req. rate: "+Ia+" to maxSafeBasal: "+o(Va,2)+", ",Ia=r(Va,i)),(Fa=t.duration*(t.rate-Je)/60)>=2*Ra?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)):t.duration>5&&r(Ia,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+Ia+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)))}},3531:(e,t,a)=>{var r=a(2296);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},1873:(e,t,a)=>{var r=a(9325).Symbol;e.exports=r},4932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},2552:(e,t,a)=>{var r=a(1873),o=a(659),n=a(9350),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},7556:(e,t,a)=>{var r=a(1873),o=a(4932),n=a(6449),i=a(4394),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-1/0?"-0":a}},4128:(e,t,a)=>{var r=a(1800),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},4840:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},659:(e,t,a)=>{var r=a(1873),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},9350:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},9325:(e,t,a)=>{var r=a(4840),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},1800:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},2296:(e,t,a)=>{var r=a(7133),o=a(7556),n=a(1489),i=a(3222);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},6449:e=>{var t=Array.isArray;e.exports=t},3805:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},346:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},4394:(e,t,a)=>{var r=a(2552),o=a(346);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},7400:(e,t,a)=>{var r=a(6993),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},1489:(e,t,a)=>{var r=a(7400);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},6993:(e,t,a)=>{var r=a(4128),o=a(3805),n=a(4394),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},3222:(e,t,a)=>{var r=a(7556);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(2982);freeaps_determineBasal=r})(); \ No newline at end of file diff --git a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift index f264e2353..5aefb7929 100644 --- a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift +++ b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift @@ -259,7 +259,7 @@ final class OpenAPS { isfAndCr: overrideArray.first?.isfAndCr ?? false, isf: overrideArray.first?.isf ?? false, cr: overrideArray.first?.cr ?? false, - smbIsAlwaysOff: overrideArray.first?.smbIsAlwaysOff ?? false, + smbIsScheduledOff: overrideArray.first?.smbIsScheduledOff ?? false, start: (overrideArray.first?.start ?? 0) as Decimal, end: (overrideArray.first?.end ?? 0) as Decimal, smbMinutes: (overrideArray.first?.smbMinutes ?? smbMinutes) as Decimal, @@ -287,7 +287,7 @@ final class OpenAPS { isfAndCr: overrideArray.first?.isfAndCr ?? false, isf: overrideArray.first?.isf ?? false, cr: overrideArray.first?.cr ?? false, - smbIsAlwaysOff: overrideArray.first?.smbIsAlwaysOff ?? false, + smbIsScheduledOff: overrideArray.first?.smbIsScheduledOff ?? false, start: (overrideArray.first?.start ?? 0) as Decimal, end: (overrideArray.first?.end ?? 0) as Decimal, smbMinutes: (overrideArray.first?.smbMinutes ?? smbMinutes) as Decimal, diff --git a/FreeAPS/Sources/Models/Oref2_variables.swift b/FreeAPS/Sources/Models/Oref2_variables.swift index 69a162230..34e57e01e 100644 --- a/FreeAPS/Sources/Models/Oref2_variables.swift +++ b/FreeAPS/Sources/Models/Oref2_variables.swift @@ -18,7 +18,7 @@ struct Oref2_variables: JSON, Equatable { var isfAndCr: Bool var isf: Bool var cr: Bool - var smbIsAlwaysOff: Bool + var smbIsScheduledOff: Bool var start: Decimal var end: Decimal var smbMinutes: Decimal @@ -42,7 +42,7 @@ struct Oref2_variables: JSON, Equatable { isfAndCr: Bool, isf: Bool, cr: Bool, - smbIsAlwaysOff: Bool, + smbIsScheduledOff: Bool, start: Decimal, end: Decimal, smbMinutes: Decimal, @@ -65,7 +65,7 @@ struct Oref2_variables: JSON, Equatable { self.isfAndCr = isfAndCr self.isf = isf self.cr = cr - self.smbIsAlwaysOff = smbIsAlwaysOff + self.smbIsScheduledOff = smbIsScheduledOff self.start = start self.end = end self.smbMinutes = smbMinutes @@ -92,7 +92,7 @@ extension Oref2_variables { case isfAndCr case isf case cr - case smbIsAlwaysOff + case smbIsScheduledOff case start case end case smbMinutes diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift index 953bdfcdd..9c9180ad1 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/OverrideProfilesStateModel.swift @@ -19,7 +19,7 @@ extension OverrideProfilesConfig { @Published var isfAndCr: Bool = true @Published var isf: Bool = true @Published var cr: Bool = true - @Published var smbIsAlwaysOff: Bool = false + @Published var smbIsScheduledOff: Bool = false @Published var start: Decimal = 0 @Published var end: Decimal = 23 @Published var smbMinutes: Decimal = 0 @@ -66,11 +66,11 @@ extension OverrideProfilesConfig { saveOverride.isf = isf saveOverride.cr = cr } else { saveOverride.isfAndCr = true } - if smbIsAlwaysOff { - saveOverride.smbIsAlwaysOff = true + if smbIsScheduledOff { + saveOverride.smbIsScheduledOff = true saveOverride.start = start as NSDecimalNumber saveOverride.end = end as NSDecimalNumber - } else { saveOverride.smbIsAlwaysOff = false } + } else { saveOverride.smbIsScheduledOff = false } saveOverride.smbMinutes = smbMinutes as NSDecimalNumber saveOverride.uamMinutes = uamMinutes as NSDecimalNumber @@ -107,11 +107,11 @@ extension OverrideProfilesConfig { saveOverride.isf = isf saveOverride.cr = cr } else { saveOverride.isfAndCr = true } - if smbIsAlwaysOff { - saveOverride.smbIsAlwaysOff = true + if smbIsScheduledOff { + saveOverride.smbIsScheduledOff = true saveOverride.start = start as NSDecimalNumber saveOverride.end = end as NSDecimalNumber - } else { smbIsAlwaysOff = false } + } else { smbIsScheduledOff = false } saveOverride.smbMinutes = smbMinutes as NSDecimalNumber saveOverride.uamMinutes = uamMinutes as NSDecimalNumber @@ -147,11 +147,11 @@ extension OverrideProfilesConfig { saveOverride.isf = profile.isf saveOverride.cr = profile.cr } else { saveOverride.isfAndCr = true } - if profile.smbIsAlwaysOff { - saveOverride.smbIsAlwaysOff = true + if profile.smbIsScheduledOff { + saveOverride.smbIsScheduledOff = true saveOverride.start = profile.start saveOverride.end = profile.end - } else { saveOverride.smbIsAlwaysOff = false } + } else { saveOverride.smbIsScheduledOff = false } saveOverride.smbMinutes = (profile.smbMinutes ?? 0) as NSDecimalNumber saveOverride.uamMinutes = (profile.uamMinutes ?? 0) as NSDecimalNumber @@ -175,14 +175,14 @@ extension OverrideProfilesConfig { smbIsOff = overrideArray.first?.smbIsOff ?? false advancedSettings = overrideArray.first?.advancedSettings ?? false isfAndCr = overrideArray.first?.isfAndCr ?? true - smbIsAlwaysOff = overrideArray.first?.smbIsAlwaysOff ?? false + smbIsScheduledOff = overrideArray.first?.smbIsScheduledOff ?? false if advancedSettings { if !isfAndCr { isf = overrideArray.first?.isf ?? false cr = overrideArray.first?.cr ?? false } - if smbIsAlwaysOff { + if smbIsScheduledOff { start = (overrideArray.first?.start ?? 0) as Decimal end = (overrideArray.first?.end ?? 0) as Decimal } diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index de691d474..fec4cc590 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -123,21 +123,23 @@ extension OverrideProfilesConfig { Text("Disable SMBs") } } - HStack { - Toggle(isOn: $state.smbIsAlwaysOff) { - Text("Schedule when SMBs are Off") - }.disabled(!state.smbIsOff) - } - if state.smbIsAlwaysOff { + if !state.smbIsOff { HStack { - Text("First Hour SMBs are Off (24 hours)") - DecimalTextField("0", value: $state.start, formatter: formatter, cleanInput: false) - Text("hour").foregroundColor(.secondary) + Toggle(isOn: $state.smbIsScheduledOff) { + Text("Schedule when SMBs are Off") + } } - HStack { - Text("Last Hour SMBs are Off (24 hours)") - DecimalTextField("0", value: $state.end, formatter: formatter, cleanInput: false) - Text("hour").foregroundColor(.secondary) + if state.smbIsScheduledOff { + HStack { + Text("First Hour SMBs are Off (24 hours)") + DecimalTextField("0", value: $state.start, formatter: formatter, cleanInput: false) + Text("hour").foregroundColor(.secondary) + } + HStack { + Text("First Hour SMBs are Resumed (24 hours)") + DecimalTextField("0", value: $state.end, formatter: formatter, cleanInput: false) + Text("hour").foregroundColor(.secondary) + } } } HStack { @@ -281,7 +283,7 @@ extension OverrideProfilesConfig { let percent = preset.percentage / 100 let perpetual = preset.indefinite let durationString = perpetual ? "" : "\(formatter.string(from: duration as NSNumber)!)" - let scheduledSMBstring = (preset.smbIsOff && preset.smbIsAlwaysOff) ? "Scheduled SMBs" : "" + let scheduledSMBstring = (preset.smbIsOff && preset.smbIsScheduledOff) ? "Scheduled SMBs" : "" let smbString = (preset.smbIsOff && scheduledSMBstring == "") ? "SMBs are off" : "" let targetString = target != 0 ? "\(glucoseFormatter.string(from: target as NSNumber)!)" : "" let maxMinutesSMB = (preset.smbMinutes as Decimal?) != nil ? (preset.smbMinutes ?? 0) as Decimal : 0 From e8183a32fbcb458d7d4c362eb56624ed2fc1ebeb Mon Sep 17 00:00:00 2001 From: Mike Plante Date: Thu, 18 Apr 2024 00:06:04 -0400 Subject: [PATCH 2/6] Fix and refactor unChanged() for Profile Overrides Refactored by @polscm32 for readability. Logic changes by @mikeplante1 : + Removed checking `smbIsOff` from `defaultProfile` + Added checking for `smbIsScheduledOff` to `allSettingsDefault` + Removed checking `isf` and `cr` from `allSettingsDefault` Co-Authored-By: polscm32 <107251660+polscm32@users.noreply.github.com> --- .../View/OverrideProfilesRootView.swift | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index fec4cc590..4a1842940 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -330,14 +330,13 @@ extension OverrideProfilesConfig { } private func unChanged() -> Bool { - let isChanged = (state.percentage == 100 && !state.override_target && !state.smbIsOff && !state.advancedSettings) || - (!state._indefinite && state.duration == 0) || (state.override_target && state.target == 0) || - ( - state.percentage == 100 && !state.override_target && !state.smbIsOff && state.isf && state.cr && state - .smbMinutes == state.defaultSmbMinutes && state.uamMinutes == state.defaultUamMinutes - ) + let defaultProfile = state.percentage == 100 && !state.override_target && !state.advancedSettings + let noDurationSpecified = !state._indefinite && state.duration == 0 + let targetZeroWithOverride = state.override_target && state.target == 0 + let allSettingsDefault = state.percentage == 100 && !state.override_target && !state.smbIsOff && !state + .smbIsScheduledOff && state.smbMinutes == state.defaultSmbMinutes && state.uamMinutes == state.defaultUamMinutes - return isChanged + return defaultProfile || noDurationSpecified || targetZeroWithOverride || allSettingsDefault } private func removeProfile(at offsets: IndexSet) { From 0336592d84f54dfa98ee2dc7850757ed75be6205 Mon Sep 17 00:00:00 2001 From: Mike Plante Date: Thu, 18 Apr 2024 12:26:07 -0400 Subject: [PATCH 3/6] Add icon and time range to profile label MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Displays time range in label when SMBs are scheduled off in profile override. For example, if the range is set from 22:00-6:00 it would display ⃠ 22-6 --- FreeAPS/Sources/Modules/Home/View/HomeRootView.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 3f27faeb8..2ff34e937 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -243,7 +243,13 @@ extension Home { "" ) - let smbToggleString = (fetchedPercent.first?.smbIsOff ?? false) ? " \u{20e0}" : "" + let smbToggleString = ( + (fetchedPercent.first?.smbIsOff ?? false) || fetchedPercent.first?.smbIsScheduledOff ?? false + ) ? + " \u{20e0}" : "" + let smbScheduleString = (fetchedPercent.first?.smbIsScheduledOff ?? false) && + !(fetchedPercent.first?.smbIsOff ?? false) ? + " \(fetchedPercent.first?.start ?? 0)-\(fetchedPercent.first?.end ?? 0)" : "" var comma1 = ", " var comma2 = comma1 var comma3 = comma1 @@ -271,7 +277,7 @@ extension Home { if durationString == "", !indefinite { return nil } - return percentString + comma1 + targetString + comma2 + durationString + comma3 + smbToggleString + return percentString + comma1 + targetString + comma2 + durationString + comma3 + smbToggleString + smbScheduleString } var infoPanel: some View { From daa2150fce5b36bb87ef73e41fa6d64a93e51ef9 Mon Sep 17 00:00:00 2001 From: Mike Plante Date: Thu, 18 Apr 2024 16:49:51 -0400 Subject: [PATCH 4/6] Don't display a comma in override label... When `Disable SMBs` or `Schedule When SMBs are Off` is the only thing changed. Note, this commit does not fix that changes to SMB minutes are not displayed in the label. --- .../Modules/Home/View/HomeRootView.swift | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift index 2ff34e937..f636c8727 100644 --- a/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift +++ b/FreeAPS/Sources/Modules/Home/View/HomeRootView.swift @@ -243,6 +243,10 @@ extension Home { "" ) + if durationString == "", !indefinite { + return nil + } + let smbToggleString = ( (fetchedPercent.first?.smbIsOff ?? false) || fetchedPercent.first?.smbIsScheduledOff ?? false ) ? @@ -250,33 +254,13 @@ extension Home { let smbScheduleString = (fetchedPercent.first?.smbIsScheduledOff ?? false) && !(fetchedPercent.first?.smbIsOff ?? false) ? " \(fetchedPercent.first?.start ?? 0)-\(fetchedPercent.first?.end ?? 0)" : "" - var comma1 = ", " - var comma2 = comma1 - var comma3 = comma1 - if targetString == "" || percentString == "" { comma1 = "" } - if durationString == "" { comma2 = "" } - if smbToggleString == "" { comma3 = "" } - - if percentString == "", targetString == "" { - comma1 = "" - comma2 = "" - } - if percentString == "", targetString == "", smbToggleString == "" { - durationString = "" - comma1 = "" - comma2 = "" - comma3 = "" - } - if durationString == "" { - comma2 = "" - } - if smbToggleString == "" { - comma3 = "" - } + let comma1 = (percentString == "" || (targetString == "" && durationString == "" && smbToggleString == "")) + ? "" : " , " + let comma2 = (targetString == "" || (durationString == "" && smbToggleString == "")) + ? "" : " , " + let comma3 = (durationString == "" || smbToggleString == "") + ? "" : " , " - if durationString == "", !indefinite { - return nil - } return percentString + comma1 + targetString + comma2 + durationString + comma3 + smbToggleString + smbScheduleString } From 8bc49d3ed64f357a4cdc8a5955cb35572ca37e4c Mon Sep 17 00:00:00 2001 From: Mike Plante Date: Sun, 28 Apr 2024 13:19:06 -0400 Subject: [PATCH 5/6] *"Always Disable SMBs" --- .../OverrideProfilesConfig/View/OverrideProfilesRootView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift index 4a1842940..71c481919 100644 --- a/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift +++ b/FreeAPS/Sources/Modules/OverrideProfilesConfig/View/OverrideProfilesRootView.swift @@ -120,7 +120,7 @@ extension OverrideProfilesConfig { if state.advancedSettings { HStack { Toggle(isOn: $state.smbIsOff) { - Text("Disable SMBs") + Text("Always Disable SMBs") } } if !state.smbIsOff { From d317c53c48066a69c8c2d67285619f96887c04b4 Mon Sep 17 00:00:00 2001 From: bjornoleh Date: Wed, 1 May 2024 13:22:38 +0200 Subject: [PATCH 6/6] Update oref0 for #120 Rename smbIsAlwaysOff to smbIsScheduledOff Includes open-iaps-oref PR 20 and PR 17 (console error fix) Last commits: +5774155 Merge pull request 20 from MikePlante1/disable_smb_schedule +e3a8d73 Merge pull request 17 from MikePlante1/console_error_refactor +a29d9ce rename smbIsAlwaysOff to smbIsScheduledOff +d898eb1 fix threshold console.error Co-authored-by: Mike Plante --- FreeAPS/Resources/javascript/bundle/determine-basal.js | 2 +- open-iaps-oref/lib/determine-basal/determine-basal.js | 8 ++++---- oref0_source_version.txt | 6 +++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/FreeAPS/Resources/javascript/bundle/determine-basal.js b/FreeAPS/Resources/javascript/bundle/determine-basal.js index e6a3ec755..ab2ba8832 100644 --- a/FreeAPS/Resources/javascript/bundle/determine-basal.js +++ b/FreeAPS/Resources/javascript/bundle/determine-basal.js @@ -1 +1 @@ -var freeaps_determineBasal;(()=>{var e={2982:(e,t,a)=>{var r=a(3531);function o(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function n(e,t){return"mmol/L"===t.out_units?o(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v,B){var f=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(f=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr;v.smbIsScheduledOff,v.start;v.end;const D=v.smbMinutes,w=v.uamMinutes;var G=h.useNewFormula,T=0,C=f,U=new Date;c&&(U=new Date(c));var O=0,A="",R="",I="",F="",j="",P="",E=0,q=0,W=0,k=0,L=0,z=0;const N=v.weightedAverage;var H=1,Z=i.sens,$=i.carb_ratio;v.useOverride&&(H=v.overridePercentage/100,y?(Z/=H,$/=H):(S&&($/=H),x&&(Z/=H)));const J=i.weightPercentage,K=v.average_total_data;function Q(e,t){var a=e.getTime();return new Date(a+36e5*t)}function V(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?o(Math.floor(a)*t,5):0}function X(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function Y(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ee=Math.min(i.autosens_min,i.autosens_max),te=Math.max(i.autosens_min,i.autosens_max);function ae(e,t){var a=0,r=t,o=(e-t)/36e5,n=0,i=o,s=0;do{if(o>0){var l=X(r),u=p[0].rate;for(let e=0;e=(s=Y(p[e+1].start,p[e].start))?n=s:o=(s=24-Y(p[e].start,t))?n=s:od)if(e+1=(s=Y(m,l))?n=s:o=(s=Y("23:59:59",l))?n=s:o0&&o1)&&(G=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(G){let e=g.length-1;var re=new Date(g[e].timestamp),oe=new Date(g[0].timestamp);if("TempBasalDuration"==g[0]._type&&(oe=new Date),(O=(oe-re)/36e5)<23.9&&O>21)L=ae(re,(ne=24-O,ie=re.getTime(),new Date(ie-36e5*ne))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+L.toPrecision(5)+" U. ";else O<21?(G=!1,enableDynamicCR=!1):F=""}}else console.log("Pumphistory is empty!"),G=!1,enableDynamicCR=!1;var ne,ie;if(G){for(let e=0;e0){E=e,z=g[e].rate;var se=g[e-1]["duration (min)"]/60,le=se,ue=new Date(g[e-1].timestamp),de=new Date(ue),me=0;do{if(e--,0==e){de=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){de=new Date(g[e].timestamp);break}var ce=e-2;if(ce>=0&&"Rewind"==g[ce]._type){let e=g[ce].timestamp;for(;ce-1>=0&&"Prime"==g[ce-=1]._type;)me=(g[ce].timestamp-e)/36e5;me>=se&&(de=new Date(e),me=0)}}while(e>0);var ge=(de-ue)/36e5;ge0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(L+=ae(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var he=new Date(a);let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){he=new Date(g[r].timestamp);break}}while(r>0);if(0==e&&"TempBasalDuration"==g[0]._type&&(he=new Date,t=g[e]["duration (min)"]/60),(he-a)/36e5-t>0){L+=ae(he,Q(a,t))}}var pe={TDD:o(q=k+W+L,5),bolus:o(k,5),temp_basal:o(W,5),scheduled_basal:o(L,5)};O>21?(R=". Bolus insulin: "+k.toPrecision(5)+" U",I=". Temporary basal insulin: "+W.toPrecision(5)+" U",A=". Insulin with scheduled basal rate: "+L.toPrecision(5)+" U",j=F+(" TDD past 24h is: "+q.toPrecision(5)+" U")+R+I+A,P=", TDD: "+o(q,2)+" U, "+o(k/q*100,0)+"% Bolus "+o((W+L)/q*100,0)+"% Basal"):P=", TDD: Not enough pumpData (< 21h)"}var ve;const Be=e.glucose,fe=h.enableDynamicCR,be=h.adjustmentFactor,Me=f;var _e=!1,ye="",xe=1,Se="";K>0&&(xe=N/K),Se=xe>1?"Basal adjustment with a 24 hour to total average (up to 14 days of data) TDD ratio (limited by Autosens max setting). Basal Ratio: "+(xe=o(xe=Math.min(xe,i.autosens_max),2))+". Upper limit = Autosens max ("+i.autosens_max+")":xe<1?"Basal adjustment with a 24 hour to to total average (up to 14 days of data) TDD ratio (limited by Autosens min setting). Basal Ratio: "+(xe=o(xe=Math.max(xe,i.autosens_min),2))+". Lower limit = Autosens min ("+i.autosens_min+")":"Basal adjusted with a 24 hour to total average (up to 14 days of data) TDD ratio: "+xe,Se=", Basal ratio: "+xe,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(_e=!0),Me>=118&&_e&&(G=!1,ye="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+Be+" mg/dl ("+(.0555*Be).toPrecision(2)+" mmol/l)",Te="",Ce="";const Ue=h.curve,Oe=i.insulinPeakTime,Ae=h.useCustomPeakTime;var Re=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Ae?(Re=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Re)):(Re=120-Ie,console.log("insulinFactor set to : "+Re)),ve=q,J<1&&N>0&&(q=N,console.log("Using weighted TDD average: "+o(q,2)+" U, instead of past 24 h ("+o(ve,2)+" U), weight: "+J),Ce=", Weighted TDD: "+o(q,2)+" U");const Fe=h.sigmoid;var je="";if(G){var Pe=Z*be*q*Math.log(Be/Re+1)/1800;Te=", Logarithmic formula"}if(G&&Fe){const e=ee,t=te-e,a=.0555*(Be-f);var Ee=xe,qe=te-1;1==te&&(qe=te+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),o=a*be*Ee+r;Pe=t/(1+Math.exp(-o))+e,Te=", Sigmoid function"}var We=$;const ke=o($,1);var Le="",ze="";if(G&&q>0){if(Le=", Dynamic ISF/CR: On/",Pe>te?(ye=", Dynamic ISF limited by autosens_max setting: "+te+" ("+o(Pe,2)+"), ",ze=", Autosens/Dynamic Limit: "+te+" ("+o(Pe,2)+")",Pe=te):Pe-.5?"+"+o(e.delta,0):o(e.delta,0);var et=Math.min(e.delta,e.short_avgdelta),tt=Math.min(e.short_avgdelta,e.long_avgdelta),at=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);(Xe<=10||38===Xe||Ye>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high");if(Xe>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Xe&&("fakecgm"==e.device?(console.error("CGM data is unchanged ("+n(Xe,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")):400!=Xe&&!0),Ve>12||Ve<-5?He.reason="If current system time "+U+" is correct, then BG data is too old. The last BG data was read "+Ve+"m ago at "+Qe:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Xe&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+n(Xe,i)+"+"+n(e.delta,i)+") for 5m w/ "+n(e.short_avgdelta,i)+" mg/dL ~15m change & "+n(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Xe&&(Xe<=10||38===Xe||Ye>=3||Ve>12||Ve<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var rt,ot,nt,it,st=i.max_iob;if(void 0!==f&&(ot=f),void 0!==i.max_bg&&(nt=f),void 0!==i.enableSMB_high_bg_target&&(it=i.enableSMB_high_bg_target),void 0===f)return He.error="Error: could not determine target_bg. ",He;rt=f;var lt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ut=100,dt=160;if(dt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+n(e,i)+" "+i.out_units),dt=e}else console.log("Default Half Basal Target used: "+n(dt,i)+" "+i.out_units);if(lt&&i.temptargetSet&&rt>ut||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&rt=rt&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+o(xe,2)+", TDD 24h = "+o(ve,2)+"U, Weighted average TDD = "+o(N,2)+"U, (Weight percentage = "+J+"), Total data of TDDs (up to 14 days) average = "+o(K,2)+"U. "),Je!==$e*H?process.stderr.write("Adjusting basal from "+$e*H+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){ot=o((ot-60)/s.ratio)+60,nt=o((nt-60)/s.ratio)+60;var ct=o((rt-60)/s.ratio)+60;rt===(ct=Math.max(80,ct))?process.stderr.write("target_bg unchanged: "+n(ct,i)+"; "):process.stderr.write("target_bg from "+n(ct,i)+" to "+n(ct,i)+"; "),rt=ct}var gt=n(rt,i);rt!=f&&(gt=0!==b&&6!==b&&b!==rt?n(f,i)+"→"+n(b,i)+"→"+n(rt,i):n(f,i)+"→"+n(rt,i));var ht=200,pt=200,vt=200;if(e.noise>=2){var Bt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw);ht=o(Math.min(200,ot*Bt)),pt=o(Math.min(200,rt*Bt)),vt=o(Math.min(200,nt*Bt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+n(ct,i)+" to "+n(pt,i)+"; "),ot=ht,rt=pt,nt=vt}C=ot-.5*(ot-40),C=Math.min(Math.max(i.threshold_setting,C,60),120),console.error("Threshold set to ${convert_bg(threshold, profile)}");var ft="",bt=(o(Z,1),Z);if(void 0!==s&&s&&((bt=o(bt=Z/sensitivityRatio,1))!==Z?process.stderr.write("ISF from "+n(Z,i)+" to "+n(bt,i)):process.stderr.write("ISF unchanged: "+n(bt,i)),ft+="Autosens ratio: "+o(sensitivityRatio,2)+", ISF: "+n(Z,i)+"→"+n(bt,i)),console.error("CR:"+$),void 0===a)return He.error="Error: iob_data undefined. ",He;var Mt,_t=a;if(a.length,a.length>1&&(a=_t[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var yt=((Mt=void 0!==a.lastTemp?o((new Date(U).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+Mt+"m, tempModulus:"+yt+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&Mt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var xt=Mt-a.lastTemp.duration;if(xt>5&&Mt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+xt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var St=o(-a.activity*bt*5,2),Dt=o(6*(et-St));Dt<0&&(Dt=o(6*(tt-St)))<0&&(Dt=o(6*(e.long_avgdelta-St)));var wt=Xe,Gt=(wt=a.iob>0?o(Xe-a.iob*bt):o(Xe-a.iob*Math.min(bt,Z)))+Dt;if(void 0===Gt||isNaN(Gt))return He.error="Error: could not calculate eventualBG. Sensitivity: "+bt+" Deviation: "+Dt,He;var Tt,Ct,Ut=function(e,t,a){return o(a+(e-t)/24,1)}(rt,Gt,St);He={temp:"absolute",bg:Xe,tick:Ke,eventualBG:Gt,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:o($,1),TDD:ve,insulin:pe,current_target:rt,insulinForManualBolus:T,manualBolusErrorString:0,minDelta:et,expectedDelta:Ut,minGuardBG:Ct,minPredBG:Tt,threshold:n(C,i)};var Ot=[],At=[],Rt=[],It=[];Ot.push(Xe),At.push(Xe),It.push(Xe),Rt.push(Xe);let Ft=!1;M?(console.error("SMBs are always off."),Ft=!1):Ft=function(e,t,a,r,o,i,s,l){if(s.smbIsScheduledOff){let e=new Date(l.getHours()),t=s.start,a=s.end;if(t=t&&ea&&(e>=t||e100?(console.error("SMB disabled due to high temptarget of "+o),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&o<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+n(o,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Xe,rt,it,v,U);var jt=i.enableUAM,Pt=0,Et=0;Pt=o(et-St,1);var qt=o(et-St,1);csf=bt/$,console.error("profile.sens:"+n(Z,i)+", sens:"+n(bt,i)+", CSF:"+o(csf,1));var Wt=o(30*csf*5/60,1);Pt>Wt&&(console.error("Limiting carb impact from "+Pt+" to "+Wt+"mg/dL/5m (30g/h)"),Pt=Wt);var kt=3;sensitivityRatio&&(kt/=sensitivityRatio);var Lt=kt;if(l.carbs){kt=Math.max(kt,l.mealCOB/20);var zt=o((new Date(U).getTime()-l.lastCarbTime)/6e4),Nt=(l.carbs-l.mealCOB)/l.carbs;Lt=o(Lt=kt+1.5*zt/60,1),console.error("Last carbs "+zt+" minutes ago; remainingCATime:"+Lt+"hours; "+o(100*Nt,1)+"% carbs absorbed")}var Ht=Math.max(0,Pt/5*60*Lt/2)/csf,Zt=90,$t=1;i.remainingCarbsCap&&(Zt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&($t=Math.min(1,i.remainingCarbsFraction));var Jt=1-$t,Kt=Math.max(0,l.mealCOB-Ht-l.carbs*Jt),Qt=(Kt=Math.min(Zt,Kt))*csf*5/60/(Lt/2),Vt=o(l.slopeFromMaxDeviation,2),Xt=o(l.slopeFromMinDeviation,2),Yt=Math.min(Vt,-Xt/3);Et=0===Pt?0:Math.min(60*Lt/5/2,Math.max(0,l.mealCOB*csf/Pt)),console.error("Carb Impact:"+Pt+"mg/dL per 5m; CI Duration:"+o(5*Et/60*2,1)+"hours; remaining CI ("+Lt/2+"h peak):"+o(Qt,1)+"mg/dL per 5m");var ea,ta,aa,ra,oa=999,na=999,ia=999,sa=999,la=999,ua=999,da=999,ma=Gt,ca=Xe,ga=Xe,ha=0,pa=[],va=[];try{_t.forEach((function(e){var t=o(-e.activity*bt*5,2),a=o(-e.iobWithZeroTemp.activity*bt*5,2),r=wt,n=Pt*(1-Math.min(1,At.length/12));if(!0===(G&&!Fe))ma=At[At.length-1]+o(-e.activity*(1800/(q*be*Math.log(Math.max(At[At.length-1],39)/Re+1)))*5,2)+n,r=It[It.length-1]+o(-e.iobWithZeroTemp.activity*(1800/(q*be*Math.log(Math.max(It[It.length-1],39)/Re+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+o(ma,2)+" , ZTpredBG: "+o(r,2));else ma=At[At.length-1]+t+n,r=It[It.length-1]+a;var i=Math.max(0,Math.max(0,Pt)*(1-Ot.length/Math.max(2*Et,1))),s=Math.min(Ot.length,12*Lt-Ot.length),l=Math.max(0,s/(Lt/2*12)*Qt);i+l,pa.push(o(l,0)),va.push(o(i,0)),COBpredBG=Ot[Ot.length-1]+t+Math.min(0,n)+i+l;var u=Math.max(0,qt+Rt.length*Yt),d=Math.max(0,qt*(1-Rt.length/Math.max(36,1))),m=Math.min(u,d);if(m>0&&(ha=o(5*(Rt.length+1)/60,1)),!0===(G&&!Fe))UAMpredBG=Rt[Rt.length-1]+o(-e.activity*(1800/(q*be*Math.log(Math.max(Rt[Rt.length-1],39)/Re+1)))*5,2)+Math.min(0,n)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+o(UAMpredBG,2));else UAMpredBG=Rt[Rt.length-1]+t+Math.min(0,n)+m;At.length<48&&At.push(ma),Ot.length<48&&Ot.push(COBpredBG),Rt.length<48&&Rt.push(UAMpredBG),It.length<48&&It.push(r),COBpredBG18&&maca&&(ca=ma),(Et||Qt>0)&&Ot.length>18&&COBpredBG0)&&COBpredBG>ca&&(ga=COBpredBG),jt&&Rt.length>12&&UAMpredBGca&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+va.join(" ")),console.error("remainingCIs: "+pa.join(" "))),He.predBGs={},At.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))}));for(var Ba=At.length-1;Ba>12&&At[Ba-1]===At[Ba];Ba--)At.pop();for(He.predBGs.IOB=At,ta=o(At[At.length-1]),It.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ba=It.length-1;Ba>6&&!(It[Ba-1]>=It[Ba]||It[Ba]<=rt);Ba--)It.pop();if(He.predBGs.ZT=It,o(It[It.length-1]),l.mealCOB>0&&(Pt>0||Qt>0)){for(Ot.forEach((function(e,t,a){a[t]=o(Math.min(1500,Math.max(39,e)))})),Ba=Ot.length-1;Ba>12&&Ot[Ba-1]===Ot[Ba];Ba--)Ot.pop();He.predBGs.COB=Ot,aa=o(Ot[Ot.length-1]),Gt=Math.max(Gt,o(Ot[Ot.length-1])),console.error("COBpredBG: "+o(Ot[Ot.length-1]))}if(Pt>0||Qt>0){if(jt){for(Rt.forEach((function(e,t,a){a[t]=o(Math.min(401,Math.max(39,e)))})),Ba=Rt.length-1;Ba>12&&Rt[Ba-1]===Rt[Ba];Ba--)Rt.pop();He.predBGs.UAM=Rt,ra=o(Rt[Rt.length-1]),Rt[Rt.length-1]&&(Gt=Math.max(Gt,o(Rt[Rt.length-1])))}He.eventualBG=Gt}console.error("UAM Impact:"+qt+"mg/dL per 5m; UAM Duration:"+ha+"hours"),oa=Math.max(39,oa),na=Math.max(39,na),ia=Math.max(39,ia),Tt=o(oa);var fa=l.mealCOB/l.carbs;ea=o(ia<999&&na<999?(1-fa)*UAMpredBG+fa*COBpredBG:na<999?(ma+COBpredBG)/2:ia<999?(ma+UAMpredBG)/2:ma),da>ea&&(ea=da),Ct=o(Ct=Et||Qt>0?jt?fa*sa+(1-fa)*la:sa:jt?la:ua);var ba=ia;if(daia&&(ba=(ia+da)/2);if(ba=o(ba),l.carbs)if(!jt&&na<999)Tt=o(Math.max(oa,na));else if(na<999){var _a=fa*na+(1-fa)*ba;Tt=o(Math.max(oa,na,_a))}else Tt=jt?ba:Ct;else jt&&(Tt=o(Math.max(oa,ba)));Tt=Math.min(Tt,ea),process.stderr.write("minPredBG: "+Tt+" minIOBPredBG: "+oa+" minZTGuardBG: "+da),na<999&&process.stderr.write(" minCOBPredBG: "+na),ia<999&&process.stderr.write(" minUAMPredBG: "+ia),console.error(" avgPredBG:"+ea+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),ga>Xe&&(Tt=Math.min(Tt,ga)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=n(St,i),He.deviation=n(Dt,i),He.ISF=n(bt,i),He.CR=o($,1),He.target_bg=n(rt,i),He.TDD=o(ve,2),He.current_target=o(rt,0);var ya=He.CR;ke!=He.CR&&(ya=ke+"→"+He.CR),He.reason=ft+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+ya+", Target: "+gt+", minPredBG "+n(Tt,i)+", minGuardBG "+n(Ct,i)+", IOBpredBG "+n(ta,i),aa>0&&(He.reason+=", COBpredBG "+n(aa,i)),ra>0&&(He.reason+=", UAMpredBG "+n(ra,i)),He.reason+=P,He.reason+="; ";var xa=wt;xa<40&&(xa=Math.min(Ct,xa));var Sa,Da=C-xa,wa=240,Ga=240;if(l.mealCOB>0&&(Pt>0||Qt>0)){for(Ba=0;BaSa*Xe&&(console.error("maxDelta "+n(at,i)+" > "+100*Sa+"% of BG "+n(Xe,i)+" - disabling SMB"),He.reason+="maxDelta "+n(at,i)+" > "+100*Sa+"% of BG "+n(Xe,i)+" - SMB disabled!, ",Ft=!1),console.error("BG projected to remain above "+n(ot,i)+" for "+wa+"minutes"),(Ga<240||wa<60)&&console.error("BG projected to remain above "+n(C,i)+" for "+Ga+"minutes");var Ta=Ga,Ca=i.current_basal*H*bt*Ta/60,Ua=Math.max(0,l.mealCOB-.25*l.carbs),Oa=(Da-Ca)/csf-Ua;Ca=o(Ca),Oa=o(Oa),console.error("naive_eventualBG:",wt,"bgUndershoot:",Da,"zeroTempDuration:",Ta,"zeroTempEffect:",Ca,"carbsReq:",Oa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Oa>=i.carbsReqThreshold&&Ga<=45&&(He.carbsReq=Oa,He.reason+=Oa+" add'l carbs req w/in "+Ga+"m; ");var Aa=0;if(Xe0&&et>Ut)He.reason+="IOB "+a.iob+" < "+o(-i.current_basal*H*20/60,2),He.reason+=" and minDelta "+n(et,i)+" > expectedDelta "+n(Ut,i)+"; ";else if(Xe=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Ra=0,Ia=Je,Fa=0;if(GtUt&&et>0&&!Oa)return wt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>et?He.reason+=", but Delta "+n(Ke,i)+" > expectedDelta "+n(Ut,i):He.reason+=", but Min. Delta "+et.toFixed(2)+" > Exp. Delta "+n(Ut,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Ra=o(Ra=2*Math.min(0,(Gt-rt)/bt),2);var ja=Math.min(0,(wt-rt)/bt);if(ja=o(ja,2),et<0&&et>Ut)Ra=o(Ra*(et/Ut),2);Ia=r(Ia=Je+2*Ra,i),Fa=t.duration*(t.rate-Je)/60;var Pa=Math.min(Ra,ja);if(console.log("naiveInsulinReq:"+ja),Fa5&&Ia>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+Ia+"U/hr. ",He;if(Ia<=0){if((Aa=o(60*((Da=rt-wt)/bt)/i.current_basal*H))<0?Aa=0:(Aa=30*o(Aa/30),Aa=Math.min(120,Math.max(0,Aa))),Aa>0)return He.reason+=", setting "+Aa+"m zero temp. ",u.setTempBasal(Ia,Aa,i,He,t)}else He.reason+=", setting "+Ia+"U/hr. ";return u.setTempBasal(Ia,30,i,He,t)}if(et=2||Ut+-1*et>=2)&&(He.manualBolusErrorString=et>=0&&Ut>0?3:et<0&&Ut<=0||et<0&&Ut>=0?4:5),He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/bt,2),!d||!Ft))return e.delta "+n(ot,i)+" but Delta "+n(Ke,i)+" < Exp. Delta "+n(Ut,i):He.reason+="Eventual BG "+n(Gt,i)+" > "+n(ot,i)+" but Min. Delta "+et.toFixed(2)+" < Exp. Delta "+n(Ut,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Gt,Tt)ot&&(He.manualBolusErrorString=6,He.insulinForManualBolus=o((He.eventualBG-He.target_bg)/bt,2),He.minPredBG=Tt),!d||!Ft))return He.reason+=n(Gt,i)+"-"+n(Tt,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Gt>=nt&&(He.reason+="Eventual BG "+n(Gt,i)+" >= "+n(nt,i)+", ",Gt>nt&&(He.insulinForManualBolus=o((Gt-rt)/bt,2))),a.iob>st)return He.reason+="IOB "+o(a.iob,2)+" > max_iob "+st,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Ra=o((Math.min(Tt,Gt)-rt)/bt,2),T=o((Gt-rt)/bt,2),Ra>st-a.iob?(console.error("SMB limited by maxIOB: "+st-a.iob+" (. insulinReq: "+Ra+" U)"),He.reason+="max_iob "+st+", ",Ra=st-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Ra+" U)."),T>st-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+st-a.iob+" (. insulinForManualBolus: "+T+" U)"),He.reason+="max_iob "+st+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+T+" U)."),Ia=r(Ia=Je+2*Ra,i),Ra=o(Ra,3),He.insulinReq=Ra;var Ea=o((new Date(U).getTime()-a.lastBolusTime)/6e4,1);if(d&&Ft&&Xe>C){var qa=30;void 0!==i.maxSMBBasalMinutes&&(qa=i.maxSMBBasalMinutes);var Wa=30;void 0!==i.maxUAMSMBBasalMinutes&&(Wa=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&D!==qa&&(console.error("SMB Max Minutes - setting overriden from "+qa+" to "+D),qa=D),v.useOverride&&_&&w!==Wa&&(console.error("UAM Max Minutes - setting overriden from "+Wa+" to "+w),Wa=w);var ka=o(l.mealCOB/$,3),La=0;void 0===qa?(La=o(i.current_basal*H*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Ra>La&&console.error("SMB limited by maxBolus: "+La+" ( "+Ra+" U)")):a.iob>ka&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+ka),Wa?(console.error("maxUAMSMBBasalMinutes: "+Wa+", profile.current_basal: "+i.current_basal*H),La=o(i.current_basal*H*Wa/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),La=o(i.current_basal*H*30/60,1)),Ra>La?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Wa+"m ]: "+La+"U ( "+Ra+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Ra+"U )")):(console.error(".maxSMBBasalMinutes: "+qa+", profile.current_basal: "+i.current_basal*H),Ra>(La=o(i.current_basal*H*qa/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+qa+"m ]: "+La+"U ( insulinReq: "+Ra+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Ra+"U )"));var za=i.bolus_increment,Na=1/za,Ha=Math.min(i.smb_delivery_ratio,1);.5!=Ha&&console.error("SMB Delivery Ratio changed from default 0.5 to "+o(Ha,2));var Za=Math.min(Ra*Ha,La);Za=Math.floor(Za*Na)/Na,Aa=o(60*((rt-(wt+oa)/2)/bt)/i.current_basal*H),Ra>0&&Za=30?(Aa=30*o(Aa/30),Aa=Math.min(60,Math.max(0,Aa))):($a=o(Je*Aa/30,2),Aa=30),He.reason+=" insulinReq "+Ra,Za>=La&&(He.reason+="; maxBolus "+La),Aa>0&&(He.reason+="; setting "+Aa+"m low temp of "+$a+"U/h"),He.reason+=". ";var Ja=3;i.SMBInterval&&(Ja=Math.min(10,Math.max(1,i.SMBInterval)));var Ka=o(Ja-Ea,0),Qa=o(60*(Ja-Ea),0)%60;if(console.error("naive_eventualBG "+wt+","+Aa+"m "+$a+"U/h temp needed; last bolus "+Ea+"m ago; maxBolus: "+La),Ea>Ja?Za>0&&(He.units=Za,He.reason+="Microbolusing "+Za+"U. "):He.reason+="Waiting "+Ka+"m "+Qa+"s to microbolus again. ",Aa>0)return He.rate=$a,He.duration=Aa,He}var Va=u.getMaxSafeBasal(i);return 400==Xe?u.setTempBasal(i.current_basal,30,i,He,t):(Ia>Va&&(He.reason+="adj. req. rate: "+Ia+" to maxSafeBasal: "+o(Va,2)+", ",Ia=r(Va,i)),(Fa=t.duration*(t.rate-Je)/60)>=2*Ra?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)):t.duration>5&&r(Ia,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+Ia+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)))}},3531:(e,t,a)=>{var r=a(2296);e.exports=function(e,t){var a=20;void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40);return e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},1873:(e,t,a)=>{var r=a(9325).Symbol;e.exports=r},4932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,o=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},2552:(e,t,a)=>{var r=a(1873),o=a(659),n=a(9350),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):n(e)}},7556:(e,t,a)=>{var r=a(1873),o=a(4932),n=a(6449),i=a(4394),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(n(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-1/0?"-0":a}},4128:(e,t,a)=>{var r=a(1800),o=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,""):e}},4840:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},659:(e,t,a)=>{var r=a(1873),o=Object.prototype,n=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=n.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=a:delete e[s]),o}},9350:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},9325:(e,t,a)=>{var r=a(4840),o="object"==typeof self&&self&&self.Object===Object&&self,n=r||o||Function("return this")();e.exports=n},1800:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},2296:(e,t,a)=>{var r=a(7133),o=a(7556),n=a(1489),i=a(3222);e.exports=function(e,t,a){e=i(e),t=o(t);var s=e.length,l=a=void 0===a?s:r(n(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},6449:e=>{var t=Array.isArray;e.exports=t},3805:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},346:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},4394:(e,t,a)=>{var r=a(2552),o=a(346);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},7400:(e,t,a)=>{var r=a(6993),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},1489:(e,t,a)=>{var r=a(7400);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},6993:(e,t,a)=>{var r=a(4128),o=a(3805),n=a(4394),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(n(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},3222:(e,t,a)=>{var r=a(7556);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(2982);freeaps_determineBasal=r})(); \ No newline at end of file +var freeaps_determineBasal;(()=>{var e={2982:(e,t,a)=>{var r=a(3531);function n(e,t){t||(t=0);var a=Math.pow(10,t);return Math.round(e*a)/a}function o(e,t){return"mmol/L"===t.out_units?n(.0555*e,1):Math.round(e)}e.exports=function(e,t,a,i,s,l,u,d,m,c,g,h,p,v,B){var f=i.min_bg,b=v.overrideTarget;0!=b&&6!=b&&v.useOverride&&!i.temptargetSet&&(f=b);const M=v.smbIsOff,_=v.advancedSettings,y=v.isfAndCr,x=v.isf,S=v.cr;v.smbIsScheduledOff,v.start,v.end;const D=v.smbMinutes,w=v.uamMinutes;var G=h.useNewFormula,C=0,T=f,U=new Date;c&&(U=new Date(c));var O=0,R="",A="",I="",F="",P="",j="",E=0,q=0,W=0,k=0,L=0,z=0;const N=v.weightedAverage;var H=1,Z=i.sens,$=i.carb_ratio;v.useOverride&&(H=v.overridePercentage/100,y?(Z/=H,$/=H):(S&&($/=H),x&&(Z/=H)));const J=i.weightPercentage,K=v.average_total_data;function Q(e,t){var a=e.getTime();return new Date(a+36e5*t)}function V(e){var t=i.bolus_increment;.1!=t&&(t=.05);var a=e/t;return a>=1?n(Math.floor(a)*t,5):0}function X(e){function t(e){return e<10&&(e="0"+e),e}return t(e.getHours())+":"+t(e.getMinutes())+":00"}function Y(e,t){var a=new Date("1/1/1999 "+e),r=new Date("1/1/1999 "+t);return(a.getTime()-r.getTime())/36e5}const ee=Math.min(i.autosens_min,i.autosens_max),te=Math.max(i.autosens_min,i.autosens_max);function ae(e,t){var a=0,r=t,n=(e-t)/36e5,o=0,i=n,s=0;do{if(n>0){var l=X(r),u=p[0].rate;for(let e=0;e=(s=Y(p[e+1].start,p[e].start))?o=s:n=(s=24-Y(p[e].start,t))?o=s:nd)if(e+1=(s=Y(m,l))?o=s:n=(s=Y("23:59:59",l))?o=s:n0&&n1)&&(G=!1,console.log("Dynamic ISF disabled due to current autosens settings")),g.length){if(G){let e=g.length-1;var re=new Date(g[e].timestamp),ne=new Date(g[0].timestamp);"TempBasalDuration"==g[0]._type&&(ne=new Date),(O=(ne-re)/36e5)<23.9&&O>21?(L=ae(re,(oe=24-O,ie=re.getTime(),new Date(ie-36e5*oe))),F="24 hours of data is required for an accurate tdd calculation. Currently only "+O.toPrecision(3)+" hours of pump history data are available. Using your pump scheduled basals to fill in the missing hours. Scheduled basals added: "+L.toPrecision(5)+" U. "):O<21?(G=!1,enableDynamicCR=!1):F=""}}else console.log("Pumphistory is empty!"),G=!1,enableDynamicCR=!1;var oe,ie,se;if(G){for(let e=0;e0){E=e,z=g[e].rate;var le=g[e-1]["duration (min)"]/60,ue=le,de=new Date(g[e-1].timestamp),me=new Date(de),ce=0;do{if(e--,0==e){me=new Date;break}if("TempBasal"==g[e]._type||"PumpSuspend"==g[e]._type){me=new Date(g[e].timestamp);break}var ge=e-2;if(ge>=0&&"Rewind"==g[ge]._type){let e=g[ge].timestamp;for(;ge-1>=0&&"Prime"==g[ge-=1]._type;)ce=(g[ge].timestamp-e)/36e5;ce>=le&&(me=new Date(e),ce=0)}}while(e>0);var he=(me-de)/36e5;he0&&(--r,"TempBasal"==g[r]._type)){a=new Date(g[r].timestamp);break}}while(r>0);(a-t)/36e5>0&&(L+=ae(a,t))}for(let e=g.length-1;e>0;e--)if("TempBasalDuration"==g[e]._type){let t=g[e]["duration (min)"]/60,a=new Date(g[e].timestamp);var pe=new Date(a);let r=e;do{if(--r,r>=0&&("TempBasal"==g[r]._type||"PumpSuspend"==g[r]._type)){pe=new Date(g[r].timestamp);break}}while(r>0);0==e&&"TempBasalDuration"==g[0]._type&&(pe=new Date,t=g[e]["duration (min)"]/60),(pe-a)/36e5-t>0&&(L+=ae(pe,Q(a,t)))}var ve={TDD:n(q=k+W+L,5),bolus:n(k,5),temp_basal:n(W,5),scheduled_basal:n(L,5)};O>21?(A=". Bolus insulin: "+k.toPrecision(5)+" U",I=". Temporary basal insulin: "+W.toPrecision(5)+" U",R=". Insulin with scheduled basal rate: "+L.toPrecision(5)+" U",P=F+" TDD past 24h is: "+q.toPrecision(5)+" U"+A+I+R,j=", TDD: "+n(q,2)+" U, "+n(k/q*100,0)+"% Bolus "+n((W+L)/q*100,0)+"% Basal"):j=", TDD: Not enough pumpData (< 21h)"}const Be=e.glucose,fe=h.enableDynamicCR,be=h.adjustmentFactor,Me=f;var _e,ye=!1,xe="",Se=1;K>0&&(Se=N/K),Se>1?(Se=n(Se=Math.min(Se,i.autosens_max),2),i.autosens_max):Se<1&&(Se=n(Se=Math.max(Se,i.autosens_min),2),i.autosens_min),_e=", Basal ratio: "+Se,(i.high_temptarget_raises_sensitivity||i.exercise_mode||v.isEnabled)&&(ye=!0),Me>=118&&ye&&(G=!1,xe="Dynamic ISF temporarily off due to a high temp target/exercising. Current min target: "+Me);var De=", Dynamic ratios log: ",we=", AF: "+be,Ge="BG: "+Be+" mg/dl ("+(.0555*Be).toPrecision(2)+" mmol/l)",Ce="",Te="";const Ue=h.curve,Oe=i.insulinPeakTime,Re=h.useCustomPeakTime;var Ae=55,Ie=65;switch(Ue){case"rapid-acting":Ie=65;break;case"ultra-rapid":Ie=50}Re?(Ae=120-Oe,console.log("Custom insulinpeakTime set to :"+Oe+", insulinFactor: "+Ae)):(Ae=120-Ie,console.log("insulinFactor set to : "+Ae)),se=q,J<1&&N>0&&(q=N,console.log("Using weighted TDD average: "+n(q,2)+" U, instead of past 24 h ("+n(se,2)+" U), weight: "+J),Te=", Weighted TDD: "+n(q,2)+" U");const Fe=h.sigmoid;var Pe="";if(G){var je=Z*be*q*Math.log(Be/Ae+1)/1800;Ce=", Logarithmic formula"}if(G&&Fe){const e=ee,t=te-e,a=.0555*(Be-f);var Ee=Se,qe=te-1;1==te&&(qe=te+.01-1);const r=Math.log10(1/qe-e/qe)/Math.log10(Math.E),n=a*be*Ee+r;je=t/(1+Math.exp(-n))+e,Ce=", Sigmoid function"}var We=$;const ke=n($,1);var Le="",ze="";if(G&&q>0){if(Le=", Dynamic ISF/CR: On/",je>te?(xe=", Dynamic ISF limited by autosens_max setting: "+te+" ("+n(je,2)+"), ",ze=", Autosens/Dynamic Limit: "+te+" ("+n(je,2)+")",je=te):je-.5?"+"+n(e.delta,0):n(e.delta,0);var et=Math.min(e.delta,e.short_avgdelta),tt=Math.min(e.short_avgdelta,e.long_avgdelta),at=Math.max(e.delta,e.short_avgdelta,e.long_avgdelta);if((Xe<=10||38===Xe||Ye>=3)&&(He.reason="CGM is calibrating, in ??? state, or noise is high"),Xe>60&&0==e.delta&&e.short_avgdelta>-1&&e.short_avgdelta<1&&e.long_avgdelta>-1&&e.long_avgdelta<1&&400!=Xe&&"fakecgm"==e.device&&(console.error("CGM data is unchanged ("+o(Xe,i)+"+"+o(e.delta,i)+") for 5m w/ "+o(e.short_avgdelta,i)+" mg/dL ~15m change & "+o(e.long_avgdelta,2)+" mg/dL ~45m change"),console.error("Simulator mode detected ("+e.device+"): continuing anyway")),Ve>12||Ve<-5?He.reason="If current system time "+U+" is correct, then BG data is too old. The last BG data was read "+Ve+"m ago at "+Qe:0===e.short_avgdelta&&0===e.long_avgdelta&&400!=Xe&&(e.last_cal&&e.last_cal<3?He.reason="CGM was just calibrated":He.reason="CGM data is unchanged ("+o(Xe,i)+"+"+o(e.delta,i)+") for 5m w/ "+o(e.short_avgdelta,i)+" mg/dL ~15m change & "+o(e.long_avgdelta,i)+" mg/dL ~45m change"),400!=Xe&&(Xe<=10||38===Xe||Ye>=3||Ve>12||Ve<-5||0===e.short_avgdelta&&0===e.long_avgdelta))return t.rate>=Je?(He.reason+=". Canceling high temp basal of "+t.rate,He.deliverAt=Ze,He.temp="absolute",He.duration=0,He.rate=0,He):0===t.rate&&t.duration>30?(He.reason+=". Shortening "+t.duration+"m long zero temp to 30m. ",He.deliverAt=Ze,He.temp="absolute",He.duration=30,He.rate=0,He):(He.reason+=". Temp "+t.rate+" <= current basal "+Je+"U/hr; doing nothing. ",He);var rt,nt,ot,it,st=i.max_iob;if(void 0!==f&&(nt=f),void 0!==i.max_bg&&(ot=f),void 0!==i.enableSMB_high_bg_target&&(it=i.enableSMB_high_bg_target),void 0===f)return He.error="Error: could not determine target_bg. ",He;rt=f;var lt=i.exercise_mode||i.high_temptarget_raises_sensitivity||v.isEnabled,ut=100,dt=160;if(dt=i.half_basal_exercise_target,v.isEnabled){const e=v.hbt;console.log("Half Basal Target used: "+o(e,i)+" "+i.out_units),dt=e}else console.log("Default Half Basal Target used: "+o(dt,i)+" "+i.out_units);if(lt&&i.temptargetSet&&rt>ut||i.low_temptarget_lowers_sensitivity&&i.temptargetSet&&rt=rt&&sensitivityRatio0&&(process.stderr.write("TDD-adjustment of basals activated, using tdd24h_14d_Ratio "+n(Se,2)+", TDD 24h = "+n(se,2)+"U, Weighted average TDD = "+n(N,2)+"U, (Weight percentage = "+J+"), Total data of TDDs (up to 14 days) average = "+n(K,2)+"U. "),Je!==$e*H?process.stderr.write("Adjusting basal from "+$e*H+" U/h to "+Je+" U/h; "):process.stderr.write("Basal unchanged: "+Je+" U/h; "))),i.temptargetSet);else if(void 0!==s&&s&&(i.sensitivity_raises_target&&s.ratio<1||i.resistance_lowers_target&&s.ratio>1)){nt=n((nt-60)/s.ratio)+60,ot=n((ot-60)/s.ratio)+60;var ct=n((rt-60)/s.ratio)+60;rt===(ct=Math.max(80,ct))?process.stderr.write("target_bg unchanged: "+o(ct,i)+"; "):process.stderr.write("target_bg from "+o(ct,i)+" to "+o(ct,i)+"; "),rt=ct}var gt=o(rt,i);rt!=f&&(gt=0!==b&&6!==b&&b!==rt?o(f,i)+"→"+o(b,i)+"→"+o(rt,i):o(f,i)+"→"+o(rt,i));var ht=200,pt=200,vt=200;if(e.noise>=2){var Bt=Math.max(1.1,i.noisyCGMTargetMultiplier);Math.min(250,i.maxRaw),ht=n(Math.min(200,nt*Bt)),pt=n(Math.min(200,rt*Bt)),vt=n(Math.min(200,ot*Bt)),process.stderr.write("Raising target_bg for noisy / raw CGM data, from "+o(ct,i)+" to "+o(pt,i)+"; "),nt=ht,rt=pt,ot=vt}T=nt-.5*(nt-40),T=Math.min(Math.max(i.threshold_setting,T,60),120),console.error(`Threshold set to ${o(T,i)}`);var ft="",bt=(n(Z,1),Z);if(void 0!==s&&s&&((bt=n(bt=Z/sensitivityRatio,1))!==Z?process.stderr.write("ISF from "+o(Z,i)+" to "+o(bt,i)):process.stderr.write("ISF unchanged: "+o(bt,i)),ft+="Autosens ratio: "+n(sensitivityRatio,2)+", ISF: "+o(Z,i)+"→"+o(bt,i)),console.error("CR:"+$),void 0===a)return He.error="Error: iob_data undefined. ",He;var Mt,_t=a;if(a.length,a.length>1&&(a=_t[0]),void 0===a.activity||void 0===a.iob)return He.error="Error: iob_data missing some property. ",He;var yt=((Mt=void 0!==a.lastTemp?n((new Date(U).getTime()-a.lastTemp.date)/6e4):0)+t.duration)%30;if(console.error("currenttemp:"+t.rate+" lastTempAge:"+Mt+"m, tempModulus:"+yt+"m"),He.temp="absolute",He.deliverAt=Ze,d&&t&&a.lastTemp&&t.rate!==a.lastTemp.rate&&Mt>10&&t.duration)return He.reason="Warning: currenttemp rate "+t.rate+" != lastTemp rate "+a.lastTemp.rate+" from pumphistory; canceling temp",u.setTempBasal(0,0,i,He,t);if(t&&a.lastTemp&&t.duration>0){var xt=Mt-a.lastTemp.duration;if(xt>5&&Mt>10)return He.reason="Warning: currenttemp running but lastTemp from pumphistory ended "+xt+"m ago; canceling temp",u.setTempBasal(0,0,i,He,t)}var St=n(-a.activity*bt*5,2),Dt=n(6*(et-St));Dt<0&&(Dt=n(6*(tt-St)))<0&&(Dt=n(6*(e.long_avgdelta-St)));var wt,Gt=(wt=a.iob>0?n(Xe-a.iob*bt):n(Xe-a.iob*Math.min(bt,Z)))+Dt;if(void 0===Gt||isNaN(Gt))return He.error="Error: could not calculate eventualBG. Sensitivity: "+bt+" Deviation: "+Dt,He;var Ct,Tt,Ut=function(e,t,a){return n(a+(e-t)/24,1)}(rt,Gt,St);He={temp:"absolute",bg:Xe,tick:Ke,eventualBG:Gt,insulinReq:0,reservoir:m,deliverAt:Ze,sensitivityRatio,CR:n($,1),TDD:se,insulin:ve,current_target:rt,insulinForManualBolus:C,manualBolusErrorString:0,minDelta:et,expectedDelta:Ut,minGuardBG:Tt,minPredBG:Ct,threshold:o(T,i)};var Ot=[],Rt=[],At=[],It=[];Ot.push(Xe),Rt.push(Xe),It.push(Xe),At.push(Xe);let Ft=!1;M?(console.error("SMBs are always off."),Ft=!1):Ft=function(e,t,a,r,n,i,s,l){if(s.smbIsScheduledOff){let e=new Date(l.getHours()),t=s.start,a=s.end;if(t=t&&ea&&(e>=t||e100?(console.error("SMB disabled due to high temptarget of "+n),!1):!0===a.bwFound&&!1===e.A52_risk_enable?(console.error("SMB disabled due to Bolus Wizard activity in the last 6 hours."),!1):400==r?(console.error("Invalid CGM (HIGH). SMBs disabled."),!1):!0===e.enableSMB_always?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled due to enableSMB_always"),!0):!0===e.enableSMB_with_COB&&a.mealCOB?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for COB of "+a.mealCOB),!0):!0===e.enableSMB_after_carbs&&a.carbs?(a.bwCarbs?console.error("Warning: SMB enabled with Bolus Wizard carbs: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for 6h after carb entry"),!0):!0===e.enableSMB_with_temptarget&&e.temptargetSet&&n<100?(a.bwFound?console.error("Warning: SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("SMB enabled for temptarget of "+o(n,e)),!0):!0===e.enableSMB_high_bg&&null!==i&&r>=i?(console.error("Checking BG to see if High for SMB enablement."),console.error("Current BG",r," | High BG ",i),a.bwFound?console.error("Warning: High BG SMB enabled within 6h of using Bolus Wizard: be sure to easy bolus 30s before using Bolus Wizard"):console.error("High BG detected. Enabling SMB."),!0):(console.error("SMB disabled (no enableSMB preferences active or no condition satisfied)"),!1):(console.error("SMB disabled (!microBolusAllowed)"),!1)}(i,d,l,Xe,rt,it,v,U);var Pt,jt=i.enableUAM,Et=0;Et=n(et-St,1);var qt=n(et-St,1);csf=bt/$,console.error("profile.sens:"+o(Z,i)+", sens:"+o(bt,i)+", CSF:"+n(csf,1));var Wt=n(30*csf*5/60,1);Et>Wt&&(console.error("Limiting carb impact from "+Et+" to "+Wt+"mg/dL/5m (30g/h)"),Et=Wt);var kt=3;sensitivityRatio&&(kt/=sensitivityRatio);var Lt=kt;if(l.carbs){kt=Math.max(kt,l.mealCOB/20);var zt=n((new Date(U).getTime()-l.lastCarbTime)/6e4),Nt=(l.carbs-l.mealCOB)/l.carbs;Lt=n(Lt=kt+1.5*zt/60,1),console.error("Last carbs "+zt+" minutes ago; remainingCATime:"+Lt+"hours; "+n(100*Nt,1)+"% carbs absorbed")}var Ht=Math.max(0,Et/5*60*Lt/2)/csf,Zt=90,$t=1;i.remainingCarbsCap&&(Zt=Math.min(90,i.remainingCarbsCap)),i.remainingCarbsFraction&&($t=Math.min(1,i.remainingCarbsFraction));var Jt=1-$t,Kt=Math.max(0,l.mealCOB-Ht-l.carbs*Jt),Qt=(Kt=Math.min(Zt,Kt))*csf*5/60/(Lt/2),Vt=n(l.slopeFromMaxDeviation,2),Xt=n(l.slopeFromMinDeviation,2),Yt=Math.min(Vt,-Xt/3);Pt=0===Et?0:Math.min(60*Lt/5/2,Math.max(0,l.mealCOB*csf/Et)),console.error("Carb Impact:"+Et+"mg/dL per 5m; CI Duration:"+n(5*Pt/60*2,1)+"hours; remaining CI ("+Lt/2+"h peak):"+n(Qt,1)+"mg/dL per 5m");var ea,ta,aa,ra,na=999,oa=999,ia=999,sa=999,la=999,ua=999,da=999,ma=Gt,ca=Xe,ga=Xe,ha=0,pa=[],va=[];try{_t.forEach((function(e){var t=n(-e.activity*bt*5,2),a=n(-e.iobWithZeroTemp.activity*bt*5,2),r=wt,o=Et*(1-Math.min(1,Rt.length/12));!0===(G&&!Fe)?(ma=Rt[Rt.length-1]+n(-e.activity*(1800/(q*be*Math.log(Math.max(Rt[Rt.length-1],39)/Ae+1)))*5,2)+o,r=It[It.length-1]+n(-e.iobWithZeroTemp.activity*(1800/(q*be*Math.log(Math.max(It[It.length-1],39)/Ae+1)))*5,2),console.log("Dynamic ISF (Logarithmic Formula) )adjusted predictions for IOB and ZT: IOBpredBG: "+n(ma,2)+" , ZTpredBG: "+n(r,2))):(ma=Rt[Rt.length-1]+t+o,r=It[It.length-1]+a);var i=Math.max(0,Math.max(0,Et)*(1-Ot.length/Math.max(2*Pt,1))),s=Math.min(Ot.length,12*Lt-Ot.length),l=Math.max(0,s/(Lt/2*12)*Qt);pa.push(n(l,0)),va.push(n(i,0)),COBpredBG=Ot[Ot.length-1]+t+Math.min(0,o)+i+l;var u=Math.max(0,qt+At.length*Yt),d=Math.max(0,qt*(1-At.length/Math.max(36,1))),m=Math.min(u,d);m>0&&(ha=n(5*(At.length+1)/60,1)),!0===(G&&!Fe)?(UAMpredBG=At[At.length-1]+n(-e.activity*(1800/(q*be*Math.log(Math.max(At[At.length-1],39)/Ae+1)))*5,2)+Math.min(0,o)+m,console.log("Dynamic ISF (Logarithmic Formula) adjusted prediction for UAM: UAMpredBG: "+n(UAMpredBG,2))):UAMpredBG=At[At.length-1]+t+Math.min(0,o)+m,Rt.length<48&&Rt.push(ma),Ot.length<48&&Ot.push(COBpredBG),At.length<48&&At.push(UAMpredBG),It.length<48&&It.push(r),COBpredBG18&&maca&&(ca=ma),(Pt||Qt>0)&&Ot.length>18&&COBpredBG0)&&COBpredBG>ca&&(ga=COBpredBG),jt&&At.length>12&&UAMpredBGca&&UAMpredBG}))}catch(e){console.error("Problem with iobArray. Optional feature Advanced Meal Assist disabled")}l.mealCOB&&(console.error("predCIs (mg/dL/5m):"+va.join(" ")),console.error("remainingCIs: "+pa.join(" "))),He.predBGs={},Rt.forEach((function(e,t,a){a[t]=n(Math.min(401,Math.max(39,e)))}));for(var Ba=Rt.length-1;Ba>12&&Rt[Ba-1]===Rt[Ba];Ba--)Rt.pop();for(He.predBGs.IOB=Rt,ta=n(Rt[Rt.length-1]),It.forEach((function(e,t,a){a[t]=n(Math.min(401,Math.max(39,e)))})),Ba=It.length-1;Ba>6&&!(It[Ba-1]>=It[Ba]||It[Ba]<=rt);Ba--)It.pop();if(He.predBGs.ZT=It,n(It[It.length-1]),l.mealCOB>0&&(Et>0||Qt>0)){for(Ot.forEach((function(e,t,a){a[t]=n(Math.min(1500,Math.max(39,e)))})),Ba=Ot.length-1;Ba>12&&Ot[Ba-1]===Ot[Ba];Ba--)Ot.pop();He.predBGs.COB=Ot,aa=n(Ot[Ot.length-1]),Gt=Math.max(Gt,n(Ot[Ot.length-1])),console.error("COBpredBG: "+n(Ot[Ot.length-1]))}if(Et>0||Qt>0){if(jt){for(At.forEach((function(e,t,a){a[t]=n(Math.min(401,Math.max(39,e)))})),Ba=At.length-1;Ba>12&&At[Ba-1]===At[Ba];Ba--)At.pop();He.predBGs.UAM=At,ra=n(At[At.length-1]),At[At.length-1]&&(Gt=Math.max(Gt,n(At[At.length-1])))}He.eventualBG=Gt}console.error("UAM Impact:"+qt+"mg/dL per 5m; UAM Duration:"+ha+"hours"),na=Math.max(39,na),oa=Math.max(39,oa),ia=Math.max(39,ia),Ct=n(na);var fa=l.mealCOB/l.carbs;ea=n(ia<999&&oa<999?(1-fa)*UAMpredBG+fa*COBpredBG:oa<999?(ma+COBpredBG)/2:ia<999?(ma+UAMpredBG)/2:ma),da>ea&&(ea=da),Tt=n(Tt=Pt||Qt>0?jt?fa*sa+(1-fa)*la:sa:jt?la:ua);var ba=ia;if(daia&&(ba=(ia+da)/2);if(ba=n(ba),l.carbs)if(!jt&&oa<999)Ct=n(Math.max(na,oa));else if(oa<999){var _a=fa*oa+(1-fa)*ba;Ct=n(Math.max(na,oa,_a))}else Ct=jt?ba:Tt;else jt&&(Ct=n(Math.max(na,ba)));Ct=Math.min(Ct,ea),process.stderr.write("minPredBG: "+Ct+" minIOBPredBG: "+na+" minZTGuardBG: "+da),oa<999&&process.stderr.write(" minCOBPredBG: "+oa),ia<999&&process.stderr.write(" minUAMPredBG: "+ia),console.error(" avgPredBG:"+ea+" COB/Carbs:"+l.mealCOB+"/"+l.carbs),ga>Xe&&(Ct=Math.min(Ct,ga)),He.COB=l.mealCOB,He.IOB=a.iob,He.BGI=o(St,i),He.deviation=o(Dt,i),He.ISF=o(bt,i),He.CR=n($,1),He.target_bg=o(rt,i),He.TDD=n(se,2),He.current_target=n(rt,0);var ya=He.CR;ke!=He.CR&&(ya=ke+"→"+He.CR),He.reason=ft+", COB: "+He.COB+", Dev: "+He.deviation+", BGI: "+He.BGI+", CR: "+ya+", Target: "+gt+", minPredBG "+o(Ct,i)+", minGuardBG "+o(Tt,i)+", IOBpredBG "+o(ta,i),aa>0&&(He.reason+=", COBpredBG "+o(aa,i)),ra>0&&(He.reason+=", UAMpredBG "+o(ra,i)),He.reason+=j,He.reason+="; ";var xa=wt;xa<40&&(xa=Math.min(Tt,xa));var Sa,Da=T-xa,wa=240,Ga=240;if(l.mealCOB>0&&(Et>0||Qt>0)){for(Ba=0;BaSa*Xe&&(console.error("maxDelta "+o(at,i)+" > "+100*Sa+"% of BG "+o(Xe,i)+" - disabling SMB"),He.reason+="maxDelta "+o(at,i)+" > "+100*Sa+"% of BG "+o(Xe,i)+" - SMB disabled!, ",Ft=!1),console.error("BG projected to remain above "+o(nt,i)+" for "+wa+"minutes"),(Ga<240||wa<60)&&console.error("BG projected to remain above "+o(T,i)+" for "+Ga+"minutes");var Ca=Ga,Ta=i.current_basal*H*bt*Ca/60,Ua=Math.max(0,l.mealCOB-.25*l.carbs),Oa=(Da-Ta)/csf-Ua;Ta=n(Ta),Oa=n(Oa),console.error("naive_eventualBG:",wt,"bgUndershoot:",Da,"zeroTempDuration:",Ca,"zeroTempEffect:",Ta,"carbsReq:",Oa),"Could not parse clock data"==l.reason?console.error("carbsReq unknown: Could not parse clock data"):Oa>=i.carbsReqThreshold&&Ga<=45&&(He.carbsReq=Oa,He.reason+=Oa+" add'l carbs req w/in "+Ga+"m; ");var Ra=0;if(Xe0&&et>Ut)He.reason+="IOB "+a.iob+" < "+n(-i.current_basal*H*20/60,2),He.reason+=" and minDelta "+o(et,i)+" > expectedDelta "+o(Ut,i)+"; ";else if(Xe=55)return He.reason+="; Canceling temp at "+He.deliverAt.getMinutes()+"m past the hour. ",u.setTempBasal(0,0,i,He,t);var Aa=0,Ia=Je,Fa=0;if(GtUt&&et>0&&!Oa)return wt<40?(He.reason+=", naive_eventualBG < 40. ",u.setTempBasal(0,30,i,He,t)):(e.delta>et?He.reason+=", but Delta "+o(Ke,i)+" > expectedDelta "+o(Ut,i):He.reason+=", but Min. Delta "+et.toFixed(2)+" > Exp. Delta "+o(Ut,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t)));Aa=n(Aa=2*Math.min(0,(Gt-rt)/bt),2);var Pa=Math.min(0,(wt-rt)/bt);Pa=n(Pa,2),et<0&&et>Ut&&(Aa=n(Aa*(et/Ut),2)),Ia=r(Ia=Je+2*Aa,i),Fa=t.duration*(t.rate-Je)/60;var ja=Math.min(Aa,Pa);if(console.log("naiveInsulinReq:"+Pa),Fa5&&Ia>=.8*t.rate)return He.reason+=", temp "+t.rate+" ~< req "+Ia+"U/hr. ",He;if(Ia<=0){if((Ra=n((Da=rt-wt)/bt*60/i.current_basal*H))<0?Ra=0:(Ra=30*n(Ra/30),Ra=Math.min(120,Math.max(0,Ra))),Ra>0)return He.reason+=", setting "+Ra+"m zero temp. ",u.setTempBasal(Ia,Ra,i,He,t)}else He.reason+=", setting "+Ia+"U/hr. ";return u.setTempBasal(Ia,30,i,He,t)}if(et=2||Ut+-1*et>=2)&&(He.manualBolusErrorString=et>=0&&Ut>0?3:et<0&&Ut<=0||et<0&&Ut>=0?4:5),He.insulinForManualBolus=n((He.eventualBG-He.target_bg)/bt,2),!d||!Ft))return e.delta "+o(nt,i)+" but Delta "+o(Ke,i)+" < Exp. Delta "+o(Ut,i):He.reason+="Eventual BG "+o(Gt,i)+" > "+o(nt,i)+" but Min. Delta "+et.toFixed(2)+" < Exp. Delta "+o(Ut,i),t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Math.min(Gt,Ct)nt&&(He.manualBolusErrorString=6,He.insulinForManualBolus=n((He.eventualBG-He.target_bg)/bt,2),He.minPredBG=Ct),!d||!Ft))return He.reason+=o(Gt,i)+"-"+o(Ct,i)+" in range: no temp required",t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));if(Gt>=ot&&(He.reason+="Eventual BG "+o(Gt,i)+" >= "+o(ot,i)+", ",Gt>ot&&(He.insulinForManualBolus=n((Gt-rt)/bt,2))),a.iob>st)return He.reason+="IOB "+n(a.iob,2)+" > max_iob "+st,t.duration>15&&r(Je,i)===r(t.rate,i)?(He.reason+=", temp "+t.rate+" ~ req "+Je+"U/hr. ",He):(He.reason+="; setting current basal of "+Je+" as temp. ",u.setTempBasal(Je,30,i,He,t));Aa=n((Math.min(Ct,Gt)-rt)/bt,2),C=n((Gt-rt)/bt,2),Aa>st-a.iob?(console.error("SMB limited by maxIOB: "+st-a.iob+" (. insulinReq: "+Aa+" U)"),He.reason+="max_iob "+st+", ",Aa=st-a.iob):console.error("SMB not limited by maxIOB ( insulinReq: "+Aa+" U)."),C>st-a.iob?(console.error("Ev. Bolus limited by maxIOB: "+st-a.iob+" (. insulinForManualBolus: "+C+" U)"),He.reason+="max_iob "+st+", "):console.error("Ev. Bolus would not be limited by maxIOB ( insulinForManualBolus: "+C+" U)."),Ia=r(Ia=Je+2*Aa,i),Aa=n(Aa,3),He.insulinReq=Aa;var Ea=n((new Date(U).getTime()-a.lastBolusTime)/6e4,1);if(d&&Ft&&Xe>T){var qa=30;void 0!==i.maxSMBBasalMinutes&&(qa=i.maxSMBBasalMinutes);var Wa=30;void 0!==i.maxUAMSMBBasalMinutes&&(Wa=i.maxUAMSMBBasalMinutes),v.useOverride&&_&&D!==qa&&(console.error("SMB Max Minutes - setting overriden from "+qa+" to "+D),qa=D),v.useOverride&&_&&w!==Wa&&(console.error("UAM Max Minutes - setting overriden from "+Wa+" to "+w),Wa=w);var ka=n(l.mealCOB/$,3),La=0;void 0===qa?(La=n(i.current_basal*H*30/60,1),console.error("smbMinutesSetting undefined: defaulting to 30m"),Aa>La&&console.error("SMB limited by maxBolus: "+La+" ( "+Aa+" U)")):a.iob>ka&&a.iob>0?(console.error("IOB"+a.iob+"> COB"+l.mealCOB+"; mealInsulinReq ="+ka),Wa?(console.error("maxUAMSMBBasalMinutes: "+Wa+", profile.current_basal: "+i.current_basal*H),La=n(i.current_basal*H*Wa/60,1)):(console.error("maxUAMSMBBasalMinutes undefined: defaulting to 30m"),La=n(i.current_basal*H*30/60,1)),Aa>La?console.error("SMB limited by maxUAMSMBBasalMinutes [ "+Wa+"m ]: "+La+"U ( "+Aa+"U )"):console.error("SMB is not limited by maxUAMSMBBasalMinutes. ( insulinReq: "+Aa+"U )")):(console.error(".maxSMBBasalMinutes: "+qa+", profile.current_basal: "+i.current_basal*H),Aa>(La=n(i.current_basal*H*qa/60,1))?console.error("SMB limited by maxSMBBasalMinutes: "+qa+"m ]: "+La+"U ( insulinReq: "+Aa+"U )"):console.error("SMB is not limited by maxSMBBasalMinutes. ( insulinReq: "+Aa+"U )"));var za=i.bolus_increment,Na=1/za,Ha=Math.min(i.smb_delivery_ratio,1);.5!=Ha&&console.error("SMB Delivery Ratio changed from default 0.5 to "+n(Ha,2));var Za=Math.min(Aa*Ha,La);Za=Math.floor(Za*Na)/Na,Ra=n((rt-(wt+na)/2)/bt*60/i.current_basal*H),Aa>0&&Za=30?(Ra=30*n(Ra/30),Ra=Math.min(60,Math.max(0,Ra))):($a=n(Je*Ra/30,2),Ra=30),He.reason+=" insulinReq "+Aa,Za>=La&&(He.reason+="; maxBolus "+La),Ra>0&&(He.reason+="; setting "+Ra+"m low temp of "+$a+"U/h"),He.reason+=". ";var Ja=3;i.SMBInterval&&(Ja=Math.min(10,Math.max(1,i.SMBInterval)));var Ka=n(Ja-Ea,0),Qa=n(60*(Ja-Ea),0)%60;if(console.error("naive_eventualBG "+wt+","+Ra+"m "+$a+"U/h temp needed; last bolus "+Ea+"m ago; maxBolus: "+La),Ea>Ja?Za>0&&(He.units=Za,He.reason+="Microbolusing "+Za+"U. "):He.reason+="Waiting "+Ka+"m "+Qa+"s to microbolus again. ",Ra>0)return He.rate=$a,He.duration=Ra,He}var Va=u.getMaxSafeBasal(i);return 400==Xe?u.setTempBasal(i.current_basal,30,i,He,t):(Ia>Va&&(He.reason+="adj. req. rate: "+Ia+" to maxSafeBasal: "+n(Va,2)+", ",Ia=r(Va,i)),(Fa=t.duration*(t.rate-Je)/60)>=2*Aa?(He.reason+=t.duration+"m@"+t.rate.toFixed(2)+" > 2 * insulinReq. Setting temp basal of "+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)):void 0===t.duration||0===t.duration?(He.reason+="no temp, setting "+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)):t.duration>5&&r(Ia,i)<=r(t.rate,i)?(He.reason+="temp "+t.rate+" >~ req "+Ia+"U/hr. ",He):(He.reason+="temp "+t.rate+"<"+Ia+"U/hr. ",u.setTempBasal(Ia,30,i,He,t)))}},3531:(e,t,a)=>{var r=a(2296);e.exports=function(e,t){var a=20;return void 0!==t&&"string"==typeof t.model&&(r(t.model,"54")||r(t.model,"23"))&&(a=40),e<1?Math.round(e*a)/a:e<10?Math.round(20*e)/20:Math.round(10*e)/10}},1873:(e,t,a)=>{var r=a(9325).Symbol;e.exports=r},4932:e=>{e.exports=function(e,t){for(var a=-1,r=null==e?0:e.length,n=Array(r);++a{e.exports=function(e,t,a){return e==e&&(void 0!==a&&(e=e<=a?e:a),void 0!==t&&(e=e>=t?e:t)),e}},2552:(e,t,a)=>{var r=a(1873),n=a(659),o=a(9350),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?n(e):o(e)}},7556:(e,t,a)=>{var r=a(1873),n=a(4932),o=a(6449),i=a(4394),s=r?r.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(o(t))return n(t,e)+"";if(i(t))return l?l.call(t):"";var a=t+"";return"0"==a&&1/t==-1/0?"-0":a}},4128:(e,t,a)=>{var r=a(1800),n=/^\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(n,""):e}},4840:(e,t,a)=>{var r="object"==typeof a.g&&a.g&&a.g.Object===Object&&a.g;e.exports=r},659:(e,t,a)=>{var r=a(1873),n=Object.prototype,o=n.hasOwnProperty,i=n.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=o.call(e,s),a=e[s];try{e[s]=void 0;var r=!0}catch(e){}var n=i.call(e);return r&&(t?e[s]=a:delete e[s]),n}},9350:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},9325:(e,t,a)=>{var r=a(4840),n="object"==typeof self&&self&&self.Object===Object&&self,o=r||n||Function("return this")();e.exports=o},1800:e=>{var t=/\s/;e.exports=function(e){for(var a=e.length;a--&&t.test(e.charAt(a)););return a}},2296:(e,t,a)=>{var r=a(7133),n=a(7556),o=a(1489),i=a(3222);e.exports=function(e,t,a){e=i(e),t=n(t);var s=e.length,l=a=void 0===a?s:r(o(a),0,s);return(a-=t.length)>=0&&e.slice(a,l)==t}},6449:e=>{var t=Array.isArray;e.exports=t},3805:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},346:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},4394:(e,t,a)=>{var r=a(2552),n=a(346);e.exports=function(e){return"symbol"==typeof e||n(e)&&"[object Symbol]"==r(e)}},7400:(e,t,a)=>{var r=a(6993),n=1/0;e.exports=function(e){return e?(e=r(e))===n||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},1489:(e,t,a)=>{var r=a(7400);e.exports=function(e){var t=r(e),a=t%1;return t==t?a?t-a:t:0}},6993:(e,t,a)=>{var r=a(4128),n=a(3805),o=a(4394),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(o(e))return NaN;if(n(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=n(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=r(e);var a=s.test(e);return a||l.test(e)?u(e.slice(2),a?2:8):i.test(e)?NaN:+e}},3222:(e,t,a)=>{var r=a(7556);e.exports=function(e){return null==e?"":r(e)}}},t={};function a(r){var n=t[r];if(void 0!==n)return n.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,a),o.exports}a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=a(2982);freeaps_determineBasal=r})(); \ No newline at end of file diff --git a/open-iaps-oref/lib/determine-basal/determine-basal.js b/open-iaps-oref/lib/determine-basal/determine-basal.js index a4b53786b..616583c80 100644 --- a/open-iaps-oref/lib/determine-basal/determine-basal.js +++ b/open-iaps-oref/lib/determine-basal/determine-basal.js @@ -45,7 +45,7 @@ function convert_bg(value, profile) } } function enable_smb(profile, microBolusAllowed, meal_data, bg, target_bg, high_bg, oref_variables, time) { - if (oref_variables.smbIsOff){ + if (oref_variables.smbIsScheduledOff){ /* Below logic is related to profile overrides which can disable SMBs or disable them for a scheduled window. * SMBs will be disabled from [start, end), such that if an SMB is scheduled to be disabled from 10 AM to 2 PM, * an SMB will not be allowed from 10:00:00 until 1:59:59. @@ -154,7 +154,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ const isfAndCr = oref2_variables.isfAndCr; const isf = oref2_variables.isf; const cr_ = oref2_variables.cr; - const smbIsAlwaysOff = oref2_variables.smbIsAlwaysOff; + const smbIsScheduledOff = oref2_variables.smbIsScheduledOff; const start = oref2_variables.start; var end = oref2_variables.end; const smbMinutes = oref2_variables.smbMinutes; @@ -1019,7 +1019,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ threshold = min_bg - 0.5*(min_bg-40); // Set threshold to the user's setting, as long as it's between 60-120 and above the default calculated threshold threshold = Math.min(Math.max(profile.threshold_setting, threshold, 60), 120); - console.error("Threshold set to ${convert_bg(threshold, profile)}"); + console.error(`Threshold set to ${convert_bg(threshold, profile)}`); // If iob_data or its required properties are missing, return. // This has to be checked after checking that we're not in one of the CGM-data-related error conditions handled above, @@ -1162,7 +1162,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ let enableSMB = false; // If SMB is always off, don't bother checking if we should enable SMBs - if (smbIsAlwaysOff) { + if (smbIsOff) { console.error("SMBs are always off."); enableSMB = false; } else { diff --git a/oref0_source_version.txt b/oref0_source_version.txt index 2f94be770..a474bbaaa 100644 --- a/oref0_source_version.txt +++ b/oref0_source_version.txt @@ -1,6 +1,10 @@ -oref0 branch: dev - git version: b89a39b +oref0 branch: dev - git version: 5774155 Last commits: +5774155 Merge pull request #20 from MikePlante1/disable_smb_schedule +e3a8d73 Merge pull request #17 from MikePlante1/console_error_refactor +a29d9ce rename smbIsAlwaysOff to smbIsScheduledOff +d898eb1 fix threshold console.error b89a39b Merge pull request #16 from bjornoleh/webpack-update b8aaf93 Merge pull request #15 from avouspierre/dev 4aba4e0 webpack-cp.sh: git log --since=2024-01-01