pub struct Nodes { /* private fields */ }Expand description
Represents the list of nodes (ECUs) defined in a DBC file.
Nodes represent the electronic control units (ECUs) that participate in the CAN bus communication. Each message must have a sender that is present in the nodes list.
§Examples
use dbc_rs::Nodes;
let nodes = Nodes::builder()
.add_node("ECM")
.add_node("TCM")
.build()?;Implementations§
Source§impl Nodes
impl Nodes
Sourcepub fn builder() -> NodesBuilder
pub fn builder() -> NodesBuilder
Create a new builder for constructing a Nodes
§Examples
use dbc_rs::Nodes;
let nodes = Nodes::builder()
.add_node("ECM")
.add_node("TCM")
.add_node("BCM")
.build()
.unwrap();
assert!(nodes.contains("ECM"));
assert!(nodes.contains("TCM"));Examples found in repository?
examples/create_dbc.rs (line 8)
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 nodes(&self) -> Option<&[Box<str>]>
pub fn nodes(&self) -> Option<&[Box<str>]>
Get a read-only slice of node names.
Returns None if there are no nodes, otherwise returns Some(&[Box<str>]).
Sourcepub fn to_string(&self) -> String
pub fn to_string(&self) -> String
Format nodes as a space-separated string for saving
Examples found in repository?
examples/create_dbc.rs (line 83)
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 to_dbc_string(&self) -> String
pub fn to_dbc_string(&self) -> String
Format nodes in DBC file format (e.g., BU_: ECM TCM)
Useful for debugging and visualization of the nodes in DBC format.
§Examples
use dbc_rs::Nodes;
let nodes = Nodes::builder()
.add_node("ECM")
.add_node("TCM")
.build()
.unwrap();
assert_eq!(nodes.to_dbc_string(), "BU_: ECM TCM");Trait Implementations§
Auto Trait Implementations§
impl Freeze for Nodes
impl RefUnwindSafe for Nodes
impl Send for Nodes
impl Sync for Nodes
impl Unpin for Nodes
impl UnwindSafe for Nodes
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more