diff --git a/hardware/Arduino/35-arduino.js b/hardware/Arduino/35-arduino.js index 7d62b8b1..0f6ad196 100644 --- a/hardware/Arduino/35-arduino.js +++ b/hardware/Arduino/35-arduino.js @@ -12,38 +12,47 @@ module.exports = function(RED) { this.running = false; this.reported = false; var node = this; + var loop; var startup = function() { - node.board = new Board(node.device, function(e) { - if ((e !== undefined) && (e.toString().indexOf("cannot open") !== -1) ) { - if (node.reported === false) { - node.error(RED._("arduino.errors.portnotfound",{device:node.device})); - node.reported = true; - } - } - else if (e === undefined) { - node.running = true; - node.reported = false; - node.board.once('ready', function() { - node.log(RED._("arduino.status.connected",{device:node.board.sp.path})); - if (RED.settings.verbose) { - node.log(RED._("arduino.status.version",{version:node.board.firmware.name+"-"+node.board.version.major+"."+node.board.version.minor})); + if (node.device === null) { + node.error(RED._("arduino.errors.portnotconf")); + } + else { + node.board = new Board(node.device, function(e) { + if ((e !== undefined) && (e.toString().indexOf("cannot open") !== -1) ) { + if (node.reported === false) { + node.error(RED._("arduino.errors.portnotfound",{device:node.device})); + node.reported = true; + node.board.port = null; } - }); - node.board.once('close', function() { - node.error(RED._("arduino.status.portclosed")); - }); - node.board.once('disconnect', function() { - if (node.running === true) { setTimeout(function() { node.running = false; startup(); }, 5000); } - }); - } - }); - setTimeout(function() { if (node.running === false) { startup(); } }, 5000); + } + else if (e === undefined) { + node.running = true; + node.reported = false; + node.board.port = node.device; + node.board.once('ready', function() { + node.log(RED._("arduino.status.connected",{device:node.board.sp.path})); + if (RED.settings.verbose) { + node.log(RED._("arduino.status.version",{version:node.board.firmware.name+"-"+node.board.version.major+"."+node.board.version.minor})); + } + }); + node.board.once('close', function() { + node.error(RED._("arduino.status.portclosed")); + }); + node.board.once('disconnect', function() { + if (node.running === true) { setTimeout(function() { node.running = false; startup(); }, 5000); } + }); + } + }); + } + loop = setTimeout(function() { if (node.running === false) { startup(); } }, 5000); }; startup(); node.on('close', function(done) { node.running = false; + clearTimeout(loop); if (node.board) { try { node.board.transport.close(function() { @@ -69,58 +78,67 @@ module.exports = function(RED) { this.serverConfig = RED.nodes.getNode(this.arduino); this.running = false; var node = this; + var loop if (typeof this.serverConfig === "object") { var startup = function() { node.board = node.serverConfig.board; node.board.setMaxListeners(0); node.oldval = ""; node.status({fill:"grey",shape:"ring",text:"node-red:common.status.connecting"}); + if (!node.board.port) { + node.status({fill:"red",shape:"ring",text:"Port Not Found"}); + } var doit = function() { - node.running = true; - if (node.state === "ANALOG") { node.board.pinMode(node.pin, 0x02); } - if (node.state === "INPUT") { node.board.pinMode(node.pin, 0x00); } - if (node.state === "PULLUP") { node.board.pinMode(node.pin, 0x0B); } - node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); - if (node.state === "ANALOG") { - node.board.analogRead(node.pin, function(v) { - if (v !== node.oldval) { - node.oldval = v; - node.send({payload:v, topic:"A"+node.pin}); - } - }); + if (node.pin && !isNaN(node.pin) && node.pin >=0 && node.pin <= 20) { + node.running = true; + if (node.state === "ANALOG") { node.board.pinMode(node.pin, 0x02); } + if (node.state === "INPUT") { node.board.pinMode(node.pin, 0x00); } + if (node.state === "PULLUP") { node.board.pinMode(node.pin, 0x0B); } + node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); + if (node.state === "ANALOG") { + node.board.analogRead(node.pin, function(v) { + if (v !== node.oldval) { + node.oldval = v; + node.send({payload:v, topic:"A"+node.pin}); + } + }); + } + if (node.state === "INPUT") { + node.board.digitalRead(node.pin, function(v) { + if (v !== node.oldval) { + node.oldval = v; + node.send({payload:v, topic:node.pin}); + } + }); + } + if (node.state === "PULLUP") { + node.board.digitalRead(node.pin, function(v) { + if (v !== node.oldval) { + node.oldval = v; + node.send({payload:v, topic:node.pin}); + } + }); + } + if (node.state == "STRING") { + node.board.on('string', function(v) { + if (v !== node.oldval) { + node.oldval = v; + node.send({payload:v, topic:"string"}); + } + }); + } } - if (node.state === "INPUT") { - node.board.digitalRead(node.pin, function(v) { - if (v !== node.oldval) { - node.oldval = v; - node.send({payload:v, topic:node.pin}); - } - }); - } - if (node.state === "PULLUP") { - node.board.digitalRead(node.pin, function(v) { - if (v !== node.oldval) { - node.oldval = v; - node.send({payload:v, topic:node.pin}); - } - }); - } - if (node.state == "STRING") { - node.board.on('string', function(v) { - if (v !== node.oldval) { - node.oldval = v; - node.send({payload:v, topic:"string"}); - } - }); + else { + node.status({fill:"red",shape:"ring",text:"Invalid pin: "+node.pin}); } node.board.once('disconnect', function() { node.status({fill:"red",shape:"ring",text:"node-red:common.status.not-connected"}); - if (node.running) { setTimeout(function() { node.running = false; startup(); }, 5500); } + if (node.running) { loop = setTimeout(function() { node.running = false; startup(); }, 5500); } }); } if (node.board.isReady) { doit(); } else { node.board.once("ready", function() { doit(); }); } - setTimeout(function() { if (node.running === false) { startup(); } }, 4500); + loop = setTimeout(function() { if (node.running === false) { startup(); } }, 4500); } startup(); } @@ -129,6 +147,7 @@ module.exports = function(RED) { } node.on('close', function() { node.running = false; + clearTimeout(loop) }); } RED.nodes.registerType("arduino in",DuinoNodeIn); @@ -144,55 +163,64 @@ module.exports = function(RED) { this.serverConfig = RED.nodes.getNode(this.arduino); this.running = false; var node = this; + var loop; if (typeof node.serverConfig === "object") { var startup = function() { node.board = node.serverConfig.board; node.board.setMaxListeners(0); node.status({fill:"grey",shape:"ring",text:"node-red:common.status.connecting"}); + if (!node.board.port) { + node.status({fill:"red",shape:"ring",text:"Port Not Found"}); + } var doit = function() { - node.running = true; - if (node.state === "OUTPUT") { node.board.pinMode(node.pin, 0x01); } - if (node.state === "PWM") { node.board.pinMode(node.pin, 0x03); } - if (node.state === "SERVO") { node.board.pinMode(node.pin, 0x04); } - node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); - node.on("input", function(msg) { - if (node.board.isReady) { - if (node.state === "OUTPUT") { - if ((msg.payload === true)||(msg.payload.toString() == "1")||(msg.payload.toString().toLowerCase() == "on")) { - node.board.digitalWrite(node.pin, node.board.HIGH); + if (node.pin && !isNaN(node.pin) && node.pin >=0 && node.pin <= 20) { + node.running = true; + if (node.state === "OUTPUT") { node.board.pinMode(node.pin, 0x01); } + if (node.state === "PWM") { node.board.pinMode(node.pin, 0x03); } + if (node.state === "SERVO") { node.board.pinMode(node.pin, 0x04); } + node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); + node.on("input", function(msg) { + if (node.board.isReady) { + if (node.state === "OUTPUT") { + if ((msg.payload === true)||(msg.payload.toString() == "1")||(msg.payload.toString().toLowerCase() == "on")) { + node.board.digitalWrite(node.pin, node.board.HIGH); + } + if ((msg.payload === false)||(msg.payload.toString() == "0")||(msg.payload.toString().toLowerCase() == "off")) { + node.board.digitalWrite(node.pin, node.board.LOW); + } } - if ((msg.payload === false)||(msg.payload.toString() == "0")||(msg.payload.toString().toLowerCase() == "off")) { - node.board.digitalWrite(node.pin, node.board.LOW); + if (node.state === "PWM") { + msg.payload = parseInt((msg.payload * 1) + 0.5); + if ((msg.payload >= 0) && (msg.payload <= 255)) { + node.board.analogWrite(node.pin, msg.payload); + } + } + if (node.state === "SERVO") { + msg.payload = parseInt((msg.payload * 1) + 0.5); + if ((msg.payload >= 0) && (msg.payload <= 180)) { + node.board.servoWrite(node.pin, msg.payload); + } + } + if (node.state === "SYSEX") { + node.board.sysexCommand(msg.payload); + } + if (node.state === "STRING") { + node.board.sendString(msg.payload.toString()); } } - if (node.state === "PWM") { - msg.payload = parseInt((msg.payload * 1) + 0.5); - if ((msg.payload >= 0) && (msg.payload <= 255)) { - node.board.analogWrite(node.pin, msg.payload); - } - } - if (node.state === "SERVO") { - msg.payload = parseInt((msg.payload * 1) + 0.5); - if ((msg.payload >= 0) && (msg.payload <= 180)) { - node.board.servoWrite(node.pin, msg.payload); - } - } - if (node.state === "SYSEX") { - node.board.sysexCommand(msg.payload); - } - if (node.state === "STRING") { - node.board.sendString(msg.payload.toString()); - } - } - }); + }); + } + else { + node.status({fill:"red",shape:"ring",text:"Invalid pin: "+node.pin}); + } node.board.once('disconnect', function() { node.status({fill:"red",shape:"ring",text:"node-red:common.status.not-connected"}); - if (node.running === true) { setTimeout(function() { node.running = false; startup(); }, 5500); } + if (node.running === true) { loop = setTimeout(function() { node.running = false; startup(); }, 5500); } }); } if (node.board.isReady) { doit(); } else { node.board.once("ready", function() { doit(); }); } - setTimeout(function() { if (node.running === false) { startup(); } }, 4500); + loop = setTimeout(function() { if (node.running === false) { startup(); } }, 4500); } startup(); } @@ -201,6 +229,7 @@ module.exports = function(RED) { } node.on('close', function() { node.running = false; + clearTimeout(loop) }); } RED.nodes.registerType("arduino out",DuinoNodeOut); diff --git a/hardware/Arduino/package.json b/hardware/Arduino/package.json index 34e055ee..e93442c3 100644 --- a/hardware/Arduino/package.json +++ b/hardware/Arduino/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-arduino", - "version": "1.0.0", + "version": "1.1.0", "description": "A Node-RED node to talk to an Arduino running firmata", "dependencies": { "serialport": "^12.0.0" @@ -23,7 +23,7 @@ } }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "author": { "name": "Dave Conway-Jones",