zigbee_cluster_library/header/
mod.rs1#![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 #[derive(Clone, Debug, Eq, PartialEq)]
19 pub struct ZclHeader {
20 pub frame_control: FrameControl,
22 #[parse_if = frame_control.is_manufacturer_specific()]
24 pub manufacturer_code: Option<ManufacturerCode>,
25 pub sequence_number: u8,
27 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 let input = [0x18, 0x01, 0x0a];
44
45 let (header, _) =
47 ZclHeader::try_read(&input, ()).expect("Could not read ZclHeader in test");
48
49 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 let input = [0x1c, 0x11, 0x12, 0x01, 0x0a];
64
65 let (header, _) =
67 ZclHeader::try_read(&input, ()).expect("Could not read ZclHeader in test");
68
69 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}