/* * * Copyright (c) 2021-2023 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. */ #include "DeviceCallbacks.h" #include "AppTask.h" #include "esp_log.h" #include #include #include #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) #include "spi_flash_mmap.h" #else #include "esp_spi_flash.h" #endif #include "esp_system.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "nvs_flash.h" #include "shell_extension/launch.h" #include "shell_extension/openthread_cli_register.h" #include #include #include #include #include #if CONFIG_ENABLE_ESP_INSIGHTS_SYSTEM_STATS #include #define START_TIMEOUT_MS 60000 #endif #if CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER #include #endif // CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER #if CONFIG_ENABLE_PW_RPC #include "Rpc.h" #endif #include "DeviceWithDisplay.h" #if CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER #include #else #include #endif // CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER #if CONFIG_SEC_CERT_DAC_PROVIDER #include #endif #if CONFIG_ENABLE_ESP_INSIGHTS_TRACE #include #include #include #endif using namespace ::chip; using namespace ::chip::Credentials; using namespace ::chip::DeviceManager; using namespace ::chip::DeviceLayer; #if CONFIG_ENABLE_ESP_INSIGHTS_TRACE extern const char insights_auth_key_start[] asm("_binary_insights_auth_key_txt_start"); extern const char insights_auth_key_end[] asm("_binary_insights_auth_key_txt_end"); #endif static const char TAG[] = "light-app"; static AppDeviceCallbacks EchoCallbacks; static AppDeviceCallbacksDelegate sAppDeviceCallbacksDelegate; namespace { #if CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER DeviceLayer::ESP32FactoryDataProvider sFactoryDataProvider; #endif // CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER #if CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER DeviceLayer::ESP32DeviceInfoProvider gExampleDeviceInfoProvider; #else DeviceLayer::DeviceInfoProviderImpl gExampleDeviceInfoProvider; #endif // CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER #if CONFIG_SEC_CERT_DAC_PROVIDER DeviceLayer::ESP32SecureCertDACProvider gSecureCertDACProvider; #endif // CONFIG_SEC_CERT_DAC_PROVIDER #ifdef CONFIG_ENABLE_SET_CERT_DECLARATION_API extern const uint8_t cd_start[] asm("_binary_certification_declaration_der_start"); extern const uint8_t cd_end[] asm("_binary_certification_declaration_der_end"); ByteSpan cdSpan(cd_start, static_cast(cd_end - cd_start)); #endif // CONFIG_ENABLE_SET_CERT_DECLARATION_API chip::Credentials::DeviceAttestationCredentialsProvider * get_dac_provider(void) { #if CONFIG_SEC_CERT_DAC_PROVIDER #ifdef CONFIG_ENABLE_SET_CERT_DECLARATION_API gSecureCertDACProvider.SetCertificationDeclaration(cdSpan); #endif // CONFIG_ENABLE_SET_CERT_DECLARATION_API return &gSecureCertDACProvider; #elif CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER #ifdef CONFIG_ENABLE_SET_CERT_DECLARATION_API sFactoryDataProvider.SetCertificationDeclaration(cdSpan); #endif // CONFIG_ENABLE_SET_CERT_DECLARATION_API return &sFactoryDataProvider; #else // EXAMPLE_DAC_PROVIDER return chip::Credentials::Examples::GetExampleDACProvider(); #endif } } // namespace static void InitServer(intptr_t context) { // Print QR Code URL PrintOnboardingCodes(chip::RendezvousInformationFlags(CONFIG_RENDEZVOUS_MODE)); DeviceCallbacksDelegate::Instance().SetAppDelegate(&sAppDeviceCallbacksDelegate); Esp32AppServer::Init(); // Init ZCL Data Model and CHIP App Server AND Initialize device attestation config #if CONFIG_ENABLE_ESP_INSIGHTS_TRACE esp_insights_config_t config = { .log_type = ESP_DIAG_LOG_TYPE_ERROR | ESP_DIAG_LOG_TYPE_WARNING | ESP_DIAG_LOG_TYPE_EVENT, .auth_key = insights_auth_key_start, }; esp_err_t ret = esp_insights_init(&config); if (ret != ESP_OK) { ESP_LOGE(TAG, "Failed to initialize ESP Insights, err:0x%x", ret); } static Tracing::Insights::ESP32Backend backend; Tracing::Register(backend); #if CONFIG_ENABLE_ESP_INSIGHTS_SYSTEM_STATS chip::System::Stats::InsightsSystemMetrics::GetInstance().RegisterAndEnable(chip::System::Clock::Timeout(START_TIMEOUT_MS)); #endif #endif } extern "C" void app_main() { // Initialize the ESP NVS layer. esp_err_t err = nvs_flash_init(); if (err != ESP_OK) { ESP_LOGE(TAG, "nvs_flash_init() failed: %s", esp_err_to_name(err)); return; } err = esp_event_loop_create_default(); if (err != ESP_OK) { ESP_LOGE(TAG, "esp_event_loop_create_default() failed: %s", esp_err_to_name(err)); return; } #if CONFIG_ENABLE_PW_RPC chip::rpc::Init(); #endif ESP_LOGI(TAG, "=================================================="); ESP_LOGI(TAG, "chip-esp32-light-example starting"); ESP_LOGI(TAG, "=================================================="); #if CONFIG_ENABLE_CHIP_SHELL #if CONFIG_OPENTHREAD_CLI chip::RegisterOpenThreadCliCommands(); #endif chip::LaunchShell(); #endif #if CHIP_DEVICE_CONFIG_ENABLE_WIFI if (Internal::ESP32Utils::InitWiFiStack() != CHIP_NO_ERROR) { ESP_LOGE(TAG, "Failed to initialize WiFi stack"); return; } #endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider); CHIPDeviceManager & deviceMgr = CHIPDeviceManager::GetInstance(); CHIP_ERROR error = deviceMgr.Init(&EchoCallbacks); if (error != CHIP_NO_ERROR) { ESP_LOGE(TAG, "device.Init() failed: %s", ErrorStr(error)); return; } #if CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER SetCommissionableDataProvider(&sFactoryDataProvider); #if CONFIG_ENABLE_ESP32_DEVICE_INSTANCE_INFO_PROVIDER SetDeviceInstanceInfoProvider(&sFactoryDataProvider); #endif #endif SetDeviceAttestationCredentialsProvider(get_dac_provider()); ESPOpenThreadInit(); chip::DeviceLayer::PlatformMgr().ScheduleWork(InitServer, reinterpret_cast(nullptr)); error = GetAppTask().StartAppTask(); if (error != CHIP_NO_ERROR) { ESP_LOGE(TAG, "GetAppTask().StartAppTask() failed : %s", ErrorStr(error)); } }