From 83516bb6bd95d1a865c44bc7f33f70426e1143dc Mon Sep 17 00:00:00 2001 From: ManikandanC Date: Fri, 16 Jun 2017 16:39:55 +0530 Subject: Injection: New callback with private data Added new injection callback with private data as argument Signed-off-by: ManikandanC --- include/dlt/dlt_user.h | 2 + include/dlt/dlt_user_macros.h | 10 +++++ src/examples/dlt-example-user.c | 72 ++++++++++++++++++++++++----------- src/lib/dlt_user.c | 84 ++++++++++++++++++++++++++++++++--------- 4 files changed, 129 insertions(+), 39 deletions(-) diff --git a/include/dlt/dlt_user.h b/include/dlt/dlt_user.h index 8e676c6..f8691d7 100644 --- a/include/dlt/dlt_user.h +++ b/include/dlt/dlt_user.h @@ -127,6 +127,8 @@ typedef struct { uint32_t service_id; int (*injection_callback)(uint32_t service_id, void *data, uint32_t length); + int (*injection_callback_with_id)(uint32_t service_id, void *data, uint32_t length, void *priv_data); + void *data; } DltUserInjectionCallback; typedef struct diff --git a/include/dlt/dlt_user_macros.h b/include/dlt/dlt_user_macros.h index e1b1267..74dea64 100644 --- a/include/dlt/dlt_user_macros.h +++ b/include/dlt/dlt_user_macros.h @@ -164,6 +164,16 @@ #define DLT_REGISTER_INJECTION_CALLBACK(CONTEXT, SERVICEID, CALLBACK) do{\ (void)dlt_register_injection_callback(&(CONTEXT),SERVICEID, CALLBACK);} while(0) +/** + * Register callback function called when injection message was received + * @param CONTEXT object containing information about one special logging context + * @param SERVICEID service id of the injection message + * @param CALLBACK function pointer to callback function + * @param PRIV_DATA data specific to context + */ +#define DLT_REGISTER_INJECTION_CALLBACK_WITH_ID(CONTEXT, SERVICEID, CALLBACK, PRIV_DATA) do{\ + (void)dlt_register_injection_callback_with_id(&(CONTEXT),SERVICEID, CALLBACK, PRIV_DATA);} while(0) + /** * Register callback function called when log level of context was changed * @param CONTEXT object containing information about one special logging context diff --git a/src/examples/dlt-example-user.c b/src/examples/dlt-example-user.c index 12d9c37..4083d4d 100644 --- a/src/examples/dlt-example-user.c +++ b/src/examples/dlt-example-user.c @@ -77,9 +77,13 @@ #include "dlt_common.h" /* for dlt_get_version() */ int dlt_user_injection_callback(uint32_t service_id, void *data, uint32_t length); +int dlt_user_injection_callback_with_specific_data(uint32_t service_id, void *data, uint32_t length, void *priv_data); + void dlt_user_log_level_changed_callback(char context_id[DLT_ID_SIZE],uint8_t log_level,uint8_t trace_status); -DLT_DECLARE_CONTEXT(mycontext) +DLT_DECLARE_CONTEXT(mycontext1) +DLT_DECLARE_CONTEXT(mycontext2) +DLT_DECLARE_CONTEXT(mycontext3) /** * Print usage information of tool. @@ -132,7 +136,7 @@ int main(int argc, char* argv[]) int lvalue = DLT_LOG_WARN; char *tvalue = 0; int rvalue = -1; - + int ret = 0; int index; int c; @@ -281,10 +285,17 @@ int main(int argc, char* argv[]) dlt_verbose_mode(); DLT_REGISTER_APP("LOG","Test Application for Logging"); - DLT_REGISTER_CONTEXT(mycontext,"TEST","Test Context for Logging"); + DLT_REGISTER_CONTEXT(mycontext1,"TEST","Test Context for Logging"); + DLT_REGISTER_CONTEXT(mycontext2, "TS1", "Test Context1 for injection"); + DLT_REGISTER_CONTEXT(mycontext3, "TS2", "Test Context2 for injection"); - DLT_REGISTER_INJECTION_CALLBACK(mycontext, 0x1000, dlt_user_injection_callback); - DLT_REGISTER_LOG_LEVEL_CHANGED_CALLBACK(mycontext, dlt_user_log_level_changed_callback); + DLT_REGISTER_INJECTION_CALLBACK(mycontext1, 0x1000, dlt_user_injection_callback); + DLT_REGISTER_INJECTION_CALLBACK_WITH_ID(mycontext2, 0x1000, dlt_user_injection_callback_with_specific_data, (void*)"TS1 context"); + DLT_REGISTER_INJECTION_CALLBACK(mycontext2, 0x1001, dlt_user_injection_callback); + DLT_REGISTER_INJECTION_CALLBACK_WITH_ID(mycontext3, 0x1000, dlt_user_injection_callback_with_specific_data, (void*)"TS2 context"); + DLT_REGISTER_INJECTION_CALLBACK(mycontext3, 0x1001, dlt_user_injection_callback); + + DLT_REGISTER_LOG_LEVEL_CHANGED_CALLBACK(mycontext1, dlt_user_log_level_changed_callback); text = message; @@ -336,11 +347,11 @@ int main(int argc, char* argv[]) if (gflag) { /* DLT messages to test Fibex non-verbose description: dlt-example-non-verbose.xml */ - DLT_LOG_ID(mycontext,DLT_LOG_INFO,10); - DLT_LOG_ID(mycontext,DLT_LOG_INFO,11,DLT_UINT16(1011)); - DLT_LOG_ID(mycontext,DLT_LOG_INFO,12,DLT_UINT32(1012),DLT_UINT32(1013)); - DLT_LOG_ID(mycontext,DLT_LOG_INFO,13,DLT_UINT8(123),DLT_FLOAT32(1.12)); - DLT_LOG_ID(mycontext,DLT_LOG_INFO,14,DLT_STRING("DEAD BEEF")); + DLT_LOG_ID(mycontext1, DLT_LOG_INFO, 10); + DLT_LOG_ID(mycontext1, DLT_LOG_INFO, 11, DLT_UINT16(1011)); + DLT_LOG_ID(mycontext1, DLT_LOG_INFO, 12, DLT_UINT32(1012), DLT_UINT32(1013)); + DLT_LOG_ID(mycontext1, DLT_LOG_INFO, 13, DLT_UINT8(123), DLT_FLOAT32(1.12)); + DLT_LOG_ID(mycontext1, DLT_LOG_INFO, 14, DLT_STRING("DEAD BEEF")); } #ifdef DLT_TEST_ENABLE @@ -361,14 +372,14 @@ int main(int argc, char* argv[]) fprintf(stderr,"Cannot allocate buffer memory!\n"); return -1; } - DLT_LOG(mycontext,DLT_LOG_WARN,DLT_STRING(text),DLT_RAW(buffer,atoi(zvalue))); + DLT_LOG(mycontext1, DLT_LOG_WARN, DLT_STRING(text), DLT_RAW(buffer, atoi(zvalue))); free(buffer); } #endif /* DLT_TEST_ENABLE */ for (num=0;num0) + + DLT_LOG(mycontext1, DLT_LOG_INFO, DLT_STRING("Injection: "), DLT_UINT32(service_id)); + printf("Injection %d, Length=%d \n", service_id, length); + + if (length > 0) + { + dlt_print_mixed_string(text, 1024, data, length, 0); + DLT_LOG(mycontext1, DLT_LOG_INFO, DLT_STRING("Data: "), DLT_STRING(text)); + printf("%s \n", text); + } + + return 0; +} + +int dlt_user_injection_callback_with_specific_data(uint32_t service_id, void *data, uint32_t length, void *priv_data) +{ + char text[1024]; + + DLT_LOG(mycontext1, DLT_LOG_INFO, DLT_STRING("Injection: "), DLT_UINT32(service_id)); + printf("Injection %d, Length=%d \n", service_id, length); + + if (length > 0) { - dlt_print_mixed_string(text,1024,data,length,0); - DLT_LOG(mycontext, DLT_LOG_INFO, DLT_STRING("Data: "), DLT_STRING(text)); + dlt_print_mixed_string(text, 1024, data, length, 0); + DLT_LOG(mycontext1, DLT_LOG_INFO, DLT_STRING("Data: "), DLT_STRING(text), DLT_STRING(priv_data)); printf("%s \n", text); } diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index 2e147f5..689e860 100644 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -2544,6 +2544,12 @@ DltReturnValue dlt_user_log_write_utf8_string(DltContextData *log, const char *t DltReturnValue dlt_register_injection_callback(DltContext *handle, uint32_t service_id, int (*dlt_injection_callback)(uint32_t service_id, void *data, uint32_t length)) +{ + return dlt_register_injection_callback_with_id(handle, service_id, dlt_injection_callback, NULL); +} + +DltReturnValue dlt_register_injection_callback_with_id(DltContext *handle, uint32_t service_id, + int (*dlt_injection_callback)(uint32_t service_id, void *data, uint32_t length, void *priv_data), void *priv) { DltContextData log; uint32_t i,j,k; @@ -2621,7 +2627,18 @@ DltReturnValue dlt_register_injection_callback(DltContext *handle, uint32_t serv /* Store service_id and corresponding function pointer for callback function */ dlt_user.dlt_ll_ts[i].injection_table[j].service_id = service_id; - dlt_user.dlt_ll_ts[i].injection_table[j].injection_callback = dlt_injection_callback; + if (priv == NULL) + { + dlt_user.dlt_ll_ts[i].injection_table[j].injection_callback = dlt_injection_callback; + dlt_user.dlt_ll_ts[i].injection_table[j].injection_callback_with_id = NULL; + dlt_user.dlt_ll_ts[i].injection_table[j].data = NULL; + } + else + { + dlt_user.dlt_ll_ts[i].injection_table[j].injection_callback = NULL; + dlt_user.dlt_ll_ts[i].injection_table[j].injection_callback_with_id = dlt_injection_callback; + dlt_user.dlt_ll_ts[i].injection_table[j].data = priv; + } DLT_SEM_FREE(); @@ -4482,24 +4499,39 @@ DltReturnValue dlt_user_log_check_user_message(void) DLT_SEM_LOCK(); - if ((usercontextinj->data_length_inject>0) && (dlt_user.dlt_ll_ts)) + if ((usercontextinj->data_length_inject > 0) && (dlt_user.dlt_ll_ts)) { /* Check if injection callback is registered for this context */ - for (i=0; ilog_level_pos].nrcallbacks;i++) + for (i = 0; i < dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].nrcallbacks; i++) { if ((dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table) && - (dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table[i].service_id == usercontextinj->service_id)) + (dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table[i].service_id == usercontextinj->service_id)) { /* Prepare delayed injection callback call */ - if (dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table[i].injection_callback!=0) + if (dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table[i].injection_callback != NULL) + { + delayed_injection_callback.injection_callback = + dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table[i].injection_callback; + } + else if (dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table[i].injection_callback_with_id != NULL) { - delayed_injection_callback.injection_callback = dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table[i].injection_callback; - delayed_injection_callback.service_id = usercontextinj->service_id; - delayed_inject_data_length = usercontextinj->data_length_inject; - delayed_inject_buffer = malloc(delayed_inject_data_length); + delayed_injection_callback.injection_callback_with_id = + dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table[i].injection_callback_with_id; + delayed_injection_callback.data = + dlt_user.dlt_ll_ts[usercontextinj->log_level_pos].injection_table[i].data; + } + delayed_injection_callback.service_id = usercontextinj->service_id; + delayed_inject_data_length = usercontextinj->data_length_inject; + delayed_inject_buffer = malloc(delayed_inject_data_length); - if(delayed_inject_buffer != NULL) - memcpy(delayed_inject_buffer, userbuffer, delayed_inject_data_length); + if(delayed_inject_buffer != NULL) + { + memcpy(delayed_inject_buffer, userbuffer, delayed_inject_data_length); + } + else + { + dlt_log(LOG_WARNING,"malloc failed!\n"); + return DLT_RETURN_ERROR; } break; } @@ -4509,18 +4541,34 @@ DltReturnValue dlt_user_log_check_user_message(void) DLT_SEM_FREE(); /* Delayed injection callback call */ - if(delayed_inject_buffer != NULL && delayed_injection_callback.injection_callback != 0) + if(delayed_inject_buffer != NULL && + delayed_injection_callback.injection_callback != NULL) { - delayed_injection_callback.injection_callback(delayed_injection_callback.service_id, delayed_inject_buffer, delayed_inject_data_length); - delayed_injection_callback.injection_callback = 0; - free(delayed_inject_buffer); - delayed_inject_buffer = NULL; - + delayed_injection_callback.injection_callback(delayed_injection_callback.service_id, + delayed_inject_buffer, + delayed_inject_data_length); + delayed_injection_callback.injection_callback = NULL; } + else if(delayed_inject_buffer != NULL && + delayed_injection_callback.injection_callback_with_id != NULL) + { + delayed_injection_callback.injection_callback_with_id(delayed_injection_callback.service_id, + delayed_inject_buffer, + delayed_inject_data_length, + delayed_injection_callback.data); + delayed_injection_callback.injection_callback_with_id = NULL; + } + free(delayed_inject_buffer); + delayed_inject_buffer = NULL; /* keep not read data in buffer */ - if (dlt_receiver_remove(receiver,(sizeof(DltUserHeader)+sizeof(DltUserControlMsgInjection)+usercontextinj->data_length_inject)) == DLT_RETURN_ERROR) + if (dlt_receiver_remove(receiver, + (sizeof(DltUserHeader) + + sizeof(DltUserControlMsgInjection) + + usercontextinj->data_length_inject)) == DLT_RETURN_ERROR) + { return DLT_RETURN_ERROR; + } } } break; -- cgit v1.2.1