| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- 'use strict';
- function cleanCal (cal) {
- var clean = {
- scale: parseFloat(cal.scale) || 0
- , intercept: parseFloat(cal.intercept) || 0
- , slope: parseFloat(cal.slope) || 0
- };
- clean.valid = ! (clean.slope === 0 || clean.unfiltered === 0 || clean.scale === 0);
- return clean;
- }
- module.exports = function withRawGlucose (entry, cals, maxRaw) {
- maxRaw = maxRaw || 200;
- if ( entry.type === "mbg" || entry.type === "cal" ) {
- return entry;
- }
- var egv = entry.glucose || entry.sgv || 0;
- entry.unfiltered = parseInt(entry.unfiltered) || 0;
- entry.filtered = parseInt(entry.filtered) || 0;
- //TODO: add time check, but how recent should it be?
- //TODO: currently assuming the first is the best (and that there is probably just 1 cal)
- var cal = cals && cals.length > 0 && cleanCal(cals[0]);
- if (cal && cal.valid) {
- if (cal.filtered === 0 || egv < 40) {
- entry.raw = Math.round(cal.scale * (entry.unfiltered - cal.intercept) / cal.slope);
- } else {
- var ratio = cal.scale * (entry.filtered - cal.intercept) / cal.slope / egv;
- entry.raw = Math.round(cal.scale * (entry.unfiltered - cal.intercept) / cal.slope / ratio);
- }
- if ( egv < 40 ) {
- if (entry.raw) {
- entry.glucose = entry.raw;
- entry.fromRaw = true;
- if (entry.raw <= maxRaw) {
- entry.noise = 2;
- } else {
- entry.noise = 3;
- }
- } else {
- entry.noise = 3;
- }
- } else if (! entry.noise) {
- entry.noise = 0;
- }
- }
- return entry;
- };
|