pub enum Receivers<'a> {
Broadcast,
Nodes([Option<&'a str>; 64], usize),
None,
}Expand description
Represents the receiver nodes for a signal in a DBC file.
A signal can have three types of receivers:
- Broadcast (
*): The signal is broadcast to all nodes on the bus - Specific nodes: A list of specific node names that receive this signal
- None: No explicit receivers specified (signal may be unused or receiver is implicit)
§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" *
SG_ Temp : 16|8@0- (1,-40) [-40|215] "°C" TCM BCM
"#)?;
let message = dbc.messages().at(0).unwrap();
// Broadcast receiver
let rpm_signal = message.signals().find("RPM").unwrap();
assert_eq!(rpm_signal.receivers().len(), 0); // Broadcast has no specific nodes
// 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 definition:
*indicates broadcast- Space-separated node names indicate specific receivers
- No receivers means
None
Variants§
Broadcast
Broadcast receiver - signal is sent to all nodes on the bus.
Nodes([Option<&'a str>; 64], usize)
Specific receiver nodes - array of node names and count.
The array can hold up to 64 nodes. The second element is the actual count.
None
No explicit receivers specified.
Implementations§
Source§impl<'a> Receivers<'a>
impl<'a> Receivers<'a>
Sourcepub fn iter(&self) -> impl Iterator<Item = &'a str> + '_
pub fn iter(&self) -> impl Iterator<Item = &'a str> + '_
Returns an iterator over the receiver node names.
For Receivers::Broadcast and 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);§Broadcast and None
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();
// Broadcast 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::BroadcastandReceivers::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 both Receivers::Broadcast and Receivers::None,
as neither has specific node names.
§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::Broadcast and 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<&'a str>
pub fn at(&self, index: usize) -> Option<&'a str>
Gets a receiver node by index.
Returns None if:
- The index is out of bounds
- The receiver is
BroadcastorNone
§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);