weblab-instrument
Version:
communication with instrument through usb
328 lines (299 loc) • 12.5 kB
JavaScript
/* 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;