diff --git a/lib/determine-basal/determine-basal.js b/lib/determine-basal/determine-basal.js index 96204d80..55c632fc 100644 --- a/lib/determine-basal/determine-basal.js +++ b/lib/determine-basal/determine-basal.js @@ -409,157 +409,155 @@ 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;