101 lines
3.0 KiB
JavaScript
101 lines
3.0 KiB
JavaScript
module.exports = function(RED) {
|
|
"use strict";
|
|
var I2C = require("i2c-bus");
|
|
const DEFAULT_HW_ADD = 0x20;
|
|
const IN_REG = 0x00;
|
|
const mask = new ArrayBuffer(16);
|
|
mask[0] = 0x8000;
|
|
mask[1] = 0x4000;
|
|
mask[2] = 0x2000;
|
|
mask[3] = 0x1000;
|
|
mask[4] = 0x0800;
|
|
mask[5] = 0x0400;
|
|
mask[6] = 0x0200;
|
|
mask[7] = 0x0100;
|
|
mask[8] = 0x80;
|
|
mask[9] = 0x40;
|
|
mask[10] = 0x20;
|
|
mask[11] = 0x10;
|
|
mask[12] = 0x08;
|
|
mask[13] = 0x04;
|
|
mask[14] = 0x02;
|
|
mask[15] = 0x01;
|
|
|
|
// The Opto input read Node
|
|
function OptoInputNode(n) {
|
|
RED.nodes.createNode(this, n);
|
|
this.stack = parseInt(n.stack);
|
|
this.channel = parseInt(n.channel);
|
|
this.payload = n.payload;
|
|
this.payloadType = n.payloadType;
|
|
var node = this;
|
|
|
|
node.port = I2C.openSync( 1 );
|
|
node.on("input", function(msg) {
|
|
var myPayload;
|
|
var stack = node.stack;
|
|
if (isNaN(stack)) stack = msg.stack;
|
|
stack = parseInt(stack);
|
|
var channel = node.channel;
|
|
if (isNaN(channel)) channel = msg.channel;
|
|
channel = parseInt(channel);
|
|
|
|
if (isNaN(stack + 1)) {
|
|
this.status({fill:"red",shape:"ring",text:"Stack level ("+stack+") value is missing or incorrect"});
|
|
return;
|
|
} else if (isNaN(channel) ) {
|
|
this.status({fill:"red",shape:"ring",text:"Relay number ("+channel+") value is missing or incorrect"});
|
|
return;
|
|
} else {
|
|
this.status({});
|
|
}
|
|
var hwAdd = DEFAULT_HW_ADD;
|
|
if(stack < 0){
|
|
stack = 0;
|
|
}
|
|
if(stack > 7){
|
|
stack = 7;
|
|
}
|
|
//check the type of io_expander
|
|
hwAdd += stack ^ 0x07;
|
|
var rawData = 0x0000;
|
|
try{
|
|
rawData = node.port.readWordSync(hwAdd, IN_REG );
|
|
|
|
if(channel < 0){
|
|
channel = 0;
|
|
}
|
|
if(channel > 16){
|
|
channel = 16;
|
|
}
|
|
if( channel > 0){
|
|
channel-= 1;//zero based
|
|
rawData = ~rawData;
|
|
if( (rawData & mask[channel]) != 0){
|
|
msg.payload = 1;
|
|
}else{
|
|
msg.payload = 0;
|
|
}
|
|
}else{
|
|
var optoData = 0x0000;
|
|
var idx = 0;
|
|
rawData = ~rawData;
|
|
for(idx = 0; idx < 16; idx++){
|
|
if( (rawData & mask[idx]) != 0){
|
|
optoData += 1 << idx;
|
|
}
|
|
}
|
|
msg.payload = optoData;
|
|
}
|
|
node.send(msg);
|
|
}catch(err) {
|
|
this.error(err,msg);
|
|
}
|
|
});
|
|
node.on("close", function() {
|
|
node.port.closeSync();
|
|
});
|
|
}
|
|
RED.nodes.registerType("16inpind", OptoInputNode);
|
|
}
|