targets.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. var getTime = require('../medtronic-clock');
  2. function bgTargetsLookup (inputs, profile) {
  3. return bound_target_range(lookup(inputs, profile));
  4. }
  5. function lookup (inputs, profile) {
  6. var bgtargets_data = inputs.targets;
  7. var temptargets_data = inputs.temptargets;
  8. var now = new Date();
  9. //bgtargets_data.targets.sort(function (a, b) { return a.offset > b.offset });
  10. var bgTargets = bgtargets_data.targets[bgtargets_data.targets.length - 1];
  11. for (var i = 0; i < bgtargets_data.targets.length - 1; i++) {
  12. if ((now >= getTime(bgtargets_data.targets[i].offset)) && (now < getTime(bgtargets_data.targets[i + 1].offset))) {
  13. bgTargets = bgtargets_data.targets[i];
  14. break;
  15. }
  16. }
  17. if (profile.target_bg) {
  18. bgTargets.low = profile.target_bg;
  19. }
  20. bgTargets.high = bgTargets.low;
  21. var tempTargets = bgTargets;
  22. // sort tempTargets by date so we can process most recent first
  23. try {
  24. temptargets_data.sort(function (a, b) { return new Date(b.created_at) - new Date(a.created_at) });
  25. } catch (e) {
  26. console.error("No temptargets found.");
  27. }
  28. //console.error(temptargets_data);
  29. //console.error(now);
  30. for (i = 0; i < temptargets_data.length; i++) {
  31. var start = new Date(temptargets_data[i].created_at);
  32. //console.error(start);
  33. var expires = new Date(start.getTime() + temptargets_data[i].duration * 60 * 1000);
  34. //console.error(expires);
  35. if (now >= start && temptargets_data[i].duration === 0) {
  36. // cancel temp targets
  37. //console.error(temptargets_data[i]);
  38. tempTargets = bgTargets;
  39. break;
  40. } else if (! temptargets_data[i].targetBottom || ! temptargets_data[i].targetTop) {
  41. console.error("eventualBG target range invalid: " + temptargets_data[i].targetBottom + "-" + temptargets_data[i].targetTop);
  42. break;
  43. } else if (now >= start && now < expires ) {
  44. //console.error(temptargets_data[i]);
  45. tempTargets.high = temptargets_data[i].targetTop;
  46. tempTargets.low = temptargets_data[i].targetBottom;
  47. tempTargets.temptargetSet = true;
  48. break;
  49. }
  50. }
  51. bgTargets = tempTargets;
  52. //console.error(bgTargets);
  53. return bgTargets;
  54. }
  55. function bound_target_range (target) {
  56. // if targets are < 20, assume for safety that they're intended to be mmol/L, and convert to mg/dL
  57. if ( target.high < 20 ) { target.high = target.high * 18; }
  58. if ( target.low < 20 ) { target.low = target.low * 18; }
  59. // hard-code lower bounds for min_bg and max_bg in case pump is set too low, or units are wrong
  60. target.max_bg = Math.max(80, target.high);
  61. target.min_bg = Math.max(80, target.low);
  62. // hard-code upper bound for min_bg in case pump is set too high
  63. target.min_bg = Math.min(200, target.min_bg);
  64. target.max_bg = Math.min(200, target.max_bg);
  65. return target
  66. }
  67. bgTargetsLookup.bgTargetsLookup = bgTargetsLookup;
  68. bgTargetsLookup.lookup = lookup;
  69. bgTargetsLookup.bound_target_range = bound_target_range;
  70. exports = module.exports = bgTargetsLookup;