From 3799926a1f9583055df09c1d2fa2f8c23ffb407f Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Thu, 20 Jul 2023 13:10:25 -0400 Subject: [PATCH] Make tlvmeta recognize feature map bitmaps. (#28084) * Make tlvmeta recognize feature map bitmaps. zap does not support per cluster featuremap types because types are global, however we can use naming conventions to select the correct featuremap values. This makes decoded data more user friendly. * Make flake8 happy * Support "Feature" as a name for features * Fix unit tests --------- Co-authored-by: Andrei Litvin --- .../generators/cpp/tlvmeta/__init__.py | 24 ++++++++++++++----- .../cpp-tlvmeta/clusters_meta.cpp | 2 +- src/lib/format/tests/TestDecoding.cpp | 2 +- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/scripts/py_matter_idl/matter_idl/generators/cpp/tlvmeta/__init__.py b/scripts/py_matter_idl/matter_idl/generators/cpp/tlvmeta/__init__.py index 6a567ee122d551..46c7de39498fac 100644 --- a/scripts/py_matter_idl/matter_idl/generators/cpp/tlvmeta/__init__.py +++ b/scripts/py_matter_idl/matter_idl/generators/cpp/tlvmeta/__init__.py @@ -62,14 +62,16 @@ def __init__(self, cluster: Cluster): for b in self.cluster.bitmaps: self.item_type_map[b.name] = "kBitmap" - def FieldEntry(self, field: Field, tag_type: str = 'ContextTag') -> TableEntry: - type_reference = "%s_%s" % (self.cluster.name, field.data_type.name) + def FieldEntry(self, field: Field, tag_type: str = 'ContextTag', type_override: Optional[str] = None) -> TableEntry: + data_type_name = type_override or field.data_type.name + type_reference = "%s_%s" % (self.cluster.name, data_type_name) + if type_reference not in self.known_types: type_reference = None - item_type = self.item_type_map.get(field.data_type.name, 'kDefault') + item_type = self.item_type_map.get(data_type_name, 'kDefault') - real_type = "%s::%s" % (self.cluster.name, field.data_type.name) + real_type = "%s::%s" % (self.cluster.name, data_type_name) if field.is_list: real_type = real_type + "[]" item_type = "kList" @@ -142,11 +144,21 @@ def CommandEntries(self) -> Generator[TableEntry, None, None]: def GenerateTables(self) -> Generator[Table, None, None]: self.ComputeKnownTypes() + cluster_feature_map = None + for b in self.cluster.bitmaps: + # Older matter files use `ClusterNameFeature` as naming, newer code was + # updated to just `Feature`. For now support both. + if b.name in {'Feature', f'{self.cluster.name}Feature'} and b.base_type.lower() == 'bitmap32': + cluster_feature_map = b.name + # Clusters have attributes. They are direct descendants for # attributes cluster_entries = [] - cluster_entries.extend([self.FieldEntry( - a.definition, tag_type='AttributeTag') for a in self.cluster.attributes]) + cluster_entries.extend([ + self.FieldEntry(a.definition, tag_type='AttributeTag', + type_override=(cluster_feature_map if a.definition.code == 0xFFFC else None)) + for a in self.cluster.attributes + ]) cluster_entries.extend([ # events always reference an existing struct diff --git a/scripts/py_matter_idl/matter_idl/tests/outputs/cluster_with_commands/cpp-tlvmeta/clusters_meta.cpp b/scripts/py_matter_idl/matter_idl/tests/outputs/cluster_with_commands/cpp-tlvmeta/clusters_meta.cpp index d96c8564e626dd..66462f8a497554 100644 --- a/scripts/py_matter_idl/matter_idl/tests/outputs/cluster_with_commands/cpp-tlvmeta/clusters_meta.cpp +++ b/scripts/py_matter_idl/matter_idl/tests/outputs/cluster_with_commands/cpp-tlvmeta/clusters_meta.cpp @@ -9,7 +9,7 @@ using namespace chip::TLV; const Entry _OnOff[] = { { { AttributeTag(0), "onOff", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::boolean - { { AttributeTag(65532), "featureMap", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::bitmap32 + { { AttributeTag(65532), "featureMap", ItemType::kBitmap }, 8 }, // OnOff::OnOffFeature { { AttributeTag(65533), "clusterRevision", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::int16u { { CommandTag(0), "Off", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::Off::() { { CommandTag(1), "On", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::On::() diff --git a/src/lib/format/tests/TestDecoding.cpp b/src/lib/format/tests/TestDecoding.cpp index e822c6869a82f9..7dfc005e8e5988 100644 --- a/src/lib/format/tests/TestDecoding.cpp +++ b/src/lib/format/tests/TestDecoding.cpp @@ -274,7 +274,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " endpoint_id: 0\n" " cluster_id: 49 == 'NetworkCommissioning'\n" " attribute_id: 65532 == 'featureMap'\n" - " NetworkCommissioning::featureMap: 4\n" + " NetworkCommissioning::featureMap: 4 == kEthernetNetworkInterface\n" " suppress_response: true\n" " interaction_model_revison: 1\n");