UNPKG

weblab-instrument

Version:
476 lines (432 loc) 16.3 kB
/* 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, };