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}