pub enum Receivers {
Nodes(Vec<String<{ MAX_NAME_SIZE }>, { _ }>),
None,
}Expand description
Represents the receiver nodes for a signal in a DBC file.
Per the DBC specification (Section 9.5), receivers are defined as:
receiver = node_name | 'Vector__XXX' ;
receivers = receiver {',' receiver} ;A signal can have two types of receivers:
- Specific nodes: A list of specific node names that receive this signal
- None: No explicit receivers specified (use
Vector__XXXin DBC output)
§Examples
use dbc_rs::Dbc;
let dbc = Dbc::parse(r#"VERSION "1.0"
BU_: ECM TCM BCM
BO_ 256 Engine : 8 ECM
SG_ RPM : 0|16@1+ (0.25,0) [0|8000] "rpm" Vector__XXX
SG_ Temp : 16|8@0- (1,-40) [-40|215] "°C" TCM,BCM
"#)?;
let message = dbc.messages().at(0).unwrap();
// No specific receiver (Vector__XXX)
let rpm_signal = message.signals().find("RPM").unwrap();
assert_eq!(rpm_signal.receivers().len(), 0);
// Specific nodes
let temp_signal = message.signals().find("Temp").unwrap();
assert_eq!(temp_signal.receivers().len(), 2);
assert!(temp_signal.receivers().contains("TCM"));§DBC Format
In DBC files, receivers are specified after the signal unit:
- Comma-separated node names indicate specific receivers (per spec)
Vector__XXXindicates no specific receiver
Variants§
Nodes(Vec<String<{ MAX_NAME_SIZE }>, { _ }>)
Specific receiver nodes - vector of node names.
None
No explicit receivers specified (serializes as Vector__XXX).
Implementations§
Source§impl Receivers
impl Receivers
Sourcepub fn iter(&self) -> impl Iterator<Item = &str>
pub fn iter(&self) -> impl Iterator<Item = &str>
Returns an iterator over the receiver node names.
For Receivers::None, the iterator will be empty.
For Receivers::Nodes, it iterates over the specific node names.
§Examples
use dbc_rs::Dbc;
let dbc = Dbc::parse(r#"VERSION "1.0"
BU_: ECM TCM BCM
BO_ 256 Engine : 8 ECM
SG_ Temp : 0|8@1+ (1,0) [0|255] "°C" TCM,BCM
"#)?;
let message = dbc.messages().at(0).unwrap();
let signal = message.signals().at(0).unwrap();
// Iterate over receiver nodes
let mut iter = signal.receivers().iter();
assert_eq!(iter.next(), Some("TCM"));
assert_eq!(iter.next(), Some("BCM"));
assert_eq!(iter.next(), None);§None Receivers
use dbc_rs::Dbc;
let dbc = Dbc::parse(r#"VERSION "1.0"
BU_: ECM
BO_ 256 Engine : 8 ECM
SG_ RPM : 0|16@1+ (0.25,0) [0|8000] "rpm" Vector__XXX
"#)?;
let message = dbc.messages().at(0).unwrap();
let signal = message.signals().at(0).unwrap();
// None receivers return empty iterator
assert_eq!(signal.receivers().iter().count(), 0);Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the number of receiver nodes.
- For
Receivers::Nodes: Returns the count of specific receiver nodes - For
Receivers::None: Returns0
§Examples
use dbc_rs::Dbc;
let dbc = Dbc::parse(r#"VERSION "1.0"
BU_: ECM TCM BCM
BO_ 256 Engine : 8 ECM
SG_ Temp : 0|8@1+ (1,0) [0|255] "°C" TCM,BCM
"#)?;
let message = dbc.messages().at(0).unwrap();
let signal = message.signals().at(0).unwrap();
assert_eq!(signal.receivers().len(), 2);Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if there are no specific receiver nodes.
This returns true for Receivers::None and for Receivers::Nodes with
an empty node list.
§Examples
use dbc_rs::Dbc;
let dbc = Dbc::parse(r#"VERSION "1.0"
BU_: ECM
BO_ 256 Engine : 8 ECM
SG_ RPM : 0|16@1+ (0.25,0) [0|8000] "rpm"
"#)?;
let message = dbc.messages().at(0).unwrap();
let signal = message.signals().at(0).unwrap();
assert!(signal.receivers().is_empty());Sourcepub fn contains(&self, node: &str) -> bool
pub fn contains(&self, node: &str) -> bool
Checks if a node name is in the receivers list.
For Receivers::None, this always returns false.
For Receivers::Nodes, it checks if the node name is in the list.
§Arguments
node- The node name to check
§Examples
use dbc_rs::Dbc;
let dbc = Dbc::parse(r#"VERSION "1.0"
BU_: ECM TCM BCM
BO_ 256 Engine : 8 ECM
SG_ Temp : 0|8@1+ (1,0) [0|255] "°C" TCM BCM
"#)?;
let message = dbc.messages().at(0).unwrap();
let signal = message.signals().at(0).unwrap();
assert!(signal.receivers().contains("TCM"));
assert!(signal.receivers().contains("BCM"));
assert!(!signal.receivers().contains("ECM"));Sourcepub fn at(&self, index: usize) -> Option<&str>
pub fn at(&self, index: usize) -> Option<&str>
Gets a receiver node by index.
Returns None if:
- The index is out of bounds
- The receiver is
None
§Arguments
index- The zero-based index of the receiver node
§Examples
use dbc_rs::Dbc;
let dbc = Dbc::parse(r#"VERSION "1.0"
BU_: ECM TCM BCM
BO_ 256 Engine : 8 ECM
SG_ Temp : 0|8@1+ (1,0) [0|255] "°C" TCM,BCM
"#)?;
let message = dbc.messages().at(0).unwrap();
let signal = message.signals().at(0).unwrap();
assert_eq!(signal.receivers().at(0), Some("TCM"));
assert_eq!(signal.receivers().at(1), Some("BCM"));
assert_eq!(signal.receivers().at(2), None);Source§impl Receivers
impl Receivers
Sourcepub fn to_dbc_string(&self) -> String
pub fn to_dbc_string(&self) -> String
Converts the receivers to their DBC file string representation.
Per DBC spec Section 9.5:
receivers = receiver {',' receiver} ;
receiver = node_name | 'Vector__XXX' ;- Specific nodes are comma-separated
- Empty or None receivers serialize as
Vector__XXX
§Examples
use dbc_rs::{ReceiversBuilder, Receivers};
// No receivers -> Vector__XXX
let none = ReceiversBuilder::new().none().build().unwrap();
assert_eq!(none.to_dbc_string(), "Vector__XXX");
// Single receiver
let single = ReceiversBuilder::new().add_node("TCM").build().unwrap();
assert_eq!(single.to_dbc_string(), "TCM");
// Multiple receivers -> comma-separated
let multi = ReceiversBuilder::new().add_node("TCM").add_node("BCM").build().unwrap();
assert_eq!(multi.to_dbc_string(), "TCM,BCM");