diff --git a/nodes/hardware/35-rpi-gpio-in.html b/nodes/deprecated/35-rpi-gpio-in.html similarity index 100% rename from nodes/hardware/35-rpi-gpio-in.html rename to nodes/deprecated/35-rpi-gpio-in.html diff --git a/nodes/hardware/35-rpi-gpio-in.js b/nodes/deprecated/35-rpi-gpio-in.js similarity index 100% rename from nodes/hardware/35-rpi-gpio-in.js rename to nodes/deprecated/35-rpi-gpio-in.js diff --git a/nodes/hardware/35-rpi-gpio-out.html b/nodes/deprecated/35-rpi-gpio-out.html similarity index 100% rename from nodes/hardware/35-rpi-gpio-out.html rename to nodes/deprecated/35-rpi-gpio-out.html diff --git a/nodes/hardware/35-rpi-gpio-out.js b/nodes/deprecated/35-rpi-gpio-out.js similarity index 100% rename from nodes/hardware/35-rpi-gpio-out.js rename to nodes/deprecated/35-rpi-gpio-out.js diff --git a/nodes/hardware/36-rpi-gpio.html b/nodes/hardware/36-rpi-gpio.html new file mode 100644 index 000000000..9fe873055 --- /dev/null +++ b/nodes/hardware/36-rpi-gpio.html @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + diff --git a/nodes/hardware/36-rpi-gpio.js b/nodes/hardware/36-rpi-gpio.js new file mode 100644 index 000000000..7ae3ffb21 --- /dev/null +++ b/nodes/hardware/36-rpi-gpio.js @@ -0,0 +1,141 @@ +/** + * Copyright 2013 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +var RED = require("../../red/red"); +var util = require("util"); +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; +} + +// 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" +} +var tablepin = { +// WiringPi : Physical + "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; + + 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; + + 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 reset",function(err,stdout,stderr) { + if (err) { + util.log('[36-rpi-gpio.js] Error: "gpio reset" command failed for some reason.'); + } + exec("gpio load spi",function(err,stdout,stderr) { + if (err) { + util.log('[36-rpi-gpio.js] Error: "gpio load spi" command failed for some reason.'); + } + + RED.nodes.registerType("rpi-gpio in",GPIOInNode); + RED.nodes.registerType("rpi-gpio out",GPIOOutNode); + + GPIOInNode.prototype.close = function() { + clearInterval(this._interval); + } + + GPIOOutNode.prototype.close = function() { + exec("gpio mode "+this.pin+" in"); + } + + }); +});