index.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. var tz = require('moment-timezone');
  2. var find_insulin = require('./history');
  3. var calculate = require('./calculate');
  4. var sum = require('./total');
  5. function generate (inputs, currentIOBOnly, treatments) {
  6. if (!treatments) {
  7. var treatments = find_insulin(inputs);
  8. // calculate IOB based on continuous future zero temping as well
  9. var treatmentsWithZeroTemp = find_insulin(inputs, 240);
  10. } else {
  11. var treatmentsWithZeroTemp = [];
  12. }
  13. //console.error(treatments.length, treatmentsWithZeroTemp.length);
  14. //console.error(treatments[treatments.length-1], treatmentsWithZeroTemp[treatmentsWithZeroTemp.length-1])
  15. var opts = {
  16. treatments: treatments
  17. , profile: inputs.profile
  18. , calculate: calculate
  19. };
  20. if ( inputs.autosens ) {
  21. opts.autosens = inputs.autosens;
  22. }
  23. var optsWithZeroTemp = {
  24. treatments: treatmentsWithZeroTemp
  25. , profile: inputs.profile
  26. , calculate: calculate
  27. };
  28. var iobArray = [];
  29. //console.error(inputs.clock);
  30. if (! /(Z|[+-][0-2][0-9]:?[034][05])+/.test(inputs.clock) ) {
  31. console.error("Warning: clock input " + inputs.clock + " is unzoned; please pass clock-zoned.json instead");
  32. }
  33. var clock = new Date(tz(inputs.clock));
  34. var lastBolusTime = new Date(0).getTime(); //clock.getTime());
  35. var lastTemp = {};
  36. lastTemp.date = new Date(0).getTime(); //clock.getTime());
  37. //console.error(treatments[treatments.length-1]);
  38. treatments.forEach(function(treatment) {
  39. if (treatment.insulin && treatment.started_at) {
  40. lastBolusTime = Math.max(lastBolusTime,treatment.started_at);
  41. //console.error(treatment.insulin,treatment.started_at,lastBolusTime);
  42. } else if (typeof(treatment.rate) === 'number' && treatment.duration ) {
  43. if ( treatment.date > lastTemp.date ) {
  44. lastTemp = treatment;
  45. lastTemp.duration = Math.round(lastTemp.duration*100)/100;
  46. }
  47. //console.error(treatment.rate, treatment.duration, treatment.started_at,lastTemp.started_at)
  48. }
  49. //console.error(treatment.rate, treatment.duration, treatment.started_at,lastTemp.started_at)
  50. //if (treatment.insulin && treatment.started_at) { console.error(treatment.insulin,treatment.started_at,lastBolusTime); }
  51. });
  52. var iStop;
  53. if (currentIOBOnly) {
  54. // for COB calculation, we only need the zeroth element of iobArray
  55. iStop=1
  56. } else {
  57. // predict IOB out to 4h, regardless of DIA
  58. iStop=4*60;
  59. }
  60. for (var i=0; i<iStop; i+=5){
  61. t = new Date(clock.getTime() + i*60000);
  62. //console.error(t);
  63. var iob = sum(opts, t);
  64. var iobWithZeroTemp = sum(optsWithZeroTemp, t);
  65. //console.error(opts.treatments[opts.treatments.length-1], optsWithZeroTemp.treatments[optsWithZeroTemp.treatments.length-1])
  66. iobArray.push(iob);
  67. //console.error(iob.iob, iobWithZeroTemp.iob);
  68. //console.error(iobArray.length-1, iobArray[iobArray.length-1]);
  69. iobArray[iobArray.length-1].iobWithZeroTemp = iobWithZeroTemp;
  70. }
  71. //console.error(lastBolusTime);
  72. iobArray[0].lastBolusTime = lastBolusTime;
  73. iobArray[0].lastTemp = lastTemp;
  74. return iobArray;
  75. }
  76. exports = module.exports = generate;