Add better error handling and update Compass

This commit is contained in:
Nick O'Leary 2016-03-06 21:54:30 +00:00
parent 53c9c834b9
commit d5446ee117
3 changed files with 42 additions and 27 deletions

View File

@ -1 +1 @@
[{"id":"8a52215e.75ade","type":"rpi-sensehat out","z":"ec37e354.13c82","name":"","x":460,"y":39,"wires":[]},{"id":"f0e76645.0f1898","type":"rpi-sensehat in","z":"ec37e354.13c82","name":"","motion":true,"env":false,"stick":false,"x":90,"y":39,"wires":[["a96a3875.5695c8"]]},{"id":"a96a3875.5695c8","type":"function","z":"ec37e354.13c82","name":"Compass","func":"// A port of the Compass example provided by\n// the Sense HAT python library\n// https://github.com/RPi-Distro/python-sense-hat/tree/master/examples\n\nvar led_loop = [4, 5, 6, 7, 15, 23, 31, 39, 47, 55, 63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8, 0, 1, 2, 3];\nvar led_degree_ratio = led_loop.length / 360.0;\nvar dir_inverted = 360 - msg.payload.compass;\nled_index = Math.floor(led_degree_ratio * dir_inverted);\noffset = led_loop[led_index]\nvar y = Math.floor(offset / 8);\nvar x = offset % 8;\nvar prev_x = context.get('prev_x');\nvar prev_y = context.get('prev_y');\n\nmsg.payload = '';\nif (x != prev_x || y != prev_y) {\n msg.payload = prev_x+\",\"+prev_y+\",off,\"\n}\nmsg.payload += x+\",\"+y+\",blue\";\n\ncontext.set('prev_x',x);\ncontext.set('prev_y',y);\n\nreturn msg;\n\n","outputs":1,"noerr":0,"x":270,"y":39,"wires":[["8a52215e.75ade"]]}] [{"id":"b3b88507.4c4778","type":"rpi-sensehat out","z":"ec37e354.13c82","name":"","x":469,"y":30,"wires":[]},{"id":"e00b82a.f1ff48","type":"rpi-sensehat in","z":"ec37e354.13c82","name":"","motion":true,"env":false,"stick":false,"x":99,"y":30,"wires":[["3571a1b3.ca8e5e"]]},{"id":"3571a1b3.ca8e5e","type":"function","z":"ec37e354.13c82","name":"Compass","func":"// Based on the Compass example provided by\n// the Sense HAT python library\n// https://github.com/RPi-Distro/python-sense-hat/tree/master/examples\n\nvar led_loop = [4, 5, 6, 7, 15, 23, 31, 39, 47, 55, 63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8, 0, 1, 2, 3];\nvar led_degree_ratio = led_loop.length / 360.0;\nvar dir = (360 - msg.payload.compass)%360;\n\nfunction getXY(dir) {\n var led_index = Math.floor(led_degree_ratio * (dir%360));\n var offset = led_loop[led_index];\n return [offset % 8,Math.floor(offset / 8)];\n}\n\nvar previous = context.get('previous');\nmsg.payload = '';\n\nvar position = getXY(dir);\nif (!previous || position[0] != previous[0][0] || position[1] != previous[0][1]) {\n if (previous) {\n msg.payload = previous[0][0]+\",\"+previous[0][1]+\",off,\"+\n previous[1][0]+\",\"+previous[1][1]+\",off,\";\n } else {\n msg.payload = \"*,*,off,\";\n }\n previous = [\n position,\n getXY(dir+180)\n ];\n msg.payload += previous[0][0]+\",\"+previous[0][1]+\",red,\"+\n previous[1][0]+\",\"+previous[1][1]+\",white\"\n \n context.set('previous',previous);\n return msg;\n}\nreturn null;\n\n","outputs":1,"noerr":0,"x":279,"y":30,"wires":[["b3b88507.4c4778"]]}]

View File

@ -24,7 +24,7 @@ module.exports = function(RED) {
if ( !(1 & parseInt ((fs.statSync(hatCommand).mode & parseInt ("777", 8)).toString (8)[0]) )) { if ( !(1 & parseInt ((fs.statSync(hatCommand).mode & parseInt ("777", 8)).toString (8)[0]) )) {
RED.log.error(hatCommand + " command is not executable"); RED.log.error(hatCommand + " command is not executable");
throw "Error : "+RED._("rpi-gpio.errors.mustbeexecutable"); throw "Error : "+RED._("node-red:rpi-gpio.errors.mustbeexecutable");
} }
// the magic to make python print stuff immediately // the magic to make python print stuff immediately
@ -104,24 +104,28 @@ module.exports = function(RED) {
for (var j=0;j<users.length;j++) { for (var j=0;j<users.length;j++) {
var node = users[j]; var node = users[j];
if (node.motion && msg.topic === "motion") { if (node.motion && msg.topic === "motion") {
node.send(msg); node.send(RED.util.cloneMessage(msg));
} else if (node.env && msg.topic === 'environment') { } else if (node.env && msg.topic === 'environment') {
node.send(msg); node.send(RED.util.cloneMessage(msg));
} else if (node.stick && msg.topic === 'joystick') { } else if (node.stick && msg.topic === 'joystick') {
node.send(msg); node.send(RED.util.cloneMessage(msg));
} }
} }
} }
} }
}); });
hat.stderr.on('data', function (data) { hat.stderr.on('data', function (data) {
if (RED.settings.verbose) { RED.log.error("err: "+data+" :"); } if (RED.settings.verbose) { RED.log.error("err: "+data+" :"); }
}); });
hat.stderr.on('error', function(err) { });
hat.stdin.on('error', function(err) { });
hat.on('close', function (code) { hat.on('close', function (code) {
hat = null; hat = null;
if (RED.settings.verbose) { RED.log.info(RED._("rpi-gpio.status.closed")); } users.forEach(function(node) {
node.status({fill:"red",shape:"ring",text:"node-red:common.status.disconnected"});
});
if (RED.settings.verbose) { RED.log.info(RED._("node-red:rpi-gpio.status.closed")); }
if (onclose) { if (onclose) {
onclose(); onclose();
onclose = null; onclose = null;
@ -133,9 +137,11 @@ module.exports = function(RED) {
}); });
hat.on('error', function (err) { hat.on('error', function (err) {
if (err.errno === "ENOENT") { RED.log.error(RED._("rpi-gpio.errors.commandnotfound")); } if (err.errno === "ENOENT") { RED.log.error(RED._("node-red:rpi-gpio.errors.commandnotfound")); }
else if (err.errno === "EACCES") { RED.log.error(RED._("rpi-gpio.errors.commandnotexecutable")); } else if (err.errno === "EACCES") { RED.log.error(RED._("node-red:rpi-gpio.errors.commandnotexecutable")); }
else { RED.log.error(RED._("rpi-gpio.errors.error")+': ' + err.errno); } else {
RED.log.error(RED._("node-red:rpi-gpio.errors.error")+': ' + err.errno);
}
}); });
if (motionUsers > 0) { if (motionUsers > 0) {
@ -165,6 +171,9 @@ module.exports = function(RED) {
if (!hat) { if (!hat) {
connect(); connect();
} }
if (!reconnectTimer) {
node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"});
}
if (node.motion) { if (node.motion) {
if (motionUsers === 0) { if (motionUsers === 0) {
@ -215,6 +224,7 @@ module.exports = function(RED) {
this.env = n.env; this.env = n.env;
this.stick = n.stick; this.stick = n.stick;
var node = this; var node = this;
node.status({fill:"red",shape:"ring",text:"node-red:common.status.disconnected"});
HAT.open(this); HAT.open(this);
node.on("close", function(done) { node.on("close", function(done) {
@ -226,6 +236,8 @@ module.exports = function(RED) {
function SenseHatOutNode(n) { function SenseHatOutNode(n) {
RED.nodes.createNode(this,n); RED.nodes.createNode(this,n);
var node = this; var node = this;
node.status({fill:"red",shape:"ring",text:"node-red:common.status.disconnected"});
HAT.open(this); HAT.open(this);
node.on("close", function(done) { node.on("close", function(done) {

View File

@ -53,9 +53,9 @@ def get_stick():
if f.read().strip() == 'Raspberry Pi Sense HAT Joystick': if f.read().strip() == 'Raspberry Pi Sense HAT Joystick':
return os.path.join('/dev', 'input', os.path.basename(evdev)) return os.path.join('/dev', 'input', os.path.basename(evdev))
except IOError as e: except IOError as e:
if e.errno != errno.ENOENT: sys.exit(1)
raise sys.exit(1)
raise RuntimeError('unable to locate SenseHAT joystick device')
stick_file = io.open(get_stick(),'rb') stick_file = io.open(get_stick(),'rb')
@ -217,20 +217,23 @@ def process_joystick():
def main_loop(): def main_loop():
# while still waiting for input on at least one file # while still waiting for input on at least one file
while files: try:
ready = select.select(files, [], [], 0.01)[0] while files:
if not ready: ready = select.select(files, [], [], 0.01)[0]
idle_work() if not ready:
else: idle_work()
for file in ready: else:
if file == sys.stdin: for file in ready:
line = file.readline() if file == sys.stdin:
if not line: # EOF, remove file from input list line = file.readline()
sys.exit(0) if not line: # EOF, remove file from input list
elif line.rstrip(): # optional: skipping empty lines sys.exit(0)
process_command(line) elif line.rstrip(): # optional: skipping empty lines
else: process_command(line)
process_joystick() else:
process_joystick()
except:
sys.exit(0)
try: try:
main_loop() main_loop()