2017-01-21 2 views
0

Ich versuche, mein eigenes Modul für die GPIO-Pins eines Raspberry Pi zu erstellen, aber ich möchte .on('something', function() { }) Ereignisse erhalten, wenn sich etwas geändert hat (wie eine Taste gedrückt/losgelassen wird).node.js Module - EventEmitter

Das Python-Skript sendet alle 0,01 Sekunden einen Wert wie wahr oder falsch.

module.js

var PythonShell = require('python-shell'); 

module.exports = { 
    switch_live: function(pin) { 

     var status = false; 

     this.get = (function(){ 
      return status; 
     }); 

     var options = { 
      mode: 'text', 
      args: [pin], 
      pythonOptions: ['-u'] 
     }; 

     var pyshell = new PythonShell('./data/switch_loop.py', options); 

     pyshell.on('message', function(message) { 

      if (message == 'false') { 

       if (status) { 
        // EMIT: button released 

       } 

       status = false; 
      } else { 

       if (!status) { 
        // EMIT: button pressed 

       } 

       status = true; 
      } 



     }); 

     return this.status;  

    }, 
    some_other_funcs: function(pin) { 
     // ... 
    } 
} 

app.js

var module = require('./module.js'); 

var button = new module.switch_live(10); 

Das Modul können Sie den Status der Taste zeigen:

// get status of button 
var status = button.get(); // returns "true" or "false" 

Aber ich möchte etwas wie folgt aus:

button.on('pressed', function() { 
    // call this function every time when button is pressed 
}); 

button.on('released', function() { 
    // call this function every time when button is released 
}); 

Danke :)

EDIT: Ich habe keine Lösung gefunden, weil ich die Funktionen innerhalb der "module.exports" brauche.

Antwort

0

Meine Lösung

Es ist ein Modul für ein Linkerkit-Board.

app.js

var linkerkit = require('./linkerkit.js'); 

var button = new linkerkit.switch_live(20); 

button.on('pressed', function() { 
    // call this function every time when button is pressed 

    console.log('press'); 

}); 

button.on('released', function() { 
    // call this function every time when button is released 

    console.log('release'); 

}); 

linkerkit.js

var PythonShell = require('python-shell'); 
var EventEmitter = require('events'); 
var util = require('util'); 

var linkerkit = { 

    switch_live: function(pin) { 

     var self = this; 

     this.status = false; 
     this.pin = pin; 
     EventEmitter.call(this); 

     this.get = function() { 
      return this.status; 
     } 

     this._pyshell = new PythonShell('./data/switch_loop.py', { 
      mode: 'text', 
      args: [this.pin], 
      pythonOptions: ['-u'] 
     }); 

     this._pyshell.on("message", function(message) { 

      if (message === "false") { 
       if (this.status === true) { 
        // EMIT: button released 
        self.emit("released"); 
       } 
       this.status = false; 
      } 
      else { 
       if (this.status === false) { 
        // EMIT: button pressed 
        self.emit("pressed"); 
       } 
       this.status = true; 
      } 

     }); 

    } 

} 


for (var key in linkerkit) { 
    util.inherits(linkerkit[key], EventEmitter); 
} 

module.exports = linkerkit; 

ich den Code bearbeitet, weil es Dinge tun können sollten wie folgt aus:

var button = linkerkit.switch(20); 
button.get() // get status of button once, has no python loop 

var button_live = linkerkit.switch_live(20); 
button.get() // get status of button once, has a python loop 
button.on('pressed', callback); 
button.on('released', callback); 

var led = linkerkit.led(10); 
led.on(); 
led.off(); 
led.brightness(255); // digitalOutput - brightness 
led.blink(200); // 100ms on, 100ms off 

var ledcolor = linkerkit.led_rgb(12); 
ledcolor.on(); // on -> color: white 
ledcolor.off(); 
ledcolor.rgb([255, 0, 0]); // on -> color: red 

Und viele weitere Funktionen ...

-1

Sie sollten in der Lage sein zu verwenden Knoten eingebauten in EventEmitter Klasse Ihren eigenen "Knopf-Emitter" zu erstellen:

module.js

var PythonShell = require('python-shell'); 

var util = require('util'); 
var EventEmitter = require('events'); 

function ButtonEmitter(pinNumber) { 
    this.status = false; 
    this.pinNumber = pinNumber; 
    EventEmitter.call(this); 
} 

util.inherits(ButtonEmitter, EventEmitter); 

ButtonEmitter.prototype.get = function() { 
    return this.status; 
}; 

ButtonEmitter.prototype.switch_live = function() { 
    var options = { 
    mode: 'text', 
    args: [this.pinNumber], 
    pythonOptions: ['-u'] 
    }; 

    this._pyshell = new PythonShell('./data/switch_loop.py', options); 

    this._pyshell.on("message", this._handleMessage.bind(this)); 

    return this.status; 
}; 

ButtonEmitter.prototype._handleMessage = function(message) { 
    if (message === "false") { 
    if (this.status === true) { 
     // EMIT: button released 
     this.emit("pressed"); 
    } 
    this.status = false; 
    } else { 
    if (this.status === false) { 
    // EMIT: button pressed 
    this.emit("released"); 
    } 
    this.status = true; 
    } 
}; 

module.exports = ButtonEmitter; 

app.js

var ButtonTrigger = require('./module.js'); 

var button = new ButtonTrigger(10); 

button.on('pressed', function() { 
    // call this function every time when button is pressed 
}); 

button.on('released', function() { 
    // call this function every time when button is released 
}); 

button.swith_live(); 

Erklärung

Der obige Code nutzt Knotens util.inherits auf „Unterklasse“ EventEmitter, so dass jede Klasse mit Zugang zu .on() hat, .off() und andere Ereignismethoden. (Hinweis: Sie ES6 class und extends Syntax verwenden könnte, wenn Sie Node-Version sind unterstützt)

Dann, mit Ihrem „Unterklasse“, können Sie Ihre eigene switch_live Methode hinzufügen, die das „Hören“ Prozess beginnt, ist es vorbei der Rückruf _handleMessage. Wenn der Rückruf _handleMessage ausgeführt wird, vergleicht er den aktuellen Status mit dem eingehenden und löst einen .emit() mit den Ereignisnamen aus, die Sie in Ihrer Frage angegeben haben. Auch hier ist die .emit() verfügbar, weil Sie eine "Unterklasse" EventEmitter.

+0

Danke, dass mir geholfen :) – user2850375

+0

@ user2850375 sicher. Vergessen Sie nicht, die Antwort als "akzeptiert" zu markieren! –

+0

Ich schrieb eine andere Antwort, um meine Lösung zu teilen. Ich habe deine Antwort gewählt :) – user2850375