UNPKG

myo-ts

Version:

Typescript and Javascript bindings for Myo, refactored to provide a clean interface

151 lines 5.99 kB
"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