pub struct Signal { /* private fields */ }Expand description
Represents a signal within a CAN message.
A signal defines how a portion of the message payload should be interpreted, including bit position, length, scaling factors, and value ranges.
§Examples
use dbc_rs::{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()?;Implementations§
Source§impl Signal
impl Signal
Sourcepub fn builder() -> SignalBuilder
pub fn builder() -> SignalBuilder
Create a new builder for constructing a Signal
§Examples
use dbc_rs::{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()?;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 signal 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 start_bit(&self) -> u8
pub fn start_bit(&self) -> u8
Get the starting bit position within the 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 length(&self) -> u8
pub fn length(&self) -> u8
Get the signal length in bits.
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 byte_order(&self) -> ByteOrder
pub fn byte_order(&self) -> ByteOrder
Get the byte order (endianness) of the signal.
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 is_unsigned(&self) -> bool
pub fn is_unsigned(&self) -> bool
Check if the signal is unsigned.
Sourcepub fn factor(&self) -> f64
pub fn factor(&self) -> f64
Get the scaling factor for converting raw value to physical value.
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 offset(&self) -> f64
pub fn offset(&self) -> f64
Get the offset for converting raw value to physical value.
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 min(&self) -> f64
pub fn min(&self) -> f64
Get the minimum physical value.
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 max(&self) -> f64
pub fn max(&self) -> f64
Get the maximum physical value.
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 unit(&self) -> Option<&str>
pub fn unit(&self) -> Option<&str>
Get the unit string, if present.
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 to_dbc_string(&self) -> String
pub fn to_dbc_string(&self) -> String
Format signal in DBC file format (e.g., SG_ RPM : 0|16@1+ (0.25,0) [0|8000] "rpm" *)
Useful for debugging and visualization of the signal in DBC format. Note: The leading space is included to match DBC file formatting conventions.
§Examples
use dbc_rs::{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()?;
assert_eq!(signal.to_dbc_string(), " SG_ RPM : 0|16@1+ (0.25,0) [0|8000] \"rpm\" *");