npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

jcom1939

v1.0.5

Published

NodeJS interface to Copperhill JCOM1939 Module

Downloads

2

Readme

NodeJS JCOM1939 Module

This module provides an interface to the JCOM1939 USB Gateway. It is likely also compatible with the SAE J1939 Turbo Interface Board for Raspberry Pi.

The module implements the device-specific serial protocol and is not compatible with any other device or adapter.

Getting Started

The following assumes that NodeJS is already installed. To install this module, use

npm install jcom1939

The JCOM board appears as a serial port; depending on your platform you may or may not need to install drivers. If a serial port does not appear when you plug in the board, refer to the board installation documents and correct the problem.

Create a script to use the board (change the COM port number as required):

const Jcom = require('jcom1939');
let board = new Jcom();

// use the first(maybe only) CAN instance on the board
let can = board.can1;

// Handle each incoming message
can.on('pgn', function( msg ) {
  console.log( 'PGN:', msg );
});

// Open the com port and configure...
board.open( 'COM3' )
.then( function() {

  // enable receipt of all PGNs
  return can.addFilter( 0x100000 );
})
.then( function() {

  console.log('Listening....');

  // listen for 5 seconds, then end the script
  setTimeout( function() {
    board.reset();
    process.exit(0); 
  }, 5000 );

})
.catch( function( err ) {
  // If anything goes wrong, report the error and exit
  console.error( err );
  board.reset();
  process.exit(-1);
});

Several complete examples can be found in the example folder.

Configuration

The constructor accepts an object that specifies the desired configuration. The board/ports are set up before the 'open' command resolves (so once the open operation is complete, the CAN interface is ready to use).

The options are as shown in the following example (if you are happy with the option, you can omit it from the options object and the default will be used).

let board = new Jcom({

  // Serial port baud rate
  baudRate: 115200,

  // Determines whether board sends ACK messages in response to commands
  ack: true,

  // Heartbeat interval in milliseconds (100-5000).
  // Zero disables heartbeat
  heartbeat: 0,

  // Configuration for CAN instance 1 on the board:
  can1: {
    // The address we would like to negotiate.  If set to 254, we are in 
    // 'listen only' mode and cannot send.
    preferredAddress: 254,

    // If preferredAddress is sent, this should be set to the 8-byte NAME of the ECU
    name: [],
    
    // If preferredAddress is set, and that address is not available, we will
    // try to get an address in this range.
    addressRange: { from: 254, to: 254 },

    // Message Mode:
    // 0: Normal ECU mode
    // 1: Gateway Mode 1: report all PGNs including global address
    // 2: Gateway Mode 2: Mode 1 plus reports protocol PGNs
    messageMode: 0,
  },

  // On dual-port boards, include configuration options similar to the above can1 options
  can2: null
});

Events

The board object emits the following events:

  • open when the serial port is successfully opened
  • error if an error occurs (like the serial port could not be opened)

To listen for the events, use the typical NodeJS EventEmitter pattern:

  board.on('open', function(){
    console.log( 'Port opened');
  })

The can1 and can2 objects emit the following events:

  • address when the address claiming status changes
  • pgn when a PGN is received on the CAN interface

API

API functions generally return Promises, which are resolved or rejected when the request is complete. Refer to NodeJS Promise documentation for details on how to chain requests together, detect errors, etc. Refer to the JCOM1939 protocol document for additional details on the use of the commands and valid parameter ranges.

setAddress( name, preferredAddress, addressRange ) Initiates the address claiming process (this is done for you when you open the port, but this might be useful if you need to retry the claiming procedure).

  • name is an array of 8 bytes (e.g. [0,1,2,3,4,5,6,7]) which specifies the J1939 NAME
  • preferredAddress is a number that indicates the desired ECU address (1-253). If it is set to 254, the interface goes into 'listen only' mode.
  • addressRange is an object { from: 1, to: 5}. If these bounds are set to 254, the ECU is not arbitrary-address capable and will only try to capture the preferredAddress. If the addressRange is set and the preferred address is not available, the ECU will attempt to capture one of the addresses in the range.

addFilter( pgn ) Adds one or more PGNs to the list of PGNs we can receive. 0x100000 is a special value that indicates all PGNs should be received. You can specify a PGN (a number like 59080) or an array of PGNs [59080, 65432]

removeFilter( pgn ) Removes one or more PGNs from the filter list (which were added using addFilter)

setListenMode() Put the board in listen-only mode

send( pgn, destination, data, options ) Send a message to a destination

  • pgn is the PGN number to send
  • destination is the address where the message should be sent
  • data is an array of bytes (up to 8) containing the message data
  • options (optional) is an object containing one or more of the following: ** loopback: true, if the message should be looped back and received locally ** interval: if present, sets the recurring transmission interval for the message. 0 disables the transmission, otherwise the value is specified in milliseconds ** sourceAddress: if not specified, our claimed source address is used. ** priority: sets the priority of the message

Development

Please note the following if you wish to update or modify this package:

  • JSHINT rules are included, please lint any changes.
  • Unit tests are included (run them using npm test). Some unit tests require a JCOM board to be attached and will fail if it is not found.