File: src/custom/ID12RFIDReader.js
/** * Copyright (c) 2011-2012 Jeff Hoefs <[email protected]> * Released under the MIT license. See LICENSE file for details. */ JSUTILS.namespace('BO.custom.ID12RFIDReader'); /** * @namespace BO.custom */ BO.custom.ID12RFIDReader = (function() { var ID12RFIDReader; // private static constants: var ID12_READER = 13, READ_EVENT = 1, REMOVE_EVENT = 2; // dependencies var EventDispatcher = JSUTILS.EventDispatcher, IOBoardEvent = BO.IOBoardEvent, RFIDEvent = BO.custom.RFIDEvent; /** * Creates an interface to an ID-12 RFID Reader. Other Innovations * RFID readers will likely work but have not been tested. This object * requires firmware other than StandardFirmata to be uploaded to the I/O board. * See [Breakout/custom\_examples/rfid_example1.html](https://github.com/soundanalogous/Breakout/blob/master/custom_examples/rfid_example1.html) * and [rfid\_example2.html](https://github.com/soundanalogous/Breakout/blob/master/custom_examples/rfid_example2.html) for * example applications. * * <p>To use this object with standard io objects in Breakout, * RFIDFirmata must be uploaded to the IOBoard rather than StandardFirmata. * See custom_examples/readme.txt for insturctions.</p> * * <p>Is is also possible to create a custom application for your * IOBoard that includes the RFID reader. See IDx_Reader_Firmata_Example * in the IDxRFIDReader library example files.</p> * * @class ID12RFIDReader * @constructor * @uses JSUTILS.EventDispatcher * @param {IOBoard} board A reference to the IOBoard instance * @param {Number} readerId The ID assigned to the reader in the firmware * running on the IOBoard (default = 13) */ ID12RFIDReader = function(board, readerId) { "use strict"; this.name = "ID12RFIDReader"; this._readerId = readerId || ID12_READER; this._board = board; this._evtDispatcher = new EventDispatcher(this); board.addEventListener(IOBoardEvent.SYSEX_MESSAGE, this.onSysExMessage.bind(this)); }; ID12RFIDReader.prototype = { constructor: ID12RFIDReader, // private methods: /** * @private * @method onSysExMessage */ onSysExMessage: function(event) { var message = event.message; if (message[0] != this._readerId) { return; } else { this.processRFIDData(message); } }, // this is nice! found it here: // http://stackoverflow.com/questions/57803/how-to-convert-decimal-to-hex-in-javascript /** * @private * @method dec2hex */ dec2hex: function(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }, /** * @private * @method processRFIDData */ processRFIDData: function(data) { var tagEvent = this._board.getValueFromTwo7bitBytes(data[1], data[2]); var tagEventType = ""; var tag = ""; for (var i = 3, len = data.length; i < len; i += 2) { tag += this.dec2hex(this._board.getValueFromTwo7bitBytes(data[i], data[i + 1])); } // change this to dispatch a single event and handle add or remove in object parameter? if (tagEvent == READ_EVENT) { this.dispatch(new RFIDEvent(RFIDEvent.ADD_TAG, tag)); } else if (tagEvent == REMOVE_EVENT) { this.dispatch(new RFIDEvent(RFIDEvent.REMOVE_TAG, tag)); } else { // got something else return; } }, /** * @private * @method dispatch */ dispatch: function(event) { this.dispatchEvent(event); }, // public methods: /* implement EventDispatcher */ /** * @param {String} type The event type * @param {Function} listener The function to be called when the event is fired */ addEventListener: function(type, listener) { this._evtDispatcher.addEventListener(type, listener); }, /** * @param {String} type The event type * @param {Function} listener The function to be called when the event is fired */ removeEventListener: function(type, listener) { this._evtDispatcher.removeEventListener(type, listener); }, /** * @param {String} type The event type * return {boolean} True is listener exists for this type, false if not. */ hasEventListener: function(type) { return this._evtDispatcher.hasEventListener(type); }, /** * @param {Event} type The Event object * @param {Object} optionalParams Optional parameters to assign to the event object. * return {boolean} True if dispatch is successful, false if not. */ dispatchEvent: function(event, optionalParams) { return this._evtDispatcher.dispatchEvent(event, optionalParams); } }; // document events /** * The addTag event is dispatched when a new tag is read. * @type BO.custom.RFIDEvent.ADD_TAG * @event addTag * @param {BO.custom.ID12RFIDReader} target A reference to the ID12RFIDReader object. * @param {String} tag The RFID tag value. */ /** * The removeTag event is dispatched when a tag is removed from the reader. * @type BO.custom.RFIDEvent.REMOVE_TAG * @event removeTag * @param {BO.custom.ID12RFIDReader} target A reference to the ID12RFIDReader object. * @param {String} tag The RFID tag value. */ return ID12RFIDReader; }());
