diff --git a/matter/src/data_model/cluster_basic_information.rs b/matter/src/data_model/cluster_basic_information.rs index eedd826..61eecef 100644 --- a/matter/src/data_model/cluster_basic_information.rs +++ b/matter/src/data_model/cluster_basic_information.rs @@ -42,59 +42,6 @@ pub struct BasicInfoConfig { pub device_name: String, } -fn attr_dm_rev_new() -> Result { - Attribute::new( - Attributes::DMRevision as u16, - AttrValue::Uint8(1), - Access::RV, - Quality::FIXED, - ) -} - -fn attr_vid_new(vid: u16) -> Result { - Attribute::new( - Attributes::VendorId as u16, - AttrValue::Uint16(vid), - Access::RV, - Quality::FIXED, - ) -} - -fn attr_pid_new(pid: u16) -> Result { - Attribute::new( - Attributes::ProductId as u16, - AttrValue::Uint16(pid), - Access::RV, - Quality::FIXED, - ) -} - -fn attr_hw_ver_new(hw_ver: u16) -> Result { - Attribute::new( - Attributes::HwVer as u16, - AttrValue::Uint16(hw_ver), - Access::RV, - Quality::FIXED, - ) -} - -fn attr_sw_ver_new(sw_ver: u32) -> Result { - Attribute::new( - Attributes::SwVer as u16, - AttrValue::Uint32(sw_ver), - Access::RV, - Quality::FIXED, - ) -} - -fn attr_serial_no_new(label: String) -> Result { - Attribute::new( - Attributes::SerialNo as u16, - AttrValue::Utf8(label), - Access::RV, - Quality::FIXED, - ) -} pub struct BasicInfoCluster { base: Cluster, } @@ -104,14 +51,47 @@ impl BasicInfoCluster { let mut cluster = Box::new(BasicInfoCluster { base: Cluster::new(ID)?, }); - cluster.base.add_attribute(attr_dm_rev_new()?)?; - cluster.base.add_attribute(attr_vid_new(cfg.vid)?)?; - cluster.base.add_attribute(attr_pid_new(cfg.pid)?)?; - cluster.base.add_attribute(attr_hw_ver_new(cfg.hw_ver)?)?; - cluster.base.add_attribute(attr_sw_ver_new(cfg.sw_ver)?)?; - cluster - .base - .add_attribute(attr_serial_no_new(cfg.serial_no)?)?; + + let attrs = [ + Attribute::new( + Attributes::DMRevision as u16, + AttrValue::Uint8(1), + Access::RV, + Quality::FIXED, + )?, + Attribute::new( + Attributes::VendorId as u16, + AttrValue::Uint16(cfg.vid), + Access::RV, + Quality::FIXED, + )?, + Attribute::new( + Attributes::ProductId as u16, + AttrValue::Uint16(cfg.pid), + Access::RV, + Quality::FIXED, + )?, + Attribute::new( + Attributes::HwVer as u16, + AttrValue::Uint16(cfg.hw_ver), + Access::RV, + Quality::FIXED, + )?, + Attribute::new( + Attributes::SwVer as u16, + AttrValue::Uint32(cfg.sw_ver), + Access::RV, + Quality::FIXED, + )?, + Attribute::new( + Attributes::SerialNo as u16, + AttrValue::Utf8(cfg.serial_no), + Access::RV, + Quality::FIXED, + )?, + ]; + cluster.base.add_attributes(&attrs[..])?; + Ok(cluster) } } diff --git a/matter/src/data_model/objects/attribute.rs b/matter/src/data_model/objects/attribute.rs index 0ffbc73..0f897e1 100644 --- a/matter/src/data_model/objects/attribute.rs +++ b/matter/src/data_model/objects/attribute.rs @@ -151,7 +151,7 @@ impl AttrValue { } } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Attribute { pub(super) id: u16, pub(super) value: AttrValue, diff --git a/matter/src/data_model/objects/cluster.rs b/matter/src/data_model/objects/cluster.rs index d279363..68a4860 100644 --- a/matter/src/data_model/objects/cluster.rs +++ b/matter/src/data_model/objects/cluster.rs @@ -30,7 +30,7 @@ use std::fmt::{self, Debug}; use super::Encoder; -pub const ATTRS_PER_CLUSTER: usize = 8; +pub const ATTRS_PER_CLUSTER: usize = 10; pub const CMDS_PER_CLUSTER: usize = 8; #[derive(FromPrimitive, Debug)] @@ -132,6 +132,15 @@ impl Cluster { )?) } + pub fn add_attributes(&mut self, attrs: &[Attribute]) -> Result<(), Error> { + if self.attributes.len() + attrs.len() <= self.attributes.capacity() { + self.attributes.extend_from_slice(attrs); + Ok(()) + } else { + Err(Error::NoSpace) + } + } + pub fn add_attribute(&mut self, attr: Attribute) -> Result<(), Error> { if self.attributes.len() < self.attributes.capacity() { self.attributes.push(attr); diff --git a/matter/src/data_model/system_model/descriptor.rs b/matter/src/data_model/system_model/descriptor.rs index 29fb15b..377b950 100644 --- a/matter/src/data_model/system_model/descriptor.rs +++ b/matter/src/data_model/system_model/descriptor.rs @@ -48,9 +48,27 @@ impl DescriptorCluster { data_model, base: Cluster::new(ID)?, }); - c.base.add_attribute(attr_devtypelist_new()?)?; - c.base.add_attribute(attr_serverlist_new()?)?; - c.base.add_attribute(attr_partslist_new()?)?; + let attrs = [ + Attribute::new( + Attributes::DeviceTypeList as u16, + AttrValue::Custom, + Access::RV, + Quality::NONE, + )?, + Attribute::new( + Attributes::ServerList as u16, + AttrValue::Custom, + Access::RV, + Quality::NONE, + )?, + Attribute::new( + Attributes::PartsList as u16, + AttrValue::Custom, + Access::RV, + Quality::NONE, + )?, + ]; + c.base.add_attributes(&attrs[..])?; Ok(c) } @@ -133,29 +151,3 @@ impl ClusterType for DescriptorCluster { } } } - -fn attr_devtypelist_new() -> Result { - Attribute::new( - Attributes::DeviceTypeList as u16, - AttrValue::Custom, - Access::RV, - Quality::NONE, - ) -} -fn attr_serverlist_new() -> Result { - Attribute::new( - Attributes::ServerList as u16, - AttrValue::Custom, - Access::RV, - Quality::NONE, - ) -} - -fn attr_partslist_new() -> Result { - Attribute::new( - Attributes::PartsList as u16, - AttrValue::Custom, - Access::RV, - Quality::NONE, - ) -}