mirror of
https://github.com/espressif/esp-matter.git
synced 2026-04-27 19:13:13 +00:00
Merge branch 'fix-groups-cluster-count-1-3' into 'release/v1.3'
[v1.3] components/esp_matter: get the cluster count from the node details See merge request app-frameworks/esp-matter!1124
This commit is contained in:
@@ -1215,9 +1215,6 @@ const function_generic_t function_list[] = {
|
||||
};
|
||||
const int function_flags = CLUSTER_FLAG_INIT_FUNCTION;
|
||||
|
||||
static uint8_t server_cluster_count = 0;
|
||||
uint8_t get_server_cluster_count() { return server_cluster_count; }
|
||||
|
||||
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
|
||||
{
|
||||
cluster_t *cluster = cluster::create(endpoint, Groups::Id, flags);
|
||||
@@ -1246,8 +1243,6 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
|
||||
} else {
|
||||
ESP_LOGE(TAG, "Config is NULL. Cannot add some attributes.");
|
||||
}
|
||||
|
||||
server_cluster_count++;
|
||||
}
|
||||
|
||||
/* Commands */
|
||||
|
||||
@@ -920,7 +920,7 @@ static void esp_matter_chip_init_task(intptr_t context)
|
||||
#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL
|
||||
// Group data provider injection for dynamic data model
|
||||
{
|
||||
uint8_t groups_server_cluster_count = cluster::groups::get_server_cluster_count();
|
||||
uint8_t groups_server_cluster_count = node::get_server_cluster_endpoint_count(chip::app::Clusters::Groups::Id);
|
||||
uint16_t max_groups_per_fabric = groups_server_cluster_count * MAX_GROUPS_PER_FABRIC_PER_ENDPOINT;
|
||||
|
||||
// since groupDataProvider is a static variable, it won't be released.
|
||||
@@ -2312,5 +2312,106 @@ esp_err_t destroy()
|
||||
return destroy_raw();
|
||||
}
|
||||
|
||||
// Treat 0xFFFF'FFFF as wildcard cluster
|
||||
static inline bool is_wildcard_cluster_id(uint32_t cluster_id)
|
||||
{
|
||||
return cluster_id == chip::kInvalidClusterId;
|
||||
}
|
||||
|
||||
// Treat 0xFFFF as wildcard endpoint
|
||||
static inline bool is_wildcard_endpoint_id(uint16_t endpoint_id)
|
||||
{
|
||||
return endpoint_id == chip::kInvalidEndpointId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the number of clusters that match the given flags
|
||||
*
|
||||
* @param endpoint_id: The endpoint ID to check, 0xFFFF is treated as wildcard endpoint id
|
||||
* @param cluster_id: The cluster ID to check, 0xFFFF is treated as wildcard cluster id
|
||||
* @param cluster_flags: The flags to check
|
||||
* @return The number of clusters that match the given flags
|
||||
*/
|
||||
static uint32_t get_cluster_count(uint32_t endpoint_id, uint32_t cluster_id, uint8_t cluster_flags)
|
||||
{
|
||||
uint32_t count = 0;
|
||||
node_t *node = get();
|
||||
VerifyOrReturnValue(node, count, ESP_LOGE(TAG, "Node cannot be NULL"));
|
||||
|
||||
// lambda to check if cluster matches flags and return 1 if it does, 0 otherwise
|
||||
auto check_cluster_flags = [cluster_flags](const endpoint_t *endpoint, const cluster_t *cluster) -> uint32_t {
|
||||
if (cluster && endpoint) {
|
||||
const _cluster_t *_cluster = (_cluster_t *)cluster;
|
||||
EmberAfClusterMask flags = _cluster->flags;
|
||||
return (flags & cluster_flags) ? 1 : 0;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
// lambda to count all matching clusters for an endpoint
|
||||
auto get_count_on_all_clusters = [&check_cluster_flags](endpoint_t *endpoint) -> uint32_t {
|
||||
uint32_t result = 0;
|
||||
if (!endpoint) return result;
|
||||
|
||||
cluster_t *cluster = cluster::get_first(endpoint);
|
||||
while (cluster) {
|
||||
result += check_cluster_flags(endpoint, cluster);
|
||||
cluster = cluster::get_next(cluster);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
// lambda to find and count a specific cluster
|
||||
auto get_count_on_specific_cluster = [&check_cluster_flags](const endpoint_t *endpoint, uint32_t cluster_id) -> uint32_t {
|
||||
if (!endpoint) return 0;
|
||||
cluster_t *cluster = cluster::get((endpoint_t *)endpoint, cluster_id);
|
||||
return check_cluster_flags(endpoint, cluster);
|
||||
};
|
||||
|
||||
// Case 1: Wildcard endpoint
|
||||
if (is_wildcard_endpoint_id(endpoint_id)) {
|
||||
endpoint_t *endpoint = endpoint::get_first(node);
|
||||
while (endpoint) {
|
||||
// Case 1.1: Wildcard cluster - count all clusters with matching flags
|
||||
if (is_wildcard_cluster_id(cluster_id)) {
|
||||
count += get_count_on_all_clusters(endpoint);
|
||||
}
|
||||
// Case 1.2: Specific cluster - count if it exists and has matching flags
|
||||
else {
|
||||
count += get_count_on_specific_cluster(endpoint, cluster_id);
|
||||
}
|
||||
endpoint = endpoint::get_next(endpoint);
|
||||
}
|
||||
}
|
||||
// Case 2: Specific endpoint
|
||||
else {
|
||||
endpoint_t *endpoint = endpoint::get(node, endpoint_id);
|
||||
if (!endpoint) {
|
||||
return count;
|
||||
}
|
||||
|
||||
// Case 2.1: Wildcard cluster - count all clusters with matching flags
|
||||
if (is_wildcard_cluster_id(cluster_id)) {
|
||||
count += get_count_on_all_clusters(endpoint);
|
||||
}
|
||||
// Case 2.2: Specific cluster - count if it exists and has matching flags
|
||||
else {
|
||||
count += get_count_on_specific_cluster(endpoint, cluster_id);
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
uint32_t get_server_cluster_endpoint_count(uint32_t cluster_id)
|
||||
{
|
||||
return get_cluster_count(chip::kInvalidEndpointId, cluster_id, CLUSTER_FLAG_SERVER);
|
||||
}
|
||||
|
||||
uint32_t get_client_cluster_endpoint_count(uint32_t cluster_id)
|
||||
{
|
||||
return get_cluster_count(chip::kInvalidEndpointId, cluster_id, CLUSTER_FLAG_CLIENT);
|
||||
}
|
||||
|
||||
} /* node */
|
||||
} /* esp_matter */
|
||||
|
||||
@@ -145,6 +145,28 @@ node_t *get();
|
||||
*/
|
||||
esp_err_t destroy();
|
||||
|
||||
/** Get the endpoint count for a server cluster
|
||||
*
|
||||
* Get the number of endpoints that have the given cluster ID as a server cluster.
|
||||
*
|
||||
* @param[in] cluster_id Cluster ID.
|
||||
*
|
||||
* @return Endpoint count on success.
|
||||
* @return 0 in case of failure or if not found on any endpoint.
|
||||
*/
|
||||
|
||||
uint32_t get_server_cluster_endpoint_count(uint32_t cluster_id);
|
||||
|
||||
/** Get the endpoint count for a client cluster
|
||||
*
|
||||
* Get the number of endpoints that have the given cluster ID as a client cluster.
|
||||
*
|
||||
* @param[in] cluster_id Cluster ID.
|
||||
*
|
||||
* @return Endpoint count on success.
|
||||
* @return 0 in case of failure or if not found on any endpoint.
|
||||
*/
|
||||
uint32_t get_client_cluster_endpoint_count(uint32_t cluster_id);
|
||||
} /* node */
|
||||
|
||||
namespace endpoint {
|
||||
|
||||
Reference in New Issue
Block a user