diff --git a/env.js b/env.js index 0218d6963..c063c2274 100644 --- a/env.js +++ b/env.js @@ -41,6 +41,7 @@ function config ( ) { env.mongo_collection = readENV('MONGO_COLLECTION', 'entries'); env.settings_collection = readENV('MONGO_SETTINGS_COLLECTION', 'settings'); env.treatments_collection = readENV('MONGO_TREATMENTS_COLLECTION', 'treatments'); + env.profile_collection = readENV('MONGO_PROFILE_COLLECTION', 'profile'); env.devicestatus_collection = readENV('MONGO_DEVICESTATUS_COLLECTION', 'devicestatus'); env.enable = readENV('ENABLE'); diff --git a/lib/api/index.js b/lib/api/index.js index 13ccb4c57..994306139 100644 --- a/lib/api/index.js +++ b/lib/api/index.js @@ -1,6 +1,6 @@ 'use strict'; -function create (env, entries, settings, treatments, devicestatus) { +function create (env, entries, settings, treatments, profile, devicestatus) { var express = require('express'), app = express( ) ; @@ -47,6 +47,7 @@ function create (env, entries, settings, treatments, devicestatus) { app.use('/', require('./entries/')(app, wares, entries)); app.use('/', require('./settings/')(app, wares, settings)); app.use('/', require('./treatments/')(app, wares, treatments)); + app.use('/', require('./profile/')(app, wares, profile)); app.use('/', require('./devicestatus/')(app, wares, devicestatus)); // Status diff --git a/lib/api/profile/index.js b/lib/api/profile/index.js new file mode 100644 index 000000000..5dae6a971 --- /dev/null +++ b/lib/api/profile/index.js @@ -0,0 +1,29 @@ +'use strict'; + +var consts = require('../../constants'); + +function configure (app, wares, profile) { + var express = require('express'), + api = express.Router( ); + + // invoke common middleware + api.use(wares.sendJSONStatus); + // text body types get handled as raw buffer stream + api.use(wares.bodyParser.raw( )); + // json body types get handled as parsed json + api.use(wares.bodyParser.json( )); + // also support url-encoded content-type + api.use(wares.bodyParser.urlencoded({ extended: true })); + + // List settings available + api.get('/profile/', function(req, res) { + profile.list(function (err, attribute) { + return res.json(attribute); + }); + }); + + return api; +} + +module.exports = configure; + diff --git a/lib/profile.js b/lib/profile.js new file mode 100644 index 000000000..c7ba0e101 --- /dev/null +++ b/lib/profile.js @@ -0,0 +1,24 @@ +'use strict'; + +function configure (collection, storage) { + + function create (obj, fn) { + obj.created_at = (new Date( )).toISOString( ); + api( ).insert(obj, function (err, doc) { + fn(null, doc); + }); + } + + function list (fn) { + return api( ).find({ }).sort({created_at: -1}).toArray(fn); + } + + function api ( ) { + return storage.pool.db.collection(collection); + } + + api.list = list; + api.create = create; + return api; +} +module.exports = configure; diff --git a/lib/websocket.js b/lib/websocket.js index 49d10bedb..6936ef173 100644 --- a/lib/websocket.js +++ b/lib/websocket.js @@ -1,5 +1,5 @@ -function websocket (env, server, entries, treatments) { +function websocket (env, server, entries, treatments, profiles) { "use strict"; // CONSTANTS var ONE_HOUR = 3600000, @@ -29,6 +29,7 @@ var dir2Char = { treatmentData = [], mbgData = [], calData = [], + profileData = [], patientData = []; function start ( ) { @@ -146,6 +147,7 @@ function update() { cgmData = []; treatmentData = []; mbgData = []; + profileData = []; var earliest_data = now - TWO_DAYS; var q = { find: {"date": {"$gte": earliest_data}} }; entries.list(q, function (err, results) { @@ -188,8 +190,19 @@ function update() { treatment.x = timestamp.getTime(); return treatment; }); - // all done, do loadData - loadData( ); + + profiles.list(function (err, results) { + // There should be only one document in the profile collection with a DIA. If there are multiple, use the last one. + results.forEach(function(element, index, array) { + if (element) { + if (element.dia) { + profileData[0] = element; + } + } + }); + // all done, do loadData + loadData( ); + }); }); }); @@ -237,6 +250,10 @@ function loadData() { }); } + if (profileData) { + var profile = profileData; + } + if (actualCurrent && actualCurrent < 39) errorCode = actualCurrent; var actualLength = actual.length - 1; @@ -271,7 +288,7 @@ function loadData() { // consolidate and send the data to the client var shouldEmit = is_different(actual, predicted, mbg, treatment, cal); - patientData = [actual, predicted, mbg, treatment, cal]; + patientData = [actual, predicted, mbg, treatment, profile, cal]; console.log('patientData', patientData.length); if (shouldEmit) { emitData( ); diff --git a/server.js b/server.js index b1a5dd8b2..7c761c142 100644 --- a/server.js +++ b/server.js @@ -50,8 +50,9 @@ var express = require('express'); var entriesStorage = entries.storage(env.mongo_collection, store, pushover); var settings = require('./lib/settings')(env.settings_collection, store); var treatmentsStorage = treatments.storage(env.treatments_collection, store, pushover); +var profile = require('./lib/profile')(env.profile_collection, store); var devicestatusStorage = devicestatus.storage(env.devicestatus_collection, store); -var api = require('./lib/api/')(env, entriesStorage, settings, treatmentsStorage, devicestatusStorage); +var api = require('./lib/api/')(env, entriesStorage, settings, treatmentsStorage, profile, devicestatusStorage); var pebble = require('./lib/pebble'); /////////////////////////////////////////////////// @@ -105,7 +106,7 @@ store(function ready ( ) { // setup socket io for data and message transmission /////////////////////////////////////////////////// var websocket = require('./lib/websocket'); - var io = websocket(env, server, entriesStorage, treatmentsStorage); + var io = websocket(env, server, entriesStorage, treatmentsStorage, profile); }); /////////////////////////////////////////////////// diff --git a/static/js/client.js b/static/js/client.js index 3fd39c675..c073f00ee 100644 --- a/static/js/client.js +++ b/static/js/client.js @@ -28,6 +28,7 @@ var app = {}, browserSettings = {}, browserStorage = $.localStorage; , latestUpdateTime , prevSGV , treatments + , profile , cal , padding = { top: 20, right: 10, bottom: 30, left: 10 } , opacity = {current: 1, DAY: 1, NIGHT: 0.5} @@ -124,7 +125,7 @@ var app = {}, browserSettings = {}, browserStorage = $.localStorage; } else if (noise < 2 && browserSettings.showRawbg != 'always') { return 0; } else if (filtered == 0 || sgv < 40) { - console.info("Skipping ratio adjustment for SGV " + sgv); + console.info('Skipping ratio adjustment for SGV ' + sgv); return scale * (unfiltered - intercept) / slope; } else { var ratio = scale * (filtered - intercept) / slope / sgv; @@ -1335,8 +1336,8 @@ var app = {}, browserSettings = {}, browserStorage = $.localStorage; d.created_at = new Date(d.created_at); }); - cal = d[4][d[4].length-1]; - + profile = d[4][0]; + cal = d[5][d[5].length-1]; var temp1 = [ ]; if (cal && showRawBGs()) {