diff options
-rw-r--r-- | include/dlt/dlt_types.h | 1 | ||||
-rw-r--r-- | include/dlt/dlt_user.h | 23 | ||||
-rw-r--r-- | include/dlt/dlt_user_macros.h | 25 | ||||
-rw-r--r-- | src/lib/dlt_user.c | 2 | ||||
-rw-r--r-- | src/tests/dlt-test-user.c | 50 | ||||
-rw-r--r-- | tests/gtest_dlt_user.cpp | 28 |
6 files changed, 120 insertions, 9 deletions
diff --git a/include/dlt/dlt_types.h b/include/dlt/dlt_types.h index cd12e77..03cd036 100644 --- a/include/dlt/dlt_types.h +++ b/include/dlt/dlt_types.h @@ -85,6 +85,7 @@ typedef unsigned int speed_t; */ typedef enum { + DLT_RETURN_LOGGING_DISABLED = -7, DLT_RETURN_USER_BUFFER_FULL = -6, DLT_RETURN_WRONG_PARAMETER = -5, DLT_RETURN_BUFFER_FULL = -4, diff --git a/include/dlt/dlt_user.h b/include/dlt/dlt_user.h index a24117e..792ebbe 100644 --- a/include/dlt/dlt_user.h +++ b/include/dlt/dlt_user.h @@ -769,6 +769,29 @@ int dlt_user_atexit_blow_out_user_buffer(void); */ DltReturnValue dlt_user_log_resend_buffer(void); +/** + * Checks the log level passed by the log function if enabled for that context or not. + * This function can be called by applications before generating their logs. + * Also called before writing new log messages. + * @param handle pointer to an object containing information about one special logging context + * @param loglevel this is the current log level of the log message to be sent + * @return Value from DltReturnValue enum, DLT_RETURN_TRUE if log level is enabled + */ +static inline DltReturnValue dlt_user_is_logLevel_enabled(DltContext *handle,DltLogLevelType loglevel) +{ + if (handle == NULL || handle->log_level_ptr == NULL) + { + return DLT_RETURN_WRONG_PARAMETER; + } + + if (loglevel <= (DltLogLevelType)(*(handle->log_level_ptr)) && loglevel != DLT_LOG_OFF) + { + return DLT_RETURN_TRUE; + } + + return DLT_RETURN_LOGGING_DISABLED; +} + #ifdef DLT_TEST_ENABLE void dlt_user_test_corrupt_user_header(int enable); void dlt_user_test_corrupt_message_size(int enable,int16_t size); diff --git a/include/dlt/dlt_user_macros.h b/include/dlt/dlt_user_macros.h index 919df7e..e1e9104 100644 --- a/include/dlt/dlt_user_macros.h +++ b/include/dlt/dlt_user_macros.h @@ -181,7 +181,7 @@ #else #define DLT_LOG(CONTEXT,LOGLEVEL,ARGS...) \ do { \ - if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \ + if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \ { \ DltContextData log_local; \ int dlt_local; \ @@ -213,7 +213,7 @@ #else #define DLT_LOG_ID(CONTEXT,LOGLEVEL,MSGID,ARGS...) \ do { \ - if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \ + if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \ { \ DltContextData log_local; \ int dlt_local; \ @@ -398,7 +398,7 @@ */ #define DLT_LOG_STRING(CONTEXT,LOGLEVEL,TEXT) \ do { \ - if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \ + if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \ { \ (void)dlt_log_string(&(CONTEXT), LOGLEVEL, TEXT); \ } \ @@ -413,7 +413,7 @@ */ #define DLT_LOG_STRING_INT(CONTEXT,LOGLEVEL,TEXT,INT_VAR) \ do { \ - if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \ + if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \ { \ (void)dlt_log_string_int(&(CONTEXT), LOGLEVEL, TEXT, INT_VAR); \ } \ @@ -428,7 +428,7 @@ */ #define DLT_LOG_STRING_UINT(CONTEXT,LOGLEVEL,TEXT,UINT_VAR) \ do { \ - if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \ + if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \ { \ (void)dlt_log_string_uint(&(CONTEXT),LOGLEVEL,TEXT,UINT_VAR); \ } \ @@ -442,7 +442,7 @@ */ #define DLT_LOG_UINT(CONTEXT,LOGLEVEL,UINT_VAR) \ do { \ - if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \ + if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \ { \ (void)dlt_log_uint(&(CONTEXT),LOGLEVEL,UINT_VAR); \ } \ @@ -456,7 +456,7 @@ */ #define DLT_LOG_INT(CONTEXT,LOGLEVEL,INT_VAR) \ do { \ - if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \ + if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \ { \ (void)dlt_log_int(&(CONTEXT),LOGLEVEL,INT_VAR); \ } \ @@ -471,7 +471,7 @@ */ #define DLT_LOG_RAW(CONTEXT,LOGLEVEL,BUF,LEN) \ do { \ - if((CONTEXT).log_level_ptr && ((LOGLEVEL)<=(int)*((CONTEXT).log_level_ptr) ) && ((LOGLEVEL)!=0)) \ + if(dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL)==DLT_RETURN_TRUE) \ { \ (void)dlt_log_raw(&(CONTEXT),LOGLEVEL,BUF,LEN); \ } \ @@ -523,6 +523,15 @@ (void)dlt_disable_local_print();} while(0) /** + * Check if log level is enabled + * + * @param CONTEXT object containing information about one special logging context + * @param LOGLEVEL the log level of the log message + */ +#define DLT_IS_LOG_LEVEL_ENABLED(CONTEXT,LOGLEVEL) \ + (dlt_user_is_logLevel_enabled(&CONTEXT,LOGLEVEL) == DLT_RETURN_TRUE) + +/** \} */ diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index ef0f36f..ca7a56d 100644 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -1371,7 +1371,7 @@ DltReturnValue dlt_user_log_write_start_id(DltContext *handle, DltContextData *l log->size = 0; /* check log levels */ - if (handle->log_level_ptr != NULL && (loglevel <= (int) *(handle->log_level_ptr)) && (loglevel != DLT_LOG_OFF)) + if (dlt_user_is_logLevel_enabled(handle, loglevel) == DLT_RETURN_TRUE) { /* In non-verbose mode, insert message id */ if (dlt_user.verbose_mode == 0) diff --git a/src/tests/dlt-test-user.c b/src/tests/dlt-test-user.c index 16479a2..9a57573 100644 --- a/src/tests/dlt-test-user.c +++ b/src/tests/dlt-test-user.c @@ -78,6 +78,18 @@ #define DLT_TEST_NUM_CONTEXT 9 +/* LogLevel string representation */ +static const char *loglevelstr[DLT_LOG_MAX] = +{ + "DLT_LOG_OFF", + "DLT_LOG_FATAL", + "DLT_LOG_ERROR", + "DLT_LOG_WARN", + "DLT_LOG_INFO", + "DLT_LOG_DEBUG", + "DLT_LOG_VERBOSE" +}; + /* Test functions... */ /* for macro interface */ @@ -478,6 +490,7 @@ int test5m(void) { char buffer[32]; int num; + int i; void *ptr = malloc(sizeof(int)); @@ -510,6 +523,26 @@ int test5m(void) DLT_LOG(context_macro_test[4],DLT_LOG_INFO,DLT_STRING("Next line: DLT_LOG_PTR")); DLT_LOG(context_macro_test[4],DLT_LOG_INFO,DLT_PTR(ptr)); + + DLT_LOG(context_macro_test[4],DLT_LOG_INFO,DLT_STRING("Next lines: DLT_IS_LOG_LEVEL_ENABLED")); + for (i = DLT_LOG_FATAL; i < DLT_LOG_MAX; i++) + { + if (DLT_IS_LOG_LEVEL_ENABLED(context_macro_test[4],i)) + { + DLT_LOG(context_info, + DLT_LOG_INFO, + DLT_STRING("Loglevel is enabled: "), + DLT_STRING(loglevelstr[i])); + } + else + { + DLT_LOG(context_info, + DLT_LOG_INFO, + DLT_STRING("Loglevel is disabled: "), + DLT_STRING(loglevelstr[i])); + } + } + /* wait 2 second before next test */ sleep(2); DLT_LOG(context_info,DLT_LOG_INFO,DLT_STRING("Test5: (Macro IF) finished")); @@ -990,6 +1023,8 @@ int test5f(void) { char buffer[32]; int num; + int i; + char log[DLT_USER_BUF_MAX_SIZE]; for(num=0;num<32;num++) { @@ -1018,6 +1053,21 @@ int test5f(void) dlt_log_string(&(context_function_test[4]),DLT_LOG_INFO,"Next line: dlt_log_string_uint()"); dlt_log_string_uint(&(context_function_test[4]), DLT_LOG_INFO,"String output: ", 42); + dlt_log_string(&(context_function_test[4]),DLT_LOG_INFO, "Next lines: dlt_user_is_logLevel_enabled"); + for (i = DLT_LOG_FATAL; i < DLT_LOG_MAX; i++) + { + if (dlt_user_is_logLevel_enabled(&(context_function_test[4]),i) == DLT_RETURN_TRUE) + { + snprintf(log, DLT_USER_BUF_MAX_SIZE, "Loglevel is enabled: %s", loglevelstr[i]); + dlt_log_string(&(context_function_test[4]),DLT_LOG_INFO, log); + } + else + { + snprintf(log, DLT_USER_BUF_MAX_SIZE, "Loglevel is disabled: %s", loglevelstr[i]); + dlt_log_string(&(context_function_test[4]),DLT_LOG_INFO, log); + } + } + /* wait 2 second before next test */ sleep(2); dlt_log_string(&context_info,DLT_LOG_INFO,"Test5: (Function IF) finished"); diff --git a/tests/gtest_dlt_user.cpp b/tests/gtest_dlt_user.cpp index d4a44bc..c8bf2de 100644 --- a/tests/gtest_dlt_user.cpp +++ b/tests/gtest_dlt_user.cpp @@ -3008,6 +3008,34 @@ TEST(t_dlt_free, onetime) } ///////////////////////////////////////// +// dlt_user_is_logLevel_enabled +TEST(t_dlt_user_is_logLevel_enabled, normal) +{ + DltContext context; + EXPECT_LE(DLT_RETURN_OK,dlt_register_app("TUSR", "dlt_user.c tests")); + EXPECT_LE(DLT_RETURN_OK,dlt_register_context_ll_ts(&context, "ILLE", + "t_dlt_user_is_logLevel_enabled context", + DLT_LOG_INFO, + -2)); /* DLT_USER_TRACE_STATUS_NOT_SET */ + + EXPECT_LE(DLT_RETURN_TRUE, dlt_user_is_logLevel_enabled(&context, DLT_LOG_FATAL)); + EXPECT_LE(DLT_RETURN_TRUE, dlt_user_is_logLevel_enabled(&context, DLT_LOG_ERROR)); + EXPECT_LE(DLT_RETURN_TRUE, dlt_user_is_logLevel_enabled(&context, DLT_LOG_WARN)); + EXPECT_LE(DLT_RETURN_TRUE, dlt_user_is_logLevel_enabled(&context, DLT_LOG_INFO)); + EXPECT_LE(DLT_RETURN_LOGGING_DISABLED, dlt_user_is_logLevel_enabled(&context, DLT_LOG_DEBUG)); + EXPECT_LE(DLT_RETURN_LOGGING_DISABLED, dlt_user_is_logLevel_enabled(&context, DLT_LOG_VERBOSE)); + EXPECT_LE(DLT_RETURN_LOGGING_DISABLED, dlt_user_is_logLevel_enabled(&context, DLT_LOG_OFF)); + + EXPECT_LE(DLT_RETURN_OK,dlt_unregister_context(&context)); + EXPECT_LE(DLT_RETURN_OK,dlt_unregister_app()); +} + +TEST(t_dlt_user_is_logLevel_enabled, nullpointer) +{ + EXPECT_LE(DLT_RETURN_WRONG_PARAMETER, dlt_user_is_logLevel_enabled(NULL, DLT_LOG_FATAL)); +} + +///////////////////////////////////////// // main int main(int argc, char **argv) { |