johnny-five
Version:
Firmata based Arduino Programming Framework.
117 lines (94 loc) • 2.36 kB
JavaScript
var Board = require("../lib/board.js"),
__ = require("../lib/fn.js"),
events = require("events"),
util = require("util");
// Switch instance private data
var priv = new WeakMap(),
aliases = {
closed: [ "close", "closed", "on" ],
open: [ "open", "off" ]
},
// Create a 5 ms debounce boundary on event triggers
// this avoids Switch events firing on
// press noise and false positives
trigger = __.debounce(function( key ) {
aliases[ key ].forEach(function( type ) {
this.emit( type, null );
}, this);
}, 7);
/**
* Switch
* @constructor
*
* five.Switch();
*
* five.Switch({
* pin: 10
* });
*
*
* @param {Object} opts [description]
*
*/
function Switch( opts ) {
if ( !(this instanceof Switch) ) {
return new Switch( opts );
}
// Initialize a Device instance on a Board
Board.Device.call(
this, opts = Board.Options( opts )
);
// Set the pin to INPUT mode
this.mode = this.firmata.MODES.INPUT;
this.firmata.pinMode( this.pin, this.mode );
// Create a "state" entry for privately
// storing the state of the Switch
priv.set( this, {
isClosed: false
});
// Analog Read event loop
this.firmata.digitalRead( this.pin, function( data ) {
var err = null;
// data = 0, this.isClosed = true
// indicates that the Switch has been opened
// after previously being closed
if ( !data && this.isClosed ) {
priv.get( this ).isClosed = false;
trigger.call( this, "open" );
}
// data = 1, this.isClosed = false
// indicates that the Switch has been closed
// after previously being open
if ( data && !this.isClosed ) {
// Update private data
priv.get( this ).isClosed = true;
// Call debounced event trigger for given "key"
// This will trigger all event aliases assigned
// to "key"
trigger.call( this, "closed" /* key */ );
}
}.bind(this));
Object.defineProperties( this, {
isClosed: {
get: function() {
return priv.get( this ).isClosed;
}
}
});
}
util.inherits( Switch, events.EventEmitter );
/**
* Fired when the Switch is closed
*
* @event
* @name closed
* @memberOf Switch
*/
/**
* Fired when the Switch is opened
*
* @event
* @name open
* @memberOf Switch
*/
module.exports = Switch;