From 1b9b96b6e052428025b1ca1923c00e7c06c8c046 Mon Sep 17 00:00:00 2001 From: chendejin Date: Wed, 24 Jul 2024 16:52:34 +0800 Subject: [PATCH] components/esp_matter: delete identify when destroy endpoint --- components/esp_matter/esp_matter_core.cpp | 33 ++++++++++++++++--- components/esp_matter/esp_matter_core.h | 13 ++++++++ components/esp_matter/esp_matter_identify.cpp | 7 ++-- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/components/esp_matter/esp_matter_core.cpp b/components/esp_matter/esp_matter_core.cpp index 33a0f2059..a0120298f 100644 --- a/components/esp_matter/esp_matter_core.cpp +++ b/components/esp_matter/esp_matter_core.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -191,6 +192,7 @@ typedef struct _endpoint { EmberAfDeviceType *device_types_ptr; uint16_t parent_endpoint_id; void *priv_data; + Identify *identify; struct _endpoint *next; } _endpoint_t; @@ -497,6 +499,12 @@ static esp_err_t disable(endpoint_t *endpoint) current_endpoint->device_types_ptr = NULL; } + /* Delete identify */ + if (current_endpoint->identify) { + chip::Platform::Delete(current_endpoint->identify); + current_endpoint->identify = NULL; + } + /* Free endpoint type */ esp_matter_mem_free(endpoint_type); current_endpoint->endpoint_type = NULL; @@ -606,7 +614,7 @@ esp_err_t enable(endpoint_t *endpoint) attribute::get_data_from_attr_val(&attribute->val, &matter_attributes[attribute_index].attributeType, &matter_attributes[attribute_index].size, NULL); - /* The length is not fixed for string attribute, so set it to the max size (32) to avoid overflow issue + /* The length is not fixed for string attribute, so set it to the max size (32) to avoid overflow issue * when writing a longer string. */ if (attribute->val.type == ESP_MATTER_VAL_TYPE_CHAR_STRING) { @@ -1020,8 +1028,8 @@ esp_err_t start(event_callback_t callback, intptr_t callback_arg) return ESP_ERR_INVALID_STATE; } esp_err_t err = esp_event_loop_create_default(); - - // In case create event loop returns ESP_ERR_INVALID_STATE it is not necessary to fail startup + + // In case create event loop returns ESP_ERR_INVALID_STATE it is not necessary to fail startup // as of it means that default event loop is already initialized and no additional actions should be done. if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) { ESP_LOGE(TAG, "Error create default event loop"); @@ -1133,7 +1141,7 @@ attribute_t *create(cluster_t *cluster, uint32_t attribute_id, uint8_t flags, es attribute_updated = true; } } - + if (!attribute_updated) { set_val((attribute_t *)attribute, &val); } @@ -2351,6 +2359,23 @@ void *get_priv_data(uint16_t endpoint_id) return current_endpoint->priv_data; } +esp_err_t set_identify(uint16_t endpoint_id, void *identify) +{ + node_t *node = node::get(); + if (!node) { + ESP_LOGE(TAG, "Node not found"); + return ESP_ERR_INVALID_ARG; + } + endpoint_t *endpoint = get(node, endpoint_id); + if (!endpoint) { + ESP_LOGE(TAG, "Endpoint not found"); + return ESP_ERR_INVALID_ARG; + } + _endpoint_t *current_endpoint = (_endpoint_t *)endpoint; + current_endpoint->identify = (Identify *)identify; + return ESP_OK; +} + } /* endpoint */ namespace node { diff --git a/components/esp_matter/esp_matter_core.h b/components/esp_matter/esp_matter_core.h index 28e47120a..c99006d2f 100644 --- a/components/esp_matter/esp_matter_core.h +++ b/components/esp_matter/esp_matter_core.h @@ -275,6 +275,19 @@ esp_err_t set_parent_endpoint(endpoint_t *endpoint, endpoint_t *parent_endpoint) */ void *get_priv_data(uint16_t endpoint_id); +/** Set identify + * + * Set identify to the endpoint. The identify pointer should be dynamically allocated using 'chip::Platform::New()', + * and once Matter stack is done using it, it will be freed by 'chip::Platform::Delete()'. + * + * @param[in] endpoint_id Endpoint id. + * @param[in] identify Identify pointer. + * + * @return ESP_OK on success. + * @return error in case of failure. + */ +esp_err_t set_identify(uint16_t endpoint_id, void *identify); + /** Enable endpoint * * Enable the endpoint which has been previously created. diff --git a/components/esp_matter/esp_matter_identify.cpp b/components/esp_matter/esp_matter_identify.cpp index d0ac92506..802e91859 100644 --- a/components/esp_matter/esp_matter_identify.cpp +++ b/components/esp_matter/esp_matter_identify.cpp @@ -60,13 +60,14 @@ static void effect_cb(Identify *identify) esp_err_t init(uint16_t endpoint_id, uint8_t identify_type, uint8_t effect_identifier, uint8_t effect_variant) { - Identify *identify = new Identify(endpoint_id, start_cb, stop_cb, (EmberAfIdentifyIdentifyType)identify_type, - effect_cb, static_cast(effect_identifier), - static_cast(effect_variant)); + Identify *identify = chip::Platform::New(endpoint_id, start_cb, stop_cb, (EmberAfIdentifyIdentifyType)identify_type, + effect_cb, static_cast(effect_identifier), + static_cast(effect_variant)); if (!identify) { ESP_LOGE(TAG, "Fail to create identify object"); return ESP_FAIL; } + endpoint::set_identify(endpoint_id, (void *)identify); return ESP_OK; }