diff --git a/components/esp_matter/esp_matter_core.cpp b/components/esp_matter/esp_matter_core.cpp index b9d260e19..a9603e9e6 100644 --- a/components/esp_matter/esp_matter_core.cpp +++ b/components/esp_matter/esp_matter_core.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -204,6 +205,7 @@ typedef struct _endpoint { EmberAfDeviceType *device_types_ptr; uint16_t parent_endpoint_id; void *priv_data; + Identify *identify; struct _endpoint *next; } _endpoint_t; @@ -516,6 +518,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; @@ -2188,6 +2196,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 ab66ebb6a..3163b71e8 100644 --- a/components/esp_matter/esp_matter_core.h +++ b/components/esp_matter/esp_matter_core.h @@ -290,6 +290,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 754345943..b1bf7fbd6 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, (chip::app::Clusters::Identify::IdentifyTypeEnum)identify_type, - effect_cb, static_cast(effect_identifier), - static_cast(effect_variant)); + Identify *identify = chip::Platform::New(endpoint_id, start_cb, stop_cb, (chip::app::Clusters::Identify::IdentifyTypeEnum)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; }