Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 64 additions & 41 deletions components/utilities/ulog/ulog.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,41 +29,41 @@

/* the number which is max stored line logs */
#ifndef ULOG_ASYNC_OUTPUT_STORE_LINES
#define ULOG_ASYNC_OUTPUT_STORE_LINES (ULOG_ASYNC_OUTPUT_BUF_SIZE * 3 / 2 / 80)
#define ULOG_ASYNC_OUTPUT_STORE_LINES (ULOG_ASYNC_OUTPUT_BUF_SIZE * 3 / 2 / 80)
#endif

#ifdef ULOG_USING_COLOR
/**
* CSI(Control Sequence Introducer/Initiator) sign
* more information on https://en.wikipedia.org/wiki/ANSI_escape_code
*/
#define CSI_START "\033["
#define CSI_END "\033[0m"
#define CSI_START "\033["
#define CSI_END "\033[0m"
/* output log front color */
#define F_BLACK "30m"
#define F_RED "31m"
#define F_GREEN "32m"
#define F_YELLOW "33m"
#define F_BLUE "34m"
#define F_MAGENTA "35m"
#define F_CYAN "36m"
#define F_WHITE "37m"
#define F_BLACK "30m"
#define F_RED "31m"
#define F_GREEN "32m"
#define F_YELLOW "33m"
#define F_BLUE "34m"
#define F_MAGENTA "35m"
#define F_CYAN "36m"
#define F_WHITE "37m"

/* output log default color definition */
#ifndef ULOG_COLOR_DEBUG
#define ULOG_COLOR_DEBUG RT_NULL
#define ULOG_COLOR_DEBUG RT_NULL
#endif
#ifndef ULOG_COLOR_INFO
#define ULOG_COLOR_INFO (F_GREEN)
#define ULOG_COLOR_INFO (F_GREEN)
#endif
#ifndef ULOG_COLOR_WARN
#define ULOG_COLOR_WARN (F_YELLOW)
#define ULOG_COLOR_WARN (F_YELLOW)
#endif
#ifndef ULOG_COLOR_ERROR
#define ULOG_COLOR_ERROR (F_RED)
#define ULOG_COLOR_ERROR (F_RED)
#endif
#ifndef ULOG_COLOR_ASSERT
#define ULOG_COLOR_ASSERT (F_MAGENTA)
#define ULOG_COLOR_ASSERT (F_MAGENTA)
#endif
#endif /* ULOG_USING_COLOR */

Expand Down Expand Up @@ -111,8 +111,7 @@ struct rt_ulog

#ifdef ULOG_OUTPUT_LEVEL
/* level output info */
static const char * const level_output_info[] =
{
static const char * const level_output_info[] = {
"A/",
RT_NULL,
RT_NULL,
Expand All @@ -126,8 +125,7 @@ static const char * const level_output_info[] =

#ifdef ULOG_USING_COLOR
/* color output info */
static const char * const color_output_info[] =
{
static const char * const color_output_info[] = {
ULOG_COLOR_ASSERT,
RT_NULL,
RT_NULL,
Expand Down Expand Up @@ -288,7 +286,7 @@ rt_weak rt_size_t ulog_head_formater(char *log_buf, rt_uint32_t level, const cha
tm = localtime_r(&t, &tm_tmp);
/* show the time format MM-DD HH:MM:SS */
rt_snprintf(log_buf + log_len, ULOG_LINE_BUF_SIZE - log_len, "%02d-%02d %02d:%02d:%02d", tm->tm_mon + 1,
tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
/* check the microseconds support when kernel is startup */
if (t > 0 && !check_usec_support && rt_thread_self() != RT_NULL)
{
Expand All @@ -299,7 +297,9 @@ rt_weak rt_size_t ulog_head_formater(char *log_buf, rt_uint32_t level, const cha
check_usec_support = RT_TRUE;
/* the microseconds is not equal between two gettimeofday calls */
if (now.tv_usec != old_usec)
{
usec_is_support = RT_TRUE;
}
}
if (usec_is_support)
{
Expand Down Expand Up @@ -344,7 +344,6 @@ rt_weak rt_size_t ulog_head_formater(char *log_buf, rt_uint32_t level, const cha
#ifdef ULOG_OUTPUT_THREAD_NAME
/* add thread info */
{

#if defined(ULOG_OUTPUT_TIME) || defined(ULOG_OUTPUT_LEVEL) || defined(ULOG_OUTPUT_TAG)
log_len += ulog_strcpy(log_len, log_buf + log_len, " ");
#endif
Expand Down Expand Up @@ -402,12 +401,6 @@ rt_weak rt_size_t ulog_tail_formater(char *log_buf, rt_size_t log_len, rt_bool_t
log_len -= sizeof((char)'\0');
}

/* package newline sign */
if (newline)
{
log_len += ulog_strcpy(log_len, log_buf + log_len, ULOG_NEWLINE_SIGN);
}

#ifdef ULOG_USING_COLOR
/* add CSI end sign */
if (color_output_info[level])
Expand All @@ -416,6 +409,12 @@ rt_weak rt_size_t ulog_tail_formater(char *log_buf, rt_size_t log_len, rt_bool_t
}
#endif /* ULOG_USING_COLOR */

/* package newline sign */
if (newline)
{
log_len += ulog_strcpy(log_len, log_buf + log_len, ULOG_NEWLINE_SIGN);
}

/* add string end sign */
log_buf[log_len] = '\0';

Expand Down Expand Up @@ -464,7 +463,7 @@ static void ulog_no_enough_buffer_printf(void)
}

rt_weak rt_size_t ulog_formater(char *log_buf, rt_uint32_t level, const char *tag, rt_bool_t newline,
const char *format, va_list args)
const char *format, va_list args)
{
/* the caller has locker, so it can use static variable for reduce stack usage */
static rt_size_t log_len;
Expand Down Expand Up @@ -494,7 +493,7 @@ rt_weak rt_size_t ulog_formater(char *log_buf, rt_uint32_t level, const char *ta

rt_weak rt_size_t ulog_hex_formater(char *log_buf, const char *tag, const rt_uint8_t *buf, rt_size_t size, rt_size_t width, rt_base_t addr)
{
#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
/* the caller has locker, so it can use static variable for reduce stack usage */
static rt_size_t log_len, j;
static int fmt_result;
Expand Down Expand Up @@ -551,7 +550,9 @@ static void ulog_output_to_all_backend(rt_uint32_t level, const char *tag, rt_bo
ulog_backend_t backend;

if (!ulog.init_ok)
{
return;
}

/* if there is no backend */
if (!rt_slist_first(&ulog.backend_list))
Expand Down Expand Up @@ -587,7 +588,9 @@ static void ulog_output_to_all_backend(rt_uint32_t level, const char *tag, rt_bo
const char *output_log = log;

if (color_output_info[level] != RT_NULL)
{
color_info_len = rt_strlen(color_output_info[level]);
}

if (color_info_len)
{
Expand Down Expand Up @@ -618,7 +621,7 @@ static void do_output(rt_uint32_t level, const char *tag, rt_bool_t is_raw, cons
if (log_blk)
{
/* package the log frame */
log_frame = (ulog_frame_t) log_blk->buf;
log_frame = (ulog_frame_t)log_blk->buf;
log_frame->magic = ULOG_FRAME_MAGIC;
log_frame->is_raw = is_raw;
log_frame->level = level;
Expand Down Expand Up @@ -673,8 +676,8 @@ static void do_output(rt_uint32_t level, const char *tag, rt_bool_t is_raw, cons
#ifdef ULOG_BACKEND_USING_CONSOLE
/* We can't ensure that all backends support ISR context output.
* So only using rt_kprintf when context is ISR */
extern void ulog_console_backend_output(struct ulog_backend *backend, rt_uint32_t level, const char *tag,
rt_bool_t is_raw, const char *log, rt_size_t len);
extern void ulog_console_backend_output(struct ulog_backend * backend, rt_uint32_t level, const char *tag,
rt_bool_t is_raw, const char *log, rt_size_t len);
ulog_console_backend_output(RT_NULL, level, tag, is_raw, log_buf, log_len);
#endif /* ULOG_BACKEND_USING_CONSOLE */
}
Expand All @@ -694,7 +697,7 @@ static void do_output(rt_uint32_t level, const char *tag, rt_bool_t is_raw, cons
* @param args variable argument list
*/
void ulog_voutput(rt_uint32_t level, const char *tag, rt_bool_t newline, const rt_uint8_t *hex_buf, rt_size_t hex_size,
rt_size_t hex_width, rt_base_t hex_addr, const char *format, va_list args)
rt_size_t hex_width, rt_base_t hex_addr, const char *format, va_list args)
{
static rt_bool_t ulog_voutput_recursion = RT_FALSE;
char *log_buf = RT_NULL;
Expand All @@ -721,8 +724,7 @@ void ulog_voutput(rt_uint32_t level, const char *tag, rt_bool_t newline, const r
return;
}
#else
if (((LOG_MASK(LOG_PRI(level)) & ulog.filter.level) == 0)
|| ((LOG_MASK(LOG_PRI(level)) & ulog_tag_lvl_filter_get(tag)) == 0))
if (((LOG_MASK(LOG_PRI(level)) & ulog.filter.level) == 0) || ((LOG_MASK(LOG_PRI(level)) & ulog_tag_lvl_filter_get(tag)) == 0))
{
return;
}
Expand Down Expand Up @@ -886,9 +888,13 @@ void ulog_hexdump(const char *tag, rt_size_t width, const rt_uint8_t *buf, rt_si
for (i = 0; i < size; i += width, buf += width)
{
if (i + width > size)
{
len = size - i;
}
else
{
len = width;
}
ulog_voutput(LOG_LVL_DBG, tag, RT_TRUE, buf, len, width, i, RT_NULL, args);
}

Expand All @@ -915,10 +921,14 @@ int ulog_be_lvl_filter_set(const char *be_name, rt_uint32_t level)
int result = RT_EOK;

if (level > LOG_FILTER_LVL_ALL)
{
return -RT_EINVAL;
}

if (!ulog.init_ok)
{
return result;
}

for (node = rt_slist_first(&ulog.backend_list); node; node = rt_slist_next(node))
{
Expand Down Expand Up @@ -960,10 +970,14 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level)
int result = RT_EOK;

if (level > LOG_FILTER_LVL_ALL)
{
return -RT_EINVAL;
}

if (!ulog.init_ok)
{
return result;
}

/* lock output */
output_lock();
Expand Down Expand Up @@ -1004,7 +1018,7 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level)
tag_lvl = (ulog_tag_lvl_filter_t)rt_malloc(sizeof(struct ulog_tag_lvl_filter));
if (tag_lvl)
{
rt_memset(tag_lvl->tag, 0 , sizeof(tag_lvl->tag));
rt_memset(tag_lvl->tag, 0, sizeof(tag_lvl->tag));
rt_strncpy(tag_lvl->tag, tag, ULOG_FILTER_TAG_MAX_LEN);
tag_lvl->level = level;
rt_slist_append(ulog_tag_lvl_list_get(), &tag_lvl->list);
Expand Down Expand Up @@ -1036,7 +1050,9 @@ rt_uint32_t ulog_tag_lvl_filter_get(const char *tag)
rt_uint32_t level = LOG_FILTER_LVL_ALL;

if (!ulog.init_ok)
{
return level;
}

/* lock output */
output_lock();
Expand Down Expand Up @@ -1304,7 +1320,6 @@ static void ulog_filter(uint8_t argc, char **argv)
#else
rt_kprintf("%d\n", tag_lvl->level);
#endif

}
/* unlock output */
output_unlock();
Expand Down Expand Up @@ -1436,12 +1451,12 @@ void ulog_async_output(void)

while ((log_blk = rt_rbb_blk_get(ulog.async_rbb)) != RT_NULL)
{
log_frame = (ulog_frame_t) log_blk->buf;
log_frame = (ulog_frame_t)log_blk->buf;
if (log_frame->magic == ULOG_FRAME_MAGIC)
{
/* output to all backends */
ulog_output_to_all_backend(log_frame->level, log_frame->tag, log_frame->is_raw, log_frame->log,
log_frame->log_len);
log_frame->log_len);
}
rt_rbb_blk_free(ulog.async_rbb, log_blk);
}
Expand Down Expand Up @@ -1519,7 +1534,9 @@ void ulog_flush(void)
ulog_backend_t backend;

if (!ulog.init_ok)
{
return;
}

#ifdef ULOG_USING_ASYNC_OUTPUT
ulog_async_output();
Expand Down Expand Up @@ -1547,7 +1564,9 @@ void ulog_flush(void)
int ulog_init(void)
{
if (ulog.init_ok)
{
return 0;
}

rt_mutex_init(&ulog.output_locker, "ulog", RT_IPC_FLAG_PRIO);
ulog.output_lock_enabled = RT_TRUE;
Expand Down Expand Up @@ -1594,7 +1613,7 @@ int ulog_async_init(void)
{
/* async output thread */
ulog.async_th = rt_thread_create("ulog_async", async_output_thread_entry, &ulog, ULOG_ASYNC_OUTPUT_THREAD_STACK,
ULOG_ASYNC_OUTPUT_THREAD_PRIORITY, 20);
ULOG_ASYNC_OUTPUT_THREAD_PRIORITY, 20);
if (ulog.async_th == RT_NULL)
{
rt_kprintf("Error: ulog init failed! No memory for async output thread.\n");
Expand All @@ -1619,7 +1638,9 @@ void ulog_deinit(void)
ulog_backend_t backend;

if (!ulog.init_ok)
{
return;
}

/* deinit all backends */
for (node = rt_slist_first(&ulog.backend_list); node; node = rt_slist_next(node))
Expand Down Expand Up @@ -1649,7 +1670,9 @@ void ulog_deinit(void)
rt_rbb_destroy(ulog.async_rbb);
rt_thread_delete(ulog.async_th);
if (ulog.async_rb)
{
rt_ringbuffer_destroy(ulog.async_rb);
}
#endif

ulog.init_ok = RT_FALSE;
Expand Down
Loading