pub struct Message { /* private fields */ }Expand description
Represents a CAN message within a DBC file.
A message contains a CAN ID, name, data length code (DLC), sender node, and a list of signals that make up the message payload.
§Examples
use dbc_rs::Message;
let message = Message::builder()
.id(256)
.name("EngineData")
.dlc(8)
.sender("ECM")
.build()?;Implementations§
Source§impl Message
impl Message
Sourcepub fn builder() -> MessageBuilder
pub fn builder() -> MessageBuilder
Create a new builder for constructing a Message
§Examples
use dbc_rs::{Message, Signal, ByteOrder, Receivers};
let signal = Signal::builder()
.name("RPM")
.start_bit(0)
.length(16)
.build()?;
let message = Message::builder()
.id(256)
.name("EngineData")
.dlc(8)
.sender("ECM")
.add_signal(signal)
.build()?;Examples found in repository?
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}Sourcepub fn id(&self) -> u32
pub fn id(&self) -> u32
Get the CAN message ID
Examples found in repository?
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}Sourcepub fn name(&self) -> &str
pub fn name(&self) -> &str
Get the message name
Examples found in repository?
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}Sourcepub fn dlc(&self) -> u8
pub fn dlc(&self) -> u8
Get the Data Length Code (DLC)
Examples found in repository?
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}Sourcepub fn sender(&self) -> &str
pub fn sender(&self) -> &str
Get the sender node name
Examples found in repository?
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}Sourcepub fn signals(&self) -> &[Signal]
pub fn signals(&self) -> &[Signal]
Get a read-only slice of signals in this message
Examples found in repository?
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}Sourcepub fn find_signal(&self, name: &str) -> Option<&Signal>
pub fn find_signal(&self, name: &str) -> Option<&Signal>
Find a signal by name in this message
Sourcepub fn to_dbc_string(&self) -> String
pub fn to_dbc_string(&self) -> String
Format message in DBC file format (e.g., BO_ 256 EngineData : 8 ECM)
This method formats the message header only. To include signals, use
to_dbc_string_with_signals().
Useful for debugging and visualization of the message in DBC format.
§Examples
use dbc_rs::{Message, Signal, ByteOrder, Receivers};
let signal = Signal::builder()
.name("RPM")
.start_bit(0)
.length(16)
.byte_order(ByteOrder::BigEndian)
.unsigned(true)
.factor(0.25)
.offset(0.0)
.min(0.0)
.max(8000.0)
.unit("rpm")
.receivers(Receivers::Broadcast)
.build()?;
let message = Message::builder()
.id(256)
.name("EngineData")
.dlc(8)
.sender("ECM")
.add_signal(signal)
.build()?;
assert_eq!(message.to_dbc_string(), "BO_ 256 EngineData : 8 ECM");Sourcepub fn to_dbc_string_with_signals(&self) -> String
pub fn to_dbc_string_with_signals(&self) -> String
Format message in DBC file format including all signals
This method formats the message header followed by all its signals, each on a new line. Useful for debugging and visualization.
§Examples
use dbc_rs::{Message, Signal, ByteOrder, Receivers};
let signal = Signal::builder()
.name("RPM")
.start_bit(0)
.length(16)
.byte_order(ByteOrder::BigEndian)
.unsigned(true)
.factor(0.25)
.offset(0.0)
.min(0.0)
.max(8000.0)
.unit("rpm")
.receivers(Receivers::Broadcast)
.build()?;
let message = Message::builder()
.id(256)
.name("EngineData")
.dlc(8)
.sender("ECM")
.add_signal(signal)
.build()?;
let dbc_str = message.to_dbc_string_with_signals();
assert!(dbc_str.contains("BO_ 256 EngineData : 8 ECM"));
assert!(dbc_str.contains("SG_ RPM"));