Source: TemperatureSensor.js

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;