Skip to content

Commit 3799926

Browse files
andy31415andreilitvin
authored andcommitted
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 <[email protected]>
1 parent d3b13a3 commit 3799926

File tree

3 files changed

+20
-8
lines changed

3 files changed

+20
-8
lines changed

scripts/py_matter_idl/matter_idl/generators/cpp/tlvmeta/__init__.py

+18-6
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,16 @@ def __init__(self, cluster: Cluster):
6262
for b in self.cluster.bitmaps:
6363
self.item_type_map[b.name] = "kBitmap"
6464

65-
def FieldEntry(self, field: Field, tag_type: str = 'ContextTag') -> TableEntry:
66-
type_reference = "%s_%s" % (self.cluster.name, field.data_type.name)
65+
def FieldEntry(self, field: Field, tag_type: str = 'ContextTag', type_override: Optional[str] = None) -> TableEntry:
66+
data_type_name = type_override or field.data_type.name
67+
type_reference = "%s_%s" % (self.cluster.name, data_type_name)
68+
6769
if type_reference not in self.known_types:
6870
type_reference = None
6971

70-
item_type = self.item_type_map.get(field.data_type.name, 'kDefault')
72+
item_type = self.item_type_map.get(data_type_name, 'kDefault')
7173

72-
real_type = "%s::%s" % (self.cluster.name, field.data_type.name)
74+
real_type = "%s::%s" % (self.cluster.name, data_type_name)
7375
if field.is_list:
7476
real_type = real_type + "[]"
7577
item_type = "kList"
@@ -142,11 +144,21 @@ def CommandEntries(self) -> Generator[TableEntry, None, None]:
142144
def GenerateTables(self) -> Generator[Table, None, None]:
143145
self.ComputeKnownTypes()
144146

147+
cluster_feature_map = None
148+
for b in self.cluster.bitmaps:
149+
# Older matter files use `ClusterNameFeature` as naming, newer code was
150+
# updated to just `Feature`. For now support both.
151+
if b.name in {'Feature', f'{self.cluster.name}Feature'} and b.base_type.lower() == 'bitmap32':
152+
cluster_feature_map = b.name
153+
145154
# Clusters have attributes. They are direct descendants for
146155
# attributes
147156
cluster_entries = []
148-
cluster_entries.extend([self.FieldEntry(
149-
a.definition, tag_type='AttributeTag') for a in self.cluster.attributes])
157+
cluster_entries.extend([
158+
self.FieldEntry(a.definition, tag_type='AttributeTag',
159+
type_override=(cluster_feature_map if a.definition.code == 0xFFFC else None))
160+
for a in self.cluster.attributes
161+
])
150162

151163
cluster_entries.extend([
152164
# events always reference an existing struct

scripts/py_matter_idl/matter_idl/tests/outputs/cluster_with_commands/cpp-tlvmeta/clusters_meta.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ using namespace chip::TLV;
99

1010
const Entry<ItemInfo> _OnOff[] = {
1111
{ { AttributeTag(0), "onOff", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::boolean
12-
{ { AttributeTag(65532), "featureMap", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::bitmap32
12+
{ { AttributeTag(65532), "featureMap", ItemType::kBitmap }, 8 }, // OnOff::OnOffFeature
1313
{ { AttributeTag(65533), "clusterRevision", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::int16u
1414
{ { CommandTag(0), "Off", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::Off::()
1515
{ { CommandTag(1), "On", ItemType::kDefault }, kInvalidNodeIndex }, // OnOff::On::()

src/lib/format/tests/TestDecoding.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext)
274274
" endpoint_id: 0\n"
275275
" cluster_id: 49 == 'NetworkCommissioning'\n"
276276
" attribute_id: 65532 == 'featureMap'\n"
277-
" NetworkCommissioning::featureMap: 4\n"
277+
" NetworkCommissioning::featureMap: 4 == kEthernetNetworkInterface\n"
278278
" suppress_response: true\n"
279279
" interaction_model_revison: 1\n");
280280

0 commit comments

Comments
 (0)