UNPKG

dynanode

Version:

Node.js library for Dynamixel motors

164 lines (135 loc) 3.67 kB
/* MotorSystem.js - main entry point for DynaNode * * Events: * - motorAdded [Motor Object] * - motorRemoved [Motor ID] * * Methods: * - constructor [baudRate] [searchFequencyMS] * - init * - setSearchFrequency [frequencyMS] * - getSearchFrequency [frequencyMS] * - addToBlackList [comPortName] * - removeFromBlackList [comPortName] * - getMotors [[Motor,..,Motor]] * - terminate * * SEE Motor.js for details of Motor events and methods. * * USAGE: var MotorSystem = require("dynanode"); * var ms = new MotorSystem(1000000,1200); * ms.on("motorAdded",funciton(d) { console.log(d); }); * ms.init(); */ var path = require("path"); var fs = require("fs"); var MotorNetwork = require(path.join(path.dirname(fs.realpathSync(__filename)), './MotorNetwork')); var util = require("util"); var events = require("events"); var MotorSystem = function(baudRate,searchFrequencyMS) { var self = this; var baudRate = baudRate || 1000000; var searchFrequency = searchFrequencyMS || 1200; var blackList = []; var searchThread = null; var networks = []; var searching = false; var searchFunction = function() { if(!searching) { searching = true; MotorNetwork.listPorts(function(err,pts){ for(var i=0; i<pts.length; i++) { var use = true; for(var j=0; j<blackList.length; j++) { if(blackList[j] === pts[i]) { use = false; break; } } for(var j=0; j<networks.length; j++) { if(networks[j].getName() === pts[i]) { use = false; break; } } if(use) { var mn = new MotorNetwork(pts[i],baudRate); networks.push(mn); self.emit("networkAdded",{name:pts[i]}); mn.on("motorAdded",function(d) { self.emit("motorAdded",{motor:d.motor}); }); mn.on("motorRemoved",function(d) { self.emit("motorRemoved",{id:d.id}); }); mn.on("statUpdate",function(d) { //TODO: handle stat updates }); mn.on("terminated",function(d) { self.emit("networkRemoved",{name:mn.getName()}); for(var j=0; j<networks.length; j++) { if(networks[j].getName() === mn.getName()) { networks.splice(j,1); j--; } } }); mn.init(); } } searching = false; }); } }; this.init = function() { searchThread = setInterval(searchFunction,searchFrequency); return true; }; this.setSearchFrequency = function(frequencyMS) { if(searchThread !== null) { searchFrequency = frequencyMS; clearInterval(searchThread); searchThread = setInterval(searchFunction,searchFrequency); return true; } return false; }; this.getSearchFrequency = function() { return searchFrequency; }; this.addToBlackList = function(comPortName) { blackList.push(comPortName); }; this.removeFromBlackList = function(comPortName) { for(var i=0; i<blackList.length; i++) { if(blackList[i] === comPortName) { blackList.splice(i,1); i--; } } }; this.getMotors = function() { var mtrs = []; for(var i=0; i<networks.length; i++) { var ms = networks[i].getMotors(); for(var j=0; j<ms.length; j++) { mtrs.push(ms[j]); } } return mtrs; }; this.terminate = function() { clearInterval(searchThread); for(var i=0; i<networks.length; i++) networks[i].terminate(); }; this.scan = function(start,end) { for(var j=0; j<networks.length; j++) { for(var i=start; i<=end; i++) { networks[j].scan(i); } } }; }; util.inherits(MotorSystem,events.EventEmitter); module.exports = MotorSystem;