android13/hardware/rockchip/camera/common/LogHelperAndroid.h

388 lines
15 KiB
C++

/*
* Copyright (C) 2012-2017 Intel Corporation
* Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd
*
* 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.
*/
#ifndef __LOGHELPERANDROID__
#define __LOGHELPERANDROID__
// System dependencies
#include <utils/Log.h>
#include "EnumPrinthelper.h"
#include <cutils/properties.h>
#include <sys/prctl.h>
#define ENV_CAMERA_HAL_DEBUG "persist.vendor.camera.debug"
#define ENV_CAMERA_HAL_PERF "persist.vendor.camera.perf"
#define ENV_CAMERA_HAL_DUMP "persist.vendor.camera.dump"
// Properties for debugging.
#define ENV_CAMERA_HAL_DUMP_SKIP_NUM "persist.vendor.camera.dump.skip"
#define ENV_CAMERA_HAL_DUMP_INTERVAL "persist.vendor.camera.dump.gap"
#define ENV_CAMERA_HAL_DUMP_COUNT "persist.vendor.camera.dump.cnt"
#define ENV_CAMERA_HAL_DUMP_PATH "persist.vendor.camera.dump.path"
#ifdef RKCAMERA_REDEFINE_LOG
typedef enum {
CAM_NO_MODULE,
CAM_HAL_MODULE,
CAM_JPEG_MODULE,
CAM_LAST_MODULE
} cam_modules_t;
/* values that persist.vendor.camera.global.debug can be set to */
/* all camera modules need to map their internal debug levels to this range */
typedef enum {
CAM_GLBL_DBG_NONE = 0,
CAM_GLBL_DBG_ERR = 1,
CAM_GLBL_DBG_WARN = 2,
CAM_GLBL_DBG_INFO = 3,
CAM_GLBL_DBG_DEBUG = 4,
CAM_GLBL_DBG_HIGH = 5,
CAM_GLBL_DBG_LOW = 6
} cam_global_debug_level_t;
extern int g_cam_log[CAM_LAST_MODULE][CAM_GLBL_DBG_LOW + 1];
/* #define FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ## __VA_ARGS__) */
#ifndef CAM_MODULE
#define CAM_MODULE CAM_HAL_MODULE
#endif
#undef CLOGx
#define CLOGx(module, level, fmt, args...) \
{\
if (g_cam_log[module][level]) { \
rk_camera_debug_log(module, level, LOG_TAG, fmt, ##args); \
}\
}
#undef CLOGI
#define CLOGI(module, fmt, args...) \
CLOGx(module, CAM_GLBL_DBG_INFO, fmt, ##args)
#undef CLOGD
#define CLOGD(module, fmt, args...) \
CLOGx(module, CAM_GLBL_DBG_DEBUG, fmt, ##args)
#undef CLOGL
#define CLOGL(module, fmt, args...) \
CLOGx(module, CAM_GLBL_DBG_LOW, fmt, ##args)
#undef CLOGW
#define CLOGW(module, fmt, args...) \
CLOGx(module, CAM_GLBL_DBG_WARN, fmt, ##args)
#undef CLOGH
#define CLOGH(module, fmt, args...) \
CLOGx(module, CAM_GLBL_DBG_HIGH, fmt, ##args)
#undef CLOGE
#define CLOGE(module, fmt, args...) \
CLOGx(module, CAM_GLBL_DBG_ERR, fmt, ##args)
#undef LOGD
#define LOGD(fmt, args...) CLOGD(CAM_MODULE, fmt, ##args)
#undef LOGL
#define LOGL(fmt, args...) CLOGL(CAM_MODULE, fmt, ##args)
#undef LOGW
#define LOGW(fmt, args...) CLOGW(CAM_MODULE, fmt, ##args)
#undef LOGH
#define LOGH(fmt, args...) CLOGH(CAM_MODULE, fmt, ##args)
#undef LOGE
#define LOGE(fmt, args...) CLOGE(CAM_MODULE, fmt, ##args)
#undef LOGI
#define LOGI(fmt, args...) CLOGI(CAM_MODULE, fmt, ##args)
#define NS_PER_MS (NS_PER_SEC /MS_PER_SEC)
static inline long get_time_diff_ms(struct timespec *from,
struct timespec *to) {
return (to->tv_sec - from->tv_sec) * (long)MS_PER_SEC +
(to->tv_nsec - from->tv_nsec) / (long)NS_PER_MS;
}
class ScopedLog {
public:
inline ScopedLog(int level, const char* name) :
mLevel(level),
mName(name) {
prctl(PR_GET_NAME, threadName);
clock_gettime(CLOCK_MONOTONIC_COARSE, &last_tm);
if (g_cam_log[CAM_MODULE][mLevel] == 1) {
ALOGD("ENTER-%s, Thread[%s]", mName, threadName);
}
}
inline ~ScopedLog() {
clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm);
diff_time = get_time_diff_ms(&last_tm,&curr_tm);
if (g_cam_log[CAM_MODULE][mLevel] == 1) {
ALOGD("EXIT-%s use %ldms, Thread[%s]",mName, diff_time, threadName);
} else if (diff_time > 100) {
if (diff_time > 1000)
ALOGE("EXIT-%s over 1s, use %ldms, Thread[%s]",mName, diff_time, threadName);
else
ALOGW("EXIT-%s use %ldms, Thread[%s]",mName, diff_time, threadName);
}
}
private:
int mLevel;
const char* mName;
char threadName[20];
struct timespec last_tm;
struct timespec curr_tm;
long diff_time;
};
/* reads and updates camera logging properties */
void rk_camera_set_dbg_log_properties(void);
/* generic logger function */
void rk_camera_debug_log(const cam_modules_t module,
const cam_global_debug_level_t level,
const char *tag, const char *fmt, ...);
void rk_camera_debug_open(void);
void rk_camera_debug_close(void);
#define LOG1(fmt, args...) LOGI(fmt, ##args)
#define LOG2(fmt, args...) LOGI(fmt, ##args)
#define LOGR(fmt, args...) LOGI(fmt, ##args)
#define LOGAIQ(fmt, args...) LOGI(fmt, ##args)
#define LOGV(fmt, args...) LOGI(fmt, ##args)
/* #undef LOGE */
/* #define LOGE(fmt, args...) LOGI(fmt, ##args) */
/* #undef LOGW */
/* #define LOGW(fmt, args...) LOGE(fmt, ##args) */
// CAMTRACE_NAME traces the beginning and end of the current scope. To trace
// the correct start and end times this macro should be declared first in the
// scope body.
#define HAL_TRACE_NAME(level, name) ScopedLog __tracer(level, name )
#define HAL_TRACE_CALL(level) HAL_TRACE_NAME(level, __FUNCTION__)
#define HAL_TRACE_CALL_PRETTY(level) HAL_TRACE_NAME(level, __PRETTY_FUNCTION__)
/* use a 64 bits value to represent all modules bug level, and the
* module bit maps is as follow:
*
* bit: 7-4 3-0
* meaning: [sub modules] [level]
*
* bit: 15 14 13 12 11-8
* meaning: [MSG] [POOL] [CAPTURE] [FLASH] [sub modules]
*
* bit: 23 22 21 20 19 18 17 16
* meaning: [U] [U] [U] [U] [U] [U] [U] [U]
*
* bit: 31 30 29 28 27 26 25 24
* meaning: [U] [U] [U] [U] [U] [U] [U] [U]
*
* bit: 39 38 37 36 35 34 33 32
* meaning: [U] [U] [U] [U] [U] [U] [U] [U]
*
* bit: 47 46 45 44 43 42 41 40
* meaning: [U] [U] [U] [U] [U] [U] [U] [U]
*
* bit: [63-48]
* meaning: [U]
*
* [U] means unused now.
* [level]: use 4 bits to define log levels.
* each module log has following ascending levels:
* 0: error
* 1: warning
* 2: info
* 3: debug
* 4: verbose
* 5: low1
* 6-7: unused, now the same as debug
* [sub modules]: use bits 4-11 to define the sub modules of each module, the
* specific meaning of each bit is decided by the module itself. These bits
* is designed to implement the sub module's log switch.
* [modules]: FLASH ...
*
* set debug level example:
* eg. set module flash log level to debug, and enable all sub modules of flash:
* Android:
* setprop persist.vendor.rkisp.log 0x1ff5
*/
int hal_get_log_level();
void hal_print_log (int module, int sub_modules, const char *tag, int level, const char* format, ...);
typedef struct hal_cam_log_module_info_s {
const char* module_name;
int log_level;
int sub_modules;
} hal_cam_log_module_info_t;
typedef enum {
HAL_LOG_LEVEL_NONE,
HAL_LOG_LEVEL_ERR,
HAL_LOG_LEVEL_WARNING,
HAL_LOG_LEVEL_INFO,
HAL_LOG_LEVEL_DEBUG,
HAL_LOG_LEVEL_VERBOSE,
HAL_LOG_LEVEL_LOW1,
} hal_log_level_t;
typedef enum {
HAL_LOG_MODULE_FLASH,
HAL_LOG_MODULE_CAP,
HAL_LOG_MODULE_POOL,
HAL_LOG_MODULE_MSG,
HAL_LOG_MODULE_MAX,
} hal_log_modules_t;
extern hal_cam_log_module_info_t g_hal_log_infos[HAL_LOG_MODULE_MAX];
static unsigned long long g_cam_hal3_log_level = 0xff0;
#define HAL_PROPERTY_VALUE_MAX 128
#define HAL_MAX_STR_SIZE 4096
// module debug
#define HAL_MODULE_LOG_ERROR(module, submodules, format, ...) \
do { \
hal_print_log(module, submodules, LOG_TAG, HAL_LOG_LEVEL_ERR, "E:" format "\n", ##__VA_ARGS__); \
} while (0)
#define HAL_MODULE_LOG_WARNING(module, submodules, format, ...) \
do { \
if (HAL_LOG_LEVEL_WARNING <= g_hal_log_infos[module].log_level && \
(submodules & g_hal_log_infos[module].sub_modules)) \
hal_print_log(module, submodules, LOG_TAG, HAL_LOG_LEVEL_WARNING, "W:" format "\n", \
##__VA_ARGS__); \
} while (0)
#define HAL_MODULE_LOG_INFO(module, submodules, format, ...) \
do { \
if (HAL_LOG_LEVEL_INFO <= g_hal_log_infos[module].log_level && \
(submodules & g_hal_log_infos[module].sub_modules)) \
hal_print_log (module, submodules, LOG_TAG, HAL_LOG_LEVEL_INFO, "I:" format "\n", ## __VA_ARGS__); \
} while(0)
#define HAL_MODULE_LOG_DEBUG(module, submodules, format, ...) \
do { \
if (HAL_LOG_LEVEL_DEBUG <= g_hal_log_infos[module].log_level && \
(submodules & g_hal_log_infos[module].sub_modules)) \
hal_print_log(module, submodules, LOG_TAG, HAL_LOG_LEVEL_DEBUG, "D:" format "\n", \
##__VA_ARGS__); \
} while(0)
#define HAL_MODULE_LOG_VERBOSE(module, submodules, format, ...) \
do { \
if (HAL_LOG_LEVEL_VERBOSE <= g_hal_log_infos[module].log_level && \
(submodules & g_hal_log_infos[module].sub_modules)) \
hal_print_log (module, submodules, LOG_TAG, HAL_LOG_LEVEL_VERBOSE, "XCAM VERBOSE %s:%d: " format "\n", __BI_FILENAME__ , __LINE__, ## __VA_ARGS__); \
} while(0) \
#define HAL_MODULE_LOG_LOW1(module, submodules, format, ...) \
do { \
if (HAL_LOG_LEVEL_LOW1 <= g_hal_log_infos[module].log_level && \
(submodules & g_hal_log_infos[module].sub_modules)) \
hal_print_log (module, submodules, LOG_TAG, HAL_LOG_LEVEL_LOW1, "XCAM LOW1 %s:%d: " format "\n", __BI_FILENAME__, __LINE__, ## __VA_ARGS__); \
} while(0)
// define flash module logs
#define LOGE_FLASH_SUBM(sub_modules, ...) HAL_MODULE_LOG_ERROR(HAL_LOG_MODULE_FLASH, sub_modules, ##__VA_ARGS__)
#define LOGW_FLASH_SUBM(sub_modules, ...) HAL_MODULE_LOG_WARNING(HAL_LOG_MODULE_FLASH, sub_modules, ##__VA_ARGS__)
#define LOGI_FLASH_SUBM(sub_modules, ...) HAL_MODULE_LOG_INFO(HAL_LOG_MODULE_FLASH, sub_modules, ##__VA_ARGS__)
#define LOGD_FLASH_SUBM(sub_modules, ...) HAL_MODULE_LOG_DEBUG(HAL_LOG_MODULE_FLASH, sub_modules, ##__VA_ARGS__)
#define LOGV_FLASH_SUBM(sub_modules, ...) HAL_MODULE_LOG_VERBOSE(HAL_LOG_MODULE_FLASH, sub_modules, ##__VA_ARGS__)
#define LOG1_FLASH_SUBM(sub_modules, ...) HAL_MODULE_LOG_LOW1(HAL_LOG_MODULE_FLASH, sub_modules, ##__VA_ARGS__)
#define LOGE_FLASH(...) LOGE_FLASH_SUBM(0xff, ##__VA_ARGS__)
#define LOGW_FLASH(...) LOGW_FLASH_SUBM(0xff, ##__VA_ARGS__)
#define LOGI_FLASH(...) LOGI_FLASH_SUBM(0xff, ##__VA_ARGS__)
#define LOGD_FLASH(...) LOGD_FLASH_SUBM(0xff, ##__VA_ARGS__)
#define LOGV_FLASH(...) LOGV_FLASH_SUBM(0xff, ##__VA_ARGS__)
#define LOG1_FLASH(...) LOG1_FLASH_SUBM(0xff, ##__VA_ARGS__)
// define capture module logs
#define LOGE_CAP_SUBM(sub_modules, ...) HAL_MODULE_LOG_ERROR(HAL_LOG_MODULE_CAP, sub_modules, ##__VA_ARGS__)
#define LOGW_CAP_SUBM(sub_modules, ...) HAL_MODULE_LOG_WARNING(HAL_LOG_MODULE_CAP, sub_modules, ##__VA_ARGS__)
#define LOGI_CAP_SUBM(sub_modules, ...) HAL_MODULE_LOG_INFO(HAL_LOG_MODULE_CAP, sub_modules, ##__VA_ARGS__)
#define LOGD_CAP_SUBM(sub_modules, ...) HAL_MODULE_LOG_DEBUG(HAL_LOG_MODULE_CAP, sub_modules, ##__VA_ARGS__)
#define LOGV_CAP_SUBM(sub_modules, ...) HAL_MODULE_LOG_VERBOSE(HAL_LOG_MODULE_CAP, sub_modules, ##__VA_ARGS__)
#define LOG1_CAP_SUBM(sub_modules, ...) HAL_MODULE_LOG_LOW1(HAL_LOG_MODULE_CAP, sub_modules, ##__VA_ARGS__)
#define LOGE_CAP(...) LOGE_CAP_SUBM(0xff, ##__VA_ARGS__)
#define LOGW_CAP(...) LOGW_CAP_SUBM(0xff, ##__VA_ARGS__)
#define LOGI_CAP(...) LOGI_CAP_SUBM(0xff, ##__VA_ARGS__)
#define LOGD_CAP(...) LOGD_CAP_SUBM(0xff, ##__VA_ARGS__)
#define LOGV_CAP(...) LOGV_CAP_SUBM(0xff, ##__VA_ARGS__)
#define LOG1_CAP(...) LOG1_CAP_SUBM(0xff, ##__VA_ARGS__)
#define LOGE_POOL_SUBM(sub_modules, ...) HAL_MODULE_LOG_ERROR(HAL_LOG_MODULE_POOL, sub_modules, ##__VA_ARGS__)
#define LOGW_POOL_SUBM(sub_modules, ...) HAL_MODULE_LOG_WARNING(HAL_LOG_MODULE_POOL, sub_modules, ##__VA_ARGS__)
#define LOGI_POOL_SUBM(sub_modules, ...) HAL_MODULE_LOG_INFO(HAL_LOG_MODULE_POOL, sub_modules, ##__VA_ARGS__)
#define LOGD_POOL_SUBM(sub_modules, ...) HAL_MODULE_LOG_DEBUG(HAL_LOG_MODULE_POOL, sub_modules, ##__VA_ARGS__)
#define LOGV_POOL_SUBM(sub_modules, ...) HAL_MODULE_LOG_VERBOSE(HAL_LOG_MODULE_POOL, sub_modules, ##__VA_ARGS__)
#define LOG1_POOL_SUBM(sub_modules, ...) HAL_MODULE_LOG_LOW1(HAL_LOG_MODULE_POOL, sub_modules, ##__VA_ARGS__)
#define LOGE_POOL(...) LOGE_POOL_SUBM(0xff, ##__VA_ARGS__)
#define LOGW_POOL(...) LOGW_POOL_SUBM(0xff, ##__VA_ARGS__)
#define LOGI_POOL(...) LOGI_POOL_SUBM(0xff, ##__VA_ARGS__)
#define LOGD_POOL(...) LOGD_POOL_SUBM(0xff, ##__VA_ARGS__)
#define LOGV_POOL(...) LOGV_POOL_SUBM(0xff, ##__VA_ARGS__)
#define LOG1_POOL(...) LOG1_POOL_SUBM(0xff, ##__VA_ARGS__)
#define LOGE_MSG_SUBM(sub_modules, ...) HAL_MODULE_LOG_ERROR(HAL_LOG_MODULE_MSG, sub_modules, ##__VA_ARGS__)
#define LOGW_MSG_SUBM(sub_modules, ...) HAL_MODULE_LOG_WARNING(HAL_LOG_MODULE_MSG, sub_modules, ##__VA_ARGS__)
#define LOGI_MSG_SUBM(sub_modules, ...) HAL_MODULE_LOG_INFO(HAL_LOG_MODULE_MSG, sub_modules, ##__VA_ARGS__)
#define LOGD_MSG_SUBM(sub_modules, ...) HAL_MODULE_LOG_DEBUG(HAL_LOG_MODULE_MSG, sub_modules, ##__VA_ARGS__)
#define LOGV_MSG_SUBM(sub_modules, ...) HAL_MODULE_LOG_VERBOSE(HAL_LOG_MODULE_MSG, sub_modules, ##__VA_ARGS__)
#define LOG1_MSG_SUBM(sub_modules, ...) HAL_MODULE_LOG_LOW1(HAL_LOG_MODULE_MSG, sub_modules, ##__VA_ARGS__)
#define LOGE_MSG(...) LOGE_MSG_SUBM(0xff, ##__VA_ARGS__)
#define LOGW_MSG(...) LOGW_MSG_SUBM(0xff, ##__VA_ARGS__)
#define LOGI_MSG(...) LOGI_MSG_SUBM(0xff, ##__VA_ARGS__)
#define LOGD_MSG(...) LOGD_MSG_SUBM(0xff, ##__VA_ARGS__)
#define LOGV_MSG(...) LOGV_MSG_SUBM(0xff, ##__VA_ARGS__)
#define LOG1_MSG(...) LOG1_MSG_SUBM(0xff, ##__VA_ARGS__)
#else
#undef LOGD
#define LOGD(fmt, args...) ALOGD(fmt, ##args)
#undef LOGL
#define LOGL(fmt, args...) ALOGD(fmt, ##args)
#undef LOGW
#define LOGW(fmt, args...) ALOGW(fmt, ##args)
#undef LOGH
#define LOGH(fmt, args...) ALOGD(fmt, ##args)
#undef LOGE
#define LOGE(fmt, args...) ALOGE(fmt, ##args)
#undef LOGI
#define LOGI(fmt, args...) ALOGV(fmt, ##args)
#define LOG1(...)
#define LOG2(...)
#define LOGR(...)
#define LOGAIQ(...)
#define LOGD(...)
#define LOGV(...)
#define LOGI(...)
#define HAL_TRACE_NAME(level, name)
#define HAL_TRACE_CALL(level)
#define HAL_TRACE_CALL_PRETTY(level)
#endif
#endif /* __LOGHELPERANDROID__ */