/* * * Copyright (c) 2020 Project CHIP Authors * All rights reserved. * * 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 "main.cpp" * * Main application. */ /***************************************************************************** * Includes Definitions *****************************************************************************/ // FreeRTOS #include "FreeRTOS.h" #include "task.h" #if defined(GP_APP_DIVERSITY_POWERCYCLECOUNTING) #include "powercycle_counting.h" #endif #if defined(GP_APP_DIVERSITY_CLEARBOX_TESTING_HOOK_APPLICATION_INIT) #include "clearbox_testing_hooks.h" #endif // Qorvo CHIP library #include "qvCHIP.h" #include "qvIO.h" // CHIP includes #include #include #include #include #if defined(PW_RPC_ENABLED) && PW_RPC_ENABLED #include "Rpc.h" #endif // PW_RPC_ENABLED #if defined(ENABLE_CHIP_SHELL) && ENABLE_CHIP_SHELL #include "shell_common/shell.h" #endif // ENABLE_CHIP_SHELL // Application level logic #include "AppTask.h" #include "ota.h" using namespace ::chip; using namespace ::chip::Inet; using namespace ::chip::DeviceLayer; using namespace ::chip::DeviceLayer::Internal; namespace { constexpr uint32_t kInitOTARequestorDelaySec = 3; constexpr int extDiscTimeoutSecs = 20; } // namespace /***************************************************************************** * Macro Definitions *****************************************************************************/ /***************************************************************************** * External Function Definitions *****************************************************************************/ /***************************************************************************** * Application Function Definitions *****************************************************************************/ CHIP_ERROR CHIP_Init(void); void Application_Init(void) { CHIP_ERROR error; #if defined(GP_APP_DIVERSITY_CLEARBOX_TESTING_HOOK_APPLICATION_INIT) GP_CLEARBOX_TESTING_APPLICATION_INIT_HOOK; #endif #if defined(GP_APP_DIVERSITY_POWERCYCLECOUNTING) gpAppFramework_Reset_Init(); #endif /* Initialize IO */ qvIO_Init(); /* Initialize CHIP stack */ error = CHIP_Init(); if (error != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "CHIP_Init failed"); return; } /* Launch application task */ ChipLogProgress(NotSpecified, "============================"); ChipLogProgress(NotSpecified, "Qorvo " APP_NAME " Launching"); ChipLogProgress(NotSpecified, "============================"); error = GetAppTask().Init(); if (error != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "GetAppTask().Init() failed"); return; } error = GetAppTask().StartAppTask(); if (error != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "GetAppTask().StartAppTask() failed"); return; } } void ChipEventHandler(const ChipDeviceEvent * aEvent, intptr_t /* arg */) { switch (aEvent->Type) { case DeviceEventType::kDnssdInitialized: #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR InitializeOTARequestor(); #endif break; default: break; } } CHIP_ERROR CHIP_Init(void) { CHIP_ERROR ret = CHIP_NO_ERROR; #if defined(PW_RPC_ENABLED) && PW_RPC_ENABLED ret = (CHIP_ERROR) chip::rpc::Init(); if (ret != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "rpc::Init() failed"); goto exit; } #endif ret = chip::Platform::MemoryInit(); if (ret != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "Platform::MemoryInit() failed"); goto exit; } #if defined(ENABLE_CHIP_SHELL) && ENABLE_CHIP_SHELL ret = (CHIP_ERROR) ShellTask::Start(); if (ret != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "ShellTask::Start() failed"); goto exit; } #endif // ENABLE_CHIP_SHELL ret = PlatformMgr().InitChipStack(); if (ret != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "PlatformMgr().InitChipStack() failed"); goto exit; } #if CHIP_ENABLE_OPENTHREAD ChipLogProgress(NotSpecified, "Initializing OpenThread stack"); ret = ThreadStackMgr().InitThreadStack(); if (ret != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "ThreadStackMgr().InitThreadStack() failed"); goto exit; } #if defined(CHIP_DEVICE_CONFIG_ENABLE_SSED) && CHIP_DEVICE_CONFIG_ENABLE_SSED ret = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SynchronizedSleepyEndDevice); qvIO_EnableSleep(true); #elif CHIP_DEVICE_CONFIG_ENABLE_SED ret = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SleepyEndDevice); qvIO_EnableSleep(true); #elif CHIP_DEVICE_CONFIG_THREAD_FTD ret = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_Router); qvIO_EnableSleep(false); #else ret = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_MinimalEndDevice); qvIO_EnableSleep(false); #endif if (ret != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "ConnectivityMgr().SetThreadDeviceType() failed"); goto exit; } ChipLogProgress(NotSpecified, "Starting OpenThread task"); ret = ThreadStackMgrImpl().StartThreadTask(); if (ret != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "ThreadStackMgr().StartThreadTask() failed"); goto exit; } #endif // CHIP_ENABLE_OPENTHREAD ChipLogProgress(NotSpecified, "Starting Platform Manager Event Loop"); PlatformMgr().AddEventHandler(ChipEventHandler, 0); ret = PlatformMgr().StartEventLoopTask(); if (ret != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "PlatformMgr().StartEventLoopTask() failed"); goto exit; } exit: return ret; } /***************************************************************************** * --- Main *****************************************************************************/ int main(void) { int result; /* Initialize Qorvo stack */ result = qvCHIP_init(Application_Init); if (result < 0) { return 0; } /* Start FreeRTOS */ vTaskStartScheduler(); return 0; }