1 unstable release

Uses new Rust 2024

new 0.1.0 Apr 27, 2025

#2009 in Procedural macros

MIT license

22KB
384 lines

dbc-data License: MIT dbc-data on crates.io dbc-data on docs.rs Source Code Repository

A derive-macro which produces code to access signals within CAN messages, as described by a .dbc file. The generated code has very few dependencies: just core primitives and [u8] slices, and is #[no_std] compatible.

Example

Given a .dbc file containing:

BO_ 1023 SomeMessage: 4 Ecu1
 SG_ Unsigned16 : 16|16@0+ (1,0) [0|0] "" Vector__XXX
 SG_ Unsigned8 : 8|8@1+ (1,0) [0|0] "" Vector__XXX
 SG_ Signed8 : 0|8@1- (1,0) [0|0] "" Vector__XXX

The following code can be written to access the fields of the message:

pub use dbc_data::*;

#[derive(DbcData, Default)]
#[dbc_file = "tests/example.dbc"]
struct TestData {
    some_message: SomeMessage,
}

fn test() {
    let mut t = TestData::default();

    assert_eq!(SomeMessage::ID, 1023);
    assert_eq!(SomeMessage::DLC, 4);
    assert!(t.some_message.decode(&[0x12, 0x34, 0x56, 0x78]).is_ok());
    assert_eq!(t.some_message.Signed8, 0x12);
    assert_eq!(t.some_message.Unsigned8, 0x34);
    assert_eq!(t.some_message.Unsigned16, 0x5678); // big-endian
}

As .dbc files may contain multiple messages, each of these can be brought into scope by referencing their name as a type (e.g. SomeMessage as shown above) and this determines what code is generated. Messages not referenced will not generate any code.

For cases where only certain signals within a message are needed, the #[dbc_signals] attribute lets you specify which ones are used.

See the test cases in this crate for examples of usage.

Functionality

  • decode signals from PDU

  • encode signals into PDU

  • generate dispatcher for decoding based on ID

  • support multiplexed signals

  • consider scoping generated types to a module

License

LICENSE-MIT

Dependencies

~1–1.7MB
~36K SLoC