diff --git a/easylogger/inc/elog.h b/easylogger/inc/elog.h deleted file mode 100755 index 6b94b21..0000000 --- a/easylogger/inc/elog.h +++ /dev/null @@ -1,275 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2019, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: It is an head file for this library. You can see all be called functions. - * Created on: 2015-04-28 - */ - -#ifndef __ELOG_H__ -#define __ELOG_H__ - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* output log's level */ -#define ELOG_LVL_ASSERT 0 -#define ELOG_LVL_ERROR 1 -#define ELOG_LVL_WARN 2 -#define ELOG_LVL_INFO 3 -#define ELOG_LVL_DEBUG 4 -#define ELOG_LVL_VERBOSE 5 - -/* the output silent level and all level for filter setting */ -#define ELOG_FILTER_LVL_SILENT ELOG_LVL_ASSERT -#define ELOG_FILTER_LVL_ALL ELOG_LVL_VERBOSE - -/* output log's level total number */ -#define ELOG_LVL_TOTAL_NUM 6 - -/* EasyLogger software version number */ -#define ELOG_SW_VERSION "2.2.99" - -/* EasyLogger assert for developer. */ -#ifdef ELOG_ASSERT_ENABLE - #define ELOG_ASSERT(EXPR) \ - if (!(EXPR)) \ - { \ - if (elog_assert_hook == NULL) { \ - elog_a("elog", "(%s) has assert failed at %s:%ld.", #EXPR, __FUNCTION__, __LINE__); \ - while (1); \ - } else { \ - elog_assert_hook(#EXPR, __FUNCTION__, __LINE__); \ - } \ - } -#else - #define ELOG_ASSERT(EXPR) ((void)0); -#endif - -#ifndef ELOG_OUTPUT_ENABLE - #define elog_assert(tag, ...) - #define elog_error(tag, ...) - #define elog_warn(tag, ...) - #define elog_info(tag, ...) - #define elog_debug(tag, ...) - #define elog_verbose(tag, ...) -#else /* ELOG_OUTPUT_ENABLE */ - #if ELOG_OUTPUT_LVL >= ELOG_LVL_ASSERT - #define elog_assert(tag, ...) \ - elog_output(ELOG_LVL_ASSERT, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__) - #else - #define elog_assert(tag, ...) - #endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_ASSERT */ - - #if ELOG_OUTPUT_LVL >= ELOG_LVL_ERROR - #define elog_error(tag, ...) \ - elog_output(ELOG_LVL_ERROR, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__) - #else - #define elog_error(tag, ...) - #endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_ERROR */ - - #if ELOG_OUTPUT_LVL >= ELOG_LVL_WARN - #define elog_warn(tag, ...) \ - elog_output(ELOG_LVL_WARN, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__) - #else - #define elog_warn(tag, ...) - #endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_WARN */ - - #if ELOG_OUTPUT_LVL >= ELOG_LVL_INFO - #define elog_info(tag, ...) \ - elog_output(ELOG_LVL_INFO, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__) - #else - #define elog_info(tag, ...) - #endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_INFO */ - - #if ELOG_OUTPUT_LVL >= ELOG_LVL_DEBUG - #define elog_debug(tag, ...) \ - elog_output(ELOG_LVL_DEBUG, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__) - #else - #define elog_debug(tag, ...) - #endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_DEBUG */ - - #if ELOG_OUTPUT_LVL == ELOG_LVL_VERBOSE - #define elog_verbose(tag, ...) \ - elog_output(ELOG_LVL_VERBOSE, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__) - #else - #define elog_verbose(tag, ...) - #endif /* ELOG_OUTPUT_LVL == ELOG_LVL_VERBOSE */ -#endif /* ELOG_OUTPUT_ENABLE */ - -/* all formats index */ -typedef enum { - ELOG_FMT_LVL = 1 << 0, /**< level */ - ELOG_FMT_TAG = 1 << 1, /**< tag */ - ELOG_FMT_TIME = 1 << 2, /**< current time */ - ELOG_FMT_P_INFO = 1 << 3, /**< process info */ - ELOG_FMT_T_INFO = 1 << 4, /**< thread info */ - ELOG_FMT_DIR = 1 << 5, /**< file directory and name */ - ELOG_FMT_FUNC = 1 << 6, /**< function name */ - ELOG_FMT_LINE = 1 << 7, /**< line number */ -} ElogFmtIndex; - -/* macro definition for all formats */ -#define ELOG_FMT_ALL (ELOG_FMT_LVL|ELOG_FMT_TAG|ELOG_FMT_TIME|ELOG_FMT_P_INFO|ELOG_FMT_T_INFO| \ - ELOG_FMT_DIR|ELOG_FMT_FUNC|ELOG_FMT_LINE) - -/* output log's tag filter */ -typedef struct { - uint8_t level; - char tag[ELOG_FILTER_TAG_MAX_LEN + 1]; - bool tag_use_flag; /**< false : tag is no used true: tag is used */ -} ElogTagLvlFilter, *ElogTagLvlFilter_t; - -/* output log's filter */ -typedef struct { - uint8_t level; - char tag[ELOG_FILTER_TAG_MAX_LEN + 1]; - char keyword[ELOG_FILTER_KW_MAX_LEN + 1]; - ElogTagLvlFilter tag_lvl[ELOG_FILTER_TAG_LVL_MAX_NUM]; -} ElogFilter, *ElogFilter_t; - -/* easy logger */ -typedef struct { - ElogFilter filter; - size_t enabled_fmt_set[ELOG_LVL_TOTAL_NUM]; - bool init_ok; - bool output_enabled; - bool output_lock_enabled; - bool output_is_locked_before_enable; - bool output_is_locked_before_disable; - -#ifdef ELOG_COLOR_ENABLE - bool text_color_enabled; -#endif - -}EasyLogger, *EasyLogger_t; - -/* EasyLogger error code */ -typedef enum { - ELOG_NO_ERR, -} ElogErrCode; - -/* elog.c */ -ElogErrCode elog_init(void); -void elog_deinit(void); -void elog_start(void); -void elog_stop(void); -void elog_set_output_enabled(bool enabled); -bool elog_get_output_enabled(void); -void elog_set_text_color_enabled(bool enabled); -bool elog_get_text_color_enabled(void); -void elog_set_fmt(uint8_t level, size_t set); -void elog_set_filter(uint8_t level, const char *tag, const char *keyword); -void elog_set_filter_lvl(uint8_t level); -void elog_set_filter_tag(const char *tag); -void elog_set_filter_kw(const char *keyword); -void elog_set_filter_tag_lvl(const char *tag, uint8_t level); -uint8_t elog_get_filter_tag_lvl(const char *tag); -void elog_raw(const char *format, ...); -void elog_output(uint8_t level, const char *tag, const char *file, const char *func, - const long line, const char *format, ...); -void elog_output_lock_enabled(bool enabled); -extern void (*elog_assert_hook)(const char* expr, const char* func, size_t line); -void elog_assert_set_hook(void (*hook)(const char* expr, const char* func, size_t line)); -int8_t elog_find_lvl(const char *log); -const char *elog_find_tag(const char *log, uint8_t lvl, size_t *tag_len); -void elog_hexdump(const char *name, uint8_t width, uint8_t *buf, uint16_t size); - -#define elog_a(tag, ...) elog_assert(tag, __VA_ARGS__) -#define elog_e(tag, ...) elog_error(tag, __VA_ARGS__) -#define elog_w(tag, ...) elog_warn(tag, __VA_ARGS__) -#define elog_i(tag, ...) elog_info(tag, __VA_ARGS__) -#define elog_d(tag, ...) elog_debug(tag, __VA_ARGS__) -#define elog_v(tag, ...) elog_verbose(tag, __VA_ARGS__) - -/** - * log API short definition - * NOTE: The `LOG_TAG` and `LOG_LVL` must defined before including the when you want to use log_x API. - */ -#if !defined(LOG_TAG) - #define LOG_TAG "NO_TAG" -#endif -#if !defined(LOG_LVL) - #define LOG_LVL ELOG_LVL_VERBOSE -#endif -#if LOG_LVL >= ELOG_LVL_ASSERT - #define log_a(...) elog_a(LOG_TAG, __VA_ARGS__) -#else - #define log_a(...) ((void)0); -#endif -#if LOG_LVL >= ELOG_LVL_ERROR - #define log_e(...) elog_e(LOG_TAG, __VA_ARGS__) -#else - #define log_e(...) ((void)0); -#endif -#if LOG_LVL >= ELOG_LVL_WARN - #define log_w(...) elog_w(LOG_TAG, __VA_ARGS__) -#else - #define log_w(...) ((void)0); -#endif -#if LOG_LVL >= ELOG_LVL_INFO - #define log_i(...) elog_i(LOG_TAG, __VA_ARGS__) -#else - #define log_i(...) ((void)0); -#endif -#if LOG_LVL >= ELOG_LVL_DEBUG - #define log_d(...) elog_d(LOG_TAG, __VA_ARGS__) -#else - #define log_d(...) ((void)0); -#endif -#if LOG_LVL >= ELOG_LVL_VERBOSE - #define log_v(...) elog_v(LOG_TAG, __VA_ARGS__) -#else - #define log_v(...) ((void)0); -#endif - -/* assert API short definition */ -#if !defined(assert) - #define assert ELOG_ASSERT -#endif - -/* elog_buf.c */ -void elog_buf_enabled(bool enabled); -void elog_flush(void); - -/* elog_async.c */ -void elog_async_enabled(bool enabled); -size_t elog_async_get_log(char *log, size_t size); -size_t elog_async_get_line_log(char *log, size_t size); - -/* elog_utils.c */ -size_t elog_strcpy(size_t cur_len, char *dst, const char *src); -size_t elog_cpyln(char *line, const char *log, size_t len); -void *elog_memcpy(void *dst, const void *src, size_t count); - -#ifdef __cplusplus -} -#endif - -#endif /* __ELOG_H__ */ diff --git a/easylogger/inc/elog_cfg.h b/easylogger/inc/elog_cfg.h deleted file mode 100644 index 91faf67..0000000 --- a/easylogger/inc/elog_cfg.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2016, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: It is the configure head file for this library. - * Created on: 2015-07-30 - */ - -#ifndef _ELOG_CFG_H_ -#define _ELOG_CFG_H_ -/*---------------------------------------------------------------------------*/ -/* enable log output. */ -#define ELOG_OUTPUT_ENABLE -/* setting static output log level. range: from ELOG_LVL_ASSERT to ELOG_LVL_VERBOSE */ -#define ELOG_OUTPUT_LVL ELOG_LVL_VERBOSE -/* enable assert check */ -#define ELOG_ASSERT_ENABLE -/* buffer size for every line's log */ -#define ELOG_LINE_BUF_SIZE 1024 -/* output line number max length */ -#define ELOG_LINE_NUM_MAX_LEN 5 -/* output filter's tag max length */ -#define ELOG_FILTER_TAG_MAX_LEN 30 -/* output filter's keyword max length */ -#define ELOG_FILTER_KW_MAX_LEN 16 -/* output filter's tag level max num */ -#define ELOG_FILTER_TAG_LVL_MAX_NUM 5 -/* output newline sign */ -#define ELOG_NEWLINE_SIGN "\n" -/*---------------------------------------------------------------------------*/ -/* enable log color */ -#define ELOG_COLOR_ENABLE -/* change the some level logs to not default color if you want */ -#define ELOG_COLOR_ASSERT (F_MAGENTA B_NULL S_NORMAL) -#define ELOG_COLOR_ERROR (F_RED B_NULL S_NORMAL) -#define ELOG_COLOR_WARN (F_YELLOW B_NULL S_NORMAL) -#define ELOG_COLOR_INFO (F_CYAN B_NULL S_NORMAL) -#define ELOG_COLOR_DEBUG (F_GREEN B_NULL S_NORMAL) -#define ELOG_COLOR_VERBOSE (F_BLUE B_NULL S_NORMAL) -/*---------------------------------------------------------------------------*/ -/* enable asynchronous output mode */ -#define ELOG_ASYNC_OUTPUT_ENABLE -/* the highest output level for async mode, other level will sync output */ -#define ELOG_ASYNC_OUTPUT_LVL ELOG_LVL_ASSERT -/* buffer size for asynchronous output mode */ -#define ELOG_ASYNC_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10) -/* each asynchronous output's log which must end with newline sign */ -#define ELOG_ASYNC_LINE_OUTPUT -/* asynchronous output mode using POSIX pthread implementation */ -#define ELOG_ASYNC_OUTPUT_USING_PTHREAD -/*---------------------------------------------------------------------------*/ -/* enable buffered output mode */ -#define ELOG_BUF_OUTPUT_ENABLE -/* buffer size for buffered output mode */ -#define ELOG_BUF_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10) - -#endif /* _ELOG_CFG_H_ */ diff --git a/easylogger/plugins/file/elog_file.c b/easylogger/plugins/file/elog_file.c deleted file mode 100755 index efc3905..0000000 --- a/easylogger/plugins/file/elog_file.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2019, Qintl, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: Save log to file. - * Created on: 2019-01-05 - */ - - #define LOG_TAG "elog.file" - -#include -#include -#include -#include - -#include "elog_file.h" - -/* initialize OK flag */ -static bool init_ok = false; -static FILE *fp = NULL; -static ElogFileCfg local_cfg; - -ElogErrCode elog_file_init(void) -{ - ElogErrCode result = ELOG_NO_ERR; - ElogFileCfg cfg; - - if (init_ok) - goto __exit; - - elog_file_port_init(); - - cfg.name = ELOG_FILE_NAME; - cfg.max_size = ELOG_FILE_MAX_SIZE; - cfg.max_rotate = ELOG_FILE_MAX_ROTATE; - - elog_file_config(&cfg); - - init_ok = true; -__exit: - return result; -} - -/* - * rotate the log file xxx.log.n-1 => xxx.log.n, and xxx.log => xxx.log.0 - */ -static bool elog_file_rotate(void) -{ -#define SUFFIX_LEN 10 - /* mv xxx.log.n-1 => xxx.log.n, and xxx.log => xxx.log.0 */ - int n, err = 0; - char oldpath[256], newpath[256]; - size_t base = strlen(local_cfg.name); - bool result = true; - FILE *tmp_fp; - - memcpy(oldpath, local_cfg.name, base); - memcpy(newpath, local_cfg.name, base); - - fclose(fp); - - for (n = local_cfg.max_rotate - 1; n >= 0; --n) { - snprintf(oldpath + base, SUFFIX_LEN, n ? ".%d" : "", n - 1); - snprintf(newpath + base, SUFFIX_LEN, ".%d", n); - /* remove the old file */ - if ((tmp_fp = fopen(newpath , "r")) != NULL) { - fclose(tmp_fp); - remove(newpath); - } - /* change the new log file to old file name */ - if ((tmp_fp = fopen(oldpath , "r")) != NULL) { - fclose(tmp_fp); - err = rename(oldpath, newpath); - } - - if (err < 0) { - result = false; - goto __exit; - } - } - -__exit: - /* reopen the file */ - fp = fopen(local_cfg.name, "a+"); - - return result; -} - - -void elog_file_write(const char *log, size_t size) -{ - size_t file_size = 0; - - ELOG_ASSERT(init_ok); - ELOG_ASSERT(log); - - elog_file_port_lock(); - - fseek(fp, 0L, SEEK_END); - file_size = ftell(fp); - - if (unlikely(file_size > local_cfg.max_size)) { -#if ELOG_FILE_MAX_ROTATE > 0 - if (!elog_file_rotate()) { - goto __exit; - } -#else - goto __exit; -#endif - } - - fwrite(log, size, 1, fp); - -#ifdef ELOG_FILE_FLUSH_CACHE_ENABLE - fflush(fp); -#endif - -__exit: - elog_file_port_unlock(); -} - -void elog_file_deinit(void) -{ - ELOG_ASSERT(init_ok); - - ElogFileCfg cfg = {NULL, 0, 0}; - - elog_file_config(&cfg); - - elog_file_port_deinit(); - - init_ok = false; -} - -void elog_file_config(ElogFileCfg *cfg) -{ - elog_file_port_lock(); - - if (fp) { - fclose(fp); - fp = NULL; - } - - if (cfg != NULL) { - local_cfg.name = cfg->name; - local_cfg.max_size = cfg->max_size; - local_cfg.max_rotate = cfg->max_rotate; - - if (local_cfg.name != NULL && strlen(local_cfg.name) > 0) - fp = fopen(local_cfg.name, "a+"); - } - - elog_file_port_unlock(); -} diff --git a/easylogger/plugins/file/elog_file.h b/easylogger/plugins/file/elog_file.h deleted file mode 100644 index 8b03f28..0000000 --- a/easylogger/plugins/file/elog_file.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2019, Qintl, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: It is an head file for file log plugin. You can see all be called functions. - * Created on: 2019-01-05 - */ - -#ifndef __ELOG_FILE__H__ -#define __ELOG_FILE__H__ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* EasyLogger file log plugin's software version number */ -#define ELOG_FILE_SW_VERSION "V1.0.0" -#ifdef linux -#define likely(x) __builtin_expect(!!(x), 1) -#define unlikely(x) __builtin_expect(!!(x), 0) -#else -#define likely(x) (x) -#define unlikely(x) (x) -#endif - -typedef struct { - char *name; /* file name */ - size_t max_size; /* file max size */ - int max_rotate; /* max rotate file count */ -} ElogFileCfg; - -/* elog_file.c */ -ElogErrCode elog_file_init(void); -void elog_file_write(const char *log, size_t size); -void elog_file_config(ElogFileCfg *cfg); -void elog_file_deinit(void); - -/* elog_file_port.c */ -ElogErrCode elog_file_port_init(void); -void elog_file_port_lock(void); -void elog_file_port_unlock(void); -void elog_file_port_deinit(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/easylogger/plugins/file/elog_file_cfg.h b/easylogger/plugins/file/elog_file_cfg.h deleted file mode 100644 index 2454ef8..0000000 --- a/easylogger/plugins/file/elog_file_cfg.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2019, Qintl, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: It is the configure head file for this flash log plugin. - * Created on: 2019-01-05 - */ - -#ifndef _ELOG_FILE_CFG_H_ -#define _ELOG_FILE_CFG_H_ - -/* EasyLogger file log plugin's using file name */ -#define ELOG_FILE_NAME /* @note you must define it for a value */ - -/* EasyLogger file log plugin's using file max size */ -#define ELOG_FILE_MAX_SIZE /* @note you must define it for a value */ - -/* EasyLogger file log plugin's using max rotate file count */ -#define ELOG_FILE_MAX_ROTATE /* @note you must define it for a value */ - -#endif /* _ELOG_FILE_CFG_H_ */ diff --git a/easylogger/plugins/file/elog_file_port.c b/easylogger/plugins/file/elog_file_port.c deleted file mode 100644 index 8ae77d6..0000000 --- a/easylogger/plugins/file/elog_file_port.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2019, Qintl, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: Portable interface for EasyLogger's file log pulgin. - * Created on: 2019-01-05 - */ - -#include "elog_file.h" - -/** - * EasyLogger flile log pulgin port initialize - * - * @return result - */ -ElogErrCode elog_file_port_init(void) -{ - ElogErrCode result = ELOG_NO_ERR; - - /* add your code here */ - - return result; -} - -/** - * file log lock - */ -void elog_file_port_lock(void) { - - /* add your code here */ - -} - -/** - * file log unlock - */ -void elog_file_port_unlock(void) { - - /* add your code here */ - -} - -/** - * file log deinit - */ -void elog_file_port_deinit(void) { - - /* add your code here */ - -} diff --git a/easylogger/plugins/flash/elog_flash.c b/easylogger/plugins/flash/elog_flash.c deleted file mode 100644 index f153b0d..0000000 --- a/easylogger/plugins/flash/elog_flash.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2017, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: Save log to flash. Must use EasyFlash(https://github.com/armink/EasyFlash) library. - * Created on: 2015-06-05 - */ - -#define LOG_TAG "elog.flash" - -#include "elog_flash.h" -#include -#include -#include -#include - -#ifdef ELOG_FLASH_USING_BUF_MODE -/* flash log buffer */ -static char log_buf[ELOG_FLASH_BUF_SIZE] = { 0 }; -/* current flash log buffer write position */ -static size_t cur_buf_size = 0; -#endif - -/* initialize OK flag */ -static bool init_ok = false; -/* the flash log buffer lock enable or disable. default is enable */ -static bool log_buf_lock_enabled = true; -/* the flash log buffer is locked before enable. */ -static bool log_buf_is_locked_before_enable = false; -/* the flash log buffer is locked before disable. */ -static bool log_buf_is_locked_before_disable = false; -static void log_buf_lock(void); -static void log_buf_unlock(void); - -/** - * EasyLogger flash log plugin initialize. - * - * @return result - */ -ElogErrCode elog_flash_init(void) { - ElogErrCode result = ELOG_NO_ERR; - - /* buffer size must be word alignment */ - ELOG_ASSERT(ELOG_FLASH_BUF_SIZE % 4 == 0); - -#ifdef ELOG_FLASH_USING_BUF_MODE - /* initialize current flash log buffer write position */ - cur_buf_size = 0; -#endif - - /* port initialize */ - elog_flash_port_init(); - /* initialize OK */ - init_ok = true; - - return result; -} - -/** - * Read and output log which saved in flash. - * - * @param index index for saved log. @note It will auto word alignment. - * Minimum index is 0. - * Maximum index is log used flash total size - 1. - * @param size - */ -void elog_flash_output(size_t index, size_t size) { - /* 128 bytes buffer */ - uint32_t buf[32] = { 0 }; - size_t log_total_size = ef_log_get_used_size(); - size_t buf_size = sizeof(buf); - size_t read_size = 0, read_overage_size = 0; - - /* word alignment for index */ - index = index / 4 * 4; - if (index + size > log_total_size) { - log_i("The output position and size is out of bound. The max size is %d.", log_total_size); - return; - } - /* must be call this function after initialize OK */ - ELOG_ASSERT(init_ok); - /* lock flash log buffer */ - log_buf_lock(); - /* output all flash saved log. It will use filter */ - while (true) { - if (read_size + buf_size < size) { - ef_log_read(index + read_size, buf, buf_size); - elog_flash_port_output((const char*)buf, buf_size); - read_size += buf_size; - } else { - /* flash read is word alignment */ - if ((size - read_size) % 4 == 0) { - read_overage_size = 0; - } else { - read_overage_size = 4 - ((size - read_size) % 4); - } - ef_log_read(index + read_size, buf, size - read_size + read_overage_size); - elog_flash_port_output((const char*) buf + read_overage_size, size - read_size); - /* output newline sign */ - elog_flash_port_output(ELOG_NEWLINE_SIGN, strlen(ELOG_NEWLINE_SIGN)); - break; - } - } - /* unlock flash log buffer */ - log_buf_unlock(); -} - -/** - * Read and output all log which saved in flash. - */ -void elog_flash_output_all(void) { - elog_flash_output(0, ef_log_get_used_size()); -} - -/** - * Read and output recent log which saved in flash. - * - * @param size recent log size - */ -void elog_flash_output_recent(size_t size) { - size_t max_size = ef_log_get_used_size(); - - if (size == 0) { - return; - } - - if (size > max_size) { - log_i("The output size is out of bound. The max size is %d.", max_size); - } else { - elog_flash_output(max_size - size, size); - } -} - -/** - * Write log to flash. The flash write use buffer mode. - * - * @param log log - * @param size log size - */ -void elog_flash_write(const char *log, size_t size) { - -#ifdef ELOG_FLASH_USING_BUF_MODE - size_t write_size = 0, write_index = 0; -#else - size_t write_size_temp = 0; - EfErrCode result = EF_NO_ERR; - /* write some '\r' for word alignment */ - char write_overage_c[4] = { '\r', '\r', '\r', '\r' }; -#endif - - /* must be call this function after initialize OK */ - ELOG_ASSERT(init_ok); - - /* lock flash log buffer */ - log_buf_lock(); - -#ifdef ELOG_FLASH_USING_BUF_MODE - while (true) { - if (cur_buf_size + size > ELOG_FLASH_BUF_SIZE) { - write_size = ELOG_FLASH_BUF_SIZE - cur_buf_size; - elog_memcpy(log_buf + cur_buf_size, log + write_index, write_size); - write_index += write_size; - size -= write_size; - cur_buf_size += write_size; - /* unlock flash log buffer */ - log_buf_unlock(); - /* write all buffered log to flash, cur_buf_size will reset */ - elog_flash_flush(); - /* lock flash log buffer */ - log_buf_lock(); - } else { - elog_memcpy(log_buf + cur_buf_size, log + write_index, size); - cur_buf_size += size; - break; - } - } -#else - /* calculate the word alignment write size */ - write_size_temp = size / 4 * 4; - /* write log to flash */ - result = ef_log_write((uint32_t *) log, write_size_temp); - /* write last word alignment data */ - if ((result == EF_NO_ERR) && (write_size_temp != size)) { - elog_memcpy(write_overage_c, log + write_size_temp, size - write_size_temp); - ef_log_write((uint32_t *) write_overage_c, 4); - } -#endif - - /* unlock flash log buffer */ - log_buf_unlock(); -} - -#ifdef ELOG_FLASH_USING_BUF_MODE -/** - * write all buffered log to flash - */ -void elog_flash_flush(void) { - size_t write_overage_size = 0; - - /* must be call this function after initialize OK */ - ELOG_ASSERT(init_ok); - /* lock flash log buffer */ - log_buf_lock(); - /* flash write is word alignment */ - if (cur_buf_size % 4 != 0) { - write_overage_size = 4 - (cur_buf_size % 4); - } - /* fill '\r' for word alignment */ - memset(log_buf + cur_buf_size, '\r', write_overage_size); - /* write all buffered log to flash */ - ef_log_write((uint32_t *) log_buf, cur_buf_size + write_overage_size); - /* reset position */ - cur_buf_size = 0; - /* unlock flash log buffer */ - log_buf_unlock(); -} -#endif - -/** - * clean all log which in flash and ram buffer - */ -void elog_flash_clean(void) { - EfErrCode clean_result = EF_NO_ERR; - - /* must be call this function after initialize OK */ - ELOG_ASSERT(init_ok); - /* lock flash log buffer */ - log_buf_lock(); - /* clean all log which in flash */ - clean_result = ef_log_clean(); - -#ifdef ELOG_FLASH_USING_BUF_MODE - /* reset position */ - cur_buf_size = 0; -#endif - - /* unlock flash log buffer */ - log_buf_unlock(); - - if(clean_result == EF_NO_ERR) { - log_i("All logs which in flash is clean OK."); - } else { - log_e("Clean logs which in flash has an error!"); - } -} - -/** - * enable or disable flash plugin lock - * @note disable this lock is not recommended except you want output system exception log - * - * @param enabled true: enable false: disable - */ -void elog_flash_lock_enabled(bool enabled) { - log_buf_lock_enabled = enabled; - /* it will re-lock or re-unlock before log buffer lock enable */ - if (log_buf_lock_enabled) { - if (!log_buf_is_locked_before_disable && log_buf_is_locked_before_enable) { - /* the log buffer lock is unlocked before disable, and the lock will unlocking after enable */ - elog_flash_port_lock(); - } else if (log_buf_is_locked_before_disable && !log_buf_is_locked_before_enable) { - /* the log buffer lock is locked before disable, and the lock will locking after enable */ - elog_flash_port_unlock(); - } - } -} - -/** - * lock flash log buffer - */ -static void log_buf_lock(void) { - if (log_buf_lock_enabled) { - elog_flash_port_lock(); - log_buf_is_locked_before_disable = true; - } else { - log_buf_is_locked_before_enable = true; - } -} -/** - * unlock flash log buffer - */ -static void log_buf_unlock(void) { - if (log_buf_lock_enabled) { - elog_flash_port_unlock(); - log_buf_is_locked_before_disable = false; - } else { - log_buf_is_locked_before_enable = false; - } -} diff --git a/easylogger/plugins/flash/elog_flash.h b/easylogger/plugins/flash/elog_flash.h deleted file mode 100644 index f4a171a..0000000 --- a/easylogger/plugins/flash/elog_flash.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2017, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: It is an head file for flash log plugin. You can see all be called functions. - * Created on: 2015-06-05 - */ - -#ifndef __ELOG_FLASH_H__ -#define __ELOG_FLASH_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#if !defined(ELOG_FLASH_BUF_SIZE) - #error "Please configure RAM buffer size (in elog_flash_cfg.h)" -#endif - -/* EasyLogger flash log plugin's software version number */ -#define ELOG_FLASH_SW_VERSION "V2.0.1" - -/* elog_flash.c */ -ElogErrCode elog_flash_init(void); -void elog_flash_output(size_t pos, size_t size); -void elog_flash_output_all(void); -void elog_flash_output_recent(size_t size); -void elog_flash_set_filter(uint8_t level,const char *tag,const char *keyword); -void elog_flash_write(const char *log, size_t size); -void elog_flash_clean(void); -void elog_flash_lock_enabled(bool enabled); - -#ifdef ELOG_FLASH_USING_BUF_MODE -void elog_flash_flush(void); -#endif - -/* elog_flash_port.c */ -ElogErrCode elog_flash_port_init(void); -void elog_flash_port_output(const char *log, size_t size); -void elog_flash_port_lock(void); -void elog_flash_port_unlock(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __ELOG_FLASH_H__ */ diff --git a/easylogger/plugins/flash/elog_flash_cfg.h b/easylogger/plugins/flash/elog_flash_cfg.h deleted file mode 100644 index e0e8cf9..0000000 --- a/easylogger/plugins/flash/elog_flash_cfg.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: It is the configure head file for this flash log plugin. - * Created on: 2015-07-30 - */ - -#ifndef _ELOG_FLASH_CFG_H_ -#define _ELOG_FLASH_CFG_H_ - -/* EasyLogger flash log plugin's using buffer mode */ -#define ELOG_FLASH_USING_BUF_MODE -/* EasyLogger flash log plugin's RAM buffer size */ -#define ELOG_FLASH_BUF_SIZE /* @note you must define it for a value */ - -#endif /* _ELOG_FLASH_CFG_H_ */ diff --git a/easylogger/plugins/flash/elog_flash_port.c b/easylogger/plugins/flash/elog_flash_port.c deleted file mode 100644 index af9f75b..0000000 --- a/easylogger/plugins/flash/elog_flash_port.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: Portable interface for EasyLogger's flash log pulgin. - * Created on: 2015-07-28 - */ - -#include "elog_flash.h" - -/** - * EasyLogger flash log pulgin port initialize - * - * @return result - */ -ElogErrCode elog_flash_port_init(void) { - ElogErrCode result = ELOG_NO_ERR; - - /* add your code here */ - - return result; -} - -/** - * output flash saved log port interface - * - * @param log flash saved log - * @param size log size - */ -void elog_flash_port_output(const char *log, size_t size) { - - /* add your code here */ - -} - -/** - * flash log lock - */ -void elog_flash_port_lock(void) { - - /* add your code here */ - -} - -/** - * flash log unlock - */ -void elog_flash_port_unlock(void) { - - /* add your code here */ - -} \ No newline at end of file diff --git a/easylogger/port/elog_port.c b/easylogger/port/elog_port.c deleted file mode 100755 index 4b5409c..0000000 --- a/easylogger/port/elog_port.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: Portable interface for each platform. - * Created on: 2015-04-28 - */ - -#include - -/** - * EasyLogger port initialize - * - * @return result - */ -ElogErrCode elog_port_init(void) { - ElogErrCode result = ELOG_NO_ERR; - - /* add your code here */ - - return result; -} - -/** - * EasyLogger port deinitialize - * - */ -void elog_port_deinit(void) { - - /* add your code here */ - -} - -/** - * output log port interface - * - * @param log output of log - * @param size log size - */ -void elog_port_output(const char *log, size_t size) { - - /* add your code here */ - -} - -/** - * output lock - */ -void elog_port_output_lock(void) { - - /* add your code here */ - -} - -/** - * output unlock - */ -void elog_port_output_unlock(void) { - - /* add your code here */ - -} - -/** - * get current time interface - * - * @return current time - */ -const char *elog_port_get_time(void) { - - /* add your code here */ - -} - -/** - * get current process name interface - * - * @return current process name - */ -const char *elog_port_get_p_info(void) { - - /* add your code here */ - -} - -/** - * get current thread name interface - * - * @return current thread name - */ -const char *elog_port_get_t_info(void) { - - /* add your code here */ - -} \ No newline at end of file diff --git a/easylogger/src/elog.c b/easylogger/src/elog.c deleted file mode 100755 index d566143..0000000 --- a/easylogger/src/elog.c +++ /dev/null @@ -1,922 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2018, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: Initialize function and other general function. - * Created on: 2015-04-28 - */ - -#define LOG_TAG "elog" - -#include -#include -#include -#include - -#if !defined(ELOG_OUTPUT_LVL) - #error "Please configure static output log level (in elog_cfg.h)" -#endif - -#if !defined(ELOG_LINE_NUM_MAX_LEN) - #error "Please configure output line number max length (in elog_cfg.h)" -#endif - -#if !defined(ELOG_LINE_BUF_SIZE) - #error "Please configure buffer size for every line's log (in elog_cfg.h)" -#endif - -#if !defined(ELOG_FILTER_TAG_MAX_LEN) - #error "Please configure output filter's tag max length (in elog_cfg.h)" -#endif - -#if !defined(ELOG_FILTER_KW_MAX_LEN) - #error "Please configure output filter's keyword max length (in elog_cfg.h)" -#endif - -#if !defined(ELOG_NEWLINE_SIGN) - #error "Please configure output newline sign (in elog_cfg.h)" -#endif - -/* output filter's tag level max num */ -#ifndef ELOG_FILTER_TAG_LVL_MAX_NUM -#define ELOG_FILTER_TAG_LVL_MAX_NUM 4 -#endif - -#ifdef ELOG_COLOR_ENABLE -/** - * 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" -/* output log front color */ -#define F_BLACK "30;" -#define F_RED "31;" -#define F_GREEN "32;" -#define F_YELLOW "33;" -#define F_BLUE "34;" -#define F_MAGENTA "35;" -#define F_CYAN "36;" -#define F_WHITE "37;" -/* output log background color */ -#define B_NULL -#define B_BLACK "40;" -#define B_RED "41;" -#define B_GREEN "42;" -#define B_YELLOW "43;" -#define B_BLUE "44;" -#define B_MAGENTA "45;" -#define B_CYAN "46;" -#define B_WHITE "47;" -/* output log fonts style */ -#define S_BOLD "1m" -#define S_UNDERLINE "4m" -#define S_BLINK "5m" -#define S_NORMAL "22m" -/* output log default color definition: [front color] + [background color] + [show style] */ -#ifndef ELOG_COLOR_ASSERT -#define ELOG_COLOR_ASSERT (F_MAGENTA B_NULL S_NORMAL) -#endif -#ifndef ELOG_COLOR_ERROR -#define ELOG_COLOR_ERROR (F_RED B_NULL S_NORMAL) -#endif -#ifndef ELOG_COLOR_WARN -#define ELOG_COLOR_WARN (F_YELLOW B_NULL S_NORMAL) -#endif -#ifndef ELOG_COLOR_INFO -#define ELOG_COLOR_INFO (F_CYAN B_NULL S_NORMAL) -#endif -#ifndef ELOG_COLOR_DEBUG -#define ELOG_COLOR_DEBUG (F_GREEN B_NULL S_NORMAL) -#endif -#ifndef ELOG_COLOR_VERBOSE -#define ELOG_COLOR_VERBOSE (F_BLUE B_NULL S_NORMAL) -#endif -#endif /* ELOG_COLOR_ENABLE */ - -/* EasyLogger object */ -static EasyLogger elog; -/* every line log's buffer */ -static char log_buf[ELOG_LINE_BUF_SIZE] = { 0 }; -/* level output info */ -static const char *level_output_info[] = { - [ELOG_LVL_ASSERT] = "A/", - [ELOG_LVL_ERROR] = "E/", - [ELOG_LVL_WARN] = "W/", - [ELOG_LVL_INFO] = "I/", - [ELOG_LVL_DEBUG] = "D/", - [ELOG_LVL_VERBOSE] = "V/", -}; - -#ifdef ELOG_COLOR_ENABLE -/* color output info */ -static const char *color_output_info[] = { - [ELOG_LVL_ASSERT] = ELOG_COLOR_ASSERT, - [ELOG_LVL_ERROR] = ELOG_COLOR_ERROR, - [ELOG_LVL_WARN] = ELOG_COLOR_WARN, - [ELOG_LVL_INFO] = ELOG_COLOR_INFO, - [ELOG_LVL_DEBUG] = ELOG_COLOR_DEBUG, - [ELOG_LVL_VERBOSE] = ELOG_COLOR_VERBOSE, -}; -#endif /* ELOG_COLOR_ENABLE */ - -static bool get_fmt_enabled(uint8_t level, size_t set); -static void elog_set_filter_tag_lvl_default(); - -/* EasyLogger assert hook */ -void (*elog_assert_hook)(const char* expr, const char* func, size_t line); - -extern void elog_port_output(const char *log, size_t size); -extern void elog_port_output_lock(void); -extern void elog_port_output_unlock(void); - -/** - * EasyLogger initialize. - * - * @return result - */ -ElogErrCode elog_init(void) { - extern ElogErrCode elog_port_init(void); - extern ElogErrCode elog_async_init(void); - - ElogErrCode result = ELOG_NO_ERR; - - if (elog.init_ok == true) { - return result; - } - - /* port initialize */ - result = elog_port_init(); - if (result != ELOG_NO_ERR) { - return result; - } - -#ifdef ELOG_ASYNC_OUTPUT_ENABLE - result = elog_async_init(); - if (result != ELOG_NO_ERR) { - return result; - } -#endif - - /* enable the output lock */ - elog_output_lock_enabled(true); - /* output locked status initialize */ - elog.output_is_locked_before_enable = false; - elog.output_is_locked_before_disable = false; - -#ifdef ELOG_COLOR_ENABLE - /* disable text color by default */ - elog_set_text_color_enabled(false); -#endif - - /* set level is ELOG_LVL_VERBOSE */ - elog_set_filter_lvl(ELOG_LVL_VERBOSE); - - /* set tag_level to default val */ - elog_set_filter_tag_lvl_default(); - - elog.init_ok = true; - - return result; -} - -/** - * EasyLogger deinitialize. - * - */ -void elog_deinit(void) { - extern ElogErrCode elog_port_deinit(void); - extern ElogErrCode elog_async_deinit(void); - - if (!elog.init_ok) { - return ; - } - -#ifdef ELOG_ASYNC_OUTPUT_ENABLE - elog_async_deinit(); -#endif - - /* port deinitialize */ - elog_port_deinit(); - - elog.init_ok = false; -} - - -/** - * EasyLogger start after initialize. - */ -void elog_start(void) { - if (!elog.init_ok) { - return ; - } - - /* enable output */ - elog_set_output_enabled(true); - -#if defined(ELOG_ASYNC_OUTPUT_ENABLE) - elog_async_enabled(true); -#elif defined(ELOG_BUF_OUTPUT_ENABLE) - elog_buf_enabled(true); -#endif - - /* show version */ - log_i("EasyLogger V%s is initialize success.", ELOG_SW_VERSION); -} - -/** - * EasyLogger stop after initialize. - */ -void elog_stop(void) { - if (!elog.init_ok) { - return ; - } - - /* disable output */ - elog_set_output_enabled(false); - -#if defined(ELOG_ASYNC_OUTPUT_ENABLE) - elog_async_enabled(false); -#elif defined(ELOG_BUF_OUTPUT_ENABLE) - elog_buf_enabled(false); -#endif - - /* show version */ - log_i("EasyLogger V%s is deinitialize success.", ELOG_SW_VERSION); -} - - -/** - * set output enable or disable - * - * @param enabled TRUE: enable FALSE: disable - */ -void elog_set_output_enabled(bool enabled) { - ELOG_ASSERT((enabled == false) || (enabled == true)); - - elog.output_enabled = enabled; -} - -#ifdef ELOG_COLOR_ENABLE -/** - * set log text color enable or disable - * - * @param enabled TRUE: enable FALSE:disable - */ -void elog_set_text_color_enabled(bool enabled) { - elog.text_color_enabled = enabled; -} - -/** - * get log text color enable status - * - * @return enable or disable - */ -bool elog_get_text_color_enabled(void) { - return elog.text_color_enabled; -} -#endif /* ELOG_COLOR_ENABLE */ - -/** - * get output is enable or disable - * - * @return enable or disable - */ -bool elog_get_output_enabled(void) { - return elog.output_enabled; -} - -/** - * set log output format. only enable or disable - * - * @param level level - * @param set format set - */ -void elog_set_fmt(uint8_t level, size_t set) { - ELOG_ASSERT(level <= ELOG_LVL_VERBOSE); - - elog.enabled_fmt_set[level] = set; -} - -/** - * set log filter all parameter - * - * @param level level - * @param tag tag - * @param keyword keyword - */ -void elog_set_filter(uint8_t level, const char *tag, const char *keyword) { - ELOG_ASSERT(level <= ELOG_LVL_VERBOSE); - - elog_set_filter_lvl(level); - elog_set_filter_tag(tag); - elog_set_filter_kw(keyword); -} - -/** - * set log filter's level - * - * @param level level - */ -void elog_set_filter_lvl(uint8_t level) { - ELOG_ASSERT(level <= ELOG_LVL_VERBOSE); - - elog.filter.level = level; -} - -/** - * set log filter's tag - * - * @param tag tag - */ -void elog_set_filter_tag(const char *tag) { - strncpy(elog.filter.tag, tag, ELOG_FILTER_TAG_MAX_LEN); -} - -/** - * set log filter's keyword - * - * @param keyword keyword - */ -void elog_set_filter_kw(const char *keyword) { - strncpy(elog.filter.keyword, keyword, ELOG_FILTER_KW_MAX_LEN); -} - -/** - * lock output - */ -void elog_output_lock(void) { - if (elog.output_lock_enabled) { - elog_port_output_lock(); - elog.output_is_locked_before_disable = true; - } else { - elog.output_is_locked_before_enable = true; - } -} - -/** - * unlock output - */ -void elog_output_unlock(void) { - if (elog.output_lock_enabled) { - elog_port_output_unlock(); - elog.output_is_locked_before_disable = false; - } else { - elog.output_is_locked_before_enable = false; - } -} - -/** - * set log filter's tag level val to default - */ -static void elog_set_filter_tag_lvl_default() -{ - uint8_t i = 0; - - for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){ - memset(elog.filter.tag_lvl[i].tag, '\0', ELOG_FILTER_TAG_MAX_LEN + 1); - elog.filter.tag_lvl[i].level = ELOG_FILTER_LVL_SILENT; - elog.filter.tag_lvl[i].tag_use_flag = false; - } -} - -/** - * Set the filter's level by different tag. - * The log on this tag which level is less than it will stop output. - * - * example: - * // the example tag log enter silent mode - * elog_set_filter_tag_lvl("example", ELOG_FILTER_LVL_SILENT); - * // the example tag log which level is less than INFO level will stop output - * elog_set_filter_tag_lvl("example", ELOG_LVL_INFO); - * // remove example tag's level filter, all level log will resume output - * elog_set_filter_tag_lvl("example", ELOG_FILTER_LVL_ALL); - * - * @param tag log tag - * @param level The filter level. When the level is ELOG_FILTER_LVL_SILENT, the log enter silent mode. - * When the level is ELOG_FILTER_LVL_ALL, it will remove this tag's level filer. - * Then all level log will resume output. - * - */ -void elog_set_filter_tag_lvl(const char *tag, uint8_t level) -{ - ELOG_ASSERT(level <= ELOG_LVL_VERBOSE); - ELOG_ASSERT(tag != ((void *)0)); - uint8_t i = 0; - - if (!elog.init_ok) { - return; - } - - elog_port_output_lock(); - /* find the tag in arr */ - for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){ - if (elog.filter.tag_lvl[i].tag_use_flag == true && - !strncmp(tag, elog.filter.tag_lvl[i].tag,ELOG_FILTER_TAG_MAX_LEN)){ - break; - } - } - - if (i < ELOG_FILTER_TAG_LVL_MAX_NUM){ - /* find OK */ - if (level == ELOG_FILTER_LVL_ALL){ - /* remove current tag's level filter when input level is the lowest level */ - elog.filter.tag_lvl[i].tag_use_flag = false; - memset(elog.filter.tag_lvl[i].tag, '\0', ELOG_FILTER_TAG_MAX_LEN + 1); - elog.filter.tag_lvl[i].level = ELOG_FILTER_LVL_SILENT; - } else{ - elog.filter.tag_lvl[i].level = level; - } - } else{ - /* only add the new tag's level filer when level is not ELOG_FILTER_LVL_ALL */ - if (level != ELOG_FILTER_LVL_ALL){ - for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){ - if (elog.filter.tag_lvl[i].tag_use_flag == false){ - strncpy(elog.filter.tag_lvl[i].tag, tag, ELOG_FILTER_TAG_MAX_LEN); - elog.filter.tag_lvl[i].level = level; - elog.filter.tag_lvl[i].tag_use_flag = true; - break; - } - } - } - } - elog_output_unlock(); -} - -/** - * get the level on tag's level filer - * - * @param tag tag - * - * @return It will return the lowest level when tag was not found. - * Other level will return when tag was found. - */ -uint8_t elog_get_filter_tag_lvl(const char *tag) -{ - ELOG_ASSERT(tag != ((void *)0)); - uint8_t i = 0; - uint8_t level = ELOG_FILTER_LVL_ALL; - - if (!elog.init_ok) { - return level; - } - - elog_port_output_lock(); - /* find the tag in arr */ - for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){ - if (elog.filter.tag_lvl[i].tag_use_flag == true && - !strncmp(tag, elog.filter.tag_lvl[i].tag,ELOG_FILTER_TAG_MAX_LEN)){ - level = elog.filter.tag_lvl[i].level; - break; - } - } - elog_output_unlock(); - - return level; -} - -/** - * output RAW format log - * - * @param format output format - * @param ... args - */ -void elog_raw(const char *format, ...) { - va_list args; - size_t log_len = 0; - int fmt_result; - - /* check output enabled */ - if (!elog.output_enabled) { - return; - } - - /* args point to the first variable parameter */ - va_start(args, format); - - /* lock output */ - elog_output_lock(); - - /* package log data to buffer */ - fmt_result = vsnprintf(log_buf, ELOG_LINE_BUF_SIZE, format, args); - - /* output converted log */ - if ((fmt_result > -1) && (fmt_result <= ELOG_LINE_BUF_SIZE)) { - log_len = fmt_result; - } else { - log_len = ELOG_LINE_BUF_SIZE; - } - /* output log */ -#if defined(ELOG_ASYNC_OUTPUT_ENABLE) - extern void elog_async_output(uint8_t level, const char *log, size_t size); - /* raw log will using assert level */ - elog_async_output(ELOG_LVL_ASSERT, log_buf, log_len); -#elif defined(ELOG_BUF_OUTPUT_ENABLE) - extern void elog_buf_output(const char *log, size_t size); - elog_buf_output(log_buf, log_len); -#else - elog_port_output(log_buf, log_len); -#endif - /* unlock output */ - elog_output_unlock(); - - va_end(args); -} - -/** - * output the log - * - * @param level level - * @param tag tag - * @param file file name - * @param func function name - * @param line line number - * @param format output format - * @param ... args - * - */ -void elog_output(uint8_t level, const char *tag, const char *file, const char *func, - const long line, const char *format, ...) { - extern const char *elog_port_get_time(void); - extern const char *elog_port_get_p_info(void); - extern const char *elog_port_get_t_info(void); - - size_t tag_len = strlen(tag), log_len = 0, newline_len = strlen(ELOG_NEWLINE_SIGN); - char line_num[ELOG_LINE_NUM_MAX_LEN + 1] = { 0 }; - char tag_sapce[ELOG_FILTER_TAG_MAX_LEN / 2 + 1] = { 0 }; - va_list args; - int fmt_result; - - ELOG_ASSERT(level <= ELOG_LVL_VERBOSE); - - /* check output enabled */ - if (!elog.output_enabled) { - return; - } - /* level filter */ - if (level > elog.filter.level || level > elog_get_filter_tag_lvl(tag)) { - return; - } else if (!strstr(tag, elog.filter.tag)) { /* tag filter */ - return; - } - /* args point to the first variable parameter */ - va_start(args, format); - /* lock output */ - elog_output_lock(); - -#ifdef ELOG_COLOR_ENABLE - /* add CSI start sign and color info */ - if (elog.text_color_enabled) { - log_len += elog_strcpy(log_len, log_buf + log_len, CSI_START); - log_len += elog_strcpy(log_len, log_buf + log_len, color_output_info[level]); - } -#endif - - /* package level info */ - if (get_fmt_enabled(level, ELOG_FMT_LVL)) { - log_len += elog_strcpy(log_len, log_buf + log_len, level_output_info[level]); - } - /* package tag info */ - if (get_fmt_enabled(level, ELOG_FMT_TAG)) { - log_len += elog_strcpy(log_len, log_buf + log_len, tag); - /* if the tag length is less than 50% ELOG_FILTER_TAG_MAX_LEN, then fill space */ - if (tag_len <= ELOG_FILTER_TAG_MAX_LEN / 2) { - memset(tag_sapce, ' ', ELOG_FILTER_TAG_MAX_LEN / 2 - tag_len); - log_len += elog_strcpy(log_len, log_buf + log_len, tag_sapce); - } - log_len += elog_strcpy(log_len, log_buf + log_len, " "); - } - /* package time, process and thread info */ - if (get_fmt_enabled(level, ELOG_FMT_TIME | ELOG_FMT_P_INFO | ELOG_FMT_T_INFO)) { - log_len += elog_strcpy(log_len, log_buf + log_len, "["); - /* package time info */ - if (get_fmt_enabled(level, ELOG_FMT_TIME)) { - log_len += elog_strcpy(log_len, log_buf + log_len, elog_port_get_time()); - if (get_fmt_enabled(level, ELOG_FMT_P_INFO | ELOG_FMT_T_INFO)) { - log_len += elog_strcpy(log_len, log_buf + log_len, " "); - } - } - /* package process info */ - if (get_fmt_enabled(level, ELOG_FMT_P_INFO)) { - log_len += elog_strcpy(log_len, log_buf + log_len, elog_port_get_p_info()); - if (get_fmt_enabled(level, ELOG_FMT_T_INFO)) { - log_len += elog_strcpy(log_len, log_buf + log_len, " "); - } - } - /* package thread info */ - if (get_fmt_enabled(level, ELOG_FMT_T_INFO)) { - log_len += elog_strcpy(log_len, log_buf + log_len, elog_port_get_t_info()); - } - log_len += elog_strcpy(log_len, log_buf + log_len, "] "); - } - /* package file directory and name, function name and line number info */ - if (get_fmt_enabled(level, ELOG_FMT_DIR | ELOG_FMT_FUNC | ELOG_FMT_LINE)) { - log_len += elog_strcpy(log_len, log_buf + log_len, "("); - /* package file info */ - if (get_fmt_enabled(level, ELOG_FMT_DIR)) { - log_len += elog_strcpy(log_len, log_buf + log_len, file); - if (get_fmt_enabled(level, ELOG_FMT_FUNC)) { - log_len += elog_strcpy(log_len, log_buf + log_len, ":"); - } else if (get_fmt_enabled(level, ELOG_FMT_LINE)) { - log_len += elog_strcpy(log_len, log_buf + log_len, " "); - } - } - /* package line info */ - if (get_fmt_enabled(level, ELOG_FMT_LINE)) { - snprintf(line_num, ELOG_LINE_NUM_MAX_LEN, "%ld", line); - log_len += elog_strcpy(log_len, log_buf + log_len, line_num); - if (get_fmt_enabled(level, ELOG_FMT_FUNC)) { - log_len += elog_strcpy(log_len, log_buf + log_len, " "); - } - } - /* package func info */ - if (get_fmt_enabled(level, ELOG_FMT_FUNC)) { - log_len += elog_strcpy(log_len, log_buf + log_len, func); - - } - log_len += elog_strcpy(log_len, log_buf + log_len, ")"); - } - /* package other log data to buffer. '\0' must be added in the end by vsnprintf. */ - fmt_result = vsnprintf(log_buf + log_len, ELOG_LINE_BUF_SIZE - log_len, format, args); - - va_end(args); - /* calculate log length */ - if ((log_len + fmt_result <= ELOG_LINE_BUF_SIZE) && (fmt_result > -1)) { - log_len += fmt_result; - } else { - /* using max length */ - log_len = ELOG_LINE_BUF_SIZE; - } - /* overflow check and reserve some space for CSI end sign and newline sign */ -#ifdef ELOG_COLOR_ENABLE - if (log_len + (sizeof(CSI_END) - 1) + newline_len > ELOG_LINE_BUF_SIZE) { - /* using max length */ - log_len = ELOG_LINE_BUF_SIZE; - /* reserve some space for CSI end sign */ - log_len -= (sizeof(CSI_END) - 1); -#else - if (log_len + newline_len > ELOG_LINE_BUF_SIZE) { - /* using max length */ - log_len = ELOG_LINE_BUF_SIZE; -#endif /* ELOG_COLOR_ENABLE */ - /* reserve some space for newline sign */ - log_len -= newline_len; - } - /* keyword filter */ - if (elog.filter.keyword[0] != '\0') { - /* add string end sign */ - log_buf[log_len] = '\0'; - /* find the keyword */ - if (!strstr(log_buf, elog.filter.keyword)) { - /* unlock output */ - elog_output_unlock(); - return; - } - } - -#ifdef ELOG_COLOR_ENABLE - /* add CSI end sign */ - if (elog.text_color_enabled) { - log_len += elog_strcpy(log_len, log_buf + log_len, CSI_END); - } -#endif - - /* package newline sign */ - log_len += elog_strcpy(log_len, log_buf + log_len, ELOG_NEWLINE_SIGN); - /* output log */ -#if defined(ELOG_ASYNC_OUTPUT_ENABLE) - extern void elog_async_output(uint8_t level, const char *log, size_t size); - elog_async_output(level, log_buf, log_len); -#elif defined(ELOG_BUF_OUTPUT_ENABLE) - extern void elog_buf_output(const char *log, size_t size); - elog_buf_output(log_buf, log_len); -#else - elog_port_output(log_buf, log_len); -#endif - /* unlock output */ - elog_output_unlock(); -} - -/** - * get format enabled - * - * @param level level - * @param set format set - * - * @return enable or disable - */ -static bool get_fmt_enabled(uint8_t level, size_t set) { - ELOG_ASSERT(level <= ELOG_LVL_VERBOSE); - - if (elog.enabled_fmt_set[level] & set) { - return true; - } else { - return false; - } -} - -/** - * enable or disable logger output lock - * @note disable this lock is not recommended except you want output system exception log - * - * @param enabled true: enable false: disable - */ -void elog_output_lock_enabled(bool enabled) { - elog.output_lock_enabled = enabled; - /* it will re-lock or re-unlock before output lock enable */ - if (elog.output_lock_enabled) { - if (!elog.output_is_locked_before_disable && elog.output_is_locked_before_enable) { - /* the output lock is unlocked before disable, and the lock will unlocking after enable */ - elog_port_output_lock(); - } else if (elog.output_is_locked_before_disable && !elog.output_is_locked_before_enable) { - /* the output lock is locked before disable, and the lock will locking after enable */ - elog_port_output_unlock(); - } - } -} - -/** - * Set a hook function to EasyLogger assert. It will run when the expression is false. - * - * @param hook the hook function - */ -void elog_assert_set_hook(void (*hook)(const char* expr, const char* func, size_t line)) { - elog_assert_hook = hook; -} - -/** - * find the log level - * @note make sure the log level is output on each format - * - * @param log log buffer - * - * @return log level, found failed will return -1 - */ -int8_t elog_find_lvl(const char *log) { - ELOG_ASSERT(log); - /* make sure the log level is output on each format */ - ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_ASSERT] & ELOG_FMT_LVL); - ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_ERROR] & ELOG_FMT_LVL); - ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_WARN] & ELOG_FMT_LVL); - ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_INFO] & ELOG_FMT_LVL); - ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_DEBUG] & ELOG_FMT_LVL); - ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_VERBOSE] & ELOG_FMT_LVL); - -#ifdef ELOG_COLOR_ENABLE - uint8_t i; - size_t csi_start_len = strlen(CSI_START); - for(i = 0; i < ELOG_LVL_TOTAL_NUM; i ++) { - if (!strncmp(color_output_info[i], log + csi_start_len, strlen(color_output_info[i]))) { - return i; - } - } - /* found failed */ - return -1; -#else - switch (log[0]) { - case 'A': return ELOG_LVL_ASSERT; - case 'E': return ELOG_LVL_ERROR; - case 'W': return ELOG_LVL_WARN; - case 'I': return ELOG_LVL_INFO; - case 'D': return ELOG_LVL_DEBUG; - case 'V': return ELOG_LVL_VERBOSE; - default: return -1; - } -#endif -} - -/** - * find the log tag - * @note make sure the log tag is output on each format - * @note the tag don't have space in it - * - * @param log log buffer - * @param lvl log level, you can get it by @see elog_find_lvl - * @param tag_len found tag length - * - * @return log tag, found failed will return NULL - */ -const char *elog_find_tag(const char *log, uint8_t lvl, size_t *tag_len) { - const char *tag = NULL, *tag_end = NULL; - - ELOG_ASSERT(log); - ELOG_ASSERT(tag_len); - ELOG_ASSERT(lvl < ELOG_LVL_TOTAL_NUM); - /* make sure the log tag is output on each format */ - ELOG_ASSERT(elog.enabled_fmt_set[lvl] & ELOG_FMT_TAG); - -#ifdef ELOG_COLOR_ENABLE - tag = log + strlen(CSI_START) + strlen(color_output_info[lvl]) + strlen(level_output_info[lvl]); -#else - tag = log + strlen(level_output_info[lvl]); -#endif - /* find the first space after tag */ - if ((tag_end = memchr(tag, ' ', ELOG_FILTER_TAG_MAX_LEN)) != NULL) { - *tag_len = tag_end - tag; - } else { - tag = NULL; - } - - return tag; -} - -/** - * dump the hex format data to log - * - * @param name 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 elog_hexdump(const char *name, uint8_t width, uint8_t *buf, uint16_t size) -{ -#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') - - uint16_t i, j; - uint16_t log_len = 0; - char dump_string[8] = {0}; - int fmt_result; - - if (!elog.output_enabled) { - return; - } - - /* level filter */ - if (ELOG_LVL_DEBUG > elog.filter.level) { - return; - } else if (!strstr(name, elog.filter.tag)) { /* tag filter */ - return; - } - - /* lock output */ - elog_output_lock(); - - for (i = 0; i < size; i += width) { - /* package header */ - fmt_result = snprintf(log_buf, ELOG_LINE_BUF_SIZE, "D/HEX %s: %04X-%04X: ", name, i, i + width - 1); - /* calculate log length */ - if ((fmt_result > -1) && (fmt_result <= ELOG_LINE_BUF_SIZE)) { - log_len = fmt_result; - } else { - log_len = ELOG_LINE_BUF_SIZE; - } - /* dump hex */ - for (j = 0; j < width; j++) { - if (i + j < size) { - snprintf(dump_string, sizeof(dump_string), "%02X ", buf[i + j]); - } else { - strncpy(dump_string, " ", sizeof(dump_string)); - } - log_len += elog_strcpy(log_len, log_buf + log_len, dump_string); - if ((j + 1) % 8 == 0) { - log_len += elog_strcpy(log_len, log_buf + log_len, " "); - } - } - log_len += elog_strcpy(log_len, log_buf + log_len, " "); - /* dump char for hex */ - for (j = 0; j < width; j++) { - if (i + j < size) { - snprintf(dump_string, sizeof(dump_string), "%c", __is_print(buf[i + j]) ? buf[i + j] : '.'); - log_len += elog_strcpy(log_len, log_buf + log_len, dump_string); - } - } - /* overflow check and reserve some space for newline sign */ - if (log_len + strlen(ELOG_NEWLINE_SIGN) > ELOG_LINE_BUF_SIZE) { - log_len = ELOG_LINE_BUF_SIZE - strlen(ELOG_NEWLINE_SIGN); - } - /* package newline sign */ - log_len += elog_strcpy(log_len, log_buf + log_len, ELOG_NEWLINE_SIGN); - /* do log output */ -#if defined(ELOG_ASYNC_OUTPUT_ENABLE) - extern void elog_async_output(uint8_t level, const char *log, size_t size); - elog_async_output(ELOG_LVL_DEBUG, log_buf, log_len); -#elif defined(ELOG_BUF_OUTPUT_ENABLE) - extern void elog_buf_output(const char *log, size_t size); - elog_buf_output(log_buf, log_len); -#else - elog_port_output(log_buf, log_len); -#endif - } - /* unlock output */ - elog_output_unlock(); -} diff --git a/easylogger/src/elog_async.c b/easylogger/src/elog_async.c deleted file mode 100755 index a8b7e2f..0000000 --- a/easylogger/src/elog_async.c +++ /dev/null @@ -1,386 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2016-2017, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: Logs asynchronous output. - * Created on: 2016-11-06 - */ - -#include -#include - -#ifdef ELOG_ASYNC_OUTPUT_ENABLE - -#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD -#include -#include -#include -/* thread default stack size */ -#ifndef ELOG_ASYNC_OUTPUT_PTHREAD_STACK_SIZE -#if PTHREAD_STACK_MIN > 4*1024 -#define ELOG_ASYNC_OUTPUT_PTHREAD_STACK_SIZE PTHREAD_STACK_MIN -#else -#define ELOG_ASYNC_OUTPUT_PTHREAD_STACK_SIZE (1*1024) -#endif -/* thread default priority */ -#ifndef ELOG_ASYNC_OUTPUT_PTHREAD_PRIORITY -#define ELOG_ASYNC_OUTPUT_PTHREAD_PRIORITY (sched_get_priority_max(SCHED_RR) - 1) -#endif -/* output thread poll get log buffer size */ -#ifndef ELOG_ASYNC_LINE_OUTPUT -#ifndef ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE -#define ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE (ELOG_ASYNC_OUTPUT_BUF_SIZE - 4) -#endif -#else -#ifndef ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE -#define ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE (ELOG_LINE_BUF_SIZE - 4) -#endif -#endif -#endif /* ELOG_ASYNC_OUTPUT_USING_PTHREAD */ - -/* asynchronous output log notice */ -static sem_t output_notice; -/* asynchronous output pthread thread */ -static pthread_t async_output_thread; -#endif /* ELOG_ASYNC_OUTPUT_ENABLE */ - -/* the highest output level for async mode, other level will sync output */ -#ifdef ELOG_ASYNC_OUTPUT_LVL -#define OUTPUT_LVL ELOG_ASYNC_OUTPUT_LVL -#else -#define OUTPUT_LVL ELOG_LVL_ASSERT -#endif /* ELOG_ASYNC_OUTPUT_LVL */ - -/* buffer size for asynchronous output mode */ -#ifdef ELOG_ASYNC_OUTPUT_BUF_SIZE -#define OUTPUT_BUF_SIZE ELOG_ASYNC_OUTPUT_BUF_SIZE -#else -#define OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10) -#endif /* ELOG_ASYNC_OUTPUT_BUF_SIZE */ - -/* Initialize OK flag */ -static bool init_ok = false; -/* thread running flag */ -static bool thread_running = false; -/* asynchronous output mode enabled flag */ -static bool is_enabled = false; -/* asynchronous output mode's ring buffer */ -static char log_buf[OUTPUT_BUF_SIZE] = { 0 }; -/* log ring buffer write index */ -static size_t write_index = 0; -/* log ring buffer read index */ -static size_t read_index = 0; -/* log ring buffer full flag */ -static bool buf_is_full = false; -/* log ring buffer empty flag */ -static bool buf_is_empty = true; - -extern void elog_port_output(const char *log, size_t size); -extern void elog_output_lock(void); -extern void elog_output_unlock(void); - -/** - * asynchronous output ring buffer used size - * - * @return used size - */ -static size_t elog_async_get_buf_used(void) { - if (write_index > read_index) { - return write_index - read_index; - } else { - if (!buf_is_full && !buf_is_empty) { - return OUTPUT_BUF_SIZE - (read_index - write_index); - } else if (buf_is_full) { - return OUTPUT_BUF_SIZE; - } else { - return 0; - } - } -} - -/** - * asynchronous output ring buffer remain space - * - * @return remain space - */ -static size_t async_get_buf_space(void) { - return OUTPUT_BUF_SIZE - elog_async_get_buf_used(); -} - -/** - * put log to asynchronous output ring buffer - * - * @param log put log buffer - * @param size log size - * - * @return put log size, the log which beyond ring buffer space will be dropped - */ -static size_t async_put_log(const char *log, size_t size) { - size_t space = 0; - - space = async_get_buf_space(); - /* no space */ - if (!space) { - size = 0; - goto __exit; - } - /* drop some log */ - if (space <= size) { - size = space; - buf_is_full = true; - } - - if (write_index + size < OUTPUT_BUF_SIZE) { - memcpy(log_buf + write_index, log, size); - write_index += size; - } else { - memcpy(log_buf + write_index, log, OUTPUT_BUF_SIZE - write_index); - memcpy(log_buf, log + OUTPUT_BUF_SIZE - write_index, - size - (OUTPUT_BUF_SIZE - write_index)); - write_index += size - OUTPUT_BUF_SIZE; - } - - buf_is_empty = false; - -__exit: - - return size; -} - -#ifdef ELOG_ASYNC_LINE_OUTPUT -/** - * Get line log from asynchronous output ring buffer. - * It will copy all log when the newline sign isn't find. - * - * @param log get line log buffer - * @param size line log size - * - * @return get line log size, the log size is less than ring buffer used size - */ -size_t elog_async_get_line_log(char *log, size_t size) { - size_t used = 0, cpy_log_size = 0; - /* lock output */ - elog_output_lock(); - used = elog_async_get_buf_used(); - - /* no log */ - if (!used || !size) { - goto __exit; - } - /* less log */ - if (used <= size) { - size = used; - } - - if (read_index + size < OUTPUT_BUF_SIZE) { - cpy_log_size = elog_cpyln(log, log_buf + read_index, size); - read_index += cpy_log_size; - } else { - cpy_log_size = elog_cpyln(log, log_buf + read_index, OUTPUT_BUF_SIZE - read_index); - if (cpy_log_size == OUTPUT_BUF_SIZE - read_index) { - cpy_log_size += elog_cpyln(log + cpy_log_size, log_buf, size - cpy_log_size); - read_index += cpy_log_size - OUTPUT_BUF_SIZE; - } else { - read_index += cpy_log_size; - } - } - - if (used == cpy_log_size) { - buf_is_empty = true; - } - - if (cpy_log_size) { - buf_is_full = false; - } - -__exit: - /* lock output */ - elog_output_unlock(); - return cpy_log_size; -} -#else -/** - * get log from asynchronous output ring buffer - * - * @param log get log buffer - * @param size log size - * - * @return get log size, the log size is less than ring buffer used size - */ -size_t elog_async_get_log(char *log, size_t size) { - size_t used = 0; - /* lock output */ - elog_output_lock(); - used = elog_async_get_buf_used(); - /* no log */ - if (!used || !size) { - size = 0; - goto __exit; - } - /* less log */ - if (used <= size) { - size = used; - buf_is_empty = true; - } - - if (read_index + size < OUTPUT_BUF_SIZE) { - memcpy(log, log_buf + read_index, size); - read_index += size; - } else { - memcpy(log, log_buf + read_index, OUTPUT_BUF_SIZE - read_index); - memcpy(log + OUTPUT_BUF_SIZE - read_index, log_buf, - size - (OUTPUT_BUF_SIZE - read_index)); - read_index += size - OUTPUT_BUF_SIZE; - } - - buf_is_full = false; - -__exit: - /* lock output */ - elog_output_unlock(); - return size; -} -#endif /* ELOG_ASYNC_LINE_OUTPUT */ - -void elog_async_output(uint8_t level, const char *log, size_t size) { - /* this function must be implement by user when ELOG_ASYNC_OUTPUT_USING_PTHREAD is not defined */ - extern void elog_async_output_notice(void); - size_t put_size; - - if (is_enabled) { - if (level >= OUTPUT_LVL) { - put_size = async_put_log(log, size); - /* notify output log thread */ - if (put_size > 0) { - elog_async_output_notice(); - } - } else { - elog_port_output(log, size); - } - } else { - elog_port_output(log, size); - } -} - -#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD -void elog_async_output_notice(void) { - sem_post(&output_notice); -} - -static void *async_output(void *arg) { - size_t get_log_size = 0; - static char poll_get_buf[ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE]; - - while(thread_running) { - /* waiting log */ - sem_wait(&output_notice); - /* polling gets and outputs the log */ - while(true) { - -#ifdef ELOG_ASYNC_LINE_OUTPUT - get_log_size = elog_async_get_line_log(poll_get_buf, ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE); -#else - get_log_size = elog_async_get_log(poll_get_buf, ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE); -#endif - - if (get_log_size) { - elog_port_output(poll_get_buf, get_log_size); - } else { - break; - } - } - } - return NULL; -} -#endif - -/** - * enable or disable asynchronous output mode - * the log will be output directly when mode is disabled - * - * @param enabled true: enabled, false: disabled - */ -void elog_async_enabled(bool enabled) { - is_enabled = enabled; -} - -/** - * asynchronous output mode initialize - * - * @return result - */ -ElogErrCode elog_async_init(void) { - ElogErrCode result = ELOG_NO_ERR; - - if (init_ok) { - return result; - } - -#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD - pthread_attr_t thread_attr; - struct sched_param thread_sched_param; - - sem_init(&output_notice, 0, 0); - - thread_running = true; - - pthread_attr_init(&thread_attr); - //pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); - pthread_attr_setstacksize(&thread_attr, ELOG_ASYNC_OUTPUT_PTHREAD_STACK_SIZE); - pthread_attr_setschedpolicy(&thread_attr, SCHED_RR); - thread_sched_param.sched_priority = ELOG_ASYNC_OUTPUT_PTHREAD_PRIORITY; - pthread_attr_setschedparam(&thread_attr, &thread_sched_param); - pthread_create(&async_output_thread, &thread_attr, async_output, NULL); - pthread_attr_destroy(&thread_attr); -#endif - - init_ok = true; - - return result; -} - -/** - * asynchronous output mode deinitialize - * - */ -void elog_async_deinit(void) { - if (!init_ok) { - return ; - } - -#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD - thread_running = false; - - elog_async_output_notice(); - - pthread_join(async_output_thread, NULL); - - sem_destroy(&output_notice); -#endif - - init_ok = false; -} - - - -#endif /* ELOG_ASYNC_OUTPUT_ENABLE */ diff --git a/easylogger/src/elog_buf.c b/easylogger/src/elog_buf.c deleted file mode 100644 index 933c450..0000000 --- a/easylogger/src/elog_buf.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2016, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: Logs buffered output. - * Created on: 2016-11-09 - */ - -#include -#include - -#ifdef ELOG_BUF_OUTPUT_ENABLE -#if !defined(ELOG_BUF_OUTPUT_BUF_SIZE) - #error "Please configure buffer size for buffered output mode (in elog_cfg.h)" -#endif - -/* buffered output mode's buffer */ -static char log_buf[ELOG_BUF_OUTPUT_BUF_SIZE] = { 0 }; -/* log buffer current write size */ -static size_t buf_write_size = 0; -/* buffered output mode enabled flag */ -static bool is_enabled = false; - -extern void elog_port_output(const char *log, size_t size); -extern void elog_output_lock(void); -extern void elog_output_unlock(void); - -/** - * output buffered logs when buffer is full - * - * @param log will be buffered line's log - * @param size log size - */ -void elog_buf_output(const char *log, size_t size) { - size_t write_size = 0, write_index = 0; - - if (!is_enabled) { - elog_port_output(log, size); - return; - } - - while (true) { - if (buf_write_size + size > ELOG_BUF_OUTPUT_BUF_SIZE) { - write_size = ELOG_BUF_OUTPUT_BUF_SIZE - buf_write_size; - memcpy(log_buf + buf_write_size, log + write_index, write_size); - write_index += write_size; - size -= write_size; - buf_write_size += write_size; - /* output log */ - elog_port_output(log_buf, buf_write_size); - /* reset write index */ - buf_write_size = 0; - } else { - memcpy(log_buf + buf_write_size, log + write_index, size); - buf_write_size += size; - break; - } - } -} - -/** - * flush all buffered logs to output device - */ -void elog_flush(void) { - if (buf_write_size == 0) - return; - /* lock output */ - elog_output_lock(); - /* output log */ - elog_port_output(log_buf, buf_write_size); - /* reset write index */ - buf_write_size = 0; - /* unlock output */ - elog_output_unlock(); -} - -/** - * enable or disable buffered output mode - * the log will be output directly when mode is disabled - * - * @param enabled true: enabled, false: disabled - */ -void elog_buf_enabled(bool enabled) { - is_enabled = enabled; -} -#endif /* ELOG_BUF_OUTPUT_ENABLE */ diff --git a/easylogger/src/elog_utils.c b/easylogger/src/elog_utils.c deleted file mode 100644 index 165d855..0000000 --- a/easylogger/src/elog_utils.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - * This file is part of the EasyLogger Library. - * - * Copyright (c) 2015-2018, Armink, - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Function: Some utils for this library. - * Created on: 2015-04-28 - */ - -#include -#include - -/** - * another copy string function - * - * @param cur_len current copied log length, max size is ELOG_LINE_BUF_SIZE - * @param dst destination - * @param src source - * - * @return copied length - */ -size_t elog_strcpy(size_t cur_len, char *dst, const char *src) { - const char *src_old = src; - - assert(dst); - assert(src); - - while (*src != 0) { - /* make sure destination has enough space */ - if (cur_len++ < ELOG_LINE_BUF_SIZE) { - *dst++ = *src++; - } else { - break; - } - } - return src - src_old; -} - -/** - * Copy line log split by newline sign. It will copy all log when the newline sign isn't find. - * - * @param line line log buffer - * @param log origin log buffer - * @param len origin log buffer length - * - * @return copy size - */ -size_t elog_cpyln(char *line, const char *log, size_t len) { - size_t newline_len = strlen(ELOG_NEWLINE_SIGN), copy_size = 0; - - assert(line); - assert(log); - - while (len--) { - *line++ = *log++; - copy_size++; - if (copy_size >= newline_len && !strncmp(log - newline_len, ELOG_NEWLINE_SIGN, newline_len)) { - break; - } - } - return copy_size; -} - -/** - * This function will copy memory content from source address to destination - * address. - * - * @param dst the address of destination memory - * @param src the address of source memory - * @param count the copied length - * - * @return the address of destination memory - */ -void *elog_memcpy(void *dst, const void *src, size_t count) { - char *tmp = (char *) dst, *s = (char *) src; - - assert(dst); - assert(src); - - while (count--) - *tmp++ = *s++; - - return dst; -}