weblab-instrument
Version:
communication with instrument through usb
476 lines (432 loc) • 16.3 kB
JavaScript
/* eslint no-restricted-syntax: 0 */
/* eslint no-await-in-loop: 0 */
const fs = require('fs');
const exec = require('child_process').exec;
const async = require('async');
const path = require('path');
const debug = require('debug');
const log = debug('inst-driver:log');
const usbDev = require('./dev/devUsb.js');
const dsoDev = require('./dso.js');
const afgDev = require('./afg.js');
const dmmDev = require('./dmm.js');
const pwrDev = require('./pwr.js');
const lcrDev = require('./lcr.js');
const supportDevice = require('./sys/sysConstant.js').supportDevice;
const os = require('os');
const connectedDevice = [];
function newDevInstance(devlist, registeMdns) {
// devlist properties
// manufacturer,
// deviceName,
// serialNumber,
// comName,
// type,
// dateCode,
// baudrate,
// vendorId,
// productId
devlist.map((dev) => {
let devDri;
let radix;
if (os.platform() === 'win32') {
radix = 16;
} else {
radix = 10;
}
log('map device:');
log(dev);
Object.keys(supportDevice).forEach((index) => {
log(`supportDevice :${supportDevice[index]}`);
log(`supportDevice vid :${supportDevice[index].vid}`);
log(`supportDevice pid :${supportDevice[index].pid}`);
if (parseInt(dev.vendorId, radix) === parseInt(supportDevice[index].vid, 16)
&& parseInt(dev.productId, radix) === parseInt(supportDevice[index].pid, 16)) {
let y;
let len;
const newConnectedDev = {
id: '',
devInfo: dev,
devDri: {},
opened: false,
};
log('connectedDevice:');
log(connectedDevice);
for (y = 0, len = connectedDevice.length; y < len; y += 1) {
if (dev.comName === connectedDevice[y].devInfo.comName) {
return;
}
}
log(`supportDevice type :${supportDevice[index].type}`);
switch (supportDevice[index].type) {
case 'DSO':
log('create DSO usb instance');
devDri = dsoDev.DsoUSB(dev);
newConnectedDev.devDri = devDri;
// connectedDevice.push( newConnectedDev );
devDri.connect()
.then(() => {
log('dso connect done');
devDri.model().then((info) => {
dev.deviceName = info.model;
dev.driverID = `${dev.type}-${info.serialNumber}`;
dev.serialNumber = info.serialNumber;
newConnectedDev.id = dev.driverID;
if (os.platform() !== 'win32') {
connectedDevice.push(newConnectedDev);
registeMdns(dev);
} else {
devDri.disconnect().then(() => {
connectedDevice.push(newConnectedDev);
registeMdns(dev);
})
.catch((e) => {
log('dso disconnect error');
log(e);
});
}
});
})
.catch(() => {
devDri.disconnect().then(() => {
log('disconnect dso device');
});
});
break;
case 'AFG':
log('create AFG usb instance');
devDri = afgDev.AfgUSB(dev);
newConnectedDev.devDri = devDri;
// connectedDevice.push( newConnectedDev );
devDri.connect()
.then(() => {
log('afg connect done');
devDri.model().then((info) => {
dev.deviceName = info.model;
dev.driverID = `${dev.type}-${info.serialNumber}`;
dev.serialNumber = info.serialNumber;
newConnectedDev.id = dev.driverID;
connectedDevice.push(newConnectedDev);
if (os.platform() !== 'win32') {
registeMdns(dev);
} else {
devDri.disconnect().then(() => {
registeMdns(dev);
});
}
});
})
.catch(() => {
devDri.disconnect().then(() => {
log('disconnect afg device');
});
});
break;
case 'DMM':
log('create DMM usb instance');
devDri = dmmDev.DmmUSB(dev);
newConnectedDev.devDri = devDri;
devDri.connect()
.then(() => {
log('dmm connect done');
devDri.model().then((info) => {
dev.deviceName = info.model;
dev.driverID = `${dev.type}-${info.serialNumber}`;
dev.serialNumber = info.serialNumber;
newConnectedDev.id = dev.driverID;
connectedDevice.push(newConnectedDev);
if (os.platform() !== 'win32') {
registeMdns(dev);
} else {
devDri.disconnect().then(() => {
registeMdns(dev);
});
}
});
})
.catch(() => {
devDri.disconnect().then(() => {
log('disconnect dmm device');
});
});
break;
case 'PWS':
log('create PWS usb instance');
devDri = pwrDev.PwrUSB(dev);
newConnectedDev.devDri = devDri;
// connectedDevice.push( newConnectedDev );
devDri.connect()
.then(() => {
log('pwr connect done');
devDri.model().then((info) => {
dev.deviceName = info.devModel;
dev.serialNumber = info.serialNumber;
dev.driverID = `${dev.type}-${info.serialNumber}`;
newConnectedDev.id = dev.driverID;
log(connectedDevice);
connectedDevice.push(newConnectedDev);
if (os.platform() !== 'win32') {
registeMdns(dev);
} else {
devDri.disconnect().then(() => {
registeMdns(dev);
});
}
});
})
.catch(() => {
devDri.disconnect().then(() => {
log('disconnect pws device');
});
});
break;
case 'LCR':
log('create LCR usb instance');
devDri = lcrDev.LcrUSB(dev);
newConnectedDev.devDri = devDri;
// connectedDevice.push( newConnectedDev );
devDri.connect()
.then(() => {
log('lcr connect done');
devDri.model().then((info) => {
dev.deviceName = info.devModel;
dev.serialNumber = info.serialNumber;
dev.driverID = `${dev.type}-${info.serialNumber}`;
newConnectedDev.id = dev.driverID;
log(connectedDevice);
connectedDevice.push(newConnectedDev);
if (os.platform() !== 'win32') {
registeMdns(dev);
} else {
devDri.disconnect().then(() => {
registeMdns(dev);
});
}
});
})
.catch(() => {
devDri.disconnect().then(() => {
log('disconnect lcr device');
});
});
break;
default:
break;
}
}
});
return dev;
});
}
export function updateValidDevice(registeMdns) {
log('updateValidDevice');
// do this for docker environment
if (os.platform() !== 'win32') {
fs.readdir('/dev', (err, files) => {
if (err) {
return;
}
// only get serial port names
for (let i = files.length - 1; i >= 0; i -= 1) {
if ((files[i].indexOf('ttyS') === -1 && files[i].indexOf('ttyACM') === -1 && files[i].indexOf('ttyUSB') === -1 && files[i].indexOf('ttyAMA') === -1) || !fs.statSync(path.join('/dev', files[i])).isCharacterDevice()) {
files.splice(i, 1);
}
}
async.map(files, (file, callback) => {
const fileName = path.join('/dev', file);
exec(`/sbin/udevadm test $(/sbin/udevadm info -n ${fileName} -q path)`, () => {
callback();
});
});
});
}
usbDev.listUsbDevice((devList) => {
if (devList === undefined) {
log('devList undefined');
return;
}
if (devList !== '') {
newDevInstance(devList, registeMdns);
}
});
}
// function getDeviceListWithDelay(device, callback) {
// return new Promise(((resolve) => {
// log('add device: ');
// log(device);
// updateValidDevice((validDev) => {
// log('updateValidDevice done');
// callback(validDev);
// resolve();
// });
// }));
// }
function getUsbDevice() {
log('validDevice');
const devInfo = [];
let i;
const len = connectedDevice.length;
for (i = 0; i < len; i += 1) {
devInfo.push(connectedDevice[i].devInfo);
}
log('devInfo device list');
log(devInfo);
log('-----------------');
return devInfo;
}
// function getConnectedDev(device, callback) {
// let i;
// let len;
// log('getConnectedDev');
// for (i = 0, len = connectedDevice.length; i < len; i += 1) {
// if (device.serialNumber === connectedDevice[i].devInfo.serialNumber) {
// callback('', connectedDevice[i].id);
// return;
// }
// }
// callback(['404', ' device not ready']);
// }
function getDevDriver(id) {
let i;
let len;
let devDri = {};
log('getDevDriver');
log(id);
log('------------');
for (i = 0, len = connectedDevice.length; i < len; i += 1) {
if (id === connectedDevice[i].id) {
devDri = connectedDevice[i].devDri;
return devDri;
}
}
return null;
}
function onAddUsb() {
usbDev.regAddEvent((dev) => {
log(dev);
});
}
function onRemoveUsb(callback) {
usbDev.regRemoveEvent((device) => {
let i;
let len;
let devDri = null;
let radix;
log('usb remove');
log(device);
log(`remove: ${device}`);
log('connectedDevice');
log(connectedDevice);
log('--------------------');
for (i = 0, len = connectedDevice.length; i < len; i += 1) {
log(connectedDevice[i]);
log(connectedDevice[i].devInfo.serialNumber);
if (os.platform() === 'win32') {
radix = 16;
} else {
radix = 10;
}
if (parseInt(device.vendorId, 10)
=== parseInt(connectedDevice[i].devInfo.vendorId, radix) &&
parseInt(device.productId, 10)
=== parseInt(connectedDevice[i].devInfo.productId, radix)) {
devDri = connectedDevice[i].devDri;
device.serialNumber = connectedDevice[i].devInfo.serialNumber;
break;
}
}
if (devDri !== null) {
devDri.closeDev().then(() => {
delete connectedDevice[i].devDri;
connectedDevice.splice(i, 1);
log(connectedDevice);
log('--------------------');
callback(device);
});
}
});
}
function findType(pid) {
let i;
let radix;
if (os.platform() === 'win32') {
radix = 16;
} else {
radix = 10;
}
for (i in supportDevice) {
if (Object.prototype.hasOwnProperty.call(supportDevice, i)) {
if (parseInt(pid, radix) === parseInt(supportDevice[i].pid, 16)) {
return supportDevice[i].type;
}
}
}
return null;
}
function openDevice(id) {
log('openDevice:');
log(id);
log('------------');
return new Promise(((resolve) => {
let checked = 0;
if (os.platform() !== 'win32') {
resolve();
} else {
for (let i = 0, len = connectedDevice.length; i < len; i += 1) {
if (id === connectedDevice[i].id) {
const dev = connectedDevice[i];
const devDri = dev.devDri;
checked = 1;
devDri.connect(true).then(() => {
dev.opened = true;
resolve();
})
.catch((err) => {
log(`err openDevice :${err}`);
resolve();
});
break;
}
}
if (!checked) {
resolve();
}
}
}));
}
function closeDevice() {
if (os.platform() === 'win32') {
connectedDevice.map((dev) => {
const devDri = dev.devDri;
if (devDri.closeDev) {
devDri.closeDev().then(() => {
dev.opened = false;
return dev.opened;
});
}
return false;
});
}
return false;
}
function isOpened(id) {
if (os.platform() !== 'win32') {
return true;
}
for (let i = 0, len = connectedDevice.length; i < len; i += 1) {
if (id === connectedDevice[i].id) {
return connectedDevice[i].opened;
}
}
return false;
}
export {
getUsbDevice,
getDevDriver,
onAddUsb,
onRemoveUsb,
findType,
openDevice,
closeDevice,
isOpened,
};