/* * * Copyright (c) 2021 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file * Provides an implementation of the ThreadStackManager object for * ESP32 platform. * */ /* this file behaves like a config.h, comes first */ #include #include #include #include #include #include "driver/uart.h" #include "esp_err.h" #include "esp_netif.h" #include "esp_openthread.h" #include "esp_openthread_lock.h" #include "esp_openthread_netif_glue.h" #include "esp_openthread_types.h" #include "esp_vfs_eventfd.h" #include "lib/core/CHIPError.h" #include #include #include namespace chip { namespace DeviceLayer { using namespace ::chip::DeviceLayer::Internal; ThreadStackManagerImpl ThreadStackManagerImpl::sInstance; CHIP_ERROR ThreadStackManagerImpl::_InitThreadStack() { CHIP_ERROR err = CHIP_NO_ERROR; openthread_init_stack(); _LockThreadStack(); err = GenericThreadStackManagerImpl_OpenThread::DoInit(esp_openthread_get_instance()); _UnlockThreadStack(); return err; } CHIP_ERROR ThreadStackManagerImpl::_StartThreadTask() { openthread_launch_task(); return CHIP_NO_ERROR; } void ThreadStackManagerImpl::_LockThreadStack() { esp_openthread_lock_acquire(portMAX_DELAY); } bool ThreadStackManagerImpl::_TryLockThreadStack() { return esp_openthread_lock_acquire(0); } void ThreadStackManagerImpl::_UnlockThreadStack() { esp_openthread_lock_release(); } #if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT void ThreadStackManagerImpl::_WaitOnSrpClearAllComplete() { // Only 1 task can be blocked on a srpClearAll request if (mSrpClearAllRequester == nullptr) { mSrpClearAllRequester = xTaskGetCurrentTaskHandle(); // Wait on OnSrpClientNotification which confirms the clearing is done. // It will notify this current task with NotifySrpClearAllComplete. // However, we won't wait more than 2s. ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(2000)); mSrpClearAllRequester = nullptr; } } void ThreadStackManagerImpl::_NotifySrpClearAllComplete() { if (mSrpClearAllRequester) { xTaskNotifyGive(mSrpClearAllRequester); } } #endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT void ThreadStackManagerImpl::_ProcessThreadActivity() { // Intentionally empty. } void ThreadStackManagerImpl::_OnCHIPoBLEAdvertisingStart() { // Intentionally empty. } void ThreadStackManagerImpl::_OnCHIPoBLEAdvertisingStop() { // Intentionally empty. } } // namespace DeviceLayer } // namespace chip