UNPKG

johnny-five

Version:

The JavaScript Robotics and Hardware Programming Framework. Use with: Arduino (all models), Electric Imp, Beagle Bone, Intel Galileo & Edison, Linino One, Pinoccio, pcDuino3, Raspberry Pi, Particle/Spark Core & Photon, Tessel 2, TI Launchpad and more!

205 lines (177 loc) 4.65 kB
var IS_TEST_MODE = !!process.env.IS_TEST_MODE; var Board = require("./board"); var Fn = require("./fn"); var Emitter = require("events").EventEmitter; var util = require("util"); var Controllers = { MPL3115A2: { requirements: { value: { options: { elevation: { throws: false, message: "Missing `elevation` option. Without a specified base `elevation`, the altitude measurement will be inaccurate. Use the meters value shown on whatismyelevation.com", typeof: "number", } } } }, initialize: { value: function(opts, dataHandler) { var Multi = require("./imu"); var driver = Multi.Drivers.get(this.board, "MPL3115A2", opts); driver.on("data", function(data) { dataHandler(data.altitude); }); } }, toMeters: { value: function(raw) { // http://cache.freescale.com/files/sensors/doc/data_sheet/MPL3115A2.pdf // Table 2, Note 3 // "Smallest bit change in register represents minimum value change in // Pascals or meters. Typical resolution to signify change in altitudeis 0.3 m" return Fn.toFixed(raw, 1); } } }, MS5611: { initialize: { value: function(opts, dataHandler) { var Multi = require("./imu"); var driver = Multi.Drivers.get(this.board, "MS5611", opts); driver.on("data", function(data) { dataHandler(data.altitude); }); } }, toMeters: { value: function(raw) { return Fn.toFixed(raw, 2); } } }, BMP180: { initialize: { value: function(opts, dataHandler) { var Multi = require("./imu"); var driver = Multi.Drivers.get(this.board, "BMP180", opts); driver.on("data", function(data) { dataHandler(data.altitude); }); } }, toMeters: { value: function(raw) { return Fn.toFixed(raw, 2); } } }, BMP280: { initialize: { value: function(opts, dataHandler) { var Multi = require("./imu"); var driver = Multi.Drivers.get(this.board, "BMP280", opts); driver.on("data", function(data) { dataHandler(data.altitude); }); } }, toMeters: { value: function(raw) { return Fn.toFixed(raw, 2); } } }, BME280: { initialize: { value: function(opts, dataHandler) { var Multi = require("./imu"); var driver = Multi.Drivers.get(this.board, "BME280", opts); driver.on("data", function(data) { dataHandler(data.altitude); }); } }, toMeters: { value: function(raw) { return Fn.toFixed(raw, 2); } } }, }; Controllers["BMP085"] = Controllers["BMP-085"] = Controllers.BMP180; var priv = new Map(); function Altimeter(opts) { if (!(this instanceof Altimeter)) { return new Altimeter(opts); } var controller = null; var freq; var last = null; var raw = null; var state = {}; Board.Component.call( this, opts = Board.Options(opts) ); freq = opts.freq || 25; if (opts.controller && typeof opts.controller === "string") { controller = Controllers[opts.controller.toUpperCase()]; } else { controller = opts.controller; } if (controller == null) { throw new Error("Altimeter expects a valid controller"); } Board.Controller.call(this, controller, opts); if (!this.toMeters) { this.toMeters = opts.toMeters || function(x) { return x; }; } var descriptors = { meters: { get: function() { return this.toMeters(raw); } }, feet: { get: function() { return Fn.toFixed(this.meters * 3.28084, 2); } } }; // Convenience aliases descriptors.m = descriptors.meters; descriptors.ft = descriptors.feet; Object.defineProperties(this, descriptors); priv.set(this, state); /* istanbul ignore else */ if (typeof this.initialize === "function") { this.initialize(opts, function(data) { raw = data; }); } setInterval(function() { if (raw == null) { return; } var data = {}; data.m = data.meters = this.meters; data.ft = data.feet = this.feet; this.emit("data", data); /* istanbul ignore else */ if (this.meters !== last) { last = this.meters; this.emit("change", data); } }.bind(this), freq); } util.inherits(Altimeter, Emitter); /* istanbul ignore else */ if (IS_TEST_MODE) { Altimeter.purge = function() { priv.clear(); }; } module.exports = Altimeter;