serialport-v5
Version:
fork with electron support of Node.js package to access serial ports. Linux, OSX and Windows. Welcome your robotic JavaScript overlords. Better yet, program them!
99 lines (86 loc) • 2.43 kB
JavaScript
;
const childProcess = require('child_process');
const Readline = require('../parsers/readline');
// get only serial port names
function checkPathOfDevice(path) {
return (/(tty(S|ACM|USB|AMA|MFD)|rfcomm)/).test(path) && path;
}
function propName(name) {
return {
'DEVNAME': 'comName',
'ID_VENDOR_ENC': 'manufacturer',
'ID_SERIAL_SHORT': 'serialNumber',
'ID_VENDOR_ID': 'vendorId',
'ID_MODEL_ENC': 'productId',
'DEVLINKS': 'pnpId'
}[name.toUpperCase()];
}
function decodeHexEscape(str) {
return str.replace(/\\x([a-fA-F0-9]{2})/g, (a, b) => {
return String.fromCharCode(parseInt(b, 16));
});
}
function propVal(name, val) {
if (name === 'pnpId') {
const match = val.match(/\/by-id\/([^\s]+)/);
return (match && match[1]) || undefined;
}
if (name === 'manufacturer') {
return decodeHexEscape(val);
}
if (name === 'productId') {
return decodeHexEscape(val);
}
if (/^0x/.test(val)) {
return val.substr(2);
}
return val;
}
function listLinux() {
return new Promise((resolve, reject) => {
const ports = [];
const ude = childProcess.spawn('udevadm', ['info', '-e']);
const lines = ude.stdout.pipe(new Readline());
ude.on('error', reject);
lines.on('error', reject);
let port = {};
let skipPort = false;
lines.on('data', (line) => {
const lineType = line.slice(0, 1);
const data = line.slice(3);
// new port entry
if (lineType === 'P') {
port = {
manufacturer: undefined,
serialNumber: undefined,
pnpId: undefined,
locationId: undefined,
vendorId: undefined,
productId: undefined
};
skipPort = false;
return;
}
if (skipPort) { return }
// Check dev name and save port if it matches flag to skip the rest of the data if not
if (lineType === 'N') {
if (checkPathOfDevice(data)) {
ports.push(port);
} else {
skipPort = true;
}
return;
}
// parse data about each port
if (lineType === 'E') {
const keyValue = data.match(/^(.+)=(.*)/);
if (!keyValue) { return }
const key = propName(keyValue[1]);
if (!key) { return }
port[key] = propVal(key, keyValue[2]);
}
});
lines.on('finish', () => resolve(ports));
});
}
module.exports = listLinux;