node-red-contrib-can
Advanced tools
Comparing version 1.0.4 to 1.0.5
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" |
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
42286
15
419
+ Addedsocketcan@2.2.0(transitive)
- Removedsocketcan@2.1.3(transitive)
Updatedsocketcan@2.2.0