From 983dafff137f0adef2709f3638ac570594ce4f2e Mon Sep 17 00:00:00 2001 From: Ivan Mikhaylov Date: Tue, 12 Jul 2022 12:10:49 +0300 Subject: [PATCH] mraa gpio din features (#929) * mraa-gpio-din: add iot2050 board This patch adds iot2050 board in possible list of boards. Signed-off-by: zengchao Signed-off-by: Jan Kiszka Signed-off-by: Ivan Mikhaylov * mraa-gpio-din: add cleanup on close Required as nodejs will only lazily delete the node objects, and we may race with the next user requesting the resources. ISR thread release. Signed-off-by: Jan Kiszka Signed-off-by: Ivan Mikhaylov * mraa-gpio-din: extend GPIO lines Signed-off-by: zengchao Signed-off-by: Ivan Mikhaylov * mraa-gpio-din: add configurable GPIO mode for DIN GPIO mode wasn't set correctly, it was set from Pinmuxes modes instead of GPIO. Add way to control GPIO modes on DINs from Node-RED with possible values from mraa : Strong, Hiz, Pull-down, Pull-up. Signed-off-by: Ivan Mikhaylov * mraa-gpio-din: add support for initial message from digital input This allows to send out an initial message with the current digital pin state on startup, simplifying initializations of certain flows. Based on siemens/meta-iot2000@5fc2bbe patch 0003. Signed-off-by: Ivan Mikhaylov --- hardware/intel/mraa-gpio-din.html | 30 +++++++++++++++++++++++++++--- hardware/intel/mraa-gpio-din.js | 29 ++++++++++++++++++++++++----- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/hardware/intel/mraa-gpio-din.html b/hardware/intel/mraa-gpio-din.html index fdbcfc45..88e256bd 100644 --- a/hardware/intel/mraa-gpio-din.html +++ b/hardware/intel/mraa-gpio-din.html @@ -1,13 +1,15 @@ diff --git a/hardware/intel/mraa-gpio-din.js b/hardware/intel/mraa-gpio-din.js index 5966e448..cfb79612 100644 --- a/hardware/intel/mraa-gpio-din.js +++ b/hardware/intel/mraa-gpio-din.js @@ -7,13 +7,16 @@ module.exports = function(RED) { RED.nodes.createNode(this,n); this.pin = n.pin; this.interrupt = n.interrupt; + this.mode = n.mode; + this.initialMsg = n.initial; this.x = new m.Gpio(parseInt(this.pin)); this.board = m.getPlatformName(); + this.defaultTimeout = 100; var node = this; - node.x.mode(m.PIN_GPIO); + node.x.mode(parseInt(this.mode)); node.x.dir(m.DIR_IN); - node.x.isr(m.EDGE_BOTH, function() { - var g = node.x.read(); + + var eventHandler = function(g) { var msg = { payload:g, topic:node.board+"/D"+node.pin }; switch (g) { case 0: { @@ -34,8 +37,15 @@ module.exports = function(RED) { node.status({fill:"grey",shape:"ring",text:"unknown"}); } } - }); - switch (node.x.read()) { + } + + var isrCallback = function() { + eventHandler(node.x.read()); + } + + node.x.isr(m.EDGE_BOTH, isrCallback); + var initialState = node.x.read(); + switch (initialState) { case 0: { node.status({fill:"green",shape:"ring",text:"low"}); break; @@ -48,8 +58,17 @@ module.exports = function(RED) { node.status({}); } } + + if (this.initialMsg) { + setTimeout(() => { + node.send( { payload: node.x.read(), topic:node.board+"/D"+node.pin } ); + }, this.defaultTimeout); + } + this.on('close', function() { node.x.isr(m.EDGE_BOTH, null); + node.x.isrExit(); + node.x.close(); }); } RED.nodes.registerType("mraa-gpio-din", gpioDin);