From c9f57afe222e361e4ab45d8af99d54cdd56e530a Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 14 Jul 2022 19:00:58 +0100 Subject: [PATCH] gpio retry failing pin connection --- hardware/PiGpio/36-rpi-gpio.js | 90 ++++++++++++++++++---------------- hardware/PiGpio/package.json | 2 +- 2 files changed, 50 insertions(+), 42 deletions(-) diff --git a/hardware/PiGpio/36-rpi-gpio.js b/hardware/PiGpio/36-rpi-gpio.js index 7ab000fc..ab7a690a 100644 --- a/hardware/PiGpio/36-rpi-gpio.js +++ b/hardware/PiGpio/36-rpi-gpio.js @@ -45,46 +45,53 @@ module.exports = function(RED) { } } + var startPin = function() { + node.child = spawn(gpioCommand, ["in",node.pin,node.intype,node.debounce]); + node.running = true; + node.status({fill:"yellow",shape:"dot",text:"rpi-gpio.status.ok"}); + + node.child.stdout.on('data', function (data) { + var d = data.toString().trim().split("\n"); + for (var i = 0; i < d.length; i++) { + if (d[i] === '') { return; } + if (node.running && node.buttonState !== -1 && !isNaN(Number(d[i])) && node.buttonState !== d[i]) { + node.send({ topic:"gpio/"+node.pin, payload:Number(d[i]) }); + } + node.buttonState = d[i]; + node.status({fill:"green",shape:"dot",text:d[i]}); + if (RED.settings.verbose) { node.log("out: "+d[i]+" :"); } + } + }); + + node.child.stderr.on('data', function (data) { + if (RED.settings.verbose) { node.log("err: "+data+" :"); } + }); + + node.child.on('close', function (code) { + node.running = false; + node.child.removeAllListeners(); + delete node.child; + if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); } + if (!node.finished && code === 1) { + setTimeout(function() {startPin()}, 250); + } + else if (node.finished) { + node.status({fill:"grey",shape:"ring",text:"rpi-gpio.status.closed"}); + node.finished(); + } + else { node.status({fill:"red",shape:"ring",text:"rpi-gpio.status.stopped"}); } + }); + + node.child.on('error', function (err) { + if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); } + else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); } + else { node.error(RED._("rpi-gpio.errors.error",{error:err.errno})) } + }); + } + if (allOK === true) { if (node.pin !== undefined) { - node.child = spawn(gpioCommand, ["in",node.pin,node.intype,node.debounce]); - node.running = true; - node.status({fill:"yellow",shape:"dot",text:"rpi-gpio.status.ok"}); - - node.child.stdout.on('data', function (data) { - var d = data.toString().trim().split("\n"); - for (var i = 0; i < d.length; i++) { - if (d[i] === '') { return; } - if (node.running && node.buttonState !== -1 && !isNaN(Number(d[i])) && node.buttonState !== d[i]) { - node.send({ topic:"gpio/"+node.pin, payload:Number(d[i]) }); - } - node.buttonState = d[i]; - node.status({fill:"green",shape:"dot",text:d[i]}); - if (RED.settings.verbose) { node.log("out: "+d[i]+" :"); } - } - }); - - node.child.stderr.on('data', function (data) { - if (RED.settings.verbose) { node.log("err: "+data+" :"); } - }); - - node.child.on('close', function (code) { - node.running = false; - node.child = null; - if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); } - if (node.finished) { - node.status({fill:"grey",shape:"ring",text:"rpi-gpio.status.closed"}); - node.finished(); - } - else { node.status({fill:"red",shape:"ring",text:"rpi-gpio.status.stopped"}); } - }); - - node.child.on('error', function (err) { - if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); } - else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); } - else { node.error(RED._("rpi-gpio.errors.error",{error:err.errno})) } - }); - + startPin(); } else { node.warn(RED._("rpi-gpio.errors.invalidpin")+": "+node.pin); @@ -109,8 +116,9 @@ module.exports = function(RED) { if (node.child != null) { node.finished = done; node.child.stdin.write("close "+node.pin, () => { - node.child.kill('SIGKILL'); - setTimeout(function() { if (done) { done(); } }, 25); + if (node.child) { + node.child.kill('SIGKILL'); + } }); } else { if (done) { done(); } } @@ -214,7 +222,7 @@ module.exports = function(RED) { node.finished = done; node.child.stdin.write("close "+node.pin, () => { node.child.kill('SIGKILL'); - setTimeout(function() { if (done) { done(); } }, 25); + setTimeout(function() { if (done) { done(); } }, 50); }); } else { if (done) { done(); } } diff --git a/hardware/PiGpio/package.json b/hardware/PiGpio/package.json index 66b71165..b9ee921b 100644 --- a/hardware/PiGpio/package.json +++ b/hardware/PiGpio/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-pi-gpio", - "version": "2.0.4", + "version": "2.0.5", "description": "The basic Node-RED node for Pi GPIO", "dependencies" : { },