85 lines
No EOL
2.3 KiB
JavaScript
85 lines
No EOL
2.3 KiB
JavaScript
// TODO: call disable function on exit
|
|
var DigitalSensor = require('./base/digitalSensor')
|
|
var commands = require('../commands')
|
|
var helpers = require('./helpers')
|
|
|
|
function DustDigitalSensor(pin) {
|
|
DigitalSensor.apply(this, Array.prototype.slice.call(arguments))
|
|
this.results = new Array()
|
|
}
|
|
DustDigitalSensor.prototype = new DigitalSensor()
|
|
|
|
DustDigitalSensor.prototype.read = function () {
|
|
var write = this.board.writeBytes(commands.dustSensorRead.concat([this.pin, commands.unused, commands.unused]))
|
|
if (write) {
|
|
this.board.wait(200)
|
|
var bytes = this.board.readBytes()
|
|
//console.log(bytes[0] + ' ' + bytes[1] + ' ' + bytes[2] + ' ' + bytes[3])
|
|
if (bytes instanceof Buffer && bytes[0] != 0)
|
|
return [bytes[0], (bytes[3] * 256 * 256 + bytes[2] * 256 + bytes[1])]
|
|
else
|
|
return false
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
DustDigitalSensor.prototype.enable = function () {
|
|
var write = this.board.writeBytes(commands.dustSensorEn.concat([commands.unused, commands.unused, commands.unused]))
|
|
if (write) {
|
|
this.board.wait(200)
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
DustDigitalSensor.prototype.disable = function () {
|
|
var write = this.board.writeBytes(commands.dustSensorDis.concat([commands.unused, commands.unused, commands.unused]))
|
|
if (write) {
|
|
this.board.wait(200)
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
DustDigitalSensor.prototype.start = function () {
|
|
if (!this.enable())
|
|
throw new Error('cannot enable dust sensor')
|
|
this.enable()
|
|
setInterval(loop.bind(this), 30 * 1000) //every 30 seconds
|
|
}
|
|
|
|
DustDigitalSensor.prototype.stop = function () {
|
|
this.disable()
|
|
clearInterval(loop)
|
|
}
|
|
|
|
function loop() {
|
|
let currentResult = this.read()
|
|
this.results.push(currentResult[1])
|
|
}
|
|
|
|
DustDigitalSensor.prototype.readAvgMax = function () {
|
|
|
|
if (this.results.length === 0) return {
|
|
avg: helpers.NOT_AVAILABLE,
|
|
max: helpers.NOT_AVAILABLE
|
|
};
|
|
|
|
let sum = this.results.reduce((acc, cur) => acc + cur, 0)
|
|
let avg = sum / this.results.length
|
|
|
|
let max = this.results.reduce(function (a, b) {
|
|
return Math.max(a, b)
|
|
});
|
|
|
|
//reset the array
|
|
this.results = new Array()
|
|
|
|
return {
|
|
avg: helpers.round(avg, 2),
|
|
max: helpers.round(max, 2)
|
|
};
|
|
}
|
|
|
|
module.exports = DustDigitalSensor |