nodeJS计时器函数

时间:2016-09-17 08:48:24

标签: javascript node.js timer

我不熟悉这个功能,但是我看到间歇性故障,有时会执行定时器功能并且newState变量会切换,有时它不会。请问你能理解我对这是做什么的理解吗?

function motionHandler() {
        console.log('im in motionhandler func')
        var newState = true;
        changeAction(newState);
        if(this.timer !== undefined) clearTimeout(this.timer);
        this.timer = setTimeout(function(){changeAction(!newState);}, this.window_seconds * 1000);
    };

据我所知,当这个函数执行时,我将newState变量设置为true。然后我执行changeAction,它将我的运动检测器设置为" true" (检测到运动)。

然后我创建了一个计时器。如果this.timer中有内容,那么请清楚。然后我创建一个超时,它将从window_seconds * 1000倒计时(即5x1000毫秒= 5秒)。一旦达到超时,我将执行changeAction函数并将newState设置为与当前相反的状态?

假设所有这些都是正确的,有时newState会重置,有时则不会重置。

每次从发射器接收特定的RF代码时,我都在执行motionHandler功能。超时是指在没有收到代码时将运动检测器重置为假。

完整的代码实际上是家庭网桥的插件,可以在这里看到:

https://github.com/mattnewham/homebridge-RFReceiver/blob/master/index.js

这是我第一次真正涉足Javascript / NodeJS,所以我真的不知道如何解决这个问题(除了我的console.logs!)

完整代码:



var Service;
var Characteristic;
var rpi433 = require("rpi-433"),
    rfSniffer = rpi433.sniffer({
      pin: 2,                     //Snif on GPIO 2 (or Physical PIN 13)
      debounceDelay: 1000          //Wait 500ms before reading another code
    }),
    rfEmitter = rpi433.emitter({
      pin: 0,                     //Send through GPIO 0 (or Physical PIN 11)
      pulseLength: 350            //Send the code with a 350 pulse length
    });

var debug = require("debug")("RFReceiverAccessory");
var crypto = require("crypto");

module.exports = function(homebridge) {
    Service = homebridge.hap.Service;
    Characteristic = homebridge.hap.Characteristic;

    homebridge.registerAccessory("homebridge-RFReceiver", "RFReceiver", RFReceiverAccessory);
}

function RFReceiverAccessory(log, config) {
  this.log = log;

  // url info
  this.name = config["name"];
  this.rfcode = config["rfcode"] || 4;
  this.window_seconds = config["window_seconds"] || 5;
  this.sensor_type = config["sensor_type"] || "m";
  this.inverse = config["inverse"] || false;

}

RFReceiverAccessory.prototype = {

  getServices: function() {

    // you can OPTIONALLY create an information service if you wish to override
    // the default values for things like serial number, model, etc.
    var informationService = new Service.AccessoryInformation();

    informationService
      .setCharacteristic(Characteristic.Name, this.name)
      .setCharacteristic(Characteristic.Manufacturer, "Homebridge")
      .setCharacteristic(Characteristic.Model, "RF Receiver")
      .setCharacteristic(Characteristic.SerialNumber, "12345");

    var service, changeAction;
    if(this.sensor_type === "c"){
        service = new Service.ContactSensor();
        changeAction = function(newState){
            service.getCharacteristic(Characteristic.ContactSensorState)
                    .setValue(newState ? Characteristic.ContactSensorState.CONTACT_DETECTED : Characteristic.ContactSensorState.CONTACT_NOT_DETECTED);
        };
    } else {
        service = new Service.MotionSensor();
        changeAction = function(newState){
	    console.log('changing state');
            service.getCharacteristic(Characteristic.MotionDetected)
                    .setValue(newState);
        };
    }

function motionHandler() {
        console.log('im in motionhandler func')
        var newState = true;
        changeAction(newState);
        if(this.timer !== undefined) clearTimeout(this.timer);
        this.timer = setTimeout(function(){changeAction(!newState);}, this.window_seconds * 1000);
    };


    
 
    var code = this.rfcode
    var name = this.name

    rfSniffer.on('data', function (data) {
    console.log('Code received: '+data.code+' pulse length : '+data.pulseLength);
    console.log(code);
    if(data.code == code){
            console.log("Motion Detected In" +name);
            motionHandler()};
    });


   
    

    return [informationService, service];
  }
};




0 个答案:

没有答案