DriveWorks SDK Reference
5.16.65 Release
For Test and Development only

CAN Interpreter

CAN Interpreter Module workflow

Initialization

The interpreter module for DBC format is initialized as follows:

dwCANInterpreter_buildFromDBC(&interpreter, "path/to/definition.dbc", ...);
DW_API_PUBLIC dwStatus dwCANInterpreter_buildFromDBC(dwCANInterpreterHandle_t *interpreter, const char8_t *inputDBC, dwContextHandle_t ctx)
Creates a CAN data interpreter based on DBC file format.
struct dwCANInterpreterObject * dwCANInterpreterHandle_t
CAN message interpreter handle.
Definition: Interpreter.h:69

The DBC message and signals definition file will be parsed to initialize the interpreter. Please refer to a DBC file format documentation for additional details on the expected syntax.

An interpreter for user-defined format is initialized as follows:

// following callbacks to be implemented by user
interpreter.addMessage = cb_addMessage;
interpreter.getDataf32 = cb_getDataf32;
interpreter.getDataf64 = cb_getDataf64;
interpreter.getDatai32 = cb_getDatai32;
interpreter.getNumAvailableSignals = cb_getNumAvailableSignals;
interpreter.getSignalInfo = cb_getSignalInfo;
dwCANInterpreter_buildFromCallbacks(&canParser, interpreter, NULL, ...);
dwCANInterpreterGetSignalInfoFunc_t getSignalInfo
getSignalInfo callback function.
Definition: Interpreter.h:106
dwCANInterpreterAddMessageFunc_t addMessage
addMessage callback function.
Definition: Interpreter.h:102
dwCANInterpreterGetDatai32Func_t getDatai32
getDatai32 callback function.
Definition: Interpreter.h:112
dwCANInterpreterGetDataf32Func_t getDataf32
getDataf32 callback function.
Definition: Interpreter.h:108
dwCANInterpreterGetNumAvailableFunc_t getNumAvailableSignals
getNumAvailableSignals callback function.
Definition: Interpreter.h:104
dwCANInterpreterGetDataf64Func_t getDataf64
getDataf64 callback function.
Definition: Interpreter.h:110
DW_API_PUBLIC dwStatus dwCANInterpreter_buildFromCallbacks(dwCANInterpreterHandle_t *interpreter, dwCANInterpreterInterface callbacks, void *userData, dwContextHandle_t context)
Creates a CAN data interpreter based on user provided callbacks.
Interface for callback based CAN data interpreter.
Definition: Interpreter.h:100

The dwCANInterpreterInterface structure is populated with pointers to the callbacks implemented by the user. The expected callback signatures are detailed in Interpreter.h. The callbacks are used as follows:

The following callbacks are required to be implemented:

  • addMessage
  • getNumAvailableSignals
  • getSignalInfo

The following callbacks are optional and have to be implemented only if a signal data type requires them:

  • getDataf32
  • getDataf64
  • getDatai32

An example implementation of those callbacks is provided in CAN Message Interpreter Sample

Consuming messages

CAN messages can be provided to the interpreter for parsing as follows:

dwCANInterpreter_consume(&msg, interpreter);
DW_API_PUBLIC dwStatus dwCANInterpreter_consume(const dwCANMessage *msg, dwCANInterpreterHandle_t interpreter)
Pushes a new message to the interpreter.

Then used as follows:

uint32_t num;
dwStatus status = dwCANInterpreter_getNumberSignals(&num, interpreter);
if (status == DW_SUCCESS && num > 0)
{
int32_t int_value = 0;
float32_t float_value = 0;
dwTime_t timestamp = 0;
const char* name;
// for each signal
for (uint32_t i = 0; i < num; ++i)
{
// get name of signal
if (dwCANInterpreter_getSignalName(&name, i, interpreter) == DW_SUCCESS)
{
// do something based on signal name
if (strcmp(name, "some_signal_int") == 0)
{
if (dwCANInterpreter_geti32(&int_value, &timestamp, i, interpreter) == DW_SUCCESS)
std::cout << "some_signal_int value: " << int_value << std::endl;
else
std::cerr << "error getting value for some_signal_int" << std::endl;
}
elseif (strcmp(name, "some_signal_float") == 0)
{
if (dwCANInterpreter_getf32(&float_value, &timestamp, i, interpreter) == DW_SUCCESS)
std::cout << "some_signal_float value: " << float_value << std::endl;
else
std::cerr << "error getting value for some_signal_float" << std::endl;
}
else std::cerr << "unhandled signal name" << std::endl;
}
}
}
dwStatus
Status definition.
Definition: ErrorDefs.h:44
@ DW_SUCCESS
No error.
Definition: ErrorDefs.h:45
float float32_t
Specifies POD types.
Definition: BasicTypes.h:59
int64_t dwTime_t
Specifies a timestamp unit, in microseconds.
Definition: BasicTypes.h:65
DW_API_PUBLIC dwStatus dwCANInterpreter_getSignalName(const char8_t **name, uint32_t idx, dwCANInterpreterHandle_t interpreter)
Gets the name of a signal available for consumption by the application as a string.
DW_API_PUBLIC dwStatus dwCANInterpreter_geti32(int32_t *value, dwTime_t *timestamp_us, uint32_t idx, dwCANInterpreterHandle_t interpreter)
Same as dwCANInterpreter_getf32, but for int32 types.
DW_API_PUBLIC dwStatus dwCANInterpreter_getNumberSignals(uint32_t *num, dwCANInterpreterHandle_t interpreter)
Gets the number of signals decoded and available for consumption by the application side.
DW_API_PUBLIC dwStatus dwCANInterpreter_getf32(float32_t *value, dwTime_t *timestamp_us, uint32_t idx, dwCANInterpreterHandle_t interpreter)
Gets a 'float32_t' value from the available values.

The above snippet iterates over all signals handled by the intepreter, and attempts to read a value for each signal, in the latest consumed dwCANMessage.

Note that in general the number of signals as returned by dwCANInterpreter_getNumberSignals() is the number of valid signals found in last consumed CAN message. However this does not have to be true in user-provided callback based interpreters, as it is implementation dependent.

Releasing the interpreter

The interpreter can be released as follows:

DW_API_PUBLIC dwStatus dwCANInterpreter_release(dwCANInterpreterHandle_t interpreter)
Closes previously opened interpreter.

For more details see CAN Message Interpreter Sample