New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

node-red-contrib-can

Package Overview
Dependencies
Maintainers
5
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

node-red-contrib-can - npm Package Compare versions

Comparing version 1.0.4 to 1.0.5

.eslintrc.json

41

can/can-config.js
module.exports = function(RED) {
"use strict";
'use strict';
var CanController = require("./can-controller");
var file = '';
var socket = '';
var CanController = require('./can-controller');

@@ -16,5 +14,2 @@ function CanConfigNode(n) {

file = this.dbFile;
socket = this.socket;
// Config node state

@@ -30,3 +25,3 @@ this.refreshRate = 20; //ms

this.controller.on('connect', function(socketName) {
node.log('Connected to can port '+socketName);
node.log('Connected to can port ' + socketName);
node.connecting = false;

@@ -40,3 +35,3 @@ node.connected = true;

// Here we should tell all registered nodes that it's ok to listen
for (var user in node.users) {
for (var user in node.users) {
node.addListener(node.users[user]);

@@ -52,3 +47,3 @@ }

var name = canNode.name === '' ? canNode.id : canNode.name;
node.log('Registering '+name);
node.log('Registering ' + name);
node.users[canNode.id] = canNode;

@@ -59,5 +54,5 @@

this.deregister = function(canNode,done) {
this.deregister = function(canNode, done) {
var name = canNode.name === '' ? canNode.id : canNode.name;
node.log('Deregister '+name);
node.log('Deregister ' + name);
node.removeListener(canNode);

@@ -70,3 +65,3 @@ delete node.users[canNode.id];

if (!node.connected) {
node.warn('Can not register listener for '+node.controller.socket+' as it is not connected.');
node.warn('Can not register listener for ' + node.controller.socket + ' as it is not connected.');
return;

@@ -78,3 +73,3 @@ }

}
node.log('About to add listener for '+canNode.message+' signal '+canNode.signal);
node.log('About to add listener for ' + canNode.message + ' signal ' + canNode.signal);

@@ -94,4 +89,4 @@

if (Object.keys(listeners).length === 0) {
// register listener
node.log('Registering real listener for '+canNode.message+' '+canNode.signal);
// register listener
node.log('Registering real listener for ' + canNode.message + ' ' + canNode.signal);
node.controller.registerListener(canNode.message, canNode.signal, function(message, signal) {

@@ -115,8 +110,14 @@ // Go trough all listeners and send them updates

}
node.log('Removing '+canNode.id+' as lsitener.');
node.log('Removing ' + canNode.id + ' as lsitener.');
delete node.subscriptions[canNode.message][canNode.signal][canNode.id];
}
};
this.on('close', function() {
if (this.controller != undefined) {
this.controller.disconnect();
}
});
}
RED.nodes.registerType("can-config",CanConfigNode);
RED.nodes.registerType('can-config', CanConfigNode);
};
'use strict';
var _ = require('lodash');
var EventEmitter = require('events').EventEmitter;
var can = require('socketcan');
var HashMap = require('hashmap');
var fs = require('fs');
var _ = require('lodash');
var EventEmitter = require('events').EventEmitter;
var can = require('socketcan');
var HashMap = require('hashmap');
var fs = require('fs');
var TAG = 'can-controller';
function CanController(socket, bus, dbFile, refreshRate) {
var self = this;
var self = this;
self.socket = socket;
self.bus = bus;
self.refreshRate = refreshRate||20;
self.dbFile = dbFile;
self.socket = socket;
self.bus = bus;
self.refreshRate = refreshRate || 20;
self.dbFile = dbFile;
self.emitter = new EventEmitter();
self.emitter = new EventEmitter();
var databaseService;
self.retainedCanMessages = new HashMap();
self.retainedCanMessages = new HashMap();
}
CanController.prototype = {
constructor: CanController,
constructor: CanController,
on:function(event, callback) {
var self = this;
self.emitter.on(event, callback);
},
connect:function() {
var self = this;
on: function(event, callback) {
var self = this;
self.emitter.on(event, callback);
},
connect: function() {
var self = this;
try {
fs.accessSync(self.dbFile);
} catch(e) {
console.error('error '+e.message);
} catch (e) {
console.error('error ' + e.message);
return;
}
if (self.socket === '' || self.socket === undefined) {
console.error('Must specify socket for can-controller before connect.');
return;
}
if (self.bus === '' || self.bus === undefined) {
console.error('Must specify bus for can-controller before connect.');
return;
}
self._initializeCanConnection(self.dbFile, self.socket, self.bus);
},
if (self.socket === '' || self.socket === undefined) {
console.error('Must specify socket for can-controller before connect.');
return;
}
if (self.bus === '' || self.bus === undefined) {
console.error('Must specify bus for can-controller before connect.');
return;
}
self._initializeCanConnection(self.dbFile, self.socket, self.bus);
},
_emitCanSignalChanged:function(message, signal) {
var self = this;
self.emitter.emit('signal', message, signal);
},
_emitCanConnected:function(socketName) {
var self = this;
self.emitter.emit('connect', socketName);
},
disconnect: function() {
var self = this;
if (self.channel != undefined) {
self.channel.stop();
}
_isDatabaseServiceCreated:function() {
if (this.databaseService === undefined) {
console.error('error adding listener as databaseService is not created. Run _initializeCanConnection to create.');
return false;
}
return true;
},
},
_initializeCanConnection:function(database, socket, bus) {
// Parse database
var network = can.parseNetworkDescription(database);
_emitCanSignalChanged: function(message, signal) {
var self = this;
self.emitter.emit('signal', message, signal);
},
var channel;
try {
channel = can.createRawChannel(socket, false); // False don't add timestamp to messages
} catch(e) {
console.error('error %s when creating channel for socket %s',e.message,socket);
return;
}
this.databaseService = new can.DatabaseService(channel, network.buses[bus]);
channel.start();
this._emitCanConnected(socket);
},
registerListener:function(message, signal, callback) {
var self = this;
if (!self._isDatabaseServiceCreated())
return;
self.databaseService.messages[message].signals[signal].onChange(function(sig) {
callback(message, sig);
});
},
/**
* Will send the data conencted with message out on can.
* message - the can message that you want to send
*/
sendCanMessage:function(message) {
var self = this;
if (message === undefined) {
console.error('undefined message not valid');
return;
}
// can't send can message if no service is created
if (!this._isDatabaseServiceCreated())
return;
try {
self.databaseService.send(message);
} catch(e) {
console.error('error %s when sending can msg %s',e.message,message);
}
},
_emitCanConnected: function(socketName) {
var self = this;
self.emitter.emit('connect', socketName);
},
sendAllCanMessages:function() {
var self = this;
if (!this._isDatabaseServiceCreated()) {
return;
}
_isDatabaseServiceCreated: function() {
if (this.databaseService === undefined) {
console.error('error adding listener as databaseService is not created. Run _initializeCanConnection to create.');
return false;
}
return true;
},
_.forEach(self.databaseService.messages, function(message) {
self.sendCanMessage(message);
});
},
_initializeCanConnection: function(database, socket, bus) {
// Parse database
var self = this;
var network = can.parseNetworkDescription(database);
/**
* Will update one can message with the specified signal and value. Don't forget to send it!
* message - string representing the message that the signal belong to
* signal - object with the properties name and value.
*/
updateCanMessageWithSignal:function(message, signal) {
var self = this;
// can't update can message if no service is created
if (!this._isDatabaseServiceCreated())
return;
var value = parseFloat(signal.value);
self.databaseService.messages[message].signals[signal.name].update(value);
},
try {
self.channel = can.createRawChannel(socket, false); // False don't add timestamp to messages
} catch (e) {
console.error('error %s when creating channel for socket %s', e.message, socket);
return;
}
this.databaseService = new can.DatabaseService(self.channel, network.buses[bus]);
self.channel.start();
this._emitCanConnected(socket);
},
registerListener: function(message, signal, callback) {
var self = this;
if (!self._isDatabaseServiceCreated())
return;
self.databaseService.messages[message].signals[signal].onChange(function(sig) {
callback(message, sig);
});
},
/**
* Will add the message to a retained map and initiate a setInterval that will keep sending it.
* message - the CAN message we want to keep sending.
*/
addRetainedCanMessage:function(message) {
var self = this;
/**
* Will send the data conencted with message out on can.
* message - the can message that you want to send
*/
sendCanMessage: function(message) {
var self = this;
if (message === undefined) {
console.error('undefined message not valid');
return;
}
// can't send can message if no service is created
if (!this._isDatabaseServiceCreated())
return;
try {
self.databaseService.send(message);
} catch (e) {
console.error('error %s when sending can msg %s', e.message, message);
}
},
// check that message isn't already in list
if (self.retainedCanMessages.has(message)) {
// message already in list return
return;
}
sendAllCanMessages: function() {
var self = this;
if (!this._isDatabaseServiceCreated()) {
return;
}
// create interval to send added message
var intervalId = setInterval(function() {
self.sendCanMessage(message);
}, self.refreshRate);
_.forEach(self.databaseService.messages, function(message) {
self.sendCanMessage(message);
});
},
self.retainedCanMessages.set(message, intervalId);
},
/**
* Will update one can message with the specified signal and value. Don't forget to send it!
* message - string representing the message that the signal belong to
* signal - object with the properties name and value.
*/
updateCanMessageWithSignal: function(message, signal) {
var self = this;
// can't update can message if no service is created
if (!this._isDatabaseServiceCreated())
return;
var value = parseFloat(signal.value);
self.databaseService.messages[message].signals[signal.name].update(value);
},
/**
* If the CAN message is retained this will stop the interval that keeps sending it.
* message - The CAN message that we want to no longer be retained.
*/
removeRetainedCanMessage:function(message) {
var self = this;
/**
* Will add the message to a retained map and initiate a setInterval that will keep sending it.
* message - the CAN message we want to keep sending.
*/
addRetainedCanMessage: function(message) {
var self = this;
// message not already retained, exit
if (!self.retainedCanMessages.has(message))
return;
// check that message isn't already in list
if (self.retainedCanMessages.has(message)) {
// message already in list return
return;
}
var intervalId = self.retainedCanMessages.get(message);
clearInterval(intervalId);
// create interval to send added message
var intervalId = setInterval(function() {
self.sendCanMessage(message);
}, self.refreshRate);
// Remove message from retained messages
self.retainedCanMessages.remove(message);
},
readCurrentSignal:function(message,signal){
var self = this;
self.retainedCanMessages.set(message, intervalId);
},
var foundValue = null;
/**
* If the CAN message is retained this will stop the interval that keeps sending it.
* message - The CAN message that we want to no longer be retained.
*/
removeRetainedCanMessage: function(message) {
var self = this;
if (!this._isDatabaseServiceCreated()) {
return;
}
if(self.databaseService.messages[message]){
// message not already retained, exit
if (!self.retainedCanMessages.has(message))
return;
if(signal === undefined || signal === '')
foundValue = self.databaseService.messages[message].signals;
else{
if(self.databaseService.messages[message].signals[signal]){
foundValue = self.databaseService.messages[message].signals[signal].value;
}
}
}
return foundValue;
var intervalId = self.retainedCanMessages.get(message);
clearInterval(intervalId);
// Remove message from retained messages
self.retainedCanMessages.remove(message);
},
readCurrentSignal: function(message, signal) {
var self = this;
var foundValue = null;
if (!this._isDatabaseServiceCreated()) {
return;
}
if (self.databaseService.messages[message]) {
if (signal === undefined || signal === '') {
foundValue = self.databaseService.messages[message].signals;
} else {
if (self.databaseService.messages[message].signals[signal]) {
foundValue = self.databaseService.messages[message].signals[signal].value;
}
}
}
return foundValue;
}

@@ -205,0 +205,0 @@ };

module.exports = function(RED) {
function CanListenNode(config) {
RED.nodes.createNode(this,config);
RED.nodes.createNode(this, config);

@@ -15,3 +15,3 @@ this.can = config.can;

if (!this.canConnection) {
this.error(RED._("can.errors.missing-config"));
this.error(RED._('can.errors.missing-config'));
return;

@@ -21,3 +21,5 @@ }

this.update = function(value) {
node.send({payload:value});
node.send({
payload: value
});
};

@@ -29,3 +31,3 @@

node.canConnection.deregister(node, function() {
node.log('Node was '+node.id+' was deregistered.');
node.log('Node was ' + node.id + ' was deregistered.');
done();

@@ -35,3 +37,3 @@ });

}
RED.nodes.registerType("can-listen",CanListenNode);
}
RED.nodes.registerType('can-listen', CanListenNode);
};
module.exports = function(RED) {
function CanReadNode(config) {
RED.nodes.createNode(this,config);
RED.nodes.createNode(this, config);

@@ -16,10 +16,14 @@ this.can = config.can;

if (!this.canConnection) {
this.error(RED._("can.errors.missing-config"));
this.error(RED._('can.errors.missing-config'));
return;
}
if(this.message){
if (this.message) {
this.status({fill:"green",shape:"ring",text:"Ready to query " + this.message});
}
this.status({
fill: 'green',
shape: 'ring',
text: 'Ready to query ' + this.message
});
}

@@ -29,27 +33,26 @@ node.canConnection.register(this);

this.on('input', function(msg) {
var usePayloadConf = msg.payload && msg.payload.message;
var actualMessage = usePayloadConf ? msg.payload.message : this.message;
var actualSignal = usePayloadConf ? msg.payload.signal : this.signal;
if (!actualMessage || actualMessage === '' || actualSignal === undefined || actualSignal === '') {
this.status({
fill: 'red',
shape: 'ring',
text: 'empty CAN message/signal'
});
return;
}
var usePayloadConf = msg.payload && msg.payload.message;
var actualMessage = usePayloadConf ? msg.payload.message : this.message;
var actualSignal = usePayloadConf ? msg.payload.signal : this.signal ;
if(!actualMessage || actualMessage === "" || actualSignal === undefined || actualSignal === ""){
var value = node.canConnection.controller.readCurrentSignal(actualMessage, actualSignal);
this.status({fill:"red",shape:"ring",text:"empty CAN message/signal"});
this.status({
fill: 'green',
shape: 'ring',
text: 'Queried ' + actualMessage + ' - ' + actualSignal
});
return;
}
var value = node.canConnection.controller.readCurrentSignal(actualMessage,actualSignal);
this.status({fill:"green",shape:"ring",text:"Queried " + actualMessage + " - " + actualSignal});
node.send({payload:value});
node.send({
payload: value
});
});

@@ -60,3 +63,3 @@

node.canConnection.deregister(node, function() {
node.log('Node was '+node.id+' was deregistered.');
node.log('Node was ' + node.id + ' was deregistered.');
done();

@@ -66,3 +69,3 @@ });

}
RED.nodes.registerType("can-read",CanReadNode);
}
RED.nodes.registerType('can-read', CanReadNode);
};
module.exports = function(RED) {
function CanUpdateNode(config) {
RED.nodes.createNode(this,config);
RED.nodes.createNode(this, config);

@@ -16,3 +16,3 @@ this.can = config.can;

if (!this.canConnection) {
this.error(RED._("can.errors.missing-config"));
this.error(RED._('can.errors.missing-config'));
return;

@@ -24,3 +24,6 @@ }

this.on('input', function(msg) {
var signal = {name:node.signal,value:msg.payload};
var signal = {
name: node.signal,
value: msg.payload
};
node.canConnection.controller.updateCanMessageWithSignal(node.message, signal);

@@ -39,3 +42,3 @@ node.canConnection.controller.sendCanMessage(node.message);

node.canConnection.deregister(node, function() {
node.log('Node was '+node.id+' was deregistered.');
node.log('Node was ' + node.id + ' was deregistered.');
done();

@@ -45,3 +48,3 @@ });

}
RED.nodes.registerType("can-update",CanUpdateNode);
}
RED.nodes.registerType('can-update', CanUpdateNode);
};
{
"name": "node-red-contrib-can",
"version": "1.0.4",
"version": "1.0.5",
"description": "Node RED Node interfacing with a CAN network.",

@@ -34,3 +34,3 @@ "main": "index.js",

"dependencies": {
"socketcan": "2.1.3",
"socketcan": "2.2.0",
"lodash": "latest",

@@ -37,0 +37,0 @@ "hashmap": "latest"

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc