diff --git a/components/openthread/include/esp_openthread.h b/components/openthread/include/esp_openthread.h index ce96d18656..7ce38a5884 100644 --- a/components/openthread/include/esp_openthread.h +++ b/components/openthread/include/esp_openthread.h @@ -102,7 +102,7 @@ esp_err_t esp_openthread_mainloop_exit(void); * - ESP_ERR_INVALID_STATE if already initialized * */ -esp_err_t esp_openthread_start(esp_openthread_platform_config_t *config); +esp_err_t esp_openthread_start(const esp_openthread_config_t *config); /** * @brief This function performs OpenThread stack and platform driver deinitialization and delete the handle task. diff --git a/components/openthread/include/esp_openthread_types.h b/components/openthread/include/esp_openthread_types.h index 364d596100..cd3f75f5a6 100644 --- a/components/openthread/include/esp_openthread_types.h +++ b/components/openthread/include/esp_openthread_types.h @@ -11,6 +11,7 @@ #include #include "esp_event_base.h" +#include "esp_netif_types.h" #include "driver/gpio.h" #include "driver/spi_master.h" #include "driver/spi_slave.h" @@ -198,6 +199,15 @@ typedef struct { esp_openthread_port_config_t port_config; /*!< The port configuration */ } esp_openthread_platform_config_t; +/** + * @brief The OpenThread configuration + * + */ +typedef struct { + esp_netif_config_t netif_config; /*!< The netif configuration */ + esp_openthread_platform_config_t platform_config; /*!< The platform configuration */ +} esp_openthread_config_t; + /** * @brief The OpenThread rcp failure handler * diff --git a/components/openthread/src/esp_openthread.cpp b/components/openthread/src/esp_openthread.cpp index b1f2329f51..8b4e19ef40 100644 --- a/components/openthread/src/esp_openthread.cpp +++ b/components/openthread/src/esp_openthread.cpp @@ -235,15 +235,14 @@ esp_err_t esp_openthread_deinit(void) static void ot_task_worker(void *aContext) { - esp_openthread_platform_config_t* config = (esp_openthread_platform_config_t *)aContext; + const esp_openthread_config_t* config = *(esp_openthread_config_t **)aContext; // Initialize the OpenThread stack - ESP_ERROR_CHECK(esp_openthread_init(config)); + ESP_ERROR_CHECK(esp_openthread_init(&(config->platform_config))); #if CONFIG_OPENTHREAD_FTD || CONFIG_OPENTHREAD_MTD - esp_netif_config_t cfg = ESP_NETIF_DEFAULT_OPENTHREAD(); - esp_netif_t *openthread_netif = esp_netif_new(&cfg); + esp_netif_t *openthread_netif = esp_netif_new(&(config->netif_config)); assert(openthread_netif != NULL); - ESP_ERROR_CHECK(esp_netif_attach(openthread_netif, esp_openthread_netif_glue_init(config))); + ESP_ERROR_CHECK(esp_netif_attach(openthread_netif, esp_openthread_netif_glue_init(&(config->platform_config)))); #endif #if CONFIG_OPENTHREAD_LOG_LEVEL_DYNAMIC @@ -256,10 +255,10 @@ static void ot_task_worker(void *aContext) esp_openthread_cli_console_command_register(); #endif // CONFIG_OPENTHREAD_CLI - xSemaphoreGive(s_ot_syn_semaphore); #if CONFIG_OPENTHREAD_RADIO otAppNcpInit(esp_openthread_get_instance()); #endif + xSemaphoreGive(s_ot_syn_semaphore); // Run the main loop esp_openthread_launch_mainloop(); @@ -283,12 +282,13 @@ static void ot_task_worker(void *aContext) vTaskDelay(portMAX_DELAY); } -esp_err_t esp_openthread_start(esp_openthread_platform_config_t *config) +esp_err_t esp_openthread_start(const esp_openthread_config_t *config) { + assert(config); ESP_RETURN_ON_FALSE(s_ot_syn_semaphore == NULL, ESP_ERR_INVALID_STATE, OT_PLAT_LOG_TAG, "OpenThread has been initialized"); s_ot_syn_semaphore = xSemaphoreCreateBinary(); ESP_RETURN_ON_FALSE(s_ot_syn_semaphore != NULL, ESP_ERR_INVALID_STATE, OT_PLAT_LOG_TAG, "Failed to create s_ot_syn_semaphore"); - assert(xTaskCreate(ot_task_worker, CONFIG_OPENTHREAD_TASK_NAME, CONFIG_OPENTHREAD_TASK_SIZE, config, CONFIG_OPENTHREAD_TASK_PRIORITY, &s_ot_task_handle) == pdPASS); + assert(xTaskCreate(ot_task_worker, CONFIG_OPENTHREAD_TASK_NAME, CONFIG_OPENTHREAD_TASK_SIZE, &config, CONFIG_OPENTHREAD_TASK_PRIORITY, &s_ot_task_handle) == pdPASS); xSemaphoreTake(s_ot_syn_semaphore, portMAX_DELAY); return ESP_OK; }