summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2013-07-24 11:26:21 +0200
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2013-07-25 13:09:14 +0200
commit244c56f9ba0c412b20d2bd9590ae6d07a799cbc9 (patch)
tree2a445032901547e73d67269f1cf7d04bbeffe80e
parent6235728e2a7d8f4524c29681355f4953b8cc277b (diff)
downloadDLT-daemon-244c56f9ba0c412b20d2bd9590ae6d07a799cbc9.tar.gz
Bug 84 - Adding utf8 support to dlt-daemon, dlt-viewer. Modified patch, originally provided by Stefan Vacek.
Signed-off-by: Alexander Wenzel <Alexander.AW.Wenzel@bmw.de>
-rwxr-xr-xinclude/dlt/dlt_protocol.h16
-rw-r--r--include/dlt/dlt_user.h10
-rw-r--r--include/dlt/dlt_user_macros.h8
-rw-r--r--src/lib/dlt_user.c49
-rwxr-xr-xsrc/shared/dlt_common.c4
-rwxr-xr-xsrc/tests/dlt-test-client.c68
-rwxr-xr-xsrc/tests/dlt-test-user.c30
7 files changed, 145 insertions, 40 deletions
diff --git a/include/dlt/dlt_protocol.h b/include/dlt/dlt_protocol.h
index 1c30d66..c2e91d7 100755
--- a/include/dlt/dlt_protocol.h
+++ b/include/dlt/dlt_protocol.h
@@ -155,14 +155,14 @@
#define DLT_TYPE_INFO_STRU 0x00004000 /**< Struct */
#define DLT_TYPE_INFO_SCOD 0x00038000 /**< coding of the type string: 0 = ASCII, 1 = UTF-8 */
-#define DLT_TYLE_8BIT 1
-#define DLT_TYLE_16BIT 2
-#define DLT_TYLE_32BIT 3
-#define DLT_TYLE_64BIT 4
-#define DLT_TYLE_128BIT 5
-
-#define DLT_SCOD_ASCII 0
-#define DLT_SCOD_UTF8 1
+#define DLT_TYLE_8BIT 0x00000001
+#define DLT_TYLE_16BIT 0x00000002
+#define DLT_TYLE_32BIT 0x00000003
+#define DLT_TYLE_64BIT 0x00000004
+#define DLT_TYLE_128BIT 0x00000005
+
+#define DLT_SCOD_ASCII 0x00000000
+#define DLT_SCOD_UTF8 0x00008000
/*
* Definitions of DLT services.
diff --git a/include/dlt/dlt_user.h b/include/dlt/dlt_user.h
index 0523da2..b548707 100644
--- a/include/dlt/dlt_user.h
+++ b/include/dlt/dlt_user.h
@@ -345,6 +345,16 @@ int dlt_user_log_write_int64(DltContextData *log, int64_t data);
*/
int dlt_user_log_write_string( DltContextData *log, const char *text);
+ /**
+ * Write a null terminated UTF8 string into a DLT log message.
+ * dlt_user_log_write_start has to be called before adding any attributes to the log message.
+ * Finish sending log message by calling dlt_user_log_write_finish.
+ * @param log pointer to an object containing information about logging context data
+ * @param text pointer to the parameter written into log message containing null termination.
+ * @return negative value if there was an error
+ */
+int dlt_user_log_write_utf8_string(DltContextData *log, const char *text);
+
/**
* Write a binary memory block into a DLT log message.
* dlt_user_log_write_start has to be called before adding any attributes to the log message.
diff --git a/include/dlt/dlt_user_macros.h b/include/dlt/dlt_user_macros.h
index 20f605d..c8551b1 100644
--- a/include/dlt/dlt_user_macros.h
+++ b/include/dlt/dlt_user_macros.h
@@ -202,6 +202,14 @@ extern DltContext CONTEXT;
})
/**
+ * Add utf8-encoded string parameter to the log messsage.
+ * @param TEXT UTF8-encoded string
+ */
+#define DLT_UTF8(TEXT) ({ \
+ dlt_user_log_write_utf8_string(&log,TEXT); \
+ })
+
+/**
* Add boolean parameter to the log messsage.
* @param BOOL_VAR Boolean value (mapped to uint8)
*/
diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c
index d6c761c..1f43801 100644
--- a/src/lib/dlt_user.c
+++ b/src/lib/dlt_user.c
@@ -438,6 +438,10 @@ int dlt_init_common(void)
void dlt_user_atexit_handler(void)
{
+ if (dlt_user_initialised==0)
+ {
+ return;
+ }
/* Try to resend potential log messages in the user buffer */
int count = dlt_user_atexit_blow_out_user_buffer();
@@ -1764,7 +1768,50 @@ int dlt_user_log_write_string(DltContextData *log, const char *text)
return -1;
}
- type_info = DLT_TYPE_INFO_STRG;
+ type_info = DLT_TYPE_INFO_STRG | DLT_SCOD_ASCII;
+
+ memcpy((log->buffer)+log->size,&(type_info),sizeof(uint32_t));
+ log->size += sizeof(uint32_t);
+ }
+
+ arg_size = strlen(text) + 1;
+
+ memcpy((log->buffer)+log->size,&(arg_size),sizeof(uint16_t));
+ log->size += sizeof(uint16_t);
+
+ memcpy((log->buffer)+log->size,text,arg_size);
+ log->size += arg_size;
+
+ log->args_num ++;
+
+ return 0;
+}
+
+int dlt_user_log_write_utf8_string(DltContextData *log, const char *text)
+{
+ uint16_t arg_size;
+ uint32_t type_info;
+
+ if ((log==0) || (text==0))
+ {
+ return -1;
+ }
+
+ arg_size = strlen(text)+1;
+
+ if ((log->size+arg_size+sizeof(uint16_t))>DLT_USER_BUF_MAX_SIZE)
+ {
+ return -1;
+ }
+
+ if (dlt_user.verbose_mode)
+ {
+ if ((log->size+arg_size+sizeof(uint32_t)+sizeof(uint16_t))>DLT_USER_BUF_MAX_SIZE)
+ {
+ return -1;
+ }
+
+ type_info = DLT_TYPE_INFO_STRG | DLT_SCOD_UTF8;
memcpy((log->buffer)+log->size,&(type_info),sizeof(uint32_t));
log->size += sizeof(uint32_t);
diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c
index b7a865e..54a99c3 100755
--- a/src/shared/dlt_common.c
+++ b/src/shared/dlt_common.c
@@ -3230,10 +3230,10 @@ int dlt_message_argument_print(DltMessage *msg,uint32_t type_info,uint8_t **ptr,
uint32_t quantisation_tmp=0;
- if (type_info & DLT_TYPE_INFO_STRG)
+ if ( (type_info & DLT_TYPE_INFO_STRG) && (((type_info & DLT_TYPE_INFO_SCOD) == DLT_SCOD_ASCII) || ((type_info & DLT_TYPE_INFO_SCOD) == DLT_SCOD_UTF8)) )
{
- /* string type */
+ /* string type or utf8-encoded string type */
if (byteLength<0)
{
DLT_MSG_READ_VALUE(length_tmp,*ptr,*datalength,uint16_t);
diff --git a/src/tests/dlt-test-client.c b/src/tests/dlt-test-client.c
index 5da480f..a8f10ff 100755
--- a/src/tests/dlt-test-client.c
+++ b/src/tests/dlt-test-client.c
@@ -492,7 +492,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
else if (strcmp(text,"Test2: (Macro IF) finished")==0)
{
- if (dltdata->test_counter_macro[1]==14)
+ if (dltdata->test_counter_macro[1]==16)
{
printf("Test2m PASSED\n");
dltdata->tests_passed++;
@@ -540,7 +540,21 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
DLT_MSG_READ_VALUE(type_info_tmp,ptr,datalength,uint32_t);
type_info=DLT_ENDIAN_GET_32(message->standardheader->htyp, type_info_tmp);
- if (type_info & DLT_TYPE_INFO_BOOL)
+ if ((type_info & DLT_TYPE_INFO_STRG) && ((type_info & DLT_TYPE_INFO_SCOD) == DLT_SCOD_ASCII))
+ {
+ if (datalength==(sizeof(uint16_t)+strlen("Hello world")+1))
+ {
+ dltdata->test_counter_macro[1]++;
+ }
+ }
+ else if ((type_info & DLT_TYPE_INFO_STRG) && ((type_info & DLT_TYPE_INFO_SCOD) == DLT_SCOD_UTF8))
+ {
+ if (datalength==(sizeof(uint16_t)+strlen("Hello world")+1))
+ {
+ dltdata->test_counter_macro[1]++;
+ }
+ }
+ else if (type_info & DLT_TYPE_INFO_BOOL)
{
if (datalength==sizeof(uint8_t))
{
@@ -694,7 +708,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
else if (strcmp(text,"Test3: (Macro IF) finished")==0)
{
- if (dltdata->test_counter_macro[2]==14)
+ if (dltdata->test_counter_macro[2]==16)
{
printf("Test3m PASSED\n");
dltdata->tests_passed++;
@@ -731,6 +745,28 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
{
case 1:
{
+ slen=strlen("string")+1;
+ datalength-=slen;
+ ptr+=slen;
+ if (datalength==sizeof(uint16_t)+strlen("Hello world")+1)
+ {
+ dltdata->test_counter_macro[2]++;
+ }
+ break;
+ }
+ case 2:
+ {
+ slen=strlen("utf8")+1;
+ datalength-=slen;
+ ptr+=slen;
+ if (datalength==sizeof(uint16_t)+strlen("Hello world")+1)
+ {
+ dltdata->test_counter_macro[2]++;
+ }
+ break;
+ }
+ case 3:
+ {
slen=strlen("bool")+1;
datalength-=slen;
ptr+=slen;
@@ -740,7 +776,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 2:
+ case 4:
{
slen=strlen("int")+1;
datalength-=slen;
@@ -751,7 +787,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 3:
+ case 5:
{
slen=strlen("int8")+1;
datalength-=slen;
@@ -762,7 +798,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 4:
+ case 6:
{
slen=strlen("int16")+1;
datalength-=slen;
@@ -773,7 +809,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 5:
+ case 7:
{
slen=strlen("int32")+1;
datalength-=slen;
@@ -784,7 +820,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 6:
+ case 8:
{
slen=strlen("int64")+1;
datalength-=slen;
@@ -795,7 +831,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 7:
+ case 9:
{
slen=strlen("uint")+1;
datalength-=slen;
@@ -806,7 +842,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 8:
+ case 10:
{
slen=strlen("uint8")+1;
datalength-=slen;
@@ -817,7 +853,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 9:
+ case 11:
{
slen=strlen("uint16")+1;
datalength-=slen;
@@ -828,7 +864,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 10:
+ case 12:
{
slen=strlen("uint32")+1;
datalength-=slen;
@@ -839,7 +875,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 11:
+ case 13:
{
slen=strlen("uint64")+1;
datalength-=slen;
@@ -850,7 +886,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 12:
+ case 14:
{
slen=strlen("float32")+1;
datalength-=slen;
@@ -862,7 +898,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 13:
+ case 15:
{
slen=strlen("float64")+1;
datalength-=slen;
@@ -874,7 +910,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data)
}
break;
}
- case 14:
+ case 16:
{
slen=strlen("raw")+1;
datalength-=slen;
diff --git a/src/tests/dlt-test-user.c b/src/tests/dlt-test-user.c
index 16c3cab..caef49f 100755
--- a/src/tests/dlt-test-user.c
+++ b/src/tests/dlt-test-user.c
@@ -373,6 +373,8 @@ int test2m(void)
printf("Test2m: (Macro IF) Test all variable types (verbose)\n");
DLT_LOG(context_info,DLT_LOG_INFO,DLT_STRING("Test2: (Macro IF) Test all variable types (verbose)"));
+ DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("string"),DLT_STRING("Hello world"));
+ DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("utf8"),DLT_UTF8("Hello world"));
DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("bool"),DLT_BOOL(1));
DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("int"),DLT_INT(INT32_MIN)); /* (-2147483647-1) */
DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("int8"),DLT_INT8(INT8_MIN)); /* (-128) */
@@ -412,19 +414,21 @@ int test3m(void)
DLT_NONVERBOSE_MODE();
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,1,DLT_STRING("bool"),DLT_BOOL(1));
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,2,DLT_STRING("int"),DLT_INT(INT32_MIN)); /* (-2147483647-1) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,3,DLT_STRING("int8"),DLT_INT8(INT8_MIN)); /* (-128) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,4,DLT_STRING("int16"),DLT_INT16(INT16_MIN)); /* (-32767-1) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,5,DLT_STRING("int32"),DLT_INT32(INT32_MIN)); /* (-2147483647-1) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,6,DLT_STRING("int64"),DLT_INT64(INT64_MIN)); /* (-__INT64_C(9223372036854775807)-1) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,7,DLT_STRING("uint"),DLT_UINT(UINT32_MAX)); /* (4294967295U) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,8,DLT_STRING("uint8"),DLT_UINT8(UINT8_MAX)); /* (255) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,9,DLT_STRING("uint16"),DLT_UINT16(UINT16_MAX)); /* (65535) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,10,DLT_STRING("uint32"),DLT_UINT32(UINT32_MAX)); /* (4294967295U) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,11,DLT_STRING("uint64"),DLT_UINT64(UINT64_MAX)); /* (__UINT64_C(18446744073709551615)) */
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,12,DLT_STRING("float32"),DLT_FLOAT32(FLT_MIN),DLT_FLOAT32(FLT_MAX));
- DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,13,DLT_STRING("float64"),DLT_FLOAT64(DBL_MIN),DLT_FLOAT64(DBL_MAX));
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,1,DLT_STRING("string"),DLT_STRING("Hello world"));
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,2,DLT_STRING("utf8"),DLT_UTF8("Hello world"));
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,3,DLT_STRING("bool"),DLT_BOOL(1));
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,4,DLT_STRING("int"),DLT_INT(INT32_MIN)); /* (-2147483647-1) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,5,DLT_STRING("int8"),DLT_INT8(INT8_MIN)); /* (-128) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,6,DLT_STRING("int16"),DLT_INT16(INT16_MIN)); /* (-32767-1) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,7,DLT_STRING("int32"),DLT_INT32(INT32_MIN)); /* (-2147483647-1) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,8,DLT_STRING("int64"),DLT_INT64(INT64_MIN)); /* (-__INT64_C(9223372036854775807)-1) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,9,DLT_STRING("uint"),DLT_UINT(UINT32_MAX)); /* (4294967295U) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,10,DLT_STRING("uint8"),DLT_UINT8(UINT8_MAX)); /* (255) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,11,DLT_STRING("uint16"),DLT_UINT16(UINT16_MAX)); /* (65535) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,12,DLT_STRING("uint32"),DLT_UINT32(UINT32_MAX)); /* (4294967295U) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,13,DLT_STRING("uint64"),DLT_UINT64(UINT64_MAX)); /* (__UINT64_C(18446744073709551615)) */
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,14,DLT_STRING("float32"),DLT_FLOAT32(FLT_MIN),DLT_FLOAT32(FLT_MAX));
+ DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,15,DLT_STRING("float64"),DLT_FLOAT64(DBL_MIN),DLT_FLOAT64(DBL_MAX));
for(num2=0;num2<10;num2++)