myo-ts
Version:
Typescript and Javascript bindings for Myo, refactored to provide a clean interface
151 lines • 5.99 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Myo_1 = require("./Myo");
const types_1 = require("./types");
class MyoManager {
constructor() {
this.defaults = {
apiVersion: 3,
socketUrl: "ws://127.0.0.1:10138/myo/",
appID: "com.myojs.default"
};
this.eventHandlers = new Map();
this.eventHandlersAll = new Array();
this.eventCounter = 0;
this.lockingPolicy = "standard" /* Standard */;
this.myos = [];
}
onError() {
throw "MYO: Error with the socket connection. Myo Connect might not be running. If it is, double check the API version.";
}
setLockingPolicy(policy) {
this.sendCommand({
command: "set_locking_policy",
type: policy
});
this.lockingPolicy = policy;
}
emit(name, myo, ...args) {
const handler = this.eventHandlers.get(name);
if (handler !== undefined) {
handler.fn(myo, ...args);
}
this.eventHandlersAll.forEach(h => h.fn(undefined, ...args));
}
on(name, fn) {
const id = `${Date.now()}${this.eventCounter++}`;
const handler = { id, name, fn };
if (name === "*") {
this.eventHandlersAll.push(handler);
}
else {
this.eventHandlers.set(name, handler);
}
}
off(name) {
if (name === "*") {
this.eventHandlersAll = []; // this is not really optimal
}
else {
this.eventHandlers.delete(name);
}
}
connect(newAppID, newSocketURL) {
if (newAppID) {
this.defaults.appID = newAppID;
}
if (newSocketURL) {
this.defaults.socketUrl = newSocketURL;
}
const { socketUrl, apiVersion, appID } = this.defaults;
const s = new WebSocket(`${socketUrl}${apiVersion}?appid=${appID}`);
s.onmessage = msg => this.handleMessage(msg);
s.onopen = ev => this.emit("ready" /* Ready */, undefined, ev);
s.onclose = ev => this.emit("socket_closed" /* SocketClosed */, undefined, ev);
s.onerror = this.onError;
this.socket = s;
}
disconnect() {
if (this.socket === undefined)
throw new Error("socket was not connected");
this.socket.close();
}
sendCommand(data) {
if (this.socket === undefined)
throw new Error("socket was not connected");
this.socket.send(JSON.stringify(["command", data]));
}
handleMessage(msg) {
const data = JSON.parse(msg.data)[1];
if (!data.type || data.myo === undefined)
return;
if (data.type === "paired" /* Paired */) {
const exists = this.myos.some(myo => myo.macAddress === data.mac_address);
if (!exists) {
const { mac_address, name, myo } = data;
this.myos.push(new Myo_1.Myo(mac_address, name, myo, this));
}
}
const myo = this.myos.find(myo => myo.connectIndex === data.myo);
if (myo !== undefined) {
switch (data.type) {
case "pose" /* Pose */:
myo.pose(data);
break;
case "orientation" /* Orientation */:
myo.orientation(data);
break;
case "emg" /* EMG */:
const { emg, timestamp } = data;
this.emit("emg" /* EMG */, myo, emg, timestamp);
break;
case "unlocked" /* Unlocked */:
myo.isLocked = false;
break;
case "rssi" /* RSSI */:
myo.updateBluetooth(data);
break;
case "battery_level" /* BatteryLevel */:
myo.updateBatteryLevel(data);
break;
case "arm_synced" /* ArmSynced */:
myo.syncArm(data);
this.emit("arm_synced" /* ArmSynced */, myo, data, data.timestamp);
break;
case "arm_unsynced" /* ArmUnsynced */:
myo.unsyncArm();
this.emit("arm_unsynced" /* ArmUnsynced */, myo, data, data.timestamp);
break;
case "connected" /* Connected */:
const dto = data;
myo.connectVersion = dto.version.join(".");
myo.isConnected = true;
this.emit("connected" /* Connected */, myo, dto, dto.timestamp);
break;
case "disconnected" /* Disconnected */:
myo.isConnected = false;
this.emit("disconnected" /* Disconnected */, myo, data, data.timestamp);
break;
case "locked" /* Locked */:
myo.isLocked = true;
this.emit("locked" /* Locked */, myo, data, data.timestamp);
break;
case "warmup_completed" /* WarmupCompleted */:
myo.warmupState = "warm" /* Warm */;
this.emit("warmup_completed" /* WarmupCompleted */, myo, data, data.timestamp);
break;
case "paired" /* Paired */:
this.emit("paired" /* Paired */, myo, data, data.timestamp);
break;
default:
console.log(data.type);
break;
}
if (types_1.isMMStatusEvent(data.type)) {
this.emit("status" /* Status */, myo, data, data.timestamp);
}
}
}
}
exports.MyoManager = MyoManager;
//# sourceMappingURL=MyoManager.js.map