UNPKG

weblab-instrument

Version:
328 lines (299 loc) 12.5 kB
/* eslint no-restricted-syntax: 0 */ /* eslint no-await-in-loop: 0 */ /* eslint no-loop-func: 0 */ const usbDetect = require('weblab-usb-detection'); const UsbPort = require('serialport'); const debug = require('debug'); const os = require('os'); const log = debug('usb:log'); const supportDevice = require('../sys/sysConstant.js').supportDevice; let errCnt = 0; function pairUsb(dev, callback) { UsbPort.list((err, ports) => { if (err) { if (callback) { return callback(err); } return err; } log(ports); log(ports.length); log('====================='); for (let i = 0, len = ports.length; i < len; i += 1) { log('ports[%d].vendorId %x', i, ports[i].vendorId); log('ports[%d].productId %x', i, ports[i].productId); log('ports[%d].serialNumber %x', i, ports[i].serialNumber); log('dev.usb.vid %x', dev.usb.vid); log('dev.usb.pid %x', dev.usb.pid); log('comName =', dev.usb.comName); // if(ports[i].serialNumber === serialNumber || ports[i].productId == 24577){ if (ports[i].comName === dev.usb.comName) { log('comName match'); if (dev.state.conn !== 'connected') { const port = ports[i]; setTimeout(() => { dev.usb.device = new UsbPort(port.comName, { baudrate: dev.usb.baudrate, encoding: 'binary', lock: false, autoOpen: false, }); // util.inherits(dev.usb,events.EventEmitter); log('---------------------'); log(dev.usb.device); log('---------------------'); dev.interf = 'usb'; if (dev.usb.device.isOpen()) { log('USB device already opened'); if (callback) { callback(); } } else { dev.usb.device.on('error', () => { if (dev.usb.device) { if (dev.usb.device.isOpen()) { dev.usb.device.close(); } } dev.state.conn = 'disconnected'; dev.usb.device = null; dev.interf = 'empty'; }); dev.usb.device.open((error) => { if (error) { log(`error msg: ${error}`); errCnt += 1; if (errCnt > 5) { if (callback) { callback(error); } } else { setTimeout(() => { dev.usb.device = null; pairUsb(dev, callback); }, 2000); } return; } errCnt = 0; // dev.usb.device = device; dev.usb.device.flush(() => { dev.state.conn = 'connected'; log('open USB device'); dev.usb.device.on('data', dev.dataHandler); dev.state.conn = 'connected'; dev.usb.device.on('disconnect', (discErr) => { log('usb disconnect'); if (discErr) { log(discErr); } dev.state.conn = 'disconnected'; dev.usb.device = null; dev.interf = 'empty'; log('-----------------'); }); if (callback) { log('paireUsb success'); callback(error); } else { log('paireUsb success without callback'); } }); }); } }, 1500); // } } else { log('usb pair: dev already connected'); if (callback) { callback(); } } return ''; } } if (dev.usb.device) { if (dev.usb.device.isOpen()) { dev.usb.device.close(); } } dev.state.conn = 'disconnected'; dev.usb.device = null; dev.interf = 'empty'; return ''; }); } exports.openUsb = function openUsb(dev, callback) { if (!dev.usb.device) { pairUsb(dev, callback); } else { log('usd.device exist, but want to creat again'); callback(); } }; exports.closeUsb = function closeUsb(dev, callback) { if (dev.usb.device) { if (dev.usb.device.isOpen()) { dev.usb.device.close(callback); } } else { log('usd.device not exist, but want to closeUsb'); callback(); } // dev.state.conn='disconnected'; // dev.usb.device=null; // dev.interf='empty'; }; exports.BindUsbObj = function BindUsbObj(dev, device) { log('BindUsbObj'); log(device); dev.interf = 'usb'; dev.usb = { manufacturer: device.manufacturer, deviceName: device.deviceName, serialNumber: device.serialNumber, comName: device.comName, baudrate: device.baudrate, vid: device.vendorId, pid: device.productId, // usbDev:{}, device: null, // pairUsb: pairUsb, // onChange:(function(){ // log('usb onChange event'); // pairUsb(this); // }).bind(dev), write: (function write(data) { if (this.usb.device === null) { log('usb device not exist'); return false; } log(`is open ? ${this.usb.device.isOpen()}`); log(`write data=${data}`); // if(this.usb.device!==null){ if (this.usb.device.isOpen()) { this.usb.device.write(data, (err, results) => { // log('err ' + err); if (err) { // TODO : error handler log(`results ${results}`); } log('usb write done'); }); return true; } log('usb device not open !!'); // pairUsb(this,function(err){ // }); return false; // } }).bind(dev), // onData:(function(callback){ // // let device= this.usb.device; // // this.usb.device.on('data',callback); // // log(this.usb.device); // }).bind(dev) }; // pairUsb take long time, so pair before connect to use // pairUsb(dev); // usbDetect.on('add:'+vid+':'+pid, dev.usb.onChange); // usbDetect.on('remove:'+vid+':'+pid, dev.usb.onChange); }; exports.regRemoveEvent = function regRemoveEvent(callback) { usbDetect.on('remove', callback); }; exports.regAddEvent = function regAddEvent(callback) { usbDetect.on('add', callback); }; exports.listUsbDevice = function listUsbDevice(callback) { let i; let len; let j; const validDevice = []; log('listUsbDevice'); // console.log(os.arch() +" platform :" +os.platform()); UsbPort.list((err, ports) => { if (err) { log(err); if (callback) { callback(validDevice); return null; } return null; } log('get device'); log(ports); if (os.platform() === 'win32') { ports.forEach((dev) => { // pnpId return xxxxVID_0403+PID_6000xxxxxx if (!dev.pnpId) { return; } if (!dev.pnpId.match('VID')) { return; } const vidIndex = dev.pnpId.match('VID').index; const pidIndex = vidIndex + 9; const vid = dev.pnpId.slice(vidIndex + 4, vidIndex + 8); const pid = dev.pnpId.slice(pidIndex + 4, pidIndex + 8); const serialNumber = dev.pnpId.slice(vidIndex + 18, vidIndex + 27); Object.keys(supportDevice).map((key) => { const suppPid = supportDevice[key].pid.slice(2, 6); if (pid.toUpperCase() === suppPid.toUpperCase()) { validDevice.push({ manufacturer: 'GWINSTEK', // deviceName:info[1], serialNumber, comName: dev.comName, type: supportDevice[key].type, baudrate: supportDevice[key].baudrate, vendorId: vid, productId: pid, }); } return key; }); }); // return validDevice; } else { for (i = 0, len = ports.length; i < len; i += 1) { const port = ports[i]; for (j in supportDevice) { if (Object.prototype.hasOwnProperty.call(supportDevice, j)) { let info; let k; let lenIn; let manuf = ''; if (parseInt(port.vendorId, 16) === parseInt(supportDevice[j].vid, 16) && parseInt(port.productId, 16) === parseInt(supportDevice[j].pid, 16)) { info = port.serialNumber.split('_'); lenIn = info.length; if (port.productId === '0x0030') { info.splice(3, 2); info.splice(0, 2, 'GW'); // FIXME info[1] += '_VCP_PORT'; // console.log(info); } else if (port.productId === '0x6001') { info.splice(0, 4, 'GW'); info.splice(1, 0, 'GPD-4303S'); // console.log(info); } else if (lenIn > 3) { for (k = 0, lenIn -= 2; k < lenIn; k += 1) { manuf += `${info[k]}_`; } info.splice(0, lenIn, manuf.slice(0, -1)); } log(port.vendorId); log(port.productId); log(info); validDevice.push({ manufacturer: info[0], deviceName: info[1], serialNumber: info[2], comName: port.comName, type: supportDevice[j].type, baudrate: supportDevice[j].baudrate, vendorId: parseInt(port.vendorId, 16), productId: parseInt(port.productId, 16), }); break; } } } } } // console.log(validDevice); // console.log("end listUsbDevice-----------------------------") // log(validDevice.slice()); callback(validDevice); return true; }); }; // exports.pairUsb = pairUsb;