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