dbc_rs/message/
mod.rs

1mod impls;
2mod parse;
3mod signals;
4#[cfg(feature = "std")]
5mod std;
6mod validate;
7
8#[cfg(feature = "std")]
9mod builder;
10
11use crate::compat::Name;
12#[cfg(feature = "std")]
13pub use builder::MessageBuilder;
14pub use signals::Signals;
15
16/// Represents a CAN message in a DBC file.
17///
18/// A `Message` contains:
19/// - A unique ID (CAN identifier)
20/// - A name
21/// - A DLC (Data Length Code) specifying the message size in bytes
22/// - A sender node (ECU that transmits this message)
23/// - A collection of signals
24///
25/// # Examples
26///
27/// ```rust,no_run
28/// use dbc_rs::Dbc;
29///
30/// let dbc_content = r#"VERSION "1.0"
31///
32/// BU_: ECM
33///
34/// BO_ 256 EngineData : 8 ECM
35///  SG_ RPM : 0|16@0+ (0.25,0) [0|8000] "rpm" *
36/// "#;
37///
38/// let dbc = Dbc::parse(dbc_content)?;
39/// let message = dbc.messages().at(0).unwrap();
40/// println!("Message: {} (ID: {})", message.name(), message.id());
41/// # Ok::<(), dbc_rs::Error>(())
42/// ```
43#[derive(Debug, Clone, PartialEq, Eq, Hash)]
44pub struct Message {
45    id: u32,
46    name: Name,
47    dlc: u8,
48    sender: Name,
49    signals: Signals,
50}
51
52impl Message {
53    // CAN ID validation constants (per DBC spec Section 8.1)
54    // - Standard CAN ID: 0 to 2047 (0x7FF) - 11-bit identifier
55    // - Extended CAN ID: Set bit 31 (0x80000000) and use bits 0-28
56    // Valid ID ranges:
57    // - 0x00000000 to 0x1FFFFFFF (standard or extended without flag)
58    // - 0x80000000 to 0x9FFFFFFF (extended with bit 31 flag)
59    // - 0xC0000000 (special pseudo-message ID per Section 8.6)
60    // Invalid: 0x20000000 to 0x7FFFFFFF and 0xA0000000+ (except 0xC0000000)
61
62    /// Maximum 29-bit extended CAN ID value
63    const MAX_EXTENDED_ID: u32 = 0x1FFF_FFFF;
64    /// Bit 31 flag indicating extended CAN ID format
65    pub(crate) const EXTENDED_ID_FLAG: u32 = 0x8000_0000;
66    /// Maximum extended CAN ID with bit 31 flag set
67    const MAX_EXTENDED_ID_WITH_FLAG: u32 = Self::EXTENDED_ID_FLAG | Self::MAX_EXTENDED_ID;
68    /// Special pseudo-message ID for VECTOR__INDEPENDENT_SIG_MSG (per spec Section 8.6)
69    const PSEUDO_MESSAGE_ID: u32 = 0xC000_0000;
70}