UNPKG

nitrogen-sensor

Version:

This module adds support for sensorCommand messages to a Nitrogen application or service. It also provides the SensorManager class for interpreting message streams and driving the attached device.

106 lines (81 loc) 2.94 kB
var nitrogen = require('nitrogen'); function SensorManager() { nitrogen.CommandManager.apply(this, arguments); this.state = { interval: SensorManager.DEFAULT_INTERVAL }; this.measureInterval = null; } SensorManager.DEFAULT_INTERVAL = 30 * 1000; // 30 seconds SensorManager.prototype = Object.create(nitrogen.CommandManager.prototype); SensorManager.prototype.constructor = SensorManager; SensorManager.prototype.applyCommand = function(command) { for (var key in command.body) { this.state[key] = command.body[key]; } }; SensorManager.prototype.measure = function(callback) { var self = this; this.device.measure(function(err, messages) { if (err) return callback(err); nitrogen.Message.sendMany(self.session, messages, function(err, messages) { messages.forEach(function(message) { self.process(message); }); if (callback) return callback(); }); }); }; SensorManager.prototype.executeQueue = function(callback) { if (!this.device) return callback(new Error('No sensor device attached to sensor manager.')); var self = this; this.activeCommands().forEach(function(command) { self.applyCommand(command); }); this.setupMeasurements(); new nitrogen.Message({ type: 'sensorState', body: { interval: this.state.interval } }).send(this.session, function(err, messages) { if (err) return callback(err); self.process(messages[0]); callback(); }); }; SensorManager.prototype.isCommand = function(message) { return (message.is('sensorCommand')); }; SensorManager.prototype.isRelevant = function(message) { return message.is('sensorCommand') || message.is('sensorState'); }; SensorManager.prototype.obsoletes = function(downstreamMsg, upstreamMsg) { return nitrogen.CommandManager.obsoletes(downstreamMsg, upstreamMsg) || upstreamMsg.is('sensorCommand') && (downstreamMsg.is('sensorCommand') || downstreamMsg.is('sensorState')) && downstreamMsg.millisToTimestamp() < 0; }; SensorManager.prototype.setupMeasurements = function() { var self = this; // if there is a previous interval active, drop it. if (this.measureInterval) clearInterval(this.measureInterval); // setup interval this.measureInterval = setInterval(function() { self.measure(); }, this.state.interval); // immediately take measurement self.measure(); }; SensorManager.prototype.start = function(session, callback) { var filter = { tags: nitrogen.CommandManager.commandTag(this.device.id) }; var self = this; nitrogen.CommandManager.prototype.start.call(this, session, filter, function(err, message) { if (callback) return callback(); }); self.setupMeasurements(); }; module.exports = SensorManager;