1 | var Emitter = require("events").EventEmitter;
|
2 | var util = require("util");
|
3 |
|
4 | var Board = require("./board");
|
5 | var Fn = require("./fn");
|
6 |
|
7 | var toFixed = Fn.toFixed;
|
8 |
|
9 |
|
10 | var Controllers = {
|
11 | MPL115A2: {
|
12 | initialize: {
|
13 | value: function(opts, dataHandler) {
|
14 | var Multi = require("./imu");
|
15 | var driver = Multi.Drivers.get(this.board, "MPL115A2", opts);
|
16 | driver.on("data", function(data) {
|
17 | dataHandler.call(this, data.pressure);
|
18 | }.bind(this));
|
19 | }
|
20 | },
|
21 |
|
22 | toPressure: {
|
23 | value: function(raw) {
|
24 |
|
25 | var output = ((65 / 1023) * raw) + 50;
|
26 |
|
27 | return toFixed(output, 2);
|
28 | }
|
29 | }
|
30 | },
|
31 | MPL3115A2: {
|
32 | initialize: {
|
33 | value: function(opts, dataHandler) {
|
34 | var Multi = require("./imu");
|
35 | var driver = Multi.Drivers.get(this.board, "MPL3115A2", opts);
|
36 | driver.on("data", function(data) {
|
37 | dataHandler.call(this, data.pressure);
|
38 | }.bind(this));
|
39 | }
|
40 | },
|
41 |
|
42 | toPressure: {
|
43 | value: function(raw) {
|
44 |
|
45 |
|
46 | var inches = (raw / 4) / 3377;
|
47 | var output = inches * 3.39;
|
48 |
|
49 |
|
50 |
|
51 | return toFixed(output, 4);
|
52 | }
|
53 | }
|
54 | },
|
55 | BMP180: {
|
56 | initialize: {
|
57 | value: function(opts, dataHandler) {
|
58 | var Multi = require("./imu");
|
59 | var driver = Multi.Drivers.get(this.board, "BMP180", opts);
|
60 | driver.on("data", function(data) {
|
61 | dataHandler.call(this, data.pressure);
|
62 | }.bind(this));
|
63 | }
|
64 | },
|
65 |
|
66 | toPressure: {
|
67 | value: function(raw) {
|
68 |
|
69 |
|
70 | return toFixed(raw / 1000, 3);
|
71 | }
|
72 | }
|
73 | },
|
74 | BMP280: {
|
75 | initialize: {
|
76 | value: function(opts, dataHandler) {
|
77 | var Multi = require("./imu");
|
78 | var driver = Multi.Drivers.get(this.board, "BMP280", opts);
|
79 | driver.on("data", function(data) {
|
80 | dataHandler.call(this, data.pressure);
|
81 | }.bind(this));
|
82 | }
|
83 | },
|
84 |
|
85 | toPressure: {
|
86 | value: function(raw) {
|
87 |
|
88 |
|
89 | return toFixed(raw / 1000, 5);
|
90 | }
|
91 | }
|
92 | },
|
93 | BME280: {
|
94 | initialize: {
|
95 | value: function(opts, dataHandler) {
|
96 | var Multi = require("./imu");
|
97 | var driver = Multi.Drivers.get(this.board, "BME280", opts);
|
98 | driver.on("data", function(data) {
|
99 | dataHandler.call(this, data.pressure);
|
100 | }.bind(this));
|
101 | }
|
102 | },
|
103 |
|
104 | toPressure: {
|
105 | value: function(raw) {
|
106 |
|
107 |
|
108 | return toFixed(raw / 1000, 5);
|
109 | }
|
110 | }
|
111 | },
|
112 | MS5611: {
|
113 | initialize: {
|
114 | value: function(opts, dataHandler) {
|
115 | var Multi = require("./imu");
|
116 | var driver = Multi.Drivers.get(this.board, "MS5611", opts);
|
117 | driver.on("data", function(data) {
|
118 | dataHandler.call(this, data.pressure);
|
119 | }.bind(this));
|
120 | }
|
121 | },
|
122 | toPressure: {
|
123 | value: function(raw) {
|
124 |
|
125 |
|
126 |
|
127 |
|
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 | return toFixed(raw / 1000, 4);
|
134 | }
|
135 | }
|
136 | },
|
137 | };
|
138 |
|
139 | Controllers.BMP085 = Controllers.BMP180;
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 |
|
154 |
|
155 |
|
156 |
|
157 | function Barometer(opts) {
|
158 |
|
159 | if (!(this instanceof Barometer)) {
|
160 | return new Barometer(opts);
|
161 | }
|
162 |
|
163 | var controller = null;
|
164 | var last = null;
|
165 | var raw = null;
|
166 |
|
167 | Board.Component.call(
|
168 | this, opts = Board.Options(opts)
|
169 | );
|
170 |
|
171 | var freq = opts.freq || 25;
|
172 |
|
173 | if (opts.controller && typeof opts.controller === "string") {
|
174 | controller = Controllers[opts.controller.toUpperCase()];
|
175 | } else {
|
176 | controller = opts.controller;
|
177 | }
|
178 |
|
179 | if (controller == null) {
|
180 |
|
181 | throw new Error("Missing Barometer controller");
|
182 | }
|
183 |
|
184 | Board.Controller.call(this, controller, opts);
|
185 |
|
186 | if (!this.toPressure) {
|
187 | this.toPressure = opts.toPressure || function(raw) {
|
188 | return raw;
|
189 | };
|
190 | }
|
191 |
|
192 | if (typeof this.initialize === "function") {
|
193 | this.initialize(opts, function(data) {
|
194 | raw = data;
|
195 | });
|
196 | }
|
197 |
|
198 | Object.defineProperties(this, {
|
199 | pressure: {
|
200 | get: function() {
|
201 | return this.toPressure(raw);
|
202 | }
|
203 | }
|
204 | });
|
205 |
|
206 | setInterval(function() {
|
207 | if (raw === null) {
|
208 | return;
|
209 | }
|
210 |
|
211 | var data = {
|
212 | pressure: this.pressure
|
213 | };
|
214 |
|
215 | this.emit("data", data);
|
216 |
|
217 | if (this.pressure !== last) {
|
218 | last = this.pressure;
|
219 | this.emit("change", data);
|
220 | }
|
221 | }.bind(this), freq);
|
222 | }
|
223 |
|
224 | util.inherits(Barometer, Emitter);
|
225 |
|
226 |
|
227 | if (!!process.env.IS_TEST_MODE) {
|
228 | Barometer.Controllers = Controllers;
|
229 | Barometer.purge = function() {};
|
230 | }
|
231 |
|
232 | module.exports = Barometer;
|