summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/dlt/dlt_types.h1
-rw-r--r--include/dlt/dlt_user.h23
-rw-r--r--include/dlt/dlt_user_macros.h25
-rw-r--r--src/lib/dlt_user.c2
-rw-r--r--src/tests/dlt-test-user.c50
-rw-r--r--tests/gtest_dlt_user.cpp28
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)
{