/* * * Copyright (c) 2020 Project CHIP Authors * Copyright (c) 2020 Nest Labs, Inc. * * 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 #define MW320_LOG_MODULE_NAME chip #define EOL_CHARS "\r\n" /* End of Line Characters */ #define EOL_CHARS_LEN 2 /* Length of EOL */ #if CHIP_DEVICE_CONFIG_ENABLE_THREAD #include #include #endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD // static bool isLogInitialized; extern uint8_t gOtLogUartInstance; namespace chip { namespace Logging { namespace Platform { void GetMessageString(char * buf, uint8_t chipCategory, uint8_t otLevelLog) { if (chipCategory != kLogCategory_None) { switch (chipCategory) { case kLogCategory_Error: memcpy(buf, "[Error]", 7); break; case kLogCategory_Progress: default: memcpy(buf, "[Progress]", 10); break; case kLogCategory_Detail: memcpy(buf, "[Debug]", 7); break; } } /*if (otLevelLog != OT_LOG_LEVEL_NONE) { switch (otLevelLog) { case OT_LOG_LEVEL_CRIT: memcpy(buf, "[Error]", 7); break; case OT_LOG_LEVEL_WARN: memcpy(buf, "[Warn]", 6); break; case OT_LOG_LEVEL_NOTE: case OT_LOG_LEVEL_INFO: default: memcpy(buf, "[Info]", 6); break; case OT_LOG_LEVEL_DEBG: memcpy(buf, "[Debug]", 7); break; } }*/ } } // namespace Platform } // namespace Logging } // namespace chip void FillPrefix(char * buf, uint8_t bufLen, uint8_t chipCategory, uint8_t otLevelLog) { /* add the error string */ chip::Logging::Platform::GetMessageString(buf, chipCategory, otLevelLog); } // unnamed namespace namespace chip { namespace DeviceLayer { /** * Called whenever a log message is emitted by CHIP or LwIP. * * This function is intended be overridden by the application to, e.g., * schedule output of queued log entries. */ void __attribute__((weak)) OnLogOutput(void) {} } // namespace DeviceLayer } // namespace chip void GenericLog(const char * format, va_list arg) { #if 0 //#if MW320_LOG_ENABLED char formattedMsg[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE - 1] = { 0 }; size_t prefixLen, writtenLen; if (!isLogInitialized) { isLogInitialized = true; // gOtLogUartInstance = 0; // otPlatUartEnable(); } /* Prefix is composed of [Debug String][MOdule Name String] */ FillPrefix(formattedMsg, CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE - 1, chip::Logging::kLogCategory_None, chip::Logging::kLogCategory_Detail); prefixLen = strlen(formattedMsg); // Append the log message. writtenLen = vsnprintf(formattedMsg + prefixLen, CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE - prefixLen - EOL_CHARS_LEN, format, arg); VerifyOrDie(writtenLen > 0); memcpy(formattedMsg + prefixLen + writtenLen, EOL_CHARS, EOL_CHARS_LEN); // Let the application know that a log message has been emitted. chip::DeviceLayer::OnLogOutput(); #endif // MW320_LOG_ENABLED } namespace chip { namespace Logging { namespace Platform { /** * CHIP log output function. */ #define MSGBUFLEN 256 void LogV(const char * module, uint8_t category, const char * msg, va_list v) { (void) module; (void) category; #if MW320_LOG_ENABLED System::Clock::Milliseconds32 now = chip::System::SystemClock().GetMonotonicTimestamp(); uint32_t now_v = now.count(); // char _msgbuf[MSGBUFLEN]; char * msgbuf = 0; char * bufpt; uint16_t buflen; msgbuf = (char *) malloc(MSGBUFLEN); // msgbuf = _msgbuf; if (msgbuf == nullptr) { return; } memset(msgbuf, 0, MSGBUFLEN); snprintf(msgbuf, MSGBUFLEN, "[%lu.%03lu]CHIP:%s: ", now_v / 1000, now_v % 1000, module); buflen = strlen(msgbuf); bufpt = &msgbuf[buflen]; vsnprintf(bufpt, (MSGBUFLEN - buflen), msg, v); PRINTF("%s \r\n", msgbuf); free(msgbuf); #endif // MW320_LOG_ENABLED #if 0 GenericLog(msg, v); // Let the application know that a log message has been emitted. DeviceLayer::OnLogOutput(); #endif // 0, MW320_LOG_ENABLED } } // namespace Platform } // namespace Logging } // namespace chip #undef MW320_LOG_MODULE_NAME #define MW320_LOG_MODULE_NAME lwip /** * LwIP log output function. */ extern "C" void LwIPLog(const char * msg, ...) { va_list v; va_start(v, msg); GenericLog(msg, v); va_end(v); } #if CHIP_DEVICE_CONFIG_ENABLE_THREAD #undef MW320_LOG_MODULE_NAME #define MW320_LOG_MODULE_NAME thread extern "C" void otPlatLog(otLogLevel aLogLevel, otLogRegion aLogRegion, const char * aFormat, ...) { va_list v; (void) aLogLevel; (void) aLogRegion; va_start(v, aFormat); GenericLog(aFormat, v); va_end(v); } #endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD