ESP32
[esp-matter] chipLogProgress() 콜스택 따라가기
하니_즐거운하루
2024. 1. 30. 18:48
BLEManagerImpl.cpp 소스의 HandleTXCharCCCDWrite() 메소드안 ChipLog 출력 부분에 대한
Call stack를 따라가 봤습니다.
▶ 함수안의 다음 코드
void BLEManagerImpl::HandleTXCharCCCDWrite(struct ble_gap_event * gapEvent)
{
~~ 중략 ~~
ChipLogProgress(DeviceLayer,
"Write request/command received for CHIPoBLE TX CCCD characteristic (con %u"
" ) indicate = %d",
gapEvent->subscribe.conn_handle, gapEvent->subscribe.cur_indicate);
~~ 중략 ~~
}
↓ 시리얼 로그 출력 내용
I (57606) chip[DL]: Write request/command received for CHIPoBLE TX CCCD characteristic (con 1 ) indicate = 1
▶ 찾고자 하는 부분은 메시지중 "[DL]" 이부분 입니다.
↓ ChipLogProgress 정의 위치 찾기 ( TextOnlyLogging.h)
#define ChipLogProgress(MOD, MSG, ...) ChipInternalLog(MOD, PROGRESS, MSG, ##__VA_ARGS__)
↓ ChipInternalLog() 정의
: MOD 부분을 중심으로 봐주세요.
#define ChipInternalLog(MOD, CAT, MSG, ...) \
if (CHIP_CONFIG_LOG_MODULE_##MOD && IsModuleCategoryEnabled(MOD, CAT)) \
{ \
ChipInternalLogImpl(MOD, CHIP_LOG_CATEGORY_##CAT, MSG, ##__VA_ARGS__); \
}
: CHIP_CONFIG_LOG_MODULE_##MOD 이 CHIP_CONFIG_LOG_MODULE_DeviceLayer 로 변경 됩니ㅏㄷ.
#define CHIP_CONFIG_LOG_MODULE_DeviceLayer 1 로 Constants.h 에 정의되어 있습니다.
↓ ChipInternalLogImpl() 선언
#define ChipInternalLogImpl(MOD, CAT, MSG, ...) \
do \
{ \
if (chip::Logging::IsCategoryEnabled(CAT)) \
{ \
chip::Logging::Log(chip::Logging::kLogModule_##MOD, CAT, MSG, ##__VA_ARGS__); \
} \
} while (0)
: kLogModule_devceLayer 가 enum 타입으로 다음처럼 정의가 되어 있네요. (Constants.h)
enum LogModule
{
kLogModule_NotSpecified = 0,
~~ 중략 ~~
kLogModule_Shell,
kLogModule_DeviceLayer, <------------ 요기
kLogModule_SetupPayload,
kLogModule_AppServer,
~~ 중략 ~~
kLogModule_Max
};
↓ chip::Logging::Log() 함수 > TextOnlyLogging.cpp 참조
void Log(uint8_t module, uint8_t category, const char * msg, ...)
{
va_list v;
va_start(v, msg);
LogV(module, category, msg, v);
va_end(v);
}
: module 변수만 따라가세요.
↓ LogV() 함수 > TextOnlyLogging.cpp 참조
void LogV(uint8_t module, uint8_t category, const char * msg, va_list args)
{
const char * moduleName = GetModuleName(static_cast<LogModule>(module));
LogRedirectCallback_t redirect = sLogRedirectCallback.load();
if (redirect != nullptr)
{
redirect(moduleName, category, msg, args);
}
else
{
Platform::LogV(moduleName, category, msg, args);
}
}
↓ GetModuleName() 함수
const char * GetModuleName(LogModule module)
{
return ModuleNames[(module < kLogModule_Max) ? module : kLogModule_NotSpecified];
}
↓ ModuleNames 문자열 배열의 변수의 LogModule 인덱스를 따라가면 "DL" 에 해당됩니다.
static const char ModuleNames[kLogModule_Max][kMaxModuleNameLen + 1] = {
"-", // None
~~ 중략 ~~
"SPT", // Support
"TOO", // chipTool
"ZCL", // Zcl
"SH", // Shell
"DL", // DeviceLayer
"SPL", // SetupPayload
"SVR", // AppServer
"DIS", // Discovery
~~ 중략 ~~
};
복잡해서 한번 따라가 보았습니다.
참조하세요.
반응형