olorin
Version:
CoffeeScript Myo Bindings
160 lines (136 loc) • 17 kB
JavaScript
;
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