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