/* * Copyright (c) 2021 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. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using chip::BitFlags; using chip::ArgParser::HelpOptions; using chip::ArgParser::OptionDef; using chip::ArgParser::OptionSet; using chip::ArgParser::PrintArgError; using chip::Messaging::ExchangeManager; bool HandleOptions(const char * aProgram, OptionSet * aOptions, int aIdentifier, const char * aName, const char * aValue) { // No option yet return true; } OptionDef cmdLineOptionsDef[] = { {}, }; OptionSet cmdLineOptions = { HandleOptions, cmdLineOptionsDef, "PROGRAM OPTIONS" }; HelpOptions helpOptions("log-source-app", "Usage: log-source-app [options]", "1.0"); OptionSet * allOptions[] = { &cmdLineOptions, &helpOptions, nullptr }; static constexpr size_t kMaxLogMessageLength = 512; DiagnosticLogsCommandHandler & GetLogProvider() { static DiagnosticLogsCommandHandler LogProvider; return LogProvider; } void ENFORCE_FORMAT(3, 0) LoggingCallback(const char * module, uint8_t category, const char * msg, va_list args) { // Print the log on console for debug va_list argsCopy; va_copy(argsCopy, args); chip::Logging::Platform::LogV(module, category, msg, argsCopy); // Feed the log entry into the internal circular buffer char buffer1[kMaxLogMessageLength]; char buffer2[kMaxLogMessageLength]; int s1 = vsnprintf(buffer1, sizeof(buffer1), msg, args); int s2 = snprintf(buffer2, sizeof(buffer2), "%s:%.*s", module, s1, buffer1); size_t len = chip::CanCastTo(s2) ? static_cast(s2) : SIZE_MAX; GetLogProvider().PushLog(chip::ByteSpan(reinterpret_cast(buffer2), len)); } int main(int argc, char * argv[]) { if (chip::Platform::MemoryInit() != CHIP_NO_ERROR) { fprintf(stderr, "FAILED to initialize memory\n"); return 1; } chip::Logging::SetLogRedirectCallback(&LoggingCallback); if (chip::DeviceLayer::PlatformMgr().InitChipStack() != CHIP_NO_ERROR) { fprintf(stderr, "FAILED to initialize chip stack\n"); return 1; } if (!chip::ArgParser::ParseArgs(argv[0], argc, argv, allOptions)) { return 1; } chip::DeviceLayer::ConfigurationMgr().LogDeviceConfig(); static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); chip::Server::GetInstance().Init(initParams); // Initialize device attestation config SetDeviceAttestationCredentialsProvider(chip::Credentials::Examples::GetExampleDACProvider()); CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&GetLogProvider()); chip::DeviceLayer::PlatformMgr().RunEventLoop(); return 0; }