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

sae_j2534_api

v1.0.0

Published

SAE J2534 Api

Downloads

1

Readme

Describe

SAE-J2534 with nodejs

Install

npm install sae_j2534_api

Method description

Attribute: drivers(array)

Host driver array, driver contents include: name: device/driver name. vendor: device vendor. library: driver library path.

Method: open(library)

This function is used to establish a connection and intialize the Pass-Thru Device. library: String, device library path. return: int, 0 is success.

Method: close()

This function is used to close the connection to a Pass-Thru Device. return: int, 0 is success.

Method: connect(protocol, baudrate, flags)

This function is used to establish a logical connection with a protocol channel on the specified SAE J2534 device. protocol: channel protocol, reference to the definition of saej2534. baudrate: bus baudrate. flags: connect flags, reference to the definition of saej2534. return: int, 0 is success.

Method: disconnect()

This function is used to terminate a logical connection with a protocol channel. return: int, 0 is success.

Method: recv(timeout)

This function reads messages and indications from the receive buffer. timeout: recv timeout, unit: millisecond. return: object, contents include protocol, id, flags, payload.

Method: send(id, payload, timeout)

This function is used to send messages. id: send msg can id. payload: send msg data. timeout: send timeout, unit: millisecond. return: int, 0 is success.

Method: startPeriodicMsg(id, payload, interval)

This function will immediately queue the specified message for transmission, and repeat at the specified interval. id: periodic msg can id. payload: periodic msg data. timeout: periodic interval, unit: millisecond. return: object, contents include err, data. When err equals 0, the operation is successful and data is message id.

Method: stopPeriodicMsg(msgId)

This function stops the specified periodic message. msgId: specified message id. return: int, 0 is success.

Method: startMsgFilter(filterType, mask, pattern, flowControl)

This function starts filtering of incoming messages. filterType: filter type, PASS_FILTER/BLOCK_FILTER/FLOW_CONTROL_FILTER, reference to the definition of saej2534. mask: msg id mask. pattern: pattern msg id. flowControl: flow control msg id. return: object, contents include err, data. When err equals 0, the operation is successful and data is filter id.

Method: stopPeriodicMsg(filterId)

This function removes the specified filter. filterId: specified filter id. return: int, 0 is success.

Usage Example

/**************************/
/* ProtocolID definitions */
/**************************/
const J1850VPW = 1;
const J1850PWM = 2;
const ISO9141  = 3;
const ISO14230 = 4;
const CAN	   = 5;
const ISO15765 = 6;
const SCI_A_ENGINE = 7;
const SCI_A_TRANS  = 8;
const SCI_B_ENGINE = 9;
const SCI_B_TRANS  = 10;

/*******************************/
/* PassThruConnect definitions */
/*******************************/
// 0 = Receive standard CAN ID (11 bit)
// 1 = Receive extended CAN ID (29 bit)
const CAN_29BIT_ID = 0x00000100;
// 0 = The interface will generate and append the checksum as defined in ISO 9141-2 and ISO 14230-2 for
// transmitted messages, and verify the checksum for received messages.
// 1 = The interface will not generate and verify the checksum-the entire message will be treated as
// data by the interface
const ISO9141_NO_CHECKSUM = 0x00000200;
// 0 = either standard or extended CAN ID types used ?CAN ID type defined by bit 8
// 1 = both standard and extended CAN ID types used ?if the CAN controller allows prioritizing either standard
// (11 bit) or extended (29 bit) CAN ID's then bit 8 will determine the higher priority ID type
const CAN_ID_BOTH = 0x00000800;
// 0 = use L-line and K-line for initialization address
// 1 = use K-line only line for initialization address
const ISO9141_K_LINE_ONLY = 0x00001000;

/************************/
/* RxStatus definitions */
/************************/
// 0 = received i.e. this message was transmitted on the bus by another node
// 1 = transmitted i.e. this is the echo of the message transmitted by the PassThru device
const TX_MSG_TYPE = 0x00000001;
// 0 = Not a start of message indication
// 1 = First byte or frame received
const START_OF_MESSAGE     = 0x00000002;
const ISO15765_FIRST_FRAME = 0x00000002;	/*v2 compat from v0202*/
const ISO15765_EXT_ADDR     = 0x00000080;	/*DT Accidentally refered to in spec*/
// 0 = No break received
// 1 = Break received
const RX_BREAK		= 0x00000004;
// 0 = No TxDone
// 1 = TxDone
const TX_INDICATION	= 0x00000008;	// Preferred name
const TX_DONE		= 0x00000008;
// 0 = No Error
// 1 = Padding Error
const ISO15765_PADDING_ERROR = 0x00000010;
// 0 = no extended address,
// 1 = extended address is first byte after the CAN ID
const ISO15765_ADDR_TYPE = 0x00000080;
//CAN_29BIT_ID							0x00000100  defined above
const SW_CAN_NS_RX = 0x00040000;	/*-2*/
const SW_CAN_HS_RX = 0x00020000;	/*-2*/
const SW_CAN_HV_RX = 0x00010000;	/*-2*/

/***********************/
/* TxFlags definitions */
/***********************/
// 0 = no padding
// 1 = pad all flow controlled messages to a full CAN frame using zeroes
const ISO15765_FRAME_PAD = 0x00000040;
//ISO15765_ADDR_TYPE					0x00000080  defined above
//CAN_29BIT_ID							0x00000100  defined above
// 0 = Interface message timing as specified in ISO 14230
// 1 = After a response is received for a physical request, the wait time shall be reduced to P3_MIN
// Does not affect timing on responses to functional requests
const WAIT_P3_MIN_ONLY = 0x00000200;
const SW_CAN_HV_TX = 0x00000400;	/*-2*/
// 0 = Transmit using SCI Full duplex mode
// 1 = Transmit using SCI Half duplex mode
const SCI_MODE = 0x00400000;
// 0 = no voltage after message transmit
// 1 = apply 20V after message transmit
const SCI_TX_VOLTAGE = 0x00800000;
const DT_PERIODIC_UPDATE = 0x10000000;	/*DT*/

/**********************/
/* Filter definitions */
/**********************/
// Allows matching messages into the receive queue. This filter type is only valid on non-ISO 15765 channels
const PASS_FILTER = 0x00000001;

// Keeps matching messages out of the receive queue. This filter type is only valid on non-ISO 15765 channels
const BLOCK_FILTER = 0x00000002;
// Allows matching messages into the receive queue and defines an outgoing flow control message to support
// the ISO 15765-2 flow control mechanism. This filter type is only valid on ISO 15765 channels.
const FLOW_CONTROL_FILTER =	0x00000003;

const binding = require('..');
const device = new binding.J2534();

let CANID_HOST = 0x74D;
let CANID_ECU  = 0x7CD;
let arr = device.drivers;
for(let i = 0; i < arr.length; i++){
    console.log("Discover Driver: ", arr[i].name);
}

console.log("open ", arr[2].name, " device."); 
if (0 != device.open(arr[2].library)) {
    console.log("device open failure."); 
    process.exit();
}

console.log("connect ISO15765."); 
if (0 != device.connect(ISO15765, 500000, CAN_ID_BOTH)) {
    console.log("device connect failure."); 
    process.exit();
}

var filter = device.startMsgFilter(FLOW_CONTROL_FILTER, 0x7FF, CANID_ECU, CANID_HOST);
if (0 != filter.err) {
    console.log("start msg filter failure."); 
    device.disconnect();
    device.close();
    process.exit();
}

var periodPayload = Buffer.from([0x3E]);
var periodMsg = device.startPeriodicMsg(CANID_HOST, periodPayload, 1000);
if (0 != periodMsg.err) {
    console.log("start period msg failure."); 
    device.disconnect();
    device.close();
    process.exit();
}

while(1) {
    var msg = device.recv(1000);
    if (0 != msg.err) {
        continue;
    }
    
    if ((TX_MSG_TYPE | START_OF_MESSAGE) & msg.flags) {
        continue;
    }
    console.log("Recv Msg");
    console.log("Protocol:", "0x" + msg.protocol.toString(16));
    console.log("Id:",       "0x" + msg.id.toString(16));
    console.log("Flags:",    "0x" + msg.flags.toString(16));
    console.log("Payload:",  msg.payload.toString('hex'));
    device.send(CANID_HOST, msg.payload, 1000);
}

if (0 != device.stopPeriodicMsg(periodMsg.id)) {
    console.log("stop msg period failure."); 
}

if (0 != device.stopMsgFilter(filter.id)) {
    console.log("stop msg filter failure."); 
}

if (0 != device.disconnect()) {
    console.log("device disconnect failure."); 
}

if (0 != device.close()) {
    console.log("device close failure.");
}
process.exit()