Signal

Struct Signal 

Source
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

Source

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?
examples/create_dbc.rs (line 11)
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}
Source

pub fn name(&self) -> &str

Get the signal name.

Examples found in repository?
examples/create_dbc.rs (line 97)
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}
Source

pub fn start_bit(&self) -> u8

Get the starting bit position within the message.

Examples found in repository?
examples/create_dbc.rs (line 98)
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}
Source

pub fn length(&self) -> u8

Get the signal length in bits.

Examples found in repository?
examples/create_dbc.rs (line 99)
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}
Source

pub fn byte_order(&self) -> ByteOrder

Get the byte order (endianness) of the signal.

Examples found in repository?
examples/create_dbc.rs (line 100)
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}
Source

pub fn is_unsigned(&self) -> bool

Check if the signal is unsigned.

Source

pub fn factor(&self) -> f64

Get the scaling factor for converting raw value to physical value.

Examples found in repository?
examples/create_dbc.rs (line 105)
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}
Source

pub fn offset(&self) -> f64

Get the offset for converting raw value to physical value.

Examples found in repository?
examples/create_dbc.rs (line 106)
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}
Source

pub fn min(&self) -> f64

Get the minimum physical value.

Examples found in repository?
examples/create_dbc.rs (line 107)
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}
Source

pub fn max(&self) -> f64

Get the maximum physical value.

Examples found in repository?
examples/create_dbc.rs (line 108)
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}
Source

pub fn unit(&self) -> Option<&str>

Get the unit string, if present.

Examples found in repository?
examples/create_dbc.rs (line 109)
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}
Source

pub fn receivers(&self) -> &Receivers

Get the receiver specification for this signal.

Source

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\" *");

Trait Implementations§

Source§

impl Clone for Signal

Source§

fn clone(&self) -> Signal

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Signal

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Signal

Source§

fn eq(&self, other: &Signal) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for Signal

Auto Trait Implementations§

§

impl Freeze for Signal

§

impl RefUnwindSafe for Signal

§

impl Send for Signal

§

impl Sync for Signal

§

impl Unpin for Signal

§

impl UnwindSafe for Signal

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.