@csllc/j1939
Version:
J1939 transport layer for CANBUS communication
84 lines (67 loc) • 2.12 kB
JavaScript
// Example that demonstrates J1939-81 network management and address claiming
// Usage: node network_management.js --name "00 00 00 00 00 00 00 00"
// CTRL-C stops the example
const Can = require('@csllc/cs-canbus-universal');
const J1939 = require('..');
let name = [ 0, 0, 0, 0, 0, 0, 0, 0 ];
let nameArgumentIndex = process.argv.findIndex((a) => a === '--name');
if (nameArgumentIndex > 0) {
let nameString = process.argv[nameArgumentIndex + 1];
if (nameString) {
nameString = nameString.split(" ");
if (nameString.length != 8) {
throw new Error("NAME must be 8 bytes long");
}
name = nameString.map((i) => parseInt(i, 16));
}
}
console.log("Using NAME", name);
let can = new Can({
canRate: 250000,
// Only allow J1939 network management through
filters: [
{
ext: true,
mask: 0x00F80000,
code: 0x00EE0000
}
]
});
// Event handlers
can.on('open', () => console.info('Port Open'));
can.on('error', (err) => console.error('Port Error:', err));
can.on('data', (msg) => console.log('Msg: ', msg.id.toString(16), msg.buf));
can.on('close', (err) => {
if (err && err.disconnected) {
console.log('Port Disconnected');
} else {
console.log('Port Closed by application');
}
});
// Look for compatible CAN adapters
can.list()
.then(function(ports) {
if (ports.length > 0) {
// Set up J1939 stack to use CAN interface
let j1939 = new J1939(can, {
address: 0x80,
name: name,
addressRange: [ 0x80, 0xEF ],
priority: 6
})
j1939.on('data', (msg) => console.log("j1939 data", msg));
j1939.on('error', (e) => console.log("j1939 error", e.message));
j1939.on('address', (status, address) => console.log("j1939 address, status", address, status));
// Open CAN interface
return can.autoOpen(ports);
} else {
console.error('No CAN devices found');
return Promise.reject();
}
})
.catch(function(err) {
// Something went wrong...
console.error(err);
can.close();
process.exit(-1);
});