Skip to content

Commit

Permalink
Merge branch 'cherry-pick/delete_identify' into 'release/v1.2'
Browse files Browse the repository at this point in the history
components/esp_matter: delete identify when destroy endpoint (backport v1.2)

See merge request app-frameworks/esp-matter!876
  • Loading branch information
chshu committed Oct 12, 2024
2 parents 8d35e9f + 1d59bda commit 7b9d69a
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 7 deletions.
33 changes: 29 additions & 4 deletions components/esp_matter/esp_matter_core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

#include <app/clusters/network-commissioning/network-commissioning.h>
#include <app/clusters/general-diagnostics-server/general-diagnostics-server.h>
#include <app/clusters/identify-server/identify-server.h>
#include <app/server/Dnssd.h>
#include <app/server/Server.h>
#include <app/util/attribute-storage.h>
Expand Down Expand Up @@ -193,6 +194,7 @@ typedef struct _endpoint {
EmberAfDeviceType *device_types_ptr;
uint16_t parent_endpoint_id;
void *priv_data;
Identify *identify;
struct _endpoint *next;
} _endpoint_t;

Expand Down Expand Up @@ -503,6 +505,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;
Expand Down Expand Up @@ -611,7 +619,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 ||
Expand Down Expand Up @@ -1011,8 +1019,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");
Expand Down Expand Up @@ -1988,7 +1996,7 @@ uint16_t get_count(node_t *node)
ESP_LOGE(TAG, "Node cannot be NULL");
return 0;
}
uint16_t count = 0;
uint16_t count = 0;
endpoint_t *endpoint = get_first(node);
while (endpoint) {
count++;
Expand Down Expand Up @@ -2082,6 +2090,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 {
Expand Down
13 changes: 13 additions & 0 deletions components/esp_matter/esp_matter_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,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<Identify>()',
* 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.
Expand Down
7 changes: 4 additions & 3 deletions components/esp_matter/esp_matter_identify.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<chip::app::Clusters::Identify::EffectIdentifierEnum>(effect_identifier),
static_cast<chip::app::Clusters::Identify::EffectVariantEnum>(effect_variant));
Identify *identify = chip::Platform::New<Identify>(endpoint_id, start_cb, stop_cb, (chip::app::Clusters::Identify::IdentifyTypeEnum)identify_type,
effect_cb, static_cast<chip::app::Clusters::Identify::EffectIdentifierEnum>(effect_identifier),
static_cast<chip::app::Clusters::Identify::EffectVariantEnum>(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;
}

Expand Down

0 comments on commit 7b9d69a

Please sign in to comment.