UNPKG

nightscout

Version:

Nightscout acts as a web-based CGM (Continuous Glucose Monitor) to allow multiple caregivers to remotely view a patients glucose data in realtime.

88 lines (68 loc) 2.74 kB
'use strict'; var _ = require('lodash'); var consts = require('../constants'); const MAX_BG_MMOL = 22; const MAX_BG_MGDL = MAX_BG_MMOL * consts.MMOL_TO_MGDL; module.exports = function fitTreatmentsToBGCurve (ddata, env, ctx) { var settings = env.settings; var rawbg = require('../plugins/rawbg')({ settings: settings , language: ctx.language }); function updateTreatmentBG(treatment) { function mgdlByTime() { var withBGs = _.filter(ddata.sgvs, function(d) { return d.mgdl > 39 || settings.isEnabled('rawbg'); }); var beforeTreatment = _.findLast(withBGs, function (d) { return d.mills <= treatment.mills; }); var afterTreatment = _.find(withBGs, function (d) { return d.mills >= treatment.mills; }); var mgdlBefore = mgdlValue(beforeTreatment) || calcRaw(beforeTreatment); var mgdlAfter = mgdlValue(afterTreatment) || calcRaw(afterTreatment); var calcedBG = 0; if (mgdlBefore && mgdlAfter) { calcedBG = (mgdlBefore + mgdlAfter) / 2; } else if (mgdlBefore) { calcedBG = mgdlBefore; } else if (mgdlAfter) { calcedBG = mgdlAfter; } return Math.round(calcedBG) || 180; } function mgdlValue (entry) { return entry && entry.mgdl >= 39 && Number(entry.mgdl); } function calcRaw (entry) { var raw; if (entry && settings.isEnabled('rawbg')) { var cal = _.last(ddata.cals); if (cal) { raw = rawbg.calc(entry, cal); } } return raw; } //to avoid checking if eventType is null everywhere, just default it here treatment.eventType = treatment.eventType || ''; if (treatment.glucose && isNaN(treatment.glucose)) { console.warn('found an invalid glucose value', treatment); } else if (treatment.glucose && treatment.units) { if (treatment.units === 'mmol') { treatment.mmol = Math.min(Number(treatment.glucose), MAX_BG_MMOL); } else { treatment.mgdl = Math.min(Number(treatment.glucose), MAX_BG_MGDL); } } else if (treatment.glucose) { //no units, assume everything is the same //console.warn('found a glucose value without any units, maybe from an old version?', _.pick(treatment, '_id', 'created_at', 'enteredBy')); var units = settings.units === 'mmol' ? 'mmol' : 'mgdl'; treatment[units] = settings.units === 'mmol' ? Math.min(Number(treatment.glucose), MAX_BG_MMOL) : Math.min(Number(treatment.glucose), MAX_BG_MGDL); } else { treatment.mgdl = mgdlByTime(); } } _.each(ddata.treatments, updateTreatmentBG); };