can_tools
Rust utilities for parsing and modeling automotive CAN databases and logs.
Highlights
- DBC parsing → streaming reader that decodes Windows-1252, transliterates a few common characters,
and materialises a SlotMap-backed
DatabaseDBC
(nodes, messages, signals, attributes, relations). - ASC parsing → single-pass Vector ASCII reader that discovers optional
date
headers, formats absolute timestamps, keeps every frame incan_frames
, and tracks one latest frame per(id, channel)
inlast_id_chn_frame
.
Feature Flags
The crate enables both parsers by default. Use Cargo features to opt out:
Feature | Enabled by default? | Description |
---|---|---|
dbc |
✅ | DBC database parser and models (brings encoding_rs , slotmap ). |
asc |
✅ | Vector ASCII trace parser and models (depends on dbc , adds chrono ). |
This README documents the library API (no application/UI specifics).
Installation
Add to Cargo.toml
:
[]
= "1.3.6"
Use only the DBC parser (disable default features):
[]
= { = "1.3.6", = false, = ["dbc"] }
Minimal usage with DBC only:
use dbc;
use DatabaseDBC;
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_db_nodes_by_name;
db.sort_db_messages_by_name;
db.sort_db_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?;
// `CanLog` contains:
// - `can_frames`: every frame in file order;
// - `messages`: one entry per frame with enriched metadata;
// - `signals`: aggregated decoded signals updated as frames arrive;
// - `last_id_chn_frame`: one index per `(id, channel)` pointing to the freshest frame;
// - `absolute_time`: optional trace start timestamp derived from the `date` header.
// Iterate all frames in file order and access their messages
for frame in &log.can_frames
License
MIT