zigbee_cluster_library/header/
mod.rs

1//! ZCL Header
2#![allow(dead_code, unreachable_pub)]
3
4pub mod command_identifier;
5pub mod frame_control;
6pub mod manufacturer_code;
7
8use command_identifier::CommandIdentifier;
9use frame_control::FrameControl;
10use manufacturer_code::ManufacturerCode;
11
12use crate::impl_byte;
13
14use core::fmt::Debug;
15
16impl_byte! {
17    /// 2.4.1 ZCL Header
18    #[derive(Clone, Debug, Eq, PartialEq)]
19    pub struct ZclHeader {
20        /// See Section 2.4.1.1.
21        pub frame_control: FrameControl,
22        /// See Section 2.4.1.2.
23        #[parse_if = frame_control.is_manufacturer_specific()]
24        pub manufacturer_code: Option<ManufacturerCode>,
25        /// See Section 2.4.1.3.
26        pub sequence_number: u8,
27        /// See Section 2.4.1.4.
28        pub command_identifier: CommandIdentifier,
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use byte::TryRead;
35
36    use crate::header::frame_control::FrameType;
37
38    use super::*;
39
40    #[test]
41    fn unpack_header_without_manufacturer_code() {
42        // given
43        let input = [0x18, 0x01, 0x0a];
44
45        // when
46        let (header, _) =
47            ZclHeader::try_read(&input, ()).expect("Could not read ZclHeader in test");
48
49        // then
50        assert_eq!(header.frame_control.frame_type(), FrameType::GlobalCommand);
51        assert!(!header.frame_control.is_manufacturer_specific());
52        assert_eq!(header.manufacturer_code, None);
53        assert_eq!(header.sequence_number, 1);
54        assert_eq!(
55            header.command_identifier,
56            CommandIdentifier::ReportAttributes
57        );
58    }
59
60    #[test]
61    fn unpack_header_with_manufacturer_code() {
62        // given
63        let input = [0x1c, 0x11, 0x12, 0x01, 0x0a];
64
65        // when
66        let (header, _) =
67            ZclHeader::try_read(&input, ()).expect("Could not read ZclHeader in test");
68
69        // then
70        assert_eq!(header.frame_control.frame_type(), FrameType::GlobalCommand);
71        assert!(header.frame_control.is_manufacturer_specific());
72        assert_eq!(header.manufacturer_code, Some(ManufacturerCode(4625)));
73        assert_eq!(header.sequence_number, 1);
74        assert_eq!(
75            header.command_identifier,
76            CommandIdentifier::ReportAttributes
77        );
78    }
79}