Merge branch 'bugfix/matter-init' into 'main'

examples: post Matter initialization to the scheduler

See merge request app-frameworks/esp-matter!45
This commit is contained in:
Shu Chen
2021-10-25 01:56:50 +00:00
4 changed files with 36 additions and 23 deletions
+16 -6
View File
@@ -22,11 +22,12 @@
#include "app/server/Server.h"
#include "app/util/af.h"
#include "app/util/basic-types.h"
#include "platform/CHIPDeviceLayer.h"
#include "core/CHIPError.h"
#include "freertos/FreeRTOS.h"
#include "lib/shell/Engine.h"
#include "lib/support/CHIPMem.h"
#include <cstdint>
#include "platform/CHIPDeviceLayer.h"
#include "platform/PlatformManager.h"
using chip::AttributeId;
using chip::ClusterId;
@@ -236,6 +237,16 @@ static void on_device_event(const ChipDeviceEvent *event, intptr_t arg)
ESP_LOGI(TAG, "Current free heap: %zu", heap_caps_get_free_size(MALLOC_CAP_8BIT));
}
static void matter_init_task(intptr_t context)
{
xTaskHandle task_to_notify = reinterpret_cast<xTaskHandle>(context);
chip::Server::GetInstance().Init();
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
chip::app::MdnsServer::Instance().StartServer();
#endif
xTaskNotifyGive(task_to_notify);
}
esp_err_t app_matter_init()
{
if (PlatformMgr().InitChipStack() != CHIP_NO_ERROR) {
@@ -264,10 +275,9 @@ esp_err_t app_matter_init()
return ESP_FAIL;
}
#endif
chip::Server::GetInstance().Init();
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
chip::app::MdnsServer::Instance().StartServer();
#endif
PlatformMgr().ScheduleWork(matter_init_task, reinterpret_cast<intptr_t>(xTaskGetCurrentTaskHandle()));
// Wait for the matter stack to be initialized
xTaskNotifyWait(0, 0, NULL, portMAX_DELAY);
esp_matter_attribute_callback_add(APP_MATTER_NAME, app_matter_attribute_update, NULL);
return ESP_OK;
-4
View File
@@ -19,7 +19,3 @@ CONFIG_PARTITION_TABLE_FILENAME="partitions.csv"
# Enable chip shell
CONFIG_ENABLE_CHIP_SHELL=y
# Main task needs a bit more stack than the default
# default is 3584, bump this up to 5k.
CONFIG_ESP_MAIN_TASK_STACK_SIZE=5120
+20 -9
View File
@@ -6,10 +6,10 @@
CONDITIONS OF ANY KIND, either express or implied.
*/
#include "esp_matter.h"
#include "esp_matter_standard.h"
#include "app_matter.h"
#include "app_constants.h"
#include "esp_matter.h"
#include "esp_matter_standard.h"
#include "esp_heap_caps.h"
#include "esp_log.h"
@@ -22,19 +22,18 @@
#include "app/server/Server.h"
#include "app/util/af.h"
#include "app/util/basic-types.h"
#include "platform/CHIPDeviceLayer.h"
#include "core/CHIPError.h"
#include "lib/shell/Engine.h"
#include "lib/support/CHIPMem.h"
#include <cstdint>
#include "platform/CHIPDeviceLayer.h"
using chip::AttributeId;
using chip::ClusterId;
using chip::EndpointId;
using chip::DeviceLayer::ChipDeviceEvent;
using chip::DeviceLayer::ConnectivityMgr;
using chip::DeviceLayer::DeviceEventType::PublicEventTypes;
using chip::DeviceLayer::PlatformMgr;
using chip::DeviceLayer::DeviceEventType::PublicEventTypes;
typedef enum {
REMAP_MATTER_TO_STANDARD,
@@ -186,7 +185,8 @@ static esp_matter_attr_val_t app_matter_get_attribute_val(char *attribute, int v
return esp_matter_int(value);
}
static esp_err_t app_matter_attribute_update(const char *endpoint, const char *attribute, esp_matter_attr_val_t val, void *priv_data)
static esp_err_t app_matter_attribute_update(const char *endpoint, const char *attribute, esp_matter_attr_val_t val,
void *priv_data)
{
EndpointId endpoint_id = app_matter_get_endpoint_id(endpoint);
ClusterId cluster_id = app_matter_get_cluster_id(attribute);
@@ -196,7 +196,8 @@ static esp_err_t app_matter_attribute_update(const char *endpoint, const char *a
uint8_t value_remap = (uint8_t)app_matter_remap((char *)attribute, value, REMAP_STANDARD_TO_MATTER);
ESP_LOGD(TAG, "Changing %s from standard: %d, to matter: %d\n", attribute, value, value_remap);
EmberAfStatus status = emberAfWriteAttribute(endpoint_id, cluster_id, attribute_id, CLUSTER_MASK_SERVER, (uint8_t *)&value_remap, attribute_type);
EmberAfStatus status = emberAfWriteAttribute(endpoint_id, cluster_id, attribute_id, CLUSTER_MASK_SERVER,
(uint8_t *)&value_remap, attribute_type);
if (status != EMBER_ZCL_STATUS_SUCCESS) {
ESP_LOGE(TAG, "Error updating attribute to matter");
return ESP_FAIL;
@@ -204,7 +205,8 @@ static esp_err_t app_matter_attribute_update(const char *endpoint, const char *a
return ESP_OK;
}
void emberAfPostAttributeChangeCallback(EndpointId endpoint, ClusterId cluster, AttributeId attribute, uint8_t mask, uint16_t manufacturer, uint8_t type, uint16_t size, uint8_t *value)
void emberAfPostAttributeChangeCallback(EndpointId endpoint, ClusterId cluster, AttributeId attribute, uint8_t mask,
uint16_t manufacturer, uint8_t type, uint16_t size, uint8_t *value)
{
char *endpoint_name = (char *)app_matter_get_endpoint_name(endpoint);
char *attribute_name = (char *)app_matter_get_attribute_name(cluster, attribute);
@@ -233,6 +235,13 @@ static void on_device_event(const ChipDeviceEvent *event, intptr_t arg)
ESP_LOGI(TAG, "Current free heap: %zu", heap_caps_get_free_size(MALLOC_CAP_8BIT));
}
static void matter_init_task(intptr_t context)
{
xTaskHandle task_to_notify = reinterpret_cast<xTaskHandle>(context);
chip::Server::GetInstance().Init();
xTaskNotifyGive(task_to_notify);
}
esp_err_t app_matter_init()
{
if (PlatformMgr().InitChipStack() != CHIP_NO_ERROR) {
@@ -251,7 +260,9 @@ esp_err_t app_matter_init()
}
PlatformMgr().AddEventHandler(on_device_event, static_cast<intptr_t>(NULL));
chip::Server::GetInstance().Init();
PlatformMgr().ScheduleWork(matter_init_task, reinterpret_cast<intptr_t>(xTaskGetCurrentTaskHandle()));
// Wait for the matter stack to be initialized
xTaskNotifyWait(0, 0, NULL, portMAX_DELAY);
esp_matter_attribute_callback_add(APP_MATTER_NAME, app_matter_attribute_update, NULL);
return ESP_OK;
@@ -29,7 +29,3 @@ CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA=y
# Temporary Fix for Timer Overflows
CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=3120
# Main task needs a bit more stack than the default
# default is 3584, bump this up to 5k.
CONFIG_ESP_MAIN_TASK_STACK_SIZE=5120