Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Serial port list throttling and repl error with multiple boards #1456

Merged
merged 3 commits into from
Apr 5, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 25 additions & 2 deletions lib/board.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@ var rport = /usb|acm|^com/i;
// This string appears over 20 times in this file.
var UNDEFINED = "undefined";


var Serial = {
used: [],
attempts: [],
detect: function(callback) {
// Max number of times listing serial conntections can fail
var maxAttempts = 10;
// Delay (ms) before trying again to list serial connections
var retryDelay = 400;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My gut says this is a fine timeout.

var serialport;

/* istanbul ignore if */
Expand Down Expand Up @@ -88,7 +91,14 @@ var Serial = {
Serial.attempts[Serial.used.length]++;

// Retry Serial connection
Serial.detect.call(this, callback);
if (Serial.attempts[Serial.used.length] > maxAttempts) {
this.fail("Board", "No connected device found");
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here I would have logged the id of the board but I haven't because when initializing multiple boards without specifing ids they all end up having the same generated uid. Is this how it is supposed to be?

return;
}
setTimeout(() => {
Serial.detect.call(this, callback);
}, retryDelay);

return;
}

Expand Down Expand Up @@ -431,11 +441,19 @@ function finalizeAndBroadcast(data, type, io) {

if (io.name !== "Mock" && this.sigint) {
process.on("SIGINT", function() {
// Time to wait before forcing exit
var failExitTimeout = 1000;

this.emit("exit");
this.warn("Board", "Closing.");

var timeout = setTimeout(function () {
process.reallyExit();
}, failExitTimeout);
var interval = setInterval(function() {
if (!this.io.pending) {
clearInterval(interval);
clearTimeout(timeout);
process.nextTick(process.reallyExit);
}
}.bind(this), 1);
Expand Down Expand Up @@ -1177,6 +1195,11 @@ function Boards(opts) {
this.emit("error", error);
}.bind(this));

// echo the fail event from the boards
this[index].on("fail", function (event) {
this.emit("fail", event);
}.bind(this));

return new Promise(function(resolve) {
this[index].on("ready", function() {
resolve(initialized[portOpts.id]);
Expand Down
30 changes: 27 additions & 3 deletions lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,37 @@ Repl.prototype.initialize = function(callback) {
this.context = cmd.context;

cmd.on("exit", function() {
// Time to wait before forcing exit
var failExitTimeout = 1000;

state.board.emit("exit");
state.board.warn("Board", "Closing.");

var interval = setInterval(function() {
/* istanbul ignore else */
if (!state.board.io.pending) {
// A fail safe timeout if 1 second to force exit.
var timeout = setTimeout(function () {
process.reallyExit();
}, failExitTimeout);

var interval = setInterval(function () {
var pendingIo = false;
// More than one board is attached, wait until everyone has no
// io pending before exit.
if (state.board.length) {
for (let i = 0; i < state.board.length; i++) {
if (state.board[i].io.pending) {
pendingIo = true;
break;
}
}
}
// Only one board connected, wait until there is no io pending before exit.
else {
pendingIo = state.board.io.pending;
}

if (!pendingIo) {
clearInterval(interval);
clearTimeout(timeout);
process.nextTick(process.reallyExit);
}
}, 1);
Expand Down