A CAN-dbc format parser written with Rust's nom parser combinator library. CAN databases are used to exchange details about a CAN network, e.g. what messages are being send over the CAN bus and what data do they contain.
Read dbc file and generate Rust structs based on the messages/signals defined in the dbc.
use std::fs;
use can_dbc::Dbc;
use codegen::Scope;
fn main() {
let data = fs::read_to_string("./examples/sample.dbc").expect("Unable to read input file");
let dbc = Dbc::try_from(data.as_str()).expect("Failed to parse dbc file");
let mut scope = Scope::new();
for msg in dbc.messages() {
let msg_struct = scope.new_struct(msg.name());
for signal in msg.signals() {
msg_struct.field(signal.name().to_lowercase().as_str(), "f64");
}
}
println!("{}", scope.to_string());
}
For a proper implementation for reading or writing CAN frames according to the DBC, I recommend you take a look at dbc-codegen.
The file parser simply parses a dbc input file and prints the parsed content.
cargo run --example file_parser -- --input examples/sample.dbc
-
version
-
new_symbols
-
bit_timing
(deprecated but mandatory) -
nodes
-
value_tables
-
messages
-
message_transmitters
-
environment_variables
-
environment_variables_data
-
signal_types
-
comments
-
attribute_definitions
-
sigtype_attr_list
(format missing documentation) -
attribute_defaults
-
attribute_values
-
value_descriptions
-
category_definitions
(deprecated) -
categories
(deprecated) -
filter
(deprecated) -
signal_type_refs
-
signal_groups
-
signal_extended_value_type_list
- multispace between parsers instead of single space allowing e.g. (two spaces)
SIG_GROUP 13
. VAL_
suffix may be;
or;
Test dbcs files were copied from the cantools project.
- This project is easier to develop with just, a modern alternative to
make
. - To get a list of available commands, run
just
. - To run tests, use
just test
. - This project uses insta for snapshot testing. To update the snapshots run
just bless
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT) at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual-licensed as above, without any additional terms or conditions.