summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManikandanC <Manikandan.Chockalingam@in.bosch.com>2017-06-16 16:39:55 +0530
committerChristoph Lipka <clipka@users.noreply.github.com>2018-12-21 10:16:46 +0100
commit83516bb6bd95d1a865c44bc7f33f70426e1143dc (patch)
tree951f1ae272b77065ff05dbc3ad9a0dfc02e39e3d
parentbb15f2588aed9ee45ff42621de336aa4b7d65e53 (diff)
downloadDLT-daemon-83516bb6bd95d1a865c44bc7f33f70426e1143dc.tar.gz
Injection: New callback with private data Added new injection callback with private data as argument
Signed-off-by: ManikandanC <Manikandan.Chockalingam@in.bosch.com>
-rw-r--r--include/dlt/dlt_user.h2
-rw-r--r--include/dlt/dlt_user_macros.h10
-rw-r--r--src/examples/dlt-example-user.c72
-rw-r--r--src/lib/dlt_user.c84
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
@@ -165,6 +165,16 @@
(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
* @param CALLBACK function pointer to callback function
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;num<maxnum;num++)
{
- printf("Send %d %s\n",num,text);
+ printf("Send %d %s\n", num, text);
newstate = dlt_get_log_state();
if(state!=newstate)
@@ -388,18 +399,18 @@ int main(int argc, char* argv[])
if (gflag)
{
/* Non-verbose mode */
- DLT_LOG_ID(mycontext,lvalue,num,DLT_INT(num),DLT_STRING(text));
+ DLT_LOG_ID(mycontext1, lvalue, num, DLT_INT(num), DLT_STRING(text));
}
else
{
if (rvalue == -1)
{
/* Verbose mode */
- DLT_LOG(mycontext,lvalue,DLT_INT(num),DLT_STRING(text));
+ DLT_LOG(mycontext1, lvalue, DLT_INT(num), DLT_STRING(text));
}
else
{
- DLT_LOG(mycontext,lvalue,DLT_RAW(text, rvalue));
+ DLT_LOG(mycontext1, lvalue, DLT_RAW(text, rvalue));
}
}
@@ -411,7 +422,7 @@ int main(int argc, char* argv[])
sleep(1);
- DLT_UNREGISTER_CONTEXT(mycontext);
+ DLT_UNREGISTER_CONTEXT(mycontext1);
DLT_UNREGISTER_APP();
@@ -422,12 +433,31 @@ int main(int argc, char* argv[])
int dlt_user_injection_callback(uint32_t service_id, void *data, uint32_t length)
{
char text[1024];
- DLT_LOG(mycontext, DLT_LOG_INFO, DLT_STRING("Injection: "), DLT_UINT32(service_id));
- printf("Injection %d, Length=%d \n",service_id,length);
- if (length>0)
+
+ 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
@@ -2545,6 +2545,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;
int found = 0;
@@ -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; i<dlt_user.dlt_ll_ts[usercontextinj->log_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;