Let serialport retry reconnects etc

Partial fix to Issue #111

This doesn't fix the screaming loop issue if you try to write to an unplugged
serial port - but does attempt to fix the not retrying to reconnect part of 
the issue.

Both were introduced by changes to the underlying serialport npm.
This commit is contained in:
Dave C-J 2013-12-08 16:59:36 +00:00
parent 67e16adfd0
commit fae34f8244
1 changed files with 47 additions and 57 deletions

View File

@ -39,12 +39,7 @@ function SerialOutNode(n) {
if (this.serialConfig) { if (this.serialConfig) {
var node = this; var node = this;
try {
node.port = serialPool.get(this.serialConfig.serialport,this.serialConfig.serialbaud,this.serialConfig.newline); node.port = serialPool.get(this.serialConfig.serialport,this.serialConfig.serialbaud,this.serialConfig.newline);
} catch(err) {
this.error(err);
return;
}
node.addCh = ""; node.addCh = "";
if (node.serialConfig.addchar == "true") { node.addCh = this.serialConfig.newline.replace("\\n","\n").replace("\\r","\r"); } if (node.serialConfig.addchar == "true") { node.addCh = this.serialConfig.newline.replace("\\n","\n").replace("\\r","\r"); }
node.on("input",function(msg) { node.on("input",function(msg) {
@ -52,7 +47,9 @@ function SerialOutNode(n) {
if (typeof payload === "object") { payload = JSON.stringify(payload); } if (typeof payload === "object") { payload = JSON.stringify(payload); }
if (typeof payload !== "buffer") { payload = new String(payload) + node.addCh; } if (typeof payload !== "buffer") { payload = new String(payload) + node.addCh; }
node.port.write(payload,function(err,res) { node.port.write(payload,function(err,res) {
if (err) { node.error(err); } if (err) {
node.error(err);
}
}); });
}); });
} else { } else {
@ -75,13 +72,7 @@ function SerialInNode(n) {
if (this.serialConfig) { if (this.serialConfig) {
var node = this; var node = this;
try {
this.port = serialPool.get(this.serialConfig.serialport,this.serialConfig.serialbaud,this.serialConfig.newline); this.port = serialPool.get(this.serialConfig.serialport,this.serialConfig.serialbaud,this.serialConfig.newline);
} catch(err) {
this.error(err);
return;
}
this.port.on('data', function(msg) { this.port.on('data', function(msg) {
node.send({ "payload": msg }); node.send({ "payload": msg });
}); });
@ -115,23 +106,22 @@ var serialPool = function() {
_closing: false, _closing: false,
tout: null, tout: null,
on: function(a,b) { this._emitter.on(a,b); }, on: function(a,b) { this._emitter.on(a,b); },
close: function(cb) { this.serial.close(cb)}, close: function(cb) { this.serial.close(cb); },
write: function(m,cb) { this.serial.write(m,cb)}, write: function(m,cb) { this.serial.write(m,cb); },
} }
newline = newline.replace("\\n","\n").replace("\\r","\r"); newline = newline.replace("\\n","\n").replace("\\r","\r");
var setupSerial = function() { var setupSerial = function() {
try {
if (newline == "") { if (newline == "") {
obj.serial = new serialp.SerialPort(port,{ obj.serial = new serialp.SerialPort(port,{
baudrate: baud, baudrate: baud,
parser: serialp.parsers.raw parser: serialp.parsers.raw
}); },true, function(err, results) { if (err) obj.serial.emit('error',err); });
} }
else { else {
obj.serial = new serialp.SerialPort(port,{ obj.serial = new serialp.SerialPort(port,{
baudrate: baud, baudrate: baud,
parser: serialp.parsers.readline(newline) parser: serialp.parsers.readline(newline)
}); },true, function(err, results) { if (err) obj.serial.emit('error',err); });
} }
obj.serial.on('error', function(err) { obj.serial.on('error', function(err) {
util.log("[serial] serial port "+port+" error "+err); util.log("[serial] serial port "+port+" error "+err);
@ -149,6 +139,7 @@ var serialPool = function() {
}); });
obj.serial.on('open',function() { obj.serial.on('open',function() {
util.log("[serial] serial port "+port+" opened at "+baud+" baud"); util.log("[serial] serial port "+port+" opened at "+baud+" baud");
if (obj.tout) { clearTimeout(obj.tout); }
obj.serial.flush(); obj.serial.flush();
obj._emitter.emit('ready'); obj._emitter.emit('ready');
}); });
@ -163,7 +154,6 @@ var serialPool = function() {
obj._emitter.emit('data',d); obj._emitter.emit('data',d);
} }
}); });
} catch(err) { console.log("Booo!",err,"Booo!"); }
} }
setupSerial(); setupSerial();
return obj; return obj;