can_tools
Rust utilities for parsing and modeling automotive CAN databases and logs.
Updated 2025-08-22: uses SlotMap-backed arenas (stable keys), order-aware iteration, sorting helpers, and normalized lookups.
Features
- DBC parsing → build an in-memory
DatabaseDBC
(nodes, messages, signals). - ASC parsing → parse Vector ASCII traces into a
CanLog
model. - ARXML parsing → extract CAN clusters into
DatabaseARXML
entries. - Stable keys via SlotMap → reorder presentation without invalidating references.
- Order-aware iteration →
iter_nodes/messages/signals()
respect order vectors. - Sorting helpers →
sort_nodes_by_name()
,sort_messages_by_name()
,sort_signals_by_name()
. - Fast lookups →
get_message_by_id/_hex/_name
,get_node_by_name
,get_signal_by_name
. - Signal decoding → compiled bit extraction with factor/offset and value tables.
This README documents the library API (no application/UI specifics).
Installation
Add to Cargo.toml
:
[]
= "1.2.7"
Usage Overview
Parse a DBC
use dbc;
use DatabaseDBC;
let db: DatabaseDBC = from_file?;
Iterate in presentation order:
for n in db.iter_nodes
for m in db.iter_messages
for s in db.iter_signals
Sort by name (ASCII case-insensitive):
let mut db = db;
db.sort_nodes_by_name;
db.sort_messages_by_name;
db.sort_signals_by_name;
Lookups:
let by_id = db.get_message_by_id;
let by_hex = db.get_message_by_id_hex;
let by_name = db.get_message_by_name;
let node = db.get_node_by_name;
let sig = db.get_signal_by_name;
Reset:
let mut db = db;
db.clear;
Notes on attributes:
- Attribute definitions come from
BA_DEF_*
and defaults fromBA_DEF_DEF_
. - Assignments
BA_
set values on DB/Node/Message/Signal. - ENUM assignments in
BA_
use numeric indices into the declared enum list.
Parse an ASC trace
use HashMap;
use asc;
use ;
use DatabaseDBC;
// Optional: provide per-channel databases for enrichment
let mut dbs: = new;
dbs.insert;
let log: CanLog = from_file?;
// Walk latest frame per (id,channel)
for idx in &log.last_id_chn_frame
// Resolve signals for a message index
for sig in resolve_message_signals
Parse ARXML (CAN clusters)
use arxml;
use DatabaseARXML;
let clusters: = parse_from_file?;
for c in &clusters
License
MIT