Skip to content
Merged
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion components/utilities/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ config RT_USING_ULOG

config ULOG_SW_VERSION_NUM
hex
default 0x00100
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RT-Thread内部,不建议再行各组件加版本号的,除了一些移植的组件外。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

如果这个 组件 对外(软件包)是 公共组件 ,确实会存在版本依赖的可能。例如 AT 组件,被 at_device 软件包依赖,随着开发阶段的不断完善,at_device 的不同版本对应 AT 组件的版本也不一样,在其 Kconfig 就需要用到版本依赖处理:

    choice

        prompt "Version"
        default PKG_USING_AT_DEVICE_LATEST_VERSION
        help
            Select the at_device version

        if AT_SW_VERSION_NUM >= 0x10200
            config PKG_USING_AT_DEVICE_V140
                bool "v1.4.0"
        endif 
           
        if AT_SW_VERSION_NUM = 0x10100
            config PKG_USING_AT_DEVICE_V130
                bool "v1.3.0"
        endif

        # AT command component version from v1.0.0 to v1.1.0 or at version not definition
        if (AT_SW_VERSION_NUM >= 0x10000 && AT_SW_VERSION_NUM < 0x10100) || (!AT_SW_VERSION_NUM)
            config PKG_USING_AT_DEVICE_V120
                bool "v1.2.0"
        endif

        config PKG_USING_AT_DEVICE_LATEST_VERSION
            bool "latest"

    endchoice

所以好像不增加版本,这个问题好像不太好解决。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

所以这个需要一个API的一致性、稳定性;这些一致性、稳定性随着RT-Thread的版本号走。RT-Thread本身也需要稳定性

Copy link
Member Author

@armink armink Nov 9, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

那这个问题如何解决呢?在内核里增加 RT-Thread 的 Kconfig version ?

default 0x00101
help
sfotware module version number
endif
Expand Down
153 changes: 122 additions & 31 deletions components/utilities/ulog/ulog.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
#endif

#ifdef ULOG_TIME_USING_TIMESTAMP
#include <time.h>
#include <sys/time.h>
#endif

#ifdef ULOG_USING_ASYNC_OUTPUT
Expand Down Expand Up @@ -74,15 +74,6 @@
#error "the log line buffer size must more than 80"
#endif

/* tag's level filter */
struct tag_lvl_filter
{
char tag[ULOG_FILTER_TAG_MAX_LEN + 1];
rt_uint32_t level;
rt_slist_t list;
};
typedef struct tag_lvl_filter *tag_lvl_filter_t;

struct rt_ulog
{
rt_bool_t init_ok;
Expand Down Expand Up @@ -634,17 +625,17 @@ void ulog_raw(const char *format, ...)
/**
* dump the hex format data to log
*
* @param name name for hex object, it will show on log header
* @param tag name for hex object, it will show on log header
* @param width hex number for every line, such as: 16, 32
* @param buf hex buffer
* @param size buffer size
*/
void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t size)
void ulog_hexdump(const char *tag, rt_size_t width, rt_uint8_t *buf, rt_size_t size)
{
#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')

rt_size_t i, j;
rt_size_t log_len = 0, name_len = rt_strlen(name);
rt_size_t log_len = 0, name_len = rt_strlen(tag);
char *log_buf = NULL, dump_string[8];
int fmt_result;

Expand All @@ -653,7 +644,7 @@ void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t
#ifdef ULOG_USING_FILTER
/* level filter */
#ifndef ULOG_USING_SYSLOG
if (LOG_LVL_DBG > ulog.filter.level)
if (LOG_LVL_DBG > ulog.filter.level || LOG_LVL_DBG > ulog_tag_lvl_filter_get(tag))
{
return;
}
Expand All @@ -663,6 +654,11 @@ void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t
return;
}
#endif /* ULOG_USING_SYSLOG */
else if (!rt_strstr(tag, ulog.filter.tag))
{
/* tag filter */
return;
}
#endif /* ULOG_USING_FILTER */

/* get log buffer */
Expand All @@ -677,7 +673,7 @@ void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t
if (i == 0)
{
log_len += ulog_strcpy(log_len, log_buf + log_len, "D/HEX ");
log_len += ulog_strcpy(log_len, log_buf + log_len, name);
log_len += ulog_strcpy(log_len, log_buf + log_len, tag);
log_len += ulog_strcpy(log_len, log_buf + log_len, ": ");
}
else
Expand Down Expand Up @@ -754,26 +750,28 @@ void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t
* When the level is LOG_FILTER_LVL_ALL, it will remove this tag's level filer.
* Then all level log will resume output.
*
* @return 0: success
* -5: no memory
* @return 0 : success
* -5 : no memory
* -10: level is out of range
*/
int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level)
{
rt_slist_t *node;
tag_lvl_filter_t tag_lvl = NULL;
ulog_tag_lvl_filter_t tag_lvl = NULL;
int result = RT_EOK;

RT_ASSERT(level <= LOG_FILTER_LVL_ALL);
if (level >= LOG_FILTER_LVL_ALL)
return -RT_EINVAL;

if (!ulog.init_ok)
return result;

/* lock output */
output_lock();
/* find the tag in list */
for (node = rt_slist_first(&ulog.filter.tag_lvl_list); node; node = rt_slist_next(node))
for (node = rt_slist_first(ulog_tag_lvl_list_get()); node; node = rt_slist_next(node))
{
tag_lvl = rt_slist_entry(node, struct tag_lvl_filter, list);
tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list);
if (!rt_strncmp(tag_lvl->tag, tag, ULOG_FILTER_TAG_MAX_LEN))
{
break;
Expand All @@ -789,7 +787,8 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level)
if (level == LOG_FILTER_LVL_ALL)
{
/* remove current tag's level filter when input level is the lowest level */
rt_slist_remove(&ulog.filter.tag_lvl_list, &tag_lvl->list);
rt_slist_remove(ulog_tag_lvl_list_get(), &tag_lvl->list);
rt_free(tag_lvl);
}
else
{
Expand All @@ -803,13 +802,13 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level)
if (level != LOG_FILTER_LVL_ALL)
{
/* new a tag's level filter */
tag_lvl = (tag_lvl_filter_t)rt_malloc(sizeof(struct tag_lvl_filter));
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_strncpy(tag_lvl->tag, tag, ULOG_FILTER_TAG_MAX_LEN);
tag_lvl->level = level;
rt_slist_append(&ulog.filter.tag_lvl_list, &tag_lvl->list);
rt_slist_append(ulog_tag_lvl_list_get(), &tag_lvl->list);
}
else
{
Expand All @@ -834,7 +833,7 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level)
rt_uint32_t ulog_tag_lvl_filter_get(const char *tag)
{
rt_slist_t *node;
tag_lvl_filter_t tag_lvl = NULL;
ulog_tag_lvl_filter_t tag_lvl = NULL;
rt_uint32_t level = LOG_FILTER_LVL_ALL;

if (!ulog.init_ok)
Expand All @@ -843,9 +842,9 @@ rt_uint32_t ulog_tag_lvl_filter_get(const char *tag)
/* lock output */
output_lock();
/* find the tag in list */
for (node = rt_slist_first(&ulog.filter.tag_lvl_list); node; node = rt_slist_next(node))
for (node = rt_slist_first(ulog_tag_lvl_list_get()); node; node = rt_slist_next(node))
{
tag_lvl = rt_slist_entry(node, struct tag_lvl_filter, list);
tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list);
if (!rt_strncmp(tag_lvl->tag, tag, ULOG_FILTER_TAG_MAX_LEN))
{
level = tag_lvl->level;
Expand All @@ -858,6 +857,16 @@ rt_uint32_t ulog_tag_lvl_filter_get(const char *tag)
return level;
}

/**
* get the tag's level list on filter
*
* @return tag's level list
*/
rt_slist_t *ulog_tag_lvl_list_get(void)
{
return &ulog.filter.tag_lvl_list;
}

/**
* set log global filter level
*
Expand All @@ -872,6 +881,18 @@ void ulog_global_filter_lvl_set(rt_uint32_t level)
ulog.filter.level = level;
}

/**
* get log global filter level
*
* @return log level: LOG_LVL_ASSERT, LOG_LVL_ERROR, LOG_LVL_WARNING, LOG_LVL_INFO, LOG_LVL_DBG
* LOG_FILTER_LVL_SILENT: disable all log output, except assert level
* LOG_FILTER_LVL_ALL: enable all log output
*/
rt_uint32_t ulog_global_filter_lvl_get(void)
{
return ulog.filter.level;
}

/**
* set log global filter tag
*
Expand All @@ -884,6 +905,16 @@ void ulog_global_filter_tag_set(const char *tag)
rt_strncpy(ulog.filter.tag, tag, ULOG_FILTER_TAG_MAX_LEN);
}

/**
* get log global filter tag
*
* @return tag
*/
const char *ulog_global_filter_tag_get(void)
{
return ulog.filter.tag;
}

/**
* set log global filter keyword
*
Expand All @@ -896,6 +927,16 @@ void ulog_global_filter_kw_set(const char *keyword)
rt_strncpy(ulog.filter.keyword, keyword, ULOG_FILTER_KW_MAX_LEN);
}

/**
* get log global filter keyword
*
* @return keyword
*/
const char *ulog_global_filter_kw_get(void)
{
return ulog.filter.keyword;
}

#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
#include <finsh.h>

Expand Down Expand Up @@ -1010,6 +1051,56 @@ static void ulog_kw(uint8_t argc, char **argv)
}
}
MSH_CMD_EXPORT(ulog_kw, Set ulog global filter keyword);

static void ulog_filter(uint8_t argc, char **argv)
{
#ifndef ULOG_USING_SYSLOG
const char *lvl_name[] = { "Assert ", "Error ", "Error ", "Error ", "Warning", "Info ", "Info ", "Debug " };
#endif
const char *tag = ulog_global_filter_tag_get(), *kw = ulog_global_filter_kw_get();
rt_slist_t *node;
ulog_tag_lvl_filter_t tag_lvl = NULL;

rt_kprintf("--------------------------------------\n");
rt_kprintf("ulog global filter:\n");

#ifndef ULOG_USING_SYSLOG
rt_kprintf("level : %s\n", lvl_name[ulog_global_filter_lvl_get()]);
#else
rt_kprintf("level : %d\n", ulog_global_filter_lvl_get());
#endif

rt_kprintf("tag : %s\n", rt_strlen(tag) == 0 ? "NULL" : tag);
rt_kprintf("keyword : %s\n", rt_strlen(kw) == 0 ? "NULL" : kw);

rt_kprintf("--------------------------------------\n");
rt_kprintf("ulog tag's level filter:\n");
if (rt_slist_isempty(ulog_tag_lvl_list_get()))
{
rt_kprintf("settings not found\n");
}
else
{
/* lock output */
output_lock();
/* show the tag level list */
for (node = rt_slist_first(ulog_tag_lvl_list_get()); node; node = rt_slist_next(node))
{
tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list);
rt_kprintf("%-*.s: ", ULOG_FILTER_TAG_MAX_LEN, tag_lvl->tag);

#ifndef ULOG_USING_SYSLOG
rt_kprintf("%s\n", lvl_name[tag_lvl->level]);
#else
rt_kprintf("%d\n", tag_lvl->level);
#endif

}
/* unlock output */
output_unlock();
}
}
MSH_CMD_EXPORT(ulog_filter, Show ulog filter settings);
#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */
#endif /* ULOG_USING_FILTER */

Expand Down Expand Up @@ -1136,7 +1227,7 @@ int ulog_init(void)
rt_slist_init(&ulog.backend_list);

#ifdef ULOG_USING_FILTER
rt_slist_init(&ulog.filter.tag_lvl_list);
rt_slist_init(ulog_tag_lvl_list_get());
#endif

#ifdef ULOG_USING_ASYNC_OUTPUT
Expand Down Expand Up @@ -1197,10 +1288,10 @@ void ulog_deinit(void)
#ifdef ULOG_USING_FILTER
/* deinit tag's level filter */
{
tag_lvl_filter_t tag_lvl;
for (node = rt_slist_first(&ulog.filter.tag_lvl_list); node; node = rt_slist_next(node))
ulog_tag_lvl_filter_t tag_lvl;
for (node = rt_slist_first(ulog_tag_lvl_list_get()); node; node = rt_slist_next(node))
{
tag_lvl = rt_slist_entry(node, struct tag_lvl_filter, list);
tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list);
rt_free(tag_lvl);
}
}
Expand Down
8 changes: 6 additions & 2 deletions components/utilities/ulog/ulog.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
extern "C" {
#endif

#define ULOG_VERSION_STR "0.1.0"
#define ULOG_VERSION_STR "0.1.1"

/*
* ulog init and deint
Expand Down Expand Up @@ -58,9 +58,13 @@ rt_err_t ulog_backend_unregister(ulog_backend_t backend);
*/
int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level);
rt_uint32_t ulog_tag_lvl_filter_get(const char *tag);
rt_slist_t *ulog_tag_lvl_list_get(void);
void ulog_global_filter_lvl_set(rt_uint32_t level);
rt_uint32_t ulog_global_filter_lvl_get(void);
void ulog_global_filter_tag_set(const char *tag);
const char *ulog_global_filter_tag_get(void);
void ulog_global_filter_kw_set(const char *keyword);
const char *ulog_global_filter_kw_get(void);
#endif /* ULOG_USING_FILTER */

/*
Expand All @@ -79,7 +83,7 @@ void ulog_async_waiting_log(rt_int32_t time);
/*
* dump the hex format data to log
*/
void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t size);
void ulog_hexdump(const char *tag, rt_size_t width, rt_uint8_t *buf, rt_size_t size);

/*
* Another log output API. This API is more difficult to use than LOG_X API.
Expand Down
9 changes: 9 additions & 0 deletions components/utilities/ulog/ulog_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,15 @@ extern "C" {

#define ULOG_FRAME_MAGIC 0x10

/* tag's level filter */
struct ulog_tag_lvl_filter
{
char tag[ULOG_FILTER_TAG_MAX_LEN + 1];
rt_uint32_t level;
rt_slist_t list;
};
typedef struct ulog_tag_lvl_filter *ulog_tag_lvl_filter_t;

struct ulog_frame
{
/* magic word is 0x10 ('lo') */
Expand Down