create_dbc/
create_dbc.rs

1use dbc_rs::{ByteOrder, Dbc, Message, Nodes, Receivers, Signal, Version};
2
3fn main() -> Result<(), dbc_rs::Error> {
4    // Create version "1.0" using builder
5    let version = Version::builder().major(1).minor(0).build()?;
6
7    // Create nodes: ECM and TCM using builder
8    let nodes = Nodes::builder().add_node("ECM").add_node("TCM").build()?;
9
10    // Create signals for Engine message using the builder pattern
11    let rpm_signal = Signal::builder()
12        .name("RPM")
13        .start_bit(0)
14        .length(16)
15        .byte_order(ByteOrder::LittleEndian)
16        .unsigned(true)
17        .factor(0.25)
18        .offset(0.0)
19        .min(0.0)
20        .max(8000.0)
21        .unit("rpm")
22        .receivers(Receivers::None)
23        .build()?;
24
25    let temp_signal = Signal::builder()
26        .name("Temp")
27        .start_bit(16)
28        .length(8)
29        .byte_order(ByteOrder::LittleEndian)
30        .unsigned(false)
31        .factor(1.0)
32        .offset(-40.0)
33        .min(-40.0)
34        .max(215.0)
35        .unit("°C")
36        .receivers(Receivers::None)
37        .build()?;
38
39    // Create signals for Brake message
40    let pressure_signal = Signal::builder()
41        .name("Pressure")
42        .start_bit(0)
43        .length(16)
44        .byte_order(ByteOrder::BigEndian)
45        .unsigned(true)
46        .factor(0.1)
47        .offset(0.0)
48        .min(0.0)
49        .max(1000.0)
50        .unit("bar")
51        .receivers(Receivers::None)
52        .build()?;
53
54    // Create Engine message (ID 256, DLC 8, sender ECM) using the builder pattern
55    let engine_message = Message::builder()
56        .id(256)
57        .name("Engine")
58        .dlc(8)
59        .sender("ECM")
60        .add_signal(rpm_signal)
61        .add_signal(temp_signal)
62        .build()?;
63
64    // Create Brake message (ID 512, DLC 4, sender TCM) using the builder pattern
65    let brake_message = Message::builder()
66        .id(512)
67        .name("Brake")
68        .dlc(4)
69        .sender("TCM")
70        .add_signal(pressure_signal)
71        .build()?;
72
73    // Create DBC with all components using the builder pattern
74    let dbc = Dbc::builder()
75        .version(version)
76        .nodes(nodes)
77        .add_message(engine_message)
78        .add_message(brake_message)
79        .build()?;
80
81    // Verify the created DBC
82    println!("Created DBC with version: {}", dbc.version().to_string());
83    println!("Nodes: {}", dbc.nodes().to_string());
84    println!("Messages: {}", dbc.messages().len());
85
86    for msg in dbc.messages() {
87        println!(
88            "  Message {} (ID: {}, DLC: {}, Sender: {})",
89            msg.name(),
90            msg.id(),
91            msg.dlc(),
92            msg.sender()
93        );
94        for sig in msg.signals() {
95            println!(
96                "    Signal {}: {}|{}@{} (factor: {}, offset: {}) [{:.1}|{:.1}] \"{}\"",
97                sig.name(),
98                sig.start_bit(),
99                sig.length(),
100                if sig.byte_order() == ByteOrder::LittleEndian {
101                    "0"
102                } else {
103                    "1"
104                },
105                sig.factor(),
106                sig.offset(),
107                sig.min(),
108                sig.max(),
109                sig.unit().unwrap_or("")
110            );
111        }
112    }
113
114    // The DBC object is now ready to use
115    // You can access messages, signals, and other data through the getter methods
116
117    Ok(())
118}