#![allow(dead_code, unreachable_pub)]
pub mod command_identifier;
pub mod frame_control;
pub mod manufacturer_code;
use core::fmt::Debug;
use command_identifier::CommandIdentifier;
use frame_control::FrameControl;
use manufacturer_code::ManufacturerCode;
use zigbee::internal::macros::impl_byte;
impl_byte! {
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ZclHeader {
pub frame_control: FrameControl,
#[parse_if = frame_control.is_manufacturer_specific()]
pub manufacturer_code: Option<ManufacturerCode>,
pub sequence_number: u8,
pub command_identifier: CommandIdentifier,
}
}
#[cfg(test)]
mod tests {
use byte::TryRead;
use super::*;
use crate::header::frame_control::FrameType;
#[test]
fn unpack_header_without_manufacturer_code() {
let input = [0x18, 0x01, 0x0a];
let (header, _) =
ZclHeader::try_read(&input, ()).expect("Could not read ZclHeader in test");
assert_eq!(header.frame_control.frame_type(), FrameType::GlobalCommand);
assert!(!header.frame_control.is_manufacturer_specific());
assert_eq!(header.manufacturer_code, None);
assert_eq!(header.sequence_number, 1);
assert_eq!(
header.command_identifier,
CommandIdentifier::ReportAttributes
);
}
#[test]
fn unpack_header_with_manufacturer_code() {
let input = [0x1c, 0x11, 0x12, 0x02, 0x0a];
let (header, _) =
ZclHeader::try_read(&input, ()).expect("Could not read ZclHeader in test");
assert_eq!(header.frame_control.frame_type(), FrameType::GlobalCommand);
assert!(header.frame_control.is_manufacturer_specific());
assert_eq!(header.manufacturer_code, Some(ManufacturerCode(4625)));
assert_eq!(header.sequence_number, 2);
assert_eq!(
header.command_identifier,
CommandIdentifier::ReportAttributes
);
}
}