UNPKG

olorin

Version:
160 lines (136 loc) 17 kB
"use strict"; var Hub, Myo, Session, connection, events, _, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; _ = require('underscore'); events = require('./events'); connection = require('./connection'); Myo = (function(_super) { var defaultConfiguration, _id; __extends(Myo, _super); defaultConfiguration = {}; _id = 0; function Myo(configuration) { Myo.__super__.constructor.apply(this, arguments); this.configuration = _.extend({}, Myo.defaultConfiguration, configuration); this.id = Myo._id++; this.session = null; } Myo.prototype.destroy = function() { return this.trigger('destroy'); }; return Myo; })(events.Events); Session = (function() { function Session(myo, arm, direction) { this.myo = myo; this.arm = arm; this.direction = direction; this.pose = null; this.eventsQueue = []; } Session.prototype.initialize = function() {}; return Session; })(); Hub = (function() { function Hub(connection) { this.connection = connection; this.onMessage = __bind(this.onMessage, this); this.myos = {}; this.onMessageSubscription = this.connection.on('message', this.onMessage); } Hub.baseEventHandlers = { arm_recognized: function(myo, eventData) { if (myo.session) { myo.session.close(); } myo.session = new Session(this, eventData.arm, eventData.x_direction); return myo.trigger(new events.Event('arm_recognized')); }, arm_lost: function(myo, eventData) { if (myo.session) { myo.session.close(); } myo.session = null; return myo.trigger(new events.Event('arm_lost')); }, pose: function(myo, eventData) { if (!myo.session) { throw new Error('No session found'); } myo.session.pose = eventData.pose; return myo.trigger(new events.Event('pose', eventData.pose)); }, orientation: function(myo, eventData) { var accelerometerData, gyroscopeData, imuData, orientationData; orientationData = { x: eventData.orientation.x, y: eventData.orientation.y, z: eventData.orientation.z, w: eventData.orientation.w }; gyroscopeData = { x: eventData.gyroscope[0], y: eventData.gyroscope[1], z: eventData.gyroscope[2] }; accelerometerData = { x: eventData.accelerometer[0], y: eventData.accelerometer[1], z: eventData.accelerometer[2] }; imuData = { gyroscope: gyroscopeData, accelerometer: accelerometerData, orientation: orientationData }; myo.trigger(new events.Event('orientation', orientationData)); myo.trigger(new events.Event('gyroscope', gyroscopeData)); myo.trigger(new events.Event('accelerometer', accelerometerData)); return myo.trigger(new events.Event('imu', imuData)); }, rssi: function(myo, eventData) { return myo.trigger(new events.Event('bluetooth_strength', eventData.rssi)); }, connected: function(myo, eventData) { return myo.trigger(new events.Event('connected')); }, disconnected: function(myo, eventData) { return myo.trigger(new events.Event('disconnected')); } }; Hub.prototype.onMessage = function(messageType, eventData) { var baseEventHandler, myo; myo = this.myos[eventData.myo]; if (!myo) { throw new Error('Specified Myo not found'); } baseEventHandler = Hub.baseEventHandlers[eventData.type]; if (!baseEventHandler) { throw new Error('Event data type not recognized'); } return baseEventHandler(myo, eventData); }; Hub.prototype.create = function(configuration) { var newMyo; newMyo = new Myo(configuration); this.myos[newMyo.id] = newMyo; newMyo.on('destroy', (function(_this) { return function() { return _this.myos[newMyo.id] = null; }; })(this)); return newMyo; }; Hub.prototype.destroy = function() { this.onMessageSubscription.dispose(); return this.connection.close(); }; return Hub; })(); _.extend(exports, { Hub: Hub, Myo: Myo }); //# sourceMappingURL=data:application/json;base64,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LElBQUMsQ0FBQSxxQkFBcUIsQ0FBQyxPQUF2QixDQUFBLENBQUEsQ0FBQTtXQUNBLElBQUMsQ0FBQSxVQUFVLENBQUMsS0FBWixDQUFBLEVBRks7RUFBQSxDQXhGVCxDQUFBOzthQUFBOztJQTNDSixDQUFBOztBQUFBLENBd0lDLENBQUMsTUFBRixDQUFTLE9BQVQsRUFBa0I7QUFBQSxFQUNkLEdBQUEsRUFBSyxHQURTO0FBQUEsRUFFZCxHQUFBLEVBQUssR0FGUztDQUFsQixDQXhJQSxDQUFBIiwiZmlsZSI6Im9sb3Jpbi5qcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbl8gPSByZXF1aXJlKCd1bmRlcnNjb3JlJylcbmV2ZW50cyA9IHJlcXVpcmUoJy4vZXZlbnRzJylcbmNvbm5lY3Rpb24gPSByZXF1aXJlKCcuL2Nvbm5lY3Rpb24nKVxuXG5cbmNsYXNzIE15byBleHRlbmRzIGV2ZW50cy5FdmVudHNcbiAgICBkZWZhdWx0Q29uZmlndXJhdGlvbiA9IHt9XG4gICAgX2lkID0gMFxuXG4gICAgIyBNeW8gY29uc3RydWN0b3JcbiAgICAjIEBwYXJhbSB7b2JqZWN0fSBjb25maWd1cmF0aW9uXG4gICAgY29uc3RydWN0b3I6IChjb25maWd1cmF0aW9uKSAtPlxuICAgICAgICBzdXBlclxuICAgICAgICBAY29uZmlndXJhdGlvbiA9IF8uZXh0ZW5kKHt9LCBNeW8uZGVmYXVsdENvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pXG4gICAgICAgIEBpZCA9IE15by5faWQrKyAgIyBub3Qgc3VyZSBhYm91dCB0aGlzIG9uZVxuICAgICAgICBAc2Vzc2lvbiA9IG51bGxcblxuICAgIGRlc3Ryb3k6ICgpIC0+XG4gICAgICAgIEB0cmlnZ2VyKCdkZXN0cm95JylcblxuXG5jbGFzcyBTZXNzaW9uXG4gICAgIyBTZXNzaW9uIGNvbnN0cnVjdG9yXG4gICAgIyBAcGFyYW0ge015b30gbXlvXG4gICAgIyBAcGFyYW0ge1N0cmluZ30gYXJtIHtsZWZ0fHJpZ2h0fVxuICAgICMgQHBhcmFtIHtTdHJpbmd9IGRpcmVjdGlvbiAjIG5vdCBzdXJlIGFib3V0IHRoaXMgb25lXG4gICAgY29uc3RydWN0b3I6IChAbXlvLCBAYXJtLCBAZGlyZWN0aW9uKSAtPlxuICAgICAgICBAcG9zZSA9IG51bGxcbiAgICAgICAgQGV2ZW50c1F1ZXVlID0gW11cblxuICAgIGluaXRpYWxpemU6ICgpIC0+XG4gICAgICAgICMgaGVyZSBJIHdhbnQgdG8gYWRkIGFuIGluaXRpYWxpemF0aW9uIG9mIHRoZSB1c2VyIHNlc3Npb24gb24gdGhlIGFybWJhbmQsIHJlZ2lzdGVyaW5nIGNvbW1vbiBhY3Rpb25zIGp1c3QgdG9cbiAgICAgICAgIyBrbm93IHRoZSB1c2VyIGJldHRlciBhbmQgYWRhcHQgdG8gaGlzIGhhYml0c1xuICAgICAgICAjIGV2ZXJ5IHBlcnNvbiBoYXMgYSBkaWZmZXJlbnQgc3RyZW5ndGggd2hlbiBwZXJmb3JtaW5nIGRpZmZlcmVudCBhY3Rpb25zLCByZWdpc3RlcmluZyBjb21tb25nIGFjdGlvbnMgd2lsbFxuICAgICAgICAjIG1ha2UgaXQgZWFzaWVyIHRvIGFkYXB0IGFjdGlvbnMgYmFzZWQgb24gdXNlcidzIHNlbnNpdGl2aXR5XG5cblxuY2xhc3MgSHViXG4gICAgIyBIdWIgY29uc3RydWN0b3JcbiAgICAjIEFuIGh1YiBpcyByZXNwb25zaWJsZSB0byBrZWVwIHRyYWNrIG9mIGFsbCB0aGUgbXlvcyBjcmVhdGVkIGFuZCB0byBkZWxpdmVyIG1lc3NhZ2VzIHRvIHRoZSBjb3JyZWN0IG15b1xuICAgICMgQHBhcmFtIHtDb25uZWN0aW9ufSBjb25uZWN0aW9uXG4gICAgY29uc3RydWN0b3I6IChAY29ubmVjdGlvbikgLT5cbiAgICAgICAgQG15b3MgPSB7fVxuICAgICAgICBAb25NZXNzYWdlU3Vic2NyaXB0aW9uID0gQGNvbm5lY3Rpb24ub24oJ21lc3NhZ2UnLCBAb25NZXNzYWdlKVxuXG4gICAgQGJhc2VFdmVudEhhbmRsZXJzID0ge1xuICAgICAgICBhcm1fcmVjb2duaXplZDogKG15bywgZXZlbnREYXRhKSAtPlxuICAgICAgICAgICAgaWYgbXlvLnNlc3Npb25cbiAgICAgICAgICAgICAgICBteW8uc2Vzc2lvbi5jbG9zZSgpXG5cbiAgICAgICAgICAgIG15by5zZXNzaW9uID0gbmV3IFNlc3Npb24oQCwgZXZlbnREYXRhLmFybSwgZXZlbnREYXRhLnhfZGlyZWN0aW9uKVxuICAgICAgICAgICAgbXlvLnRyaWdnZXIobmV3IGV2ZW50cy5FdmVudCgnYXJtX3JlY29nbml6ZWQnKSlcblxuICAgICAgICBhcm1fbG9zdDogKG15bywgZXZlbnREYXRhKSAtPlxuICAgICAgICAgICAgaWYgbXlvLnNlc3Npb25cbiAgICAgICAgICAgICAgICBteW8uc2Vzc2lvbi5jbG9zZSgpXG5cbiAgICAgICAgICAgIG15by5zZXNzaW9uID0gbnVsbFxuICAgICAgICAgICAgbXlvLnRyaWdnZXIobmV3IGV2ZW50cy5FdmVudCgnYXJtX2xvc3QnKSlcblxuICAgICAgICBwb3NlOiAobXlvLCBldmVudERhdGEpIC0+XG4gICAgICAgICAgICBpZiBub3QgbXlvLnNlc3Npb25cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlc3Npb24gZm91bmQnKVxuXG4gICAgICAgICAgICBteW8uc2Vzc2lvbi5wb3NlID0gZXZlbnREYXRhLnBvc2VcbiAgICAgICAgICAgIG15by50cmlnZ2VyKG5ldyBldmVudHMuRXZlbnQoJ3Bvc2UnLCBldmVudERhdGEucG9zZSkpXG5cbiAgICAgICAgb3JpZW50YXRpb246IChteW8sIGV2ZW50RGF0YSkgLT5cbiAgICAgICAgICAgICMgYWRkIGFuIG9mZnNldCB0byB0aGUgb3JpZW50YXRpb24gZGF0YT9cbiAgICAgICAgICAgIG9yaWVudGF0aW9uRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB4OiBldmVudERhdGEub3JpZW50YXRpb24ueFxuICAgICAgICAgICAgICAgIHk6IGV2ZW50RGF0YS5vcmllbnRhdGlvbi55XG4gICAgICAgICAgICAgICAgejogZXZlbnREYXRhLm9yaWVudGF0aW9uLnpcbiAgICAgICAgICAgICAgICB3OiBldmVudERhdGEub3JpZW50YXRpb24ud1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3lyb3Njb3BlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB4OiBldmVudERhdGEuZ3lyb3Njb3BlWzBdXG4gICAgICAgICAgICAgICAgeTogZXZlbnREYXRhLmd5cm9zY29wZVsxXVxuICAgICAgICAgICAgICAgIHo6IGV2ZW50RGF0YS5neXJvc2NvcGVbMl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjY2VsZXJvbWV0ZXJEYXRhID0ge1xuICAgICAgICAgICAgICAgIHg6IGV2ZW50RGF0YS5hY2NlbGVyb21ldGVyWzBdXG4gICAgICAgICAgICAgICAgeTogZXZlbnREYXRhLmFjY2VsZXJvbWV0ZXJbMV1cbiAgICAgICAgICAgICAgICB6OiBldmVudERhdGEuYWNjZWxlcm9tZXRlclsyXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW11RGF0YSA9IHtcbiAgICAgICAgICAgICAgICBneXJvc2NvcGU6IGd5cm9zY29wZURhdGFcbiAgICAgICAgICAgICAgICBhY2NlbGVyb21ldGVyOiBhY2NlbGVyb21ldGVyRGF0YVxuICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvbkRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG15by50cmlnZ2VyKG5ldyBldmVudHMuRXZlbnQoJ29yaWVudGF0aW9uJywgb3JpZW50YXRpb25EYXRhKSlcbiAgICAgICAgICAgIG15by50cmlnZ2VyKG5ldyBldmVudHMuRXZlbnQoJ2d5cm9zY29wZScsIGd5cm9zY29wZURhdGEpKVxuICAgICAgICAgICAgbXlvLnRyaWdnZXIobmV3IGV2ZW50cy5FdmVudCgnYWNjZWxlcm9tZXRlcicsIGFjY2VsZXJvbWV0ZXJEYXRhKSlcbiAgICAgICAgICAgIG15by50cmlnZ2VyKG5ldyBldmVudHMuRXZlbnQoJ2ltdScsIGltdURhdGEpKVxuXG4gICAgICAgIHJzc2k6IChteW8sIGV2ZW50RGF0YSkgLT5cbiAgICAgICAgICAgIG15by50cmlnZ2VyKG5ldyBldmVudHMuRXZlbnQoJ2JsdWV0b290aF9zdHJlbmd0aCcsIGV2ZW50RGF0YS5yc3NpKSlcblxuICAgICAgICBjb25uZWN0ZWQ6IChteW8sIGV2ZW50RGF0YSkgLT5cbiMgICAgICAgICAgICBteW8uY29ubmVjdF92ZXJzaW9uID0gZGF0YS52ZXJzaW9uLmpvaW4oJy4nKTtcbiAgICAgICAgICAgIG15by50cmlnZ2VyKG5ldyBldmVudHMuRXZlbnQoJ2Nvbm5lY3RlZCcpKVxuXG4gICAgICAgIGRpc2Nvbm5lY3RlZDogKG15bywgZXZlbnREYXRhKSAtPlxuICAgICAgICAgICAgIyBkZXN0cnkgbXlvIGluc3RhbmNlP1xuICAgICAgICAgICAgbXlvLnRyaWdnZXIobmV3IGV2ZW50cy5FdmVudCgnZGlzY29ubmVjdGVkJykpXG4gICAgfVxuXG4gICAgb25NZXNzYWdlOiAobWVzc2FnZVR5cGUsIGV2ZW50RGF0YSkgPT5cbiAgICAgICAgbXlvID0gQG15b3NbZXZlbnREYXRhLm15b11cblxuICAgICAgICBpZiAhbXlvXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NwZWNpZmllZCBNeW8gbm90IGZvdW5kJylcblxuICAgICAgICBiYXNlRXZlbnRIYW5kbGVyID0gSHViLmJhc2VFdmVudEhhbmRsZXJzW2V2ZW50RGF0YS50eXBlXVxuXG4gICAgICAgIGlmICFiYXNlRXZlbnRIYW5kbGVyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V2ZW50IGRhdGEgdHlwZSBub3QgcmVjb2duaXplZCcpXG5cbiAgICAgICAgYmFzZUV2ZW50SGFuZGxlcihteW8sIGV2ZW50RGF0YSlcblxuICAgIGNyZWF0ZTogKGNvbmZpZ3VyYXRpb24pIC0+XG4gICAgICAgIG5ld015byA9IG5ldyBNeW8oY29uZmlndXJhdGlvbilcbiAgICAgICAgQG15b3NbbmV3TXlvLmlkXSA9IG5ld015b1xuXG4gICAgICAgIG5ld015by5vbignZGVzdHJveScsID0+XG4gICAgICAgICAgICBAbXlvc1tuZXdNeW8uaWRdID0gbnVsbFxuICAgICAgICApXG4gICAgICAgIHJldHVybiBuZXdNeW9cblxuICAgIGRlc3Ryb3k6ICgpIC0+XG4gICAgICAgIEBvbk1lc3NhZ2VTdWJzY3JpcHRpb24uZGlzcG9zZSgpXG4gICAgICAgIEBjb25uZWN0aW9uLmNsb3NlKCkgIyBub3Qgc3VyZSBhYm91dCB0aGF0XG5cblxuXy5leHRlbmQoZXhwb3J0cywge1xuICAgIEh1YjogSHViXG4gICAgTXlvOiBNeW9cbn0pO1xuIl19