Files

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);
}