var Sensor = require('./Sensor.js').Sensor;
var fs = require('fs');
/**
* Represents a Temperature Sensor.
* @constructor
* @param {Object} initOption - sensor's initialized information
* @throw Error when:
* + driver of the sensor is missing, or
* + type of sensor is undefined, or
* + sensor is using, or
* + sensor is unsupported
*/
var TemperatureSensor = function (initOption) {
Sensor.apply(this, arguments);
this.currentTempSensor = null;
this.fileDesc;
try {
// check if this sensor is valid for using or not
var sensorId = this.isValid(initOption);
if (sensorId) {
initOption.id = sensorId;
}
if (this.getState() === 'errored') return;
if (initOption.type === "temperature_onboard") {
this.currentTempSensor = require('./drivers/temperature_onboard.js').TemperatureOnboard;
} else if (initOption.type === "temperature_ds18b20") {
this.currentTempSensor = require('./drivers/temperature_ds18b20.js').TemperatureDS18B20;
} else {
throw Error("Driver of " + initOption.type + " is missing");
}
initTemperatureSensorInfo(this, initOption, this.currentTempSensor);
} catch (err) {
console.log(err);
console.log(err.stack);
}
// check if user want to log data in file or not
if (this.info.logFilePath) {
//create an empty file
try {
this.fileDesc = fs.openSync(this.info.logFilePath, 'w');
} catch (err) {
console.log(err.name + "[code: " + err.code + "]:" + err.message);
console.log(err.stack);
delete (this.info.logFilePath);
}
}
// start reading data from sensor
this.start(this);
};
/**
* @extends Sensor
*/
TemperatureSensor.prototype = Object.create(Sensor.prototype);
TemperatureSensor.prototype.constructor = TemperatureSensor;
Object.assign(TemperatureSensor.prototype, Sensor.super_.prototype);
/**
* Initialize values for the Temperature Sensor
* @private
* @memberof TemperatureSensor
* @param {Object} self - TemperatureSensor object
* @param {Object} initOption - Initialized option
* @param {Object} driver - Sensor driver
*/
var initTemperatureSensorInfo = function (self, initOption, driver) {
console.log(initOption);
for (var property in driver.info) {
if (driver.info.hasOwnProperty(property)) {
self.info[property] = driver.info[property];
}
}
for (var property in initOption) {
if (initOption.hasOwnProperty(property)) {
self.info[property] = initOption[property];
}
}
}
/**
* Set unit for temperature sensor
* @param {String} - temperature unit, should be 'c' or 'C' for Celsius, 'f' or 'F' or Fahrenheit
* @throw Error when unit is illegal
*/
TemperatureSensor.prototype.unit = function (unit) {
try {
if (unit !== 'c' && unit !== 'C' && unit !== 'f' && unit !== 'F') {
throw Error("Temperature unit is illegal");
}
this.info.unit = unit;
} catch (err) {
console.log(err.name + "[code: " + err.code + "]:" + err.message);
console.log(err.stack);
console.log("Set Celsius (C) as default unit");
this.info.unit = 'C';
}
}
/**
* Read data from sensor. This function will be called at sensor's frequency.
* @fires TemperatureSensor#onerror
* @fires TemperatureSensor#onchange
* @fires TemperatureSensor#onerror
*/
TemperatureSensor.prototype.readData = function () {
if (this.getState() === 'errored') {
this.emit('onerror', new Error('TemperatureSensor is in error state'));
return;
} else if (this.getState() === 'idle') {
this.emit('onerror', new Error('TemperatureSensor was stopped. Need to resume it first'));
return;
}
var sensorData;
if (this.getId() === undefined) {
sensorData = this.currentTempSensor.readData(this.info.unit);
} else {
sensorData = this.currentTempSensor.readData(this.getId(), this.info.unit);
}
var newData = {
value: sensorData,
timeStamp: new Date().toLocaleString()
};
var recentData = {};
try {
if (this.buffer.length != 0) {
recentData = this.buffer[this.buffer.length - 1];
} else {
recentData.value = 0;
}
this.buffer.push(newData);
//todo: handle the maximum size of data buffer
//Write data in the log file if 'logFilePath' is set
if (this.info.logFilePath) {
var dataString = "[" + newData.timeStamp + "]: " + newData.value + "\n";
fs.write(this.fileDesc, dataString, function (err) {
if (err) {
console.log(err.name + "[code: " + err.code + "]:" + err.message);
console.log(err.stack);
}
});
}
// check if threshold is set
if (this.getThreshold() !== -1) {
if (Math.abs(recentData.value - newData.value) >= this.getThreshold()) {
/**
* onchange event.
* @event TemperatureSensor#onchange
* @type {Object}
* @property {Object} newdata - Most recent changed data (compared to the threshold value) read from sensor
*/
this.emit('onchange', newData);
}
}
/**
* ondata event.
* @event TemperatureSensor#ondata
* @type {Object}
* @property {Object} newData - Most recent data read from sensor
*/
this.emit('ondata', newData);
return newData;
} catch (err) {
console.log(err.name + "[code: " + err.code + "]:" + err.message);
console.log(err.stack);
/**
* onerror event.
* @event TemperatureSensor#onerror
* @type {Object}
* @property {Object} err - Indicates the error
*/
this.emit('onerror', err);
}
}
/**
* @exports TemperatureSensor
*/
module.exports.TemperatureSensor = TemperatureSensor;