Skip to content

Commit

Permalink
Adding in port selection to serialport-term. (serialport#1448)
Browse files Browse the repository at this point in the history
* Adding in port selection to serialport-term.

This makes the terminal command much more useable when you need to open
it multiple times in a row; especially when the names of the serialports
are rapidly changing.

* Fix the command line arguments.

* Fixing eslint mistakes.

* Make all of the negative errors positive in serialport-terminal.
  • Loading branch information
robertmassaioli authored and IvanSanchez committed Feb 27, 2018
1 parent a7204d5 commit 2add9f0
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 9 deletions.
50 changes: 41 additions & 9 deletions bin/terminal.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
const SerialPort = require('../lib/');
const version = require('../package.json').version;
const args = require('commander');
const List = require('prompt-list');

function makeNumber(input) {
return Number(input);
}

args
.version(version)
.usage('-p <port> [options]')
.usage('[options]')
.description('A basic terminal interface for communicating over a serial port. Pressing ctrl+c exits.')
.option('-l --list', 'List available ports then exit')
// TODO make the port not a flag as it's always required
.option('-p, --port <port>', 'Path or Name of serial port')
.option('-b, --baud <baudrate>', 'Baud rate default: 9600', makeNumber, 9600)
.option('--databits <databits>', 'Data bits default: 8', makeNumber, 8)
Expand All @@ -36,21 +36,53 @@ function listPorts() {
});
};

function createPort() {
if (!args.port) {
args.outputHelp();
args.missingArgument('port');
process.exit(-1);
function setupPort() {
if (args.port) {
createPort(args.port);
}

SerialPort.list((err, ports) => {
if (err) {
console.error('Error listing ports, and missing port argument.', err);
args.outputHelp();
args.missingArgument('port');
process.exit(4);
} else {
if (ports.length > 0) {
const portSelection = new List({
name: 'serial-port-selection',
message: 'Select a serial port to open',
choices: ports.map((port, i) => `[${i + 1}]\t${port.comName}\t${port.pnpId || ''}\t${port.manufacturer || ''}`)
});

portSelection.run()
.then(answer => {
const choice = answer.split('\t')[1];
console.log(`Opening serial port: ${choice}`);
createPort(choice);
})
.catch(error => {
console.log(`Could not select a port: ${error}`);
process.exit(2);
});
} else {
args.outputHelp();
args.missingArgument('port');
process.exit(3);
}
}
});
}

function createPort(selectedPort) {
const openOptions = {
baudRate: args.baud,
dataBits: args.databits,
parity: args.parity,
stopBits: args.stopbits
};

const port = new SerialPort(args.port, openOptions);
const port = new SerialPort(selectedPort, openOptions);

process.stdin.resume();
process.stdin.setRawMode(true);
Expand Down Expand Up @@ -82,5 +114,5 @@ function createPort() {
if (args.list) {
listPorts();
} else {
createPort();
setupPort();
}
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
"nan": "^2.6.2",
"prebuild-install": "^2.4.1",
"promirepl": "^1.0.1",
"prompt-list": "^3.1.2",
"safe-buffer": "^5.0.1"
},
"devDependencies": {
Expand Down Expand Up @@ -99,6 +100,7 @@
"lint": "eslint lib test bin examples",
"rebuild-all": "npm rebuild && node-gyp rebuild",
"repl": "node bin/repl.js",
"terminal": "node bin/terminal.js",
"stress": "mocha --no-timeouts test/arduinoTest/stress.js",
"test": "istanbul cover ./node_modules/mocha/bin/_mocha",
"test:watch": "mocha -w",
Expand Down

0 comments on commit 2add9f0

Please sign in to comment.