Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Always calculate TDD #31

Draft
wants to merge 1 commit into
base: dev
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 124 additions & 126 deletions lib/determine-basal/determine-basal.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down