dbc_rs/receivers/mod.rs
1mod core;
2mod parse;
3
4#[cfg(feature = "std")]
5mod builder;
6
7use crate::{
8 MAX_NAME_SIZE, MAX_NODES,
9 compat::{String, Vec},
10};
11
12/// Represents the receiver nodes for a signal in a DBC file.
13///
14/// A signal can have three types of receivers:
15/// - **Broadcast** (`*`): The signal is broadcast to all nodes on the bus
16/// - **Specific nodes**: A list of specific node names that receive this signal
17/// - **None**: No explicit receivers specified (signal may be unused or receiver is implicit)
18///
19/// # Examples
20///
21/// ```rust,no_run
22/// use dbc_rs::Dbc;
23///
24/// let dbc = Dbc::parse(r#"VERSION "1.0"
25///
26/// BU_: ECM TCM BCM
27///
28/// BO_ 256 Engine : 8 ECM
29/// SG_ RPM : 0|16@1+ (0.25,0) [0|8000] "rpm" *
30/// SG_ Temp : 16|8@0- (1,-40) [-40|215] "°C" TCM BCM
31/// "#)?;
32///
33/// let message = dbc.messages().at(0).unwrap();
34///
35/// // Broadcast receiver
36/// let rpm_signal = message.signals().find("RPM").unwrap();
37/// assert_eq!(rpm_signal.receivers().len(), 0); // Broadcast has no specific nodes
38///
39/// // Specific nodes
40/// let temp_signal = message.signals().find("Temp").unwrap();
41/// assert_eq!(temp_signal.receivers().len(), 2);
42/// assert!(temp_signal.receivers().contains("TCM"));
43/// # Ok::<(), dbc_rs::Error>(())
44/// ```
45///
46/// # DBC Format
47///
48/// In DBC files, receivers are specified after the signal definition:
49/// - `*` indicates broadcast
50/// - Space-separated node names indicate specific receivers
51/// - No receivers means `None`
52#[derive(Debug, Clone, PartialEq, Eq, Hash)]
53#[allow(clippy::large_enum_variant)]
54pub enum Receivers {
55 /// Broadcast receiver - signal is sent to all nodes on the bus.
56 Broadcast,
57 /// Specific receiver nodes - vector of node names.
58 Nodes(Vec<String<{ MAX_NAME_SIZE }>, { MAX_NODES - 1 }>),
59 /// No explicit receivers specified.
60 None,
61}
62
63#[cfg(feature = "std")]
64pub use builder::ReceiversBuilder;