mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Various little tweaks - less console.log more util.log, add exra try/catch to serial, add wiring-pi url to Pi "error message".
This commit is contained in:
		| @@ -31,19 +31,19 @@ function Xml2jsNode(n) { | ||||
|     var node = this; | ||||
|     this.on("input", function(msg) { | ||||
|         try { | ||||
| 		    parseString(msg.payload, function (err, result) { | ||||
| 		        if (err) { node.error(err); } | ||||
| 		        else { | ||||
| 		            msg.payload = result; | ||||
| 		            node.send(msg); | ||||
| 		            if (node.useEyes == true) { | ||||
| 		                if (gotEyes == true) { eyes.inspect(msg); } | ||||
| 		                else { node.log(JSON.stringify(msg)); } | ||||
| 		            } | ||||
| 		        } | ||||
| 		    }); | ||||
| 		} | ||||
| 		catch(e) { console.log(e); } | ||||
|             parseString(msg.payload, function (err, result) { | ||||
|                 if (err) { node.error(err); } | ||||
|                 else { | ||||
|                     msg.payload = result; | ||||
|                     node.send(msg); | ||||
|                     if (node.useEyes == true) { | ||||
|                         if (gotEyes == true) { eyes.inspect(msg); } | ||||
|                         else { node.log(JSON.stringify(msg)); } | ||||
|                     } | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|         catch(e) { util.log("[73-parsexml.js] "+e); } | ||||
|     }); | ||||
| } | ||||
| RED.nodes.registerType("xml2js",Xml2jsNode); | ||||
|   | ||||
| @@ -20,124 +20,124 @@ var exec = require('child_process').exec; | ||||
| var fs =  require('fs'); | ||||
|  | ||||
| if (!fs.existsSync("/usr/local/bin/gpio")) { | ||||
| 	exec("cat /proc/cpuinfo | grep BCM27",function(err,stdout,stderr) { | ||||
| 		if (stdout.indexOf('BCM27') > -1) { | ||||
| 			util.log('[36-rpi-gpio.js] Error: Cannot find Wiring-Pi "gpio" command'); | ||||
| 		} | ||||
| 		// else not on a Pi so don't worry anyone with needless messages. | ||||
| 	}); | ||||
| 	return; | ||||
|     exec("cat /proc/cpuinfo | grep BCM27",function(err,stdout,stderr) { | ||||
|         if (stdout.indexOf('BCM27') > -1) { | ||||
|             util.log('[36-rpi-gpio.js] Error: Cannot find Wiring-Pi "gpio" command. http://wiringpi.com/download-and-install/'); | ||||
|         } | ||||
|         // else not on a Pi so don't worry anyone with needless messages. | ||||
|     }); | ||||
|     return; | ||||
| } | ||||
|  | ||||
| // Map physical P1 pins to Gordon's Wiring-Pi Pins (as they should be V1/V2 tolerant) | ||||
| var pintable = { | ||||
| // Physical : WiringPi | ||||
| 		 "7":"7", | ||||
| 		"11":"0", | ||||
| 		"12":"1", | ||||
| 		"13":"2", | ||||
| 		"15":"3", | ||||
| 		"16":"4", | ||||
| 		"18":"5", | ||||
| 		"22":"6" | ||||
|          "7":"7", | ||||
|         "11":"0", | ||||
|         "12":"1", | ||||
|         "13":"2", | ||||
|         "15":"3", | ||||
|         "16":"4", | ||||
|         "18":"5", | ||||
|         "22":"6" | ||||
| } | ||||
| var tablepin = { | ||||
| // WiringPi : Physical | ||||
| 		"7":"7", | ||||
| 		"0":"11", | ||||
| 		"1":"12", | ||||
| 		"2":"13", | ||||
| 		"3":"15", | ||||
| 		"4":"16", | ||||
| 		"5":"18", | ||||
| 		"6":"22" | ||||
|         "7":"7", | ||||
|         "0":"11", | ||||
|         "1":"12", | ||||
|         "2":"13", | ||||
|         "3":"15", | ||||
|         "4":"16", | ||||
|         "5":"18", | ||||
|         "6":"22" | ||||
| } | ||||
|  | ||||
| function GPIOInNode(n) { | ||||
| 	RED.nodes.createNode(this,n); | ||||
| 	this.buttonState = -1; | ||||
| 	this.pin = pintable[n.pin]; | ||||
| 	this.intype = n.intype; | ||||
| 	var node = this; | ||||
|     RED.nodes.createNode(this,n); | ||||
|     this.buttonState = -1; | ||||
|     this.pin = pintable[n.pin]; | ||||
|     this.intype = n.intype; | ||||
|     var node = this; | ||||
|  | ||||
| 	if (this.pin) { | ||||
| 		exec("gpio mode "+node.pin+" "+node.intype, function(err,stdout,stderr) { | ||||
| 			if (err) node.error(err); | ||||
| 			else { | ||||
| 				node._interval = setInterval( function() { | ||||
| 					exec("gpio read "+node.pin, function(err,stdout,stderr) { | ||||
| 						if (err) node.error(err); | ||||
| 						else { | ||||
| 							if (node.buttonState !== Number(stdout)) { | ||||
| 								var previousState = node.buttonState; | ||||
| 								node.buttonState = Number(stdout); | ||||
| 								if (previousState !== -1) { | ||||
| 									var msg = {topic:"pi/"+tablepin[node.pin], payload:node.buttonState}; | ||||
| 									node.send(msg); | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					}); | ||||
| 				}, 250); | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
| 	else { | ||||
| 		this.error("Invalid GPIO pin: "+this.pin); | ||||
| 	} | ||||
|     if (this.pin) { | ||||
|         exec("gpio mode "+node.pin+" "+node.intype, function(err,stdout,stderr) { | ||||
|             if (err) node.error(err); | ||||
|             else { | ||||
|                 node._interval = setInterval( function() { | ||||
|                     exec("gpio read "+node.pin, function(err,stdout,stderr) { | ||||
|                         if (err) node.error(err); | ||||
|                         else { | ||||
|                             if (node.buttonState !== Number(stdout)) { | ||||
|                                 var previousState = node.buttonState; | ||||
|                                 node.buttonState = Number(stdout); | ||||
|                                 if (previousState !== -1) { | ||||
|                                     var msg = {topic:"pi/"+tablepin[node.pin], payload:node.buttonState}; | ||||
|                                     node.send(msg); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     }); | ||||
|                 }, 250); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|     else { | ||||
|         this.error("Invalid GPIO pin: "+this.pin); | ||||
|     } | ||||
| } | ||||
|  | ||||
| function GPIOOutNode(n) { | ||||
| 	RED.nodes.createNode(this,n); | ||||
| 	this.pin = pintable[n.pin]; | ||||
| 	var node = this; | ||||
|     RED.nodes.createNode(this,n); | ||||
|     this.pin = pintable[n.pin]; | ||||
|     var node = this; | ||||
|  | ||||
| 	if (this.pin) { | ||||
| 		process.nextTick(function() { | ||||
| 			exec("gpio mode "+node.pin+" out", function(err,stdout,stderr) { | ||||
| 				if (err) node.error(err); | ||||
| 				else { | ||||
| 					node.on("input", function(msg) { | ||||
| 						if (msg.payload === "true") msg.payload = true; | ||||
| 						if (msg.payload === "false") msg.payload = false; | ||||
| 						var out = Number(msg.payload); | ||||
| 						if ((out == 0)|(out == 1)) { | ||||
| 							exec("gpio write "+node.pin+" "+out, function(err,stdout,stderr) { | ||||
| 								if (err) node.error(err); | ||||
| 							}); | ||||
| 						} | ||||
| 						else node.warn("Invalid input - not 0 or 1"); | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| 		}); | ||||
| 	} | ||||
| 	else { | ||||
| 		this.error("Invalid GPIO pin: "+this.pin); | ||||
| 	} | ||||
|     if (this.pin) { | ||||
|         process.nextTick(function() { | ||||
|             exec("gpio mode "+node.pin+" out", function(err,stdout,stderr) { | ||||
|                 if (err) node.error(err); | ||||
|                 else { | ||||
|                     node.on("input", function(msg) { | ||||
|                         if (msg.payload === "true") msg.payload = true; | ||||
|                         if (msg.payload === "false") msg.payload = false; | ||||
|                         var out = Number(msg.payload); | ||||
|                         if ((out == 0)|(out == 1)) { | ||||
|                             exec("gpio write "+node.pin+" "+out, function(err,stdout,stderr) { | ||||
|                                 if (err) node.error(err); | ||||
|                             }); | ||||
|                         } | ||||
|                         else node.warn("Invalid input - not 0 or 1"); | ||||
|                     }); | ||||
|                 } | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
|     else { | ||||
|         this.error("Invalid GPIO pin: "+this.pin); | ||||
|     } | ||||
| } | ||||
|  | ||||
| exec("gpio mode 0 in",function(err,stdout,stderr) { | ||||
| 	if (err) { | ||||
| 		util.log('[36-rpi-gpio.js] Error: "gpio" command failed for some reason.'); | ||||
| 	} | ||||
| 	exec("gpio mode 1 in"); | ||||
| 	exec("gpio mode 2 in"); | ||||
| 	exec("gpio mode 3 in"); | ||||
| 	exec("gpio mode 4 in"); | ||||
| 	exec("gpio mode 5 in"); | ||||
| 	exec("gpio mode 6 in"); | ||||
| 	exec("gpio mode 7 in",function(err,stdout,stderr) { | ||||
| 		RED.nodes.registerType("rpi-gpio in",GPIOInNode); | ||||
| 		RED.nodes.registerType("rpi-gpio out",GPIOOutNode); | ||||
|     if (err) { | ||||
|         util.log('[36-rpi-gpio.js] Error: "gpio" command failed for some reason.'); | ||||
|     } | ||||
|     exec("gpio mode 1 in"); | ||||
|     exec("gpio mode 2 in"); | ||||
|     exec("gpio mode 3 in"); | ||||
|     exec("gpio mode 4 in"); | ||||
|     exec("gpio mode 5 in"); | ||||
|     exec("gpio mode 6 in"); | ||||
|     exec("gpio mode 7 in",function(err,stdout,stderr) { | ||||
|         RED.nodes.registerType("rpi-gpio in",GPIOInNode); | ||||
|         RED.nodes.registerType("rpi-gpio out",GPIOOutNode); | ||||
|  | ||||
| 		GPIOInNode.prototype.close = function() { | ||||
| 			clearInterval(this._interval); | ||||
| 		} | ||||
|         GPIOInNode.prototype.close = function() { | ||||
|             clearInterval(this._interval); | ||||
|         } | ||||
|  | ||||
| 		GPIOOutNode.prototype.close = function() { | ||||
| 			exec("gpio mode "+this.pin+" in"); | ||||
| 		} | ||||
|         GPIOOutNode.prototype.close = function() { | ||||
|             exec("gpio mode "+this.pin+" in"); | ||||
|         } | ||||
|  | ||||
| 	}); | ||||
|     }); | ||||
| }); | ||||
|   | ||||
| @@ -15,11 +15,10 @@ | ||||
|  **/ | ||||
|  | ||||
| var RED = require("../../red/red"); | ||||
|  | ||||
| var settings = RED.settings; | ||||
| var events = require("events"); | ||||
| var util = require("util"); | ||||
| var serialp = require("serialport"); | ||||
| var settings = RED.settings; | ||||
|  | ||||
| // TODO: 'serialPool' should be encapsulated in SerialPortNode | ||||
|  | ||||
| @@ -58,9 +57,9 @@ function SerialOutNode(n) { | ||||
|         this.error("missing serial config"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| RED.nodes.registerType("serial out",SerialOutNode); | ||||
|  | ||||
|  | ||||
| SerialOutNode.prototype.close = function() { | ||||
|     if (this.serialConfig) { | ||||
|         serialPool.close(this.serialConfig.serialport); | ||||
| @@ -90,9 +89,9 @@ function SerialInNode(n) { | ||||
|         this.error("missing serial config"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| RED.nodes.registerType("serial in",SerialInNode); | ||||
|  | ||||
|  | ||||
| SerialInNode.prototype.close = function() { | ||||
|     if (this.serialConfig) { | ||||
|         try { | ||||
| @@ -121,48 +120,50 @@ var serialPool = function() { | ||||
|                     } | ||||
|                     newline = newline.replace("\\n","\n").replace("\\r","\r"); | ||||
|                     var setupSerial = function() { | ||||
| 						if (newline == "") { | ||||
| 							obj.serial = new serialp.SerialPort(port,{ | ||||
| 									baudrate: baud, | ||||
| 									parser: serialp.parsers.raw | ||||
| 							}); | ||||
| 						} | ||||
|                         else { | ||||
| 							obj.serial = new serialp.SerialPort(port,{ | ||||
| 									baudrate: baud, | ||||
| 									parser: serialp.parsers.readline(newline) | ||||
| 							}); | ||||
| 						} | ||||
|                         obj.serial.on('error', function(err) { | ||||
|                                 util.log("[serial] serial port "+port+" error "+err); | ||||
|                                 obj.tout = setTimeout(function() { | ||||
|                                         setupSerial(); | ||||
|                                 },settings.serialReconnectTime); | ||||
|                         }); | ||||
|                         obj.serial.on('close', function() { | ||||
|                                 if (!obj._closing) { | ||||
|                                     util.log("[serial] serial port "+port+" closed unexpectedly"); | ||||
|                         try { | ||||
|                             if (newline == "") { | ||||
|                                 obj.serial = new serialp.SerialPort(port,{ | ||||
|                                         baudrate: baud, | ||||
|                                         parser: serialp.parsers.raw | ||||
|                                 }); | ||||
|                             } | ||||
|                             else { | ||||
|                                 obj.serial = new serialp.SerialPort(port,{ | ||||
|                                         baudrate: baud, | ||||
|                                         parser: serialp.parsers.readline(newline) | ||||
|                                 }); | ||||
|                             } | ||||
|                             obj.serial.on('error', function(err) { | ||||
|                                     util.log("[serial] serial port "+port+" error "+err); | ||||
|                                     obj.tout = setTimeout(function() { | ||||
|                                             setupSerial(); | ||||
|                                     },settings.serialReconnectTime); | ||||
|                             }); | ||||
|                             obj.serial.on('close', function() { | ||||
|                                     if (!obj._closing) { | ||||
|                                         util.log("[serial] serial port "+port+" closed unexpectedly"); | ||||
|                                         obj.tout = setTimeout(function() { | ||||
|                                                 setupSerial(); | ||||
|                                         },settings.serialReconnectTime); | ||||
|                                     } | ||||
|                             }); | ||||
|                             obj.serial.on('open',function() { | ||||
|                                     util.log("[serial] serial port "+port+" opened at "+baud+" baud"); | ||||
|                                     obj.serial.flush(); | ||||
|                                     obj._emitter.emit('ready'); | ||||
|                             }); | ||||
|                             obj.serial.on('data',function(d) { | ||||
|                                 if (typeof d !== "string") { | ||||
|                                     d = d.toString(); | ||||
|                                     for (i=0; i<d.length; i++) { | ||||
|                                         obj._emitter.emit('data',d.charAt(i)); | ||||
|                                     } | ||||
|                                 } | ||||
|                         }); | ||||
|                         obj.serial.on('open',function() { | ||||
|                                 util.log("[serial] serial port "+port+" opened at "+baud+" baud"); | ||||
|                                 obj.serial.flush(); | ||||
|                                 obj._emitter.emit('ready'); | ||||
|                         }); | ||||
|                         obj.serial.on('data',function(d) { | ||||
| 							if (typeof d !== "string") { | ||||
| 								d = d.toString(); | ||||
| 								for (i=0; i<d.length; i++) { | ||||
| 									obj._emitter.emit('data',d.charAt(i)); | ||||
| 								} | ||||
| 							} | ||||
| 							else { | ||||
|                                 obj._emitter.emit('data',d); | ||||
| 							} | ||||
|                         }); | ||||
|                                 else { | ||||
|                                     obj._emitter.emit('data',d); | ||||
|                                 } | ||||
|                             }); | ||||
|                         } catch(err) { console.log("Booo!",err,"Booo!"); } | ||||
|                     } | ||||
|                     setupSerial(); | ||||
|                     return obj; | ||||
| @@ -178,8 +179,7 @@ var serialPool = function() { | ||||
|                     connections[port].close(function() { | ||||
|                             util.log("[serial] serial port closed"); | ||||
|                     }); | ||||
|                 } catch(err) { | ||||
|                 }; | ||||
|                 } catch(err) { }; | ||||
|             } | ||||
|             delete connections[port]; | ||||
|         } | ||||
|   | ||||
| @@ -330,7 +330,7 @@ a.brand img { | ||||
| } | ||||
| .node_highlighted { | ||||
|    stroke: #dd1616; | ||||
|    stroke-width: 2; | ||||
|    stroke-width: 3; | ||||
|    stroke-dasharray: 10, 4; | ||||
| } | ||||
| .node_hovered { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user