본문으로 바로가기

[esp-matter] chipLogProgress() 콜스택 따라가기

category ESP32 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
    ~~ 중략 ~~
};

 

복잡해서 한번 따라가 보았습니다.

참조하세요.

반응형