|
|
@@ -409,157 +409,156 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
|
|
|
|
|
// Calculate tdd ----------------------------------------------------------------------
|
|
|
|
|
|
- if (dynISFenabled) {
|
|
|
- //Bolus:
|
|
|
- for (let i = 0; i < pumphistory.length; i++) {
|
|
|
- if (pumphistory[i]._type == "Bolus") {
|
|
|
- bolusInsulin += pumphistory[i].amount;
|
|
|
- }
|
|
|
+ //Bolus:
|
|
|
+ for (let i = 0; i < pumphistory.length; i++) {
|
|
|
+ if (pumphistory[i]._type == "Bolus") {
|
|
|
+ bolusInsulin += pumphistory[i].amount;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- // Temp basals:
|
|
|
- for (let j = 1; j < pumphistory.length; j++) {
|
|
|
- if (pumphistory[j]._type == "TempBasal" && pumphistory[j].rate > 0) {
|
|
|
- current = j;
|
|
|
- quota = pumphistory[j].rate;
|
|
|
- var duration = pumphistory[j-1]['duration (min)'] / 60;
|
|
|
- var origDur = duration;
|
|
|
- var pastTime = new Date(pumphistory[j-1].timestamp);
|
|
|
- var morePresentTime = new Date(pastTime);
|
|
|
- var substractTimeOfRewind = 0;
|
|
|
- // If temp basal hasn't yet ended, use now as end date for calculation
|
|
|
- do {
|
|
|
- j--;
|
|
|
- if (j == 0) {
|
|
|
- morePresentTime = new Date();
|
|
|
- break;
|
|
|
- }
|
|
|
- else if (pumphistory[j]._type == "TempBasal" || pumphistory[j]._type == "PumpSuspend") {
|
|
|
- morePresentTime = new Date(pumphistory[j].timestamp);
|
|
|
- break;
|
|
|
- }
|
|
|
- // During the time the Medtronic pumps are rewinded and primed, this duration of suspened insulin delivery needs to be accounted for.
|
|
|
- var pp = j-2;
|
|
|
- if (pp >= 0) {
|
|
|
- if (pumphistory[pp]._type == "Rewind") {
|
|
|
- let rewindTimestamp = pumphistory[pp].timestamp;
|
|
|
- // There can be several Prime events
|
|
|
- while (pp - 1 >= 0) {
|
|
|
- pp -= 1;
|
|
|
- if (pumphistory[pp]._type == "Prime") {
|
|
|
- substractTimeOfRewind = (pumphistory[pp].timestamp - rewindTimestamp) / 36e5;
|
|
|
- } else { break }
|
|
|
- }
|
|
|
+ // Temp basals:
|
|
|
+ for (let j = 1; j < pumphistory.length; j++) {
|
|
|
+ if (pumphistory[j]._type == "TempBasal" && pumphistory[j].rate > 0) {
|
|
|
+ current = j;
|
|
|
+ quota = pumphistory[j].rate;
|
|
|
+ var duration = pumphistory[j-1]['duration (min)'] / 60;
|
|
|
+ var origDur = duration;
|
|
|
+ var pastTime = new Date(pumphistory[j-1].timestamp);
|
|
|
+ var morePresentTime = new Date(pastTime);
|
|
|
+ var substractTimeOfRewind = 0;
|
|
|
+ // If temp basal hasn't yet ended, use now as end date for calculation
|
|
|
+ do {
|
|
|
+ j--;
|
|
|
+ if (j == 0) {
|
|
|
+ morePresentTime = new Date();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else if (pumphistory[j]._type == "TempBasal" || pumphistory[j]._type == "PumpSuspend") {
|
|
|
+ morePresentTime = new Date(pumphistory[j].timestamp);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // During the time the Medtronic pumps are rewinded and primed, this duration of suspened insulin delivery needs to be accounted for.
|
|
|
+ var pp = j-2;
|
|
|
+ if (pp >= 0) {
|
|
|
+ if (pumphistory[pp]._type == "Rewind") {
|
|
|
+ let rewindTimestamp = pumphistory[pp].timestamp;
|
|
|
+ // There can be several Prime events
|
|
|
+ while (pp - 1 >= 0) {
|
|
|
+ pp -= 1;
|
|
|
+ if (pumphistory[pp]._type == "Prime") {
|
|
|
+ substractTimeOfRewind = (pumphistory[pp].timestamp - rewindTimestamp) / 36e5;
|
|
|
+ } else { break }
|
|
|
+ }
|
|
|
|
|
|
- // If Medtronic user forgets to insert infusion set
|
|
|
- if (substractTimeOfRewind >= duration) {
|
|
|
- morePresentTime = new Date(rewindTimestamp);
|
|
|
- substractTimeOfRewind = 0;
|
|
|
- }
|
|
|
+ // If Medtronic user forgets to insert infusion set
|
|
|
+ if (substractTimeOfRewind >= duration) {
|
|
|
+ morePresentTime = new Date(rewindTimestamp);
|
|
|
+ substractTimeOfRewind = 0;
|
|
|
}
|
|
|
}
|
|
|
- } while (j > 0);
|
|
|
-
|
|
|
- var diff = (morePresentTime - pastTime) / 36e5;
|
|
|
- if (diff < origDur) {
|
|
|
- duration = diff;
|
|
|
}
|
|
|
+ } while (j > 0);
|
|
|
|
|
|
- insulin = quota * (duration - substractTimeOfRewind);
|
|
|
- tempInsulin += accountForIncrements(insulin);
|
|
|
- j = current;
|
|
|
+ var diff = (morePresentTime - pastTime) / 36e5;
|
|
|
+ if (diff < origDur) {
|
|
|
+ duration = diff;
|
|
|
}
|
|
|
+
|
|
|
+ insulin = quota * (duration - substractTimeOfRewind);
|
|
|
+ tempInsulin += accountForIncrements(insulin);
|
|
|
+ j = current;
|
|
|
}
|
|
|
- // Check and count for when basals are delivered with a scheduled basal rate.
|
|
|
- // 1. Check for 0 temp basals with 0 min duration. This is for when ending a manual temp basal and (perhaps) continuing in open loop for a while.
|
|
|
- // 2. Check for temp basals that completes. This is for when disconnected from link/iphone, or when in open loop.
|
|
|
- // 3. Account for a punp suspension. This is for when pod screams or when MDT or pod is manually suspended.
|
|
|
- // 4. Account for a pump resume (in case pump/cgm is disconnected before next loop).
|
|
|
- // To do: are there more circumstances when scheduled basal rates are used? Do we need to care about "Prime" and "Rewind" with MDT pumps?
|
|
|
- //
|
|
|
- for (let k = 0; k < pumphistory.length; k++) {
|
|
|
- // Check for 0 temp basals with 0 min duration.
|
|
|
- insulin = 0;
|
|
|
- if (pumphistory[k]['duration (min)'] == 0 || pumphistory[k]._type == "PumpResume") {
|
|
|
- let time1 = new Date(pumphistory[k].timestamp);
|
|
|
- let time2 = new Date(time1);
|
|
|
- let l = k;
|
|
|
- do {
|
|
|
- if (l > 0) {
|
|
|
- --l;
|
|
|
- if (pumphistory[l]._type == "TempBasal") {
|
|
|
- time2 = new Date(pumphistory[l].timestamp);
|
|
|
- break;
|
|
|
- }
|
|
|
+ }
|
|
|
+ // Check and count for when basals are delivered with a scheduled basal rate.
|
|
|
+ // 1. Check for 0 temp basals with 0 min duration. This is for when ending a manual temp basal and (perhaps) continuing in open loop for a while.
|
|
|
+ // 2. Check for temp basals that completes. This is for when disconnected from link/iphone, or when in open loop.
|
|
|
+ // 3. Account for a punp suspension. This is for when pod screams or when MDT or pod is manually suspended.
|
|
|
+ // 4. Account for a pump resume (in case pump/cgm is disconnected before next loop).
|
|
|
+ // To do: are there more circumstances when scheduled basal rates are used? Do we need to care about "Prime" and "Rewind" with MDT pumps?
|
|
|
+ //
|
|
|
+ for (let k = 0; k < pumphistory.length; k++) {
|
|
|
+ // Check for 0 temp basals with 0 min duration.
|
|
|
+ insulin = 0;
|
|
|
+ if (pumphistory[k]['duration (min)'] == 0 || pumphistory[k]._type == "PumpResume") {
|
|
|
+ let time1 = new Date(pumphistory[k].timestamp);
|
|
|
+ let time2 = new Date(time1);
|
|
|
+ let l = k;
|
|
|
+ do {
|
|
|
+ if (l > 0) {
|
|
|
+ --l;
|
|
|
+ if (pumphistory[l]._type == "TempBasal") {
|
|
|
+ time2 = new Date(pumphistory[l].timestamp);
|
|
|
+ break;
|
|
|
}
|
|
|
- } while (l > 0);
|
|
|
- // duration of current scheduled basal in h
|
|
|
- let basDuration = (time2 - time1) / 36e5;
|
|
|
-
|
|
|
- if (basDuration > 0) {
|
|
|
- scheduledBasalInsulin += calcScheduledBasalInsulin(time2, time1);
|
|
|
}
|
|
|
+ } while (l > 0);
|
|
|
+ // duration of current scheduled basal in h
|
|
|
+ let basDuration = (time2 - time1) / 36e5;
|
|
|
+
|
|
|
+ if (basDuration > 0) {
|
|
|
+ scheduledBasalInsulin += calcScheduledBasalInsulin(time2, time1);
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- // Check for temp basals that completes
|
|
|
- for (let n = pumphistory.length -1; n > 0; n--) {
|
|
|
- if (pumphistory[n]._type == "TempBasalDuration") {
|
|
|
- // duration in hours
|
|
|
- let oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
|
|
|
- // time of old temp basal
|
|
|
- let oldTime = new Date(pumphistory[n].timestamp);
|
|
|
- var newTime = new Date(oldTime);
|
|
|
- let o = n;
|
|
|
- do {
|
|
|
- --o;
|
|
|
- if (o >= 0) {
|
|
|
- if (pumphistory[o]._type == "TempBasal" || pumphistory[o]._type == "PumpSuspend") {
|
|
|
- // time of next (new) temp basal or a pump suspension
|
|
|
- newTime = new Date(pumphistory[o].timestamp);
|
|
|
- break;
|
|
|
- }
|
|
|
+ // Check for temp basals that completes
|
|
|
+ for (let n = pumphistory.length -1; n > 0; n--) {
|
|
|
+ if (pumphistory[n]._type == "TempBasalDuration") {
|
|
|
+ // duration in hours
|
|
|
+ let oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
|
|
|
+ // time of old temp basal
|
|
|
+ let oldTime = new Date(pumphistory[n].timestamp);
|
|
|
+ var newTime = new Date(oldTime);
|
|
|
+ let o = n;
|
|
|
+ do {
|
|
|
+ --o;
|
|
|
+ if (o >= 0) {
|
|
|
+ if (pumphistory[o]._type == "TempBasal" || pumphistory[o]._type == "PumpSuspend") {
|
|
|
+ // time of next (new) temp basal or a pump suspension
|
|
|
+ newTime = new Date(pumphistory[o].timestamp);
|
|
|
+ break;
|
|
|
}
|
|
|
- } while (o > 0);
|
|
|
-
|
|
|
- // When latest temp basal is index 0 in pump history
|
|
|
- if (n == 0 && pumphistory[0]._type == "TempBasalDuration") {
|
|
|
- newTime = new Date();
|
|
|
- oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
|
|
|
}
|
|
|
+ } while (o > 0);
|
|
|
|
|
|
- let tempBasalTimeDifference = (newTime - oldTime) / 36e5;
|
|
|
- let timeOfbasal = tempBasalTimeDifference - oldBasalDuration;
|
|
|
- // if duration of scheduled basal is more than 0
|
|
|
- if (timeOfbasal > 0) {
|
|
|
- // Timestamp after completed temp basal
|
|
|
- let timeOfScheduledBasal = addTimeToDate(oldTime, oldBasalDuration);
|
|
|
- scheduledBasalInsulin += calcScheduledBasalInsulin(newTime, timeOfScheduledBasal);
|
|
|
- }
|
|
|
+ // When latest temp basal is index 0 in pump history
|
|
|
+ if (n == 0 && pumphistory[0]._type == "TempBasalDuration") {
|
|
|
+ newTime = new Date();
|
|
|
+ oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
|
|
|
+ }
|
|
|
+
|
|
|
+ let tempBasalTimeDifference = (newTime - oldTime) / 36e5;
|
|
|
+ let timeOfbasal = tempBasalTimeDifference - oldBasalDuration;
|
|
|
+ // if duration of scheduled basal is more than 0
|
|
|
+ if (timeOfbasal > 0) {
|
|
|
+ // Timestamp after completed temp basal
|
|
|
+ let timeOfScheduledBasal = addTimeToDate(oldTime, oldBasalDuration);
|
|
|
+ scheduledBasalInsulin += calcScheduledBasalInsulin(newTime, timeOfScheduledBasal);
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- tdd = bolusInsulin + tempInsulin + scheduledBasalInsulin;
|
|
|
+ tdd = bolusInsulin + tempInsulin + scheduledBasalInsulin;
|
|
|
|
|
|
|
|
|
- var insulin_ = {
|
|
|
- TDD: round(tdd, 5),
|
|
|
- bolus: round(bolusInsulin, 5),
|
|
|
- temp_basal: round(tempInsulin, 5),
|
|
|
- scheduled_basal: round(scheduledBasalInsulin, 5)
|
|
|
- }
|
|
|
+ var insulin_ = {
|
|
|
+ TDD: round(tdd, 5),
|
|
|
+ bolus: round(bolusInsulin, 5),
|
|
|
+ temp_basal: round(tempInsulin, 5),
|
|
|
+ scheduled_basal: round(scheduledBasalInsulin, 5)
|
|
|
+ }
|
|
|
|
|
|
- if (pumpData > 21) {
|
|
|
- logBolus = ". Bolus insulin: " + bolusInsulin.toPrecision(5) + " U";
|
|
|
- logTempBasal = ". Temporary basal insulin: " + tempInsulin.toPrecision(5) + " U";
|
|
|
- logBasal = ". Insulin with scheduled basal rate: " + scheduledBasalInsulin.toPrecision(5) + " U";
|
|
|
- logtdd = " TDD past 24h is: " + tdd.toPrecision(5) + " U";
|
|
|
- logOutPut = dataLog + logtdd + logBolus + logTempBasal + logBasal;
|
|
|
+ if (pumpData > 21) {
|
|
|
+ logBolus = ". Bolus insulin: " + bolusInsulin.toPrecision(5) + " U";
|
|
|
+ logTempBasal = ". Temporary basal insulin: " + tempInsulin.toPrecision(5) + " U";
|
|
|
+ logBasal = ". Insulin with scheduled basal rate: " + scheduledBasalInsulin.toPrecision(5) + " U";
|
|
|
+ logtdd = " TDD past 24h is: " + tdd.toPrecision(5) + " U";
|
|
|
+ logOutPut = dataLog + logtdd + logBolus + logTempBasal + logBasal;
|
|
|
|
|
|
- tddReason = ", TDD: " + round(tdd,2) + " U, " + round(bolusInsulin/tdd*100,0) + "% Bolus " + round((tempInsulin+scheduledBasalInsulin)/tdd*100,0) + "% Basal";
|
|
|
+ tddReason = ", TDD: " + round(tdd,2) + " U, " + round(bolusInsulin/tdd*100,0) + "% Bolus " + round((tempInsulin+scheduledBasalInsulin)/tdd*100,0) + "% Basal";
|
|
|
+
|
|
|
+ } else { tddReason = ", TDD: Not enough pumpData (< 21h)"; }
|
|
|
|
|
|
- } else { tddReason = ", TDD: Not enough pumpData (< 21h)"; }
|
|
|
- }
|
|
|
|
|
|
var tdd_before = tdd;
|
|
|
|
|
|
@@ -643,7 +642,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
|
|
|
|
|
// Use weighted TDD average
|
|
|
tdd_before = tdd;
|
|
|
- if (weightPercentage < 1 && weightedAverage > 0) {
|
|
|
+ if (weightPercentage < 1 && weightedAverage > 1) {
|
|
|
tdd = weightedAverage;
|
|
|
console.log("Using weighted TDD average: " + round(tdd,2) + " U, instead of past 24 h (" + round(tdd_before,2) + " U), weight: " + weightPercentage);
|
|
|
weightLog = ", Weighted TDD: " + round(tdd,2) + " U";
|