#parser-combinator #automotive #nom #dbc #ecu #data-exchange #networking

can-dbc

A parser for the DBC format. The DBC format is used to exchange CAN network data.

16 stable releases (5 major)

6.0.0 Feb 8, 2024
5.0.0 Jun 22, 2022
4.0.0 Nov 15, 2021
3.0.2 Oct 28, 2020
1.0.0 Dec 9, 2018

#166 in Parser implementations

Download history 1612/week @ 2024-07-22 1431/week @ 2024-07-29 1856/week @ 2024-08-05 1792/week @ 2024-08-12 1450/week @ 2024-08-19 1823/week @ 2024-08-26 1805/week @ 2024-09-02 1751/week @ 2024-09-09 1971/week @ 2024-09-16 2179/week @ 2024-09-23 1797/week @ 2024-09-30 2668/week @ 2024-10-07 2435/week @ 2024-10-14 2284/week @ 2024-10-21 2033/week @ 2024-10-28 2737/week @ 2024-11-04

9,565 downloads per month
Used in 5 crates (4 directly)

MIT license

82KB
2K SLoC

can-dbc

LICENSE VERSION Actions Status codecov docs Cargo Deny Status

A CAN-dbc format parser written with Rust's nom parser combinator library.

1. Example

Read dbc file and generate Rust structs based on the messages/signals defined in the dbc.

use can_dbc::DBC;
use codegen::Scope;

use std::fs::File;
use std::io;
use std::io::prelude::*;

fn main() -> io::Result<()> {
    let mut f = File::open("./examples/sample.dbc")?;
    let mut buffer = Vec::new();
    f.read_to_end(&mut buffer)?;

    let dbc = can_dbc::DBC::from_slice(&buffer).expect("Failed to parse dbc file");

    let mut scope = Scope::new();
    for message in dbc.messages() {
        for signal in message.signals() {

            let mut scope = Scope::new();
            let message_struct = scope.new_struct(message.message_name());
            for signal in message.signals() {
                message_struct.field(signal.name().to_lowercase().as_str(), "f64");
            }
        }
    }

    println!("{}", scope.to_string());
    Ok(())
}

For a proper implementation for reading or writing CAN frames according to the DBC, I recommend you take a look at dbc-codegen.

2. Example

The file parser simply parses a dbc input file and prints the parsed content.

cargo test && ./target/debug/examples/file_parser -i examples/sample.dbc

Installation

can-dbc is available on crates.io and can be included in your Cargo enabled project like this:

[dependencies]
can-dbc = "3.0"

Implemented DBC parts

  • 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

Deviating from standard

  • multispace between parsers instead of single space allowing e.g. (two spaces) SIG_GROUP 13.
  • VAL_ suffix may be ; or ;

Alternatives

Credits

Test dbcs files were copied from the cantools project.

License Checks

This project uses cargo-deny for checking the licenses of dependencies. To run the check locally run the following:

cargo install cargo-deny
cargo deny check

Dependencies

~2.5MB
~57K SLoC