with-raw-glucose.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. 'use strict';
  2. function cleanCal (cal) {
  3. var clean = {
  4. scale: parseFloat(cal.scale) || 0
  5. , intercept: parseFloat(cal.intercept) || 0
  6. , slope: parseFloat(cal.slope) || 0
  7. };
  8. clean.valid = ! (clean.slope === 0 || clean.unfiltered === 0 || clean.scale === 0);
  9. return clean;
  10. }
  11. module.exports = function withRawGlucose (entry, cals, maxRaw) {
  12. maxRaw = maxRaw || 200;
  13. if ( entry.type === "mbg" || entry.type === "cal" ) {
  14. return entry;
  15. }
  16. var egv = entry.glucose || entry.sgv || 0;
  17. entry.unfiltered = parseInt(entry.unfiltered) || 0;
  18. entry.filtered = parseInt(entry.filtered) || 0;
  19. //TODO: add time check, but how recent should it be?
  20. //TODO: currently assuming the first is the best (and that there is probably just 1 cal)
  21. var cal = cals && cals.length > 0 && cleanCal(cals[0]);
  22. if (cal && cal.valid) {
  23. if (cal.filtered === 0 || egv < 40) {
  24. entry.raw = Math.round(cal.scale * (entry.unfiltered - cal.intercept) / cal.slope);
  25. } else {
  26. var ratio = cal.scale * (entry.filtered - cal.intercept) / cal.slope / egv;
  27. entry.raw = Math.round(cal.scale * (entry.unfiltered - cal.intercept) / cal.slope / ratio);
  28. }
  29. if ( egv < 40 ) {
  30. if (entry.raw) {
  31. entry.glucose = entry.raw;
  32. entry.fromRaw = true;
  33. if (entry.raw <= maxRaw) {
  34. entry.noise = 2;
  35. } else {
  36. entry.noise = 3;
  37. }
  38. } else {
  39. entry.noise = 3;
  40. }
  41. } else if (! entry.noise) {
  42. entry.noise = 0;
  43. }
  44. }
  45. return entry;
  46. };