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(), "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.