2 * Dlt- Diagnostic Log and Trace console apps
5 * Copyright (C) 2011, BMW AG - Alexander Wenzel <alexander.wenzel@bmw.de>
7 * This program is free software; you can redistribute it and/or modify it under the terms of the
8 * GNU Lesser General Public License, version 2.1, as published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
10 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
11 * Public License, version 2.1, for more details.
13 * You should have received a copy of the GNU Lesser General Public License, version 2.1, along
14 * with this program; if not, see <http://www.gnu.org/licenses/lgpl-2.1.html>.
16 * Note that the copyright holders assume that the GNU Lesser General Public License, version 2.1, may
17 * also be applicable to programs even in cases in which the program is not a library in the technical sense.
19 * Linking DLT statically or dynamically with other modules is making a combined work based on DLT. You may
20 * license such other modules under the GNU Lesser General Public License, version 2.1. If you do not want to
21 * license your linked modules under the GNU Lesser General Public License, version 2.1, you
22 * may use the program under the following exception.
24 * As a special exception, the copyright holders of DLT give you permission to combine DLT
25 * with software programs or libraries that are released under any license unless such a combination is not
26 * permitted by the license of such a software program or library. You may copy and distribute such a
27 * system following the terms of the GNU Lesser General Public License, version 2.1, including this
28 * special exception, for DLT and the licenses of the other code concerned.
30 * Note that people who make modified versions of DLT are not obligated to grant this special exception
31 * for their modified versions; it is their choice whether to do so. The GNU Lesser General Public License,
32 * version 2.1, gives permission to release a modified version without this exception; this exception
33 * also makes it possible to release a modified version which carries forward this exception.
39 /*******************************************************************************
41 ** SRC-MODULE: dlt_common.c **
47 ** AUTHOR : Alexander Wenzel Alexander.AW.Wenzel@bmw.de **
54 ** PLATFORM DEPENDANT [yes/no]: yes **
56 ** TO BE CHANGED BY USER [yes/no]: no **
58 *******************************************************************************/
60 /*******************************************************************************
62 ********************************************************************************
64 ** Initials Name Company **
65 ** -------- ------------------------- ---------------------------------- **
66 ** aw Alexander Wenzel BMW **
67 ** mk Markus Klein Fraunhofer ESK **
68 *******************************************************************************/
70 /*******************************************************************************
71 ** Revision Control History **
72 *******************************************************************************/
75 * $LastChangedRevision: 1670 $
76 * $LastChangedDate: 2011-04-08 15:12:06 +0200 (Fr, 08. Apr 2011) $
82 #include <stdlib.h> /* for malloc(), free() */
83 #include <string.h> /* for strlen(), memcmp(), memmove() */
84 #include <time.h> /* for localtime(), strftime() */
86 #include "dlt_common.h"
87 #include "dlt_common_cfg.h"
90 #include "svnversion.h"
92 #if defined (__WIN32__) || defined (_MSC_VER)
93 #include <winsock2.h> /* for socket(), connect(), send(), and recv() */
95 #include <sys/socket.h> /* for socket(), connect(), send(), and recv() */
97 #include <time.h> /* for clock_gettime() */
100 #if defined (_MSC_VER)
103 #include <unistd.h> /* for read(), close() */
104 #include <sys/time.h> /* for gettimeofday() */
107 #if defined (__MSDOS__) || defined (_MSC_VER)
108 #pragma warning(disable : 4996) /* Switch off C4996 warnings */
113 static char str[DLT_COMMON_BUFFER_LENGTH];
115 const char dltSerialHeader[DLT_ID_SIZE] = { 'D','L','S',1 };
116 char dltSerialHeaderChar[DLT_ID_SIZE] = { 'D','L','S',1 };
118 static int log_as_daemon = 0;
120 char *message_type[] = {"log","app_trace","nw_trace","control","","","",""};
121 char *log_info[] = {"","fatal","error","warn","info","debug","verbose","","","","","","","","",""};
122 char *trace_type[] = {"","variable","func_in","func_out","state","vfb","","","","","","","","","",""};
123 char *nw_trace_type[] = {"","ipc","can","flexray","most","vfb","","","","","","","","","",""};
124 char *control_type[] = {"","request","response","time","","","","","","","","","","","",""};
125 static char *service_id[] = {"","set_log_level","set_trace_status","get_log_info","get_default_log_level","store_config","reset_to_factory_default",
126 "set_com_interface_status","set_com_interface_max_bandwidth","set_verbose_mode","set_message_filtering","set_timing_packets",
127 "get_local_time","use_ecu_id","use_session_id","use_timestamp","use_extended_header","set_default_log_level","set_default_trace_status",
128 "get_software_version","message_buffer_overflow"
130 static char *return_type[] = {"ok","not_supported","error","","","","","","no_matching_context_id"};
132 void dlt_print_hex(uint8_t *ptr,int size)
141 for (num=0;num<size;num++)
148 printf("%.2x",((uint8_t*)ptr)[num]);
152 int dlt_print_hex_string(char *text,int textlength,uint8_t *ptr,int size)
156 if ((ptr==0) || (text==0) || (textlength<=0) || (size<0))
161 /* Length 3: AB_ , A is first digit of hex number, B is second digit of hex number, _ is space */
162 if (textlength<(size*3))
164 dlt_log(LOG_ERR, "String does not fit binary data!\n");
168 for (num=0;num<size;num++)
176 sprintf(text,"%.2x",((uint8_t*)ptr)[num]);
177 text+=2; /* 2 chars */
183 int dlt_print_mixed_string(char *text,int textlength,uint8_t *ptr,int size,int html)
185 int required_size = 0;
188 if ((ptr==0) || (text==0) || (textlength<=0) || (size<0))
193 /* Check maximum required size and do a length check */
196 required_size=(DLT_COMMON_HEX_LINELEN+(2*DLT_COMMON_HEX_CHARS+(DLT_COMMON_HEX_CHARS-1))+DLT_COMMON_CHARLEN+DLT_COMMON_HEX_CHARS+DLT_COMMON_CHARLEN) *
197 ((size/DLT_COMMON_HEX_CHARS) + 1);
198 /* Example: (8 chars line number + (2*16 chars + 15 spaces) + space + 16 ascii chars + CR) *
199 ((size/16) lines + extra line for the rest) */
203 required_size=(DLT_COMMON_HEX_LINELEN+(2*DLT_COMMON_HEX_CHARS+(DLT_COMMON_HEX_CHARS-1))+DLT_COMMON_CHARLEN+DLT_COMMON_HEX_CHARS+4*DLT_COMMON_CHARLEN) *
204 ((size/DLT_COMMON_HEX_CHARS) + 1);
205 /* Example: (8 chars line number + (2*16 chars + 15 spaces) + space + 16 ascii chars + 4 [HTML CR: <BR>]) *
206 ((size/16) lines + extra line for the rest) */
209 if (textlength<required_size)
211 sprintf(str, "String does not fit mixed data (available=%d, required=%d) !\n", textlength, required_size);
212 dlt_log(LOG_ERR, str);
216 /* print full lines */
217 for (lines=0; lines< (size / DLT_COMMON_HEX_CHARS); lines++)
220 sprintf(text,"%.6x: ",lines * DLT_COMMON_HEX_CHARS);
221 text+=DLT_COMMON_HEX_LINELEN; /* 'XXXXXX: ' */
224 /* It is not required to decrement textlength, as it was already checked, that
225 there is enough space for the complete output */
226 dlt_print_hex_string(text,textlength,(uint8_t*)(ptr+(lines*DLT_COMMON_HEX_CHARS)),DLT_COMMON_HEX_CHARS);
227 text+=((2*DLT_COMMON_HEX_CHARS)+(DLT_COMMON_HEX_CHARS-1)); /* 32 characters + 15 spaces */
230 text+=DLT_COMMON_CHARLEN;
233 /* It is not required to decrement textlength, as it was already checked, that
234 there is enough space for the complete output */
235 dlt_print_char_string(&text,textlength,(uint8_t*)(ptr+(lines*DLT_COMMON_HEX_CHARS)),DLT_COMMON_HEX_CHARS);
240 text+=DLT_COMMON_CHARLEN;
244 sprintf(text,"<BR>");
245 text+=(4*DLT_COMMON_CHARLEN);
249 /* print partial line */
250 rest = size % DLT_COMMON_HEX_CHARS;
255 sprintf(text,"%.6x: ", (size / DLT_COMMON_HEX_CHARS) * DLT_COMMON_HEX_CHARS);
256 text+=DLT_COMMON_HEX_LINELEN; /* 'XXXXXX: ' */
259 /* It is not required to decrement textlength, as it was already checked, that
260 there is enough space for the complete output */
261 dlt_print_hex_string(text,textlength,(uint8_t*)(ptr+ ((size / DLT_COMMON_HEX_CHARS) * DLT_COMMON_HEX_CHARS)),rest);
262 text+=2*rest+(rest-1);
264 for (i=0;i<(DLT_COMMON_HEX_CHARS-rest);i++)
267 text+=(3*DLT_COMMON_CHARLEN);
271 text+=DLT_COMMON_CHARLEN;
274 /* It is not required to decrement textlength, as it was already checked, that
275 there is enough space for the complete output */
276 dlt_print_char_string(&text,textlength,(uint8_t*)(ptr+ ((size / DLT_COMMON_HEX_CHARS) * DLT_COMMON_HEX_CHARS)),rest);
282 int dlt_print_char_string(char **text,int textlength,uint8_t *ptr,int size)
291 if ((ptr==0) || (*text==0) || (textlength<=0) || (size<0))
296 if (textlength< size)
298 dlt_log(LOG_ERR, "String does not fit character data!\n");
302 for (num=0;num<size;num++)
304 if ( (((char*)ptr)[num]<DLT_COMMON_ASCII_CHAR_SPACE) || (((char*)ptr)[num]>DLT_COMMON_ASCII_CHAR_TILDE) )
310 /* replace < with . */
311 if (((char*)ptr)[num]!=DLT_COMMON_ASCII_CHAR_LT)
313 sprintf(*text,"%c",((char *)ptr)[num]);
326 void dlt_print_id(char *text,const char *id)
335 /* Initialize text */
336 for (i=0; i<DLT_ID_SIZE; i++)
341 text[DLT_ID_SIZE] = 0;
343 len = ((strlen(id)<=DLT_ID_SIZE)?strlen(id):DLT_ID_SIZE);
346 for (i=0; i<len; i++)
350 void dlt_set_id(char *id,const char *text)
399 void dlt_clean_string(char *text,int length)
408 for (num=0;num<length;num++)
410 if (text[num]=='\r' || text[num]=='\n')
417 int dlt_filter_init(DltFilter *filter,int verbose)
419 PRINT_FUNCTION_VERBOSE(verbose);
431 int dlt_filter_free(DltFilter *filter,int verbose)
433 PRINT_FUNCTION_VERBOSE(verbose);
443 int dlt_filter_load(DltFilter *filter,const char *filename,int verbose)
446 char str1[DLT_COMMON_BUFFER_LENGTH];
447 char apid[DLT_ID_SIZE],ctid[DLT_ID_SIZE];
449 PRINT_FUNCTION_VERBOSE(verbose);
456 handle = fopen(filename,"r");
459 sprintf(str,"Filter file %s cannot be opened!\n",filename);
460 dlt_log(LOG_ERR, str);
467 while (!feof(handle))
470 if (fscanf(handle,"%s",str1)!=1)
479 if (strcmp(str1,"----")==0)
485 dlt_set_id(apid,str1);
489 if (fscanf(handle,"%s",str1)!=1)
497 printf(" %s\r\n",str1);
498 if (strcmp(str1,"----")==0)
504 dlt_set_id(ctid,str1);
507 if (filter->counter<DLT_FILTER_MAX)
509 dlt_filter_add(filter,apid,ctid,verbose);
513 sprintf(str, "Maximum number (%d) of allowed filters reached!\n", DLT_FILTER_MAX);
514 dlt_log(LOG_ERR, str);
524 int dlt_filter_save(DltFilter *filter,const char *filename,int verbose)
528 char buf[DLT_COMMON_BUFFER_LENGTH];
530 PRINT_FUNCTION_VERBOSE(verbose);
537 handle = fopen(filename,"w");
540 sprintf(str,"Filter file %s cannot be opened!\n",filename);
541 dlt_log(LOG_ERR, str);
545 for (num=0;num<filter->counter;num++)
547 if (filter->apid[num][0]==0)
549 fprintf(handle,"---- ");
553 dlt_print_id(buf,filter->apid[num]);
554 fprintf(handle,"%s ",buf);
556 if (filter->ctid[num][0]==0)
558 fprintf(handle,"---- ");
562 dlt_print_id(buf,filter->ctid[num]);
563 fprintf(handle,"%s ",buf);
572 int dlt_filter_find(DltFilter *filter,const char *apid,const char *ctid, int verbose)
576 PRINT_FUNCTION_VERBOSE(verbose);
578 if ((filter==0) || (apid==0))
583 for (num=0; num<filter->counter; num++)
585 if (memcmp(filter->apid[num],apid,DLT_ID_SIZE)==0)
587 /* apid matches, now check for ctid */
590 /* check if empty ctid matches */
591 if (memcmp(filter->ctid[num],"",DLT_ID_SIZE)==0)
598 if (memcmp(filter->ctid[num],ctid,DLT_ID_SIZE)==0)
606 return -1; /* Not found */
609 int dlt_filter_add(DltFilter *filter,const char *apid,const char *ctid, int verbose)
611 PRINT_FUNCTION_VERBOSE(verbose);
613 if ((filter==0) || (apid==0))
618 if (filter->counter >= DLT_FILTER_MAX)
620 dlt_log(LOG_ERR, "Maximum numbers of allowed filters reached!\n");
624 /* add each filter (apid, ctid) only once to filter array */
625 if (dlt_filter_find(filter,apid,ctid,verbose)<0)
627 /* filter not found, so add it to filter array */
628 if (filter->counter<DLT_FILTER_MAX)
630 dlt_set_id(filter->apid[filter->counter],apid);
631 dlt_set_id(filter->ctid[filter->counter],(ctid?ctid:""));
642 int dlt_filter_delete(DltFilter *filter,const char *apid,const char *ctid, int verbose)
647 PRINT_FUNCTION_VERBOSE(verbose);
649 if ((filter==0) || (apid==0))
654 if (filter->counter>0)
656 /* Get first occurence of apid and ctid in filter array */
657 for (j=0; j<filter->counter; j++)
659 if ((memcmp(filter->apid[j],apid,DLT_ID_SIZE)==0) &&
660 (memcmp(filter->ctid[j],ctid,DLT_ID_SIZE)==0)
672 /* Copy from j+1 til end to j til end-1 */
674 dlt_set_id(filter->apid[j],"");
675 dlt_set_id(filter->ctid[j],"");
677 for (k=j; k<(filter->counter-1); k++)
679 dlt_set_id(filter->apid[k],filter->apid[k+1]);
680 dlt_set_id(filter->ctid[k],filter->ctid[k+1]);
691 int dlt_message_init(DltMessage *msg,int verbose)
693 PRINT_FUNCTION_VERBOSE(verbose);
700 /* initalise structure parameters */
706 msg->storageheader = 0;
707 msg->standardheader = 0;
708 msg->extendedheader = 0;
710 msg->found_serialheader = 0;
715 int dlt_message_free(DltMessage *msg,int verbose)
717 PRINT_FUNCTION_VERBOSE(verbose);
723 /* delete databuffer if exists */
726 free(msg->databuffer);
733 int dlt_message_header(DltMessage *msg,char *text,int textlength,int verbose)
735 return dlt_message_header_flags(msg,text,textlength,DLT_HEADER_SHOW_ALL,verbose);
738 int dlt_message_header_flags(DltMessage *msg,char *text,int textlength,int flags, int verbose)
740 struct tm * timeinfo;
741 char buffer [DLT_COMMON_BUFFER_LENGTH];
743 PRINT_FUNCTION_VERBOSE(verbose);
745 if ((msg==0) || (text==0) || (textlength<=0))
750 if ((flags<DLT_HEADER_SHOW_NONE) || (flags>DLT_HEADER_SHOW_ALL))
757 if ((flags & DLT_HEADER_SHOW_TIME) == DLT_HEADER_SHOW_TIME)
759 /* print received time */
760 timeinfo = localtime ((const time_t*)(&(msg->storageheader->seconds)));
764 strftime (buffer,sizeof(buffer),"%Y/%m/%d %H:%M:%S",timeinfo);
765 sprintf(text,"%s.%.6d ",buffer,msg->storageheader->microseconds);
769 if ((flags & DLT_HEADER_SHOW_TMSTP) == DLT_HEADER_SHOW_TMSTP)
771 /* print timestamp if available */
772 if ( DLT_IS_HTYP_WTMS(msg->standardheader->htyp) )
774 sprintf(text+strlen(text),"%10u ",msg->headerextra.tmsp);
778 sprintf(text+strlen(text),"---------- ");
782 if ((flags & DLT_HEADER_SHOW_MSGCNT) == DLT_HEADER_SHOW_MSGCNT)
784 /* print message counter */
785 sprintf(text+strlen(text),"%.3d ",msg->standardheader->mcnt);
788 if ((flags & DLT_HEADER_SHOW_ECUID) == DLT_HEADER_SHOW_ECUID)
790 /* print ecu id, use header extra if available, else storage header value */
791 if ( DLT_IS_HTYP_WEID(msg->standardheader->htyp) )
793 dlt_print_id(text+strlen(text),msg->headerextra.ecu);
797 dlt_print_id(text+strlen(text),msg->storageheader->ecu);
801 /* print app id and context id if extended header available, else '----' */#
802 if ((flags & DLT_HEADER_SHOW_APID) == DLT_HEADER_SHOW_APID)
804 sprintf(text+strlen(text)," ");
805 if ((DLT_IS_HTYP_UEH(msg->standardheader->htyp)) && (msg->extendedheader->apid[0]!=0))
807 dlt_print_id(text+strlen(text),msg->extendedheader->apid);
811 sprintf(text+strlen(text),"----");
814 sprintf(text+strlen(text)," ");
817 if ((flags & DLT_HEADER_SHOW_CTID) == DLT_HEADER_SHOW_CTID)
819 if ((DLT_IS_HTYP_UEH(msg->standardheader->htyp)) && (msg->extendedheader->ctid[0]!=0))
821 dlt_print_id(text+strlen(text),msg->extendedheader->ctid);
825 sprintf(text+strlen(text),"----");
828 sprintf(text+strlen(text)," ");
831 /* print info about message type and length */
832 if (DLT_IS_HTYP_UEH(msg->standardheader->htyp))
834 if ((flags & DLT_HEADER_SHOW_MSGTYPE) == DLT_HEADER_SHOW_MSGTYPE)
836 sprintf(text+strlen(text),"%s",message_type[DLT_GET_MSIN_MSTP(msg->extendedheader->msin)]);
837 sprintf(text+strlen(text)," ");
840 if ((flags & DLT_HEADER_SHOW_MSGSUBTYPE) == DLT_HEADER_SHOW_MSGSUBTYPE)
842 if ((DLT_GET_MSIN_MSTP(msg->extendedheader->msin))==DLT_TYPE_LOG)
844 sprintf(text+strlen(text),"%s",log_info[DLT_GET_MSIN_MTIN(msg->extendedheader->msin)]);
847 if ((DLT_GET_MSIN_MSTP(msg->extendedheader->msin))==DLT_TYPE_APP_TRACE)
849 sprintf(text+strlen(text),"%s",trace_type[DLT_GET_MSIN_MTIN(msg->extendedheader->msin)]);
852 if ((DLT_GET_MSIN_MSTP(msg->extendedheader->msin))==DLT_TYPE_NW_TRACE)
854 sprintf(text+strlen(text),"%s",nw_trace_type[DLT_GET_MSIN_MTIN(msg->extendedheader->msin)]);
857 if ((DLT_GET_MSIN_MSTP(msg->extendedheader->msin))==DLT_TYPE_CONTROL)
859 sprintf(text+strlen(text),"%s",control_type[DLT_GET_MSIN_MTIN(msg->extendedheader->msin)]);
862 sprintf(text+strlen(text)," ");
865 if ((flags & DLT_HEADER_SHOW_VNVSTATUS) == DLT_HEADER_SHOW_VNVSTATUS)
867 /* print verbose status pf message */
868 if (DLT_IS_MSIN_VERB(msg->extendedheader->msin))
870 sprintf(text+strlen(text),"V");
874 sprintf(text+strlen(text),"N");
877 sprintf(text+strlen(text)," ");
880 if ((flags & DLT_HEADER_SHOW_NOARG) == DLT_HEADER_SHOW_NOARG)
882 /* print number of arguments */
883 sprintf(text+strlen(text),"%d", msg->extendedheader->noar);
889 if ((flags & DLT_HEADER_SHOW_MSGTYPE) == DLT_HEADER_SHOW_MSGTYPE)
891 sprintf(text+strlen(text),"--- ");
894 if ((flags & DLT_HEADER_SHOW_MSGSUBTYPE) == DLT_HEADER_SHOW_MSGSUBTYPE)
896 sprintf(text+strlen(text),"--- ");
899 if ((flags & DLT_HEADER_SHOW_VNVSTATUS) == DLT_HEADER_SHOW_VNVSTATUS)
901 sprintf(text+strlen(text),"N ");
904 if ((flags & DLT_HEADER_SHOW_NOARG) == DLT_HEADER_SHOW_NOARG)
906 sprintf(text+strlen(text),"-");
913 int dlt_message_payload(DltMessage *msg,char *text,int textlength,int type,int verbose)
915 uint32_t id=0,id_tmp=0;
921 /* Pointer to ptr and datalength */
923 int32_t *pdatalength;
928 uint32_t type_info=0,type_info_tmp=0;
930 PRINT_FUNCTION_VERBOSE(verbose);
932 if ((msg==0) || (text==0))
939 dlt_log(LOG_ERR, "String does not fit binary data!\n");
943 /* start with empty string */
946 /* print payload only as hex */
947 if (type==DLT_OUTPUT_HEX)
949 return dlt_print_hex_string(text,textlength,msg->databuffer,msg->datasize);
952 /* print payload as mixed */
953 if (type==DLT_OUTPUT_MIXED_FOR_PLAIN)
955 return dlt_print_mixed_string(text,textlength,msg->databuffer,msg->datasize,0);
958 if (type==DLT_OUTPUT_MIXED_FOR_HTML)
960 return dlt_print_mixed_string(text,textlength,msg->databuffer,msg->datasize,1);
963 ptr = msg->databuffer;
964 datalength = msg->datasize;
966 /* Pointer to ptr and datalength */
968 pdatalength = &datalength;
970 /* non-verbose mode */
972 /* print payload as hex */
973 if (DLT_MSG_IS_NONVERBOSE(msg))
976 DLT_MSG_READ_VALUE(id_tmp,ptr,datalength,uint32_t);
977 id=DLT_ENDIAN_GET_32(msg->standardheader->htyp, id_tmp);
979 if (textlength<((datalength*3)+20))
981 dlt_log(LOG_ERR, "String does not fit binary data!\n");
985 /* process message id / service id */
986 if (DLT_MSG_IS_CONTROL(msg))
988 if (id > 0 && id <= DLT_SERVICE_ID_MESSAGE_BUFFER_OVERFLOW)
990 sprintf(text+strlen(text),"%s",service_id[id]); /* service id */
994 if (!(DLT_MSG_IS_CONTROL_TIME(msg)))
996 sprintf(text+strlen(text),"service(%u)",id); /* service id */
1002 sprintf(text+strlen(text),", ");
1007 sprintf(text+strlen(text),"%u, ",id); /* message id */
1010 /* process return value */
1011 if (DLT_MSG_IS_CONTROL_RESPONSE(msg))
1015 DLT_MSG_READ_VALUE(retval,ptr,datalength,uint8_t); /* No endian conversion necessary */
1016 if ( (retval<3) || (retval==8))
1018 sprintf(text+strlen(text),"%s",return_type[retval]);
1022 sprintf(text+strlen(text),"%.2x",retval);
1027 sprintf(text+strlen(text),", ");
1032 if (type==DLT_OUTPUT_ASCII_LIMITED)
1034 ret=dlt_print_hex_string(text+strlen(text),textlength-strlen(text),ptr,
1035 (datalength>DLT_COMMON_ASCII_LIMIT_MAX_CHARS?DLT_COMMON_ASCII_LIMIT_MAX_CHARS:datalength));
1036 if ((datalength>DLT_COMMON_ASCII_LIMIT_MAX_CHARS) &&
1037 ((textlength-strlen(text))>4))
1039 sprintf(text+strlen(text)," ...");
1044 ret=dlt_print_hex_string(text+strlen(text),textlength-strlen(text),ptr,datalength);
1050 /* At this point, it is ensured that a extended header is available */
1056 for (num=0;num<(int)(msg->extendedheader->noar);num++)
1060 sprintf(text+strlen(text)," ");
1063 /* first read the type info of the argument */
1064 DLT_MSG_READ_VALUE(type_info_tmp,ptr,datalength,uint32_t);
1065 type_info=DLT_ENDIAN_GET_32(msg->standardheader->htyp, type_info_tmp);
1067 /* print out argument */
1068 if (dlt_message_argument_print(msg, type_info, pptr, pdatalength, text, textlength, -1, 0)==-1)
1077 int dlt_message_filter_check(DltMessage *msg,DltFilter *filter,int verbose)
1079 /* check the filters if message is used */
1083 PRINT_FUNCTION_VERBOSE(verbose);
1085 if ((msg==0) || (filter==0))
1090 if ((filter->counter==0) || (!(DLT_IS_HTYP_UEH(msg->standardheader->htyp))))
1092 /* no filter is set, or no extended header is available, so do as filter is matching */
1096 for (num=0;num<filter->counter;num++)
1098 /* check each filter if it matches */
1099 if ((DLT_IS_HTYP_UEH(msg->standardheader->htyp)) &&
1100 (filter->apid[num][0]==0 || memcmp(filter->apid[num],msg->extendedheader->apid,DLT_ID_SIZE)==0) &&
1101 (filter->ctid[num][0]==0 || memcmp(filter->ctid[num],msg->extendedheader->ctid,DLT_ID_SIZE)==0) )
1111 int dlt_message_read(DltMessage *msg,uint8_t *buffer,unsigned int length,int resync, int verbose)
1115 PRINT_FUNCTION_VERBOSE(verbose);
1117 if ((msg==0) || (buffer==0) || (length<=0))
1122 /* initialize resync_offset */
1123 msg->resync_offset=0;
1125 /* check if message contains serial header, smaller than standard header */
1126 if (length<sizeof(dltSerialHeader))
1128 /* dlt_log(LOG_ERR, "Length smaller than serial header!\n"); */
1132 if (memcmp(buffer,dltSerialHeader,sizeof(dltSerialHeader)) == 0)
1134 /* serial header found */
1135 msg->found_serialheader = 1;
1136 buffer += sizeof(dltSerialHeader);
1137 length -= sizeof(dltSerialHeader);
1141 /* serial header not found */
1142 msg->found_serialheader = 0;
1145 /* resync if necessary */
1146 msg->resync_offset=0;
1150 if (memcmp(buffer+msg->resync_offset,dltSerialHeader,sizeof(dltSerialHeader)) == 0)
1152 /* serial header found */
1153 msg->found_serialheader = 1;
1154 buffer += sizeof(dltSerialHeader);
1155 length -= sizeof(dltSerialHeader);
1159 msg->resync_offset++;
1161 while ((sizeof(dltSerialHeader)+msg->resync_offset)<=length);
1163 /* Set new start offset */
1164 if (msg->resync_offset>0)
1166 /* Resyncing connection */
1167 buffer+=msg->resync_offset;
1168 length-=msg->resync_offset;
1173 /* check that standard header fits buffer */
1174 if (length<sizeof(DltStandardHeader))
1176 /* dlt_log(LOG_ERR, "Length smaller than standard header!\n"); */
1179 memcpy(msg->headerbuffer+sizeof(DltStorageHeader),buffer,sizeof(DltStandardHeader));
1181 /* set ptrs to structures */
1182 msg->storageheader = (DltStorageHeader*) msg->headerbuffer;
1183 msg->standardheader = (DltStandardHeader*) (msg->headerbuffer + sizeof(DltStorageHeader));
1185 /* calculate complete size of headers */
1186 extra_size = DLT_STANDARD_HEADER_EXTRA_SIZE(msg->standardheader->htyp)+(DLT_IS_HTYP_UEH(msg->standardheader->htyp) ? sizeof(DltExtendedHeader) : 0);
1187 msg->headersize = sizeof(DltStorageHeader) + sizeof(DltStandardHeader) + extra_size;
1188 msg->datasize = DLT_BETOH_16(msg->standardheader->len) - (msg->headersize - sizeof(DltStorageHeader));
1192 sprintf(str,"Buffer length: %d\n",length);
1193 dlt_log(LOG_INFO, str);
1197 sprintf(str,"Header Size: %d\n",msg->headersize);
1198 dlt_log(LOG_INFO, str);
1202 sprintf(str,"Data Size: %d\n",msg->datasize);
1203 dlt_log(LOG_INFO, str);
1206 /* check data size */
1207 if (msg->datasize < 0)
1209 sprintf(str,"Plausibility check failed. Complete message size too short (%d)!\n",msg->datasize);
1210 dlt_log(LOG_ERR, str);
1214 /* load standard header extra parameters and Extended header if used */
1217 if (length < (msg->headersize - sizeof(DltStorageHeader)))
1222 memcpy(msg->headerbuffer+sizeof(DltStorageHeader)+sizeof(DltStandardHeader),buffer+sizeof(DltStandardHeader),extra_size);
1224 /* set extended header ptr and get standard header extra parameters */
1225 if (DLT_IS_HTYP_UEH(msg->standardheader->htyp))
1227 msg->extendedheader = (DltExtendedHeader*) (msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader) +
1228 DLT_STANDARD_HEADER_EXTRA_SIZE(msg->standardheader->htyp));
1232 msg->extendedheader = 0;
1235 dlt_message_get_extraparameters(msg,verbose);
1238 /* check if payload fits length */
1239 if (length < (msg->headersize - sizeof(DltStorageHeader) + msg->datasize))
1241 /* dlt_log(LOG_ERR,"length does not fit!\n"); */
1245 /* free last used memory for buffer */
1246 if (msg->databuffer)
1248 free(msg->databuffer);
1251 /* get new memory for buffer */
1252 msg->databuffer = (uint8_t *)malloc(msg->datasize);
1253 if (msg->databuffer == 0)
1255 sprintf(str,"Cannot allocate memory for payload buffer of size %d!\n",msg->datasize);
1256 dlt_log(LOG_ERR, str);
1260 /* load payload data from buffer */
1261 memcpy(msg->databuffer,buffer+(msg->headersize-sizeof(DltStorageHeader)),msg->datasize);
1266 int dlt_message_get_extraparameters(DltMessage *msg,int verbose)
1268 PRINT_FUNCTION_VERBOSE(verbose);
1275 if (DLT_IS_HTYP_WEID(msg->standardheader->htyp))
1277 memcpy(msg->headerextra.ecu,msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader),DLT_ID_SIZE);
1280 if (DLT_IS_HTYP_WSID(msg->standardheader->htyp))
1282 memcpy(&(msg->headerextra.seid),msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader)
1283 + (DLT_IS_HTYP_WEID(msg->standardheader->htyp) ? DLT_SIZE_WEID : 0), DLT_SIZE_WSID);
1284 msg->headerextra.seid = DLT_BETOH_32(msg->headerextra.seid);
1287 if (DLT_IS_HTYP_WTMS(msg->standardheader->htyp))
1289 memcpy(&(msg->headerextra.tmsp),msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader)
1290 + (DLT_IS_HTYP_WEID(msg->standardheader->htyp) ? DLT_SIZE_WEID : 0)
1291 + (DLT_IS_HTYP_WSID(msg->standardheader->htyp) ? DLT_SIZE_WSID : 0),DLT_SIZE_WTMS);
1292 msg->headerextra.tmsp = DLT_BETOH_32(msg->headerextra.tmsp);
1298 int dlt_message_set_extraparameters(DltMessage *msg,int verbose)
1300 PRINT_FUNCTION_VERBOSE(verbose);
1307 if (DLT_IS_HTYP_WEID(msg->standardheader->htyp))
1309 memcpy(msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader),msg->headerextra.ecu,DLT_ID_SIZE);
1312 if (DLT_IS_HTYP_WSID(msg->standardheader->htyp))
1314 msg->headerextra.seid = DLT_HTOBE_32(msg->headerextra.seid);
1315 memcpy(msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader)
1316 + (DLT_IS_HTYP_WEID(msg->standardheader->htyp) ? DLT_SIZE_WEID : 0), &(msg->headerextra.seid),DLT_SIZE_WSID);
1319 if (DLT_IS_HTYP_WTMS(msg->standardheader->htyp))
1321 msg->headerextra.tmsp = DLT_HTOBE_32(msg->headerextra.tmsp);
1322 memcpy(msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader)
1323 + (DLT_IS_HTYP_WEID(msg->standardheader->htyp) ? DLT_SIZE_WEID : 0)
1324 + (DLT_IS_HTYP_WSID(msg->standardheader->htyp) ? DLT_SIZE_WSID : 0), &(msg->headerextra.tmsp),DLT_SIZE_WTMS);
1330 int dlt_file_init(DltFile *file,int verbose)
1332 PRINT_FUNCTION_VERBOSE(verbose);
1339 /* initalise structure parameters */
1342 file->counter_total = 0;
1346 file->filter_counter = 0;
1347 file->file_position = 0;
1351 file->error_messages = 0;
1353 return dlt_message_init(&(file->msg),verbose);
1356 int dlt_file_set_filter(DltFile *file,DltFilter *filter,int verbose)
1358 PRINT_FUNCTION_VERBOSE(verbose);
1366 file->filter = filter;
1371 int dlt_file_read_header(DltFile *file,int verbose)
1373 PRINT_FUNCTION_VERBOSE(verbose);
1380 /* load header from file */
1381 if (fread(file->msg.headerbuffer,sizeof(DltStorageHeader)+sizeof(DltStandardHeader),1,file->handle)!=1)
1383 if (!feof(file->handle))
1385 dlt_log(LOG_ERR, "Cannot read header from file!\n");
1390 /* set ptrs to structures */
1391 file->msg.storageheader = (DltStorageHeader*) file->msg.headerbuffer;
1392 file->msg.standardheader = (DltStandardHeader*) (file->msg.headerbuffer + sizeof(DltStorageHeader));
1394 /* check id of storage header */
1395 if (dlt_check_storageheader(file->msg.storageheader)==0)
1397 dlt_log(LOG_ERR, "DLT storage header pattern not found!\n");
1401 /* calculate complete size of headers */
1402 file->msg.headersize = sizeof(DltStorageHeader) + sizeof(DltStandardHeader) +
1403 DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp) + (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp) ? sizeof(DltExtendedHeader) : 0);
1404 file->msg.datasize = DLT_BETOH_16(file->msg.standardheader->len) + sizeof(DltStorageHeader) - file->msg.headersize;
1407 sprintf(str,"Header Size: %d\n",file->msg.headersize);
1408 dlt_log(LOG_INFO, str);
1412 sprintf(str,"Data Size: %d\n",file->msg.datasize);
1413 dlt_log(LOG_INFO, str);
1416 /* check data size */
1417 if (file->msg.datasize < 0)
1419 sprintf(str,"Plausibility check failed. Complete message size too short! (%d)\n", file->msg.datasize);
1420 dlt_log(LOG_ERR, str);
1427 int dlt_file_read_header_raw(DltFile *file,int resync,int verbose)
1429 char dltSerialHeaderBuffer[DLT_ID_SIZE];
1431 PRINT_FUNCTION_VERBOSE(verbose);
1438 /* check if serial header exists, ignore if found */
1439 if (fread(dltSerialHeaderBuffer,sizeof(dltSerialHeaderBuffer),1,file->handle)!=1)
1441 /* cannot read serial header, not enough data available in file */
1442 if (!feof(file->handle))
1444 dlt_log(LOG_ERR, "Cannot read header from file!\n");
1448 if (memcmp(dltSerialHeaderBuffer,dltSerialHeader,sizeof(dltSerialHeader)) == 0)
1450 /* serial header found */
1451 /* nothing to do continue reading */
1456 /* serial header not found */
1459 /* increase error counter */
1460 file->error_messages++;
1462 /* resync to serial header */
1465 memmove(dltSerialHeaderBuffer,dltSerialHeaderBuffer+1,sizeof(dltSerialHeader)-1);
1466 if (fread(dltSerialHeaderBuffer+3,1,1,file->handle)!=1)
1468 /* cannot read any data, perhaps end of file reached */
1471 if (memcmp(dltSerialHeaderBuffer,dltSerialHeader,sizeof(dltSerialHeader)) == 0)
1473 /* serial header synchronised */
1480 /* go back to last file position */
1481 fseek(file->handle,file->file_position,SEEK_SET);
1485 /* load header from file */
1486 if (fread(file->msg.headerbuffer+sizeof(DltStorageHeader),sizeof(DltStandardHeader),1,file->handle)!=1)
1488 if (!feof(file->handle))
1490 dlt_log(LOG_ERR, "Cannot read header from file!\n");
1495 /* set ptrs to structures */
1496 file->msg.storageheader = (DltStorageHeader*) file->msg.headerbuffer; // this points now to a empty storage header (filled with '0')
1497 file->msg.standardheader = (DltStandardHeader*) (file->msg.headerbuffer + sizeof(DltStorageHeader));
1499 /* Skip storage header field, fill this field with '0' */
1500 memset(file->msg.storageheader,0,sizeof(DltStorageHeader));
1502 /* Set storage header */
1503 dlt_set_storageheader(file->msg.storageheader,DLT_COMMON_DUMMY_ECUID);
1505 /* no check for storage header id*/
1507 /* calculate complete size of headers */
1508 file->msg.headersize = sizeof(DltStorageHeader) + sizeof(DltStandardHeader) +
1509 DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp) + (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp) ? sizeof(DltExtendedHeader) : 0);
1510 file->msg.datasize = DLT_BETOH_16(file->msg.standardheader->len) + sizeof(DltStorageHeader) - file->msg.headersize;
1513 sprintf(str,"Header Size: %d\n",file->msg.headersize);
1514 dlt_log(LOG_INFO, str);
1518 sprintf(str,"Data Size: %d\n",file->msg.datasize);
1519 dlt_log(LOG_INFO, str);
1522 /* check data size */
1523 if (file->msg.datasize < 0)
1525 sprintf(str,"Plausibility check failed. Complete message size too short! (%d)\n", file->msg.datasize);
1526 dlt_log(LOG_ERR, str);
1533 int dlt_file_read_header_extended(DltFile *file, int verbose)
1535 PRINT_FUNCTION_VERBOSE(verbose);
1542 /* load standard header extra parameters if used */
1543 if (DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp))
1545 if (fread(file->msg.headerbuffer+sizeof(DltStorageHeader)+sizeof(DltStandardHeader),
1546 DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp),
1549 dlt_log(LOG_ERR, "Cannot read standard header extra parameters from file!\n");
1553 dlt_message_get_extraparameters(&(file->msg),verbose);
1556 /* load Extended header if used */
1557 if (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp)==0)
1559 /* there is nothing to be loaded */
1563 if (fread(file->msg.headerbuffer+sizeof(DltStorageHeader)+sizeof(DltStandardHeader)+DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp),
1564 (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp) ? sizeof(DltExtendedHeader) : 0),
1567 dlt_log(LOG_ERR, "Cannot read extended header from file!\n");
1571 /* set extended header ptr */
1572 if (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp))
1574 file->msg.extendedheader = (DltExtendedHeader*) (file->msg.headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader) +
1575 DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp));
1579 file->msg.extendedheader = 0;
1585 int dlt_file_read_data(DltFile *file, int verbose)
1587 PRINT_FUNCTION_VERBOSE(verbose);
1594 /* free last used memory for buffer */
1595 if (file->msg.databuffer)
1597 free(file->msg.databuffer);
1600 /* get new memory for buffer */
1601 file->msg.databuffer = (uint8_t *)malloc(file->msg.datasize);
1603 if (file->msg.databuffer == 0)
1605 sprintf(str,"Cannot allocate memory for payload buffer of size %d!\n",file->msg.datasize);
1606 dlt_log(LOG_ERR, str);
1610 /* load payload data from file */
1611 if (fread(file->msg.databuffer,file->msg.datasize,1,file->handle)!=1)
1613 if (file->msg.datasize!=0)
1615 sprintf(str,"Cannot read payload data from file of size %d!\n",file->msg.datasize);
1616 dlt_log(LOG_ERR, str);
1624 int dlt_file_open(DltFile *file,const char *filename,int verbose)
1626 PRINT_FUNCTION_VERBOSE(verbose);
1633 /* reset counters */
1635 file->counter_total = 0;
1637 file->file_position = 0;
1638 file->file_length = 0;
1639 file->error_messages = 0;
1643 fclose(file->handle);
1647 file->handle = fopen(filename,"rb");
1648 if (file->handle == 0)
1650 sprintf(str,"File %s cannot be opened!\n",filename);
1651 dlt_log(LOG_ERR, str);
1655 fseek(file->handle,0,SEEK_END);
1656 file->file_length = ftell(file->handle);
1657 fseek(file->handle,0,SEEK_SET);
1661 /* print file length */
1662 sprintf(str,"File is %lu bytes long\n",file->file_length);
1663 dlt_log(LOG_INFO, str);
1668 int dlt_file_read(DltFile *file,int verbose)
1675 sprintf(str,"%s: Message %d:\n",__func__, file->counter_total);
1676 dlt_log(LOG_INFO, str);
1684 /* allocate new memory for index if number of messages exceeds a multiple of DLT_COMMON_INDEX_ALLOC (e.g.: 1000) */
1685 if (file->counter % DLT_COMMON_INDEX_ALLOC == 0)
1687 ptr = (long *) malloc(((file->counter/DLT_COMMON_INDEX_ALLOC) + 1) * DLT_COMMON_INDEX_ALLOC * sizeof(long));
1696 memcpy(ptr,file->index,file->counter * sizeof(long));
1702 /* set to end of last succesful read message, because of conflicting calls to dlt_file_read and dlt_file_message */
1703 fseek(file->handle,file->file_position,SEEK_SET);
1705 /* get file position at start of DLT message */
1708 sprintf(str,"Position in file: %ld\n",file->file_position);
1709 dlt_log(LOG_INFO, str);
1713 if (dlt_file_read_header(file,verbose)<0)
1715 /* go back to last position in file */
1716 fseek(file->handle,file->file_position,SEEK_SET);
1722 /* read the extended header if filter is enabled and extended header exists */
1723 if (dlt_file_read_header_extended(file, verbose)<0)
1725 /* go back to last position in file */
1726 fseek(file->handle,file->file_position,SEEK_SET);
1730 /* check the filters if message is used */
1731 if (dlt_message_filter_check(&(file->msg),file->filter,verbose) == 1)
1733 /* filter matched, consequently store current message */
1734 /* store index pointer to message position in DLT file */
1735 file->index[file->counter] = file->file_position;
1737 file->position = file->counter - 1;
1742 /* skip payload data */
1743 if (fseek(file->handle,file->msg.datasize,SEEK_CUR)!=0)
1745 /* go back to last position in file */
1746 fseek(file->handle,file->file_position,SEEK_SET);
1747 sprintf(str,"Seek failed to skip payload data of size %d!\n",file->msg.datasize);
1748 dlt_log(LOG_ERR, str);
1754 /* filter is disabled */
1755 /* skip additional header parameters and payload data */
1756 if (fseek(file->handle,file->msg.headersize - sizeof(DltStorageHeader) - sizeof(DltStandardHeader) + file->msg.datasize,SEEK_CUR))
1758 /* go back to last position in file */
1759 fseek(file->handle,file->file_position,SEEK_SET);
1760 sprintf(str,"Seek failed to skip extra header and payload data from file of size %d!\n",
1761 file->msg.headersize - sizeof(DltStorageHeader) - sizeof(DltStandardHeader) + file->msg.datasize);
1762 dlt_log(LOG_ERR, str);
1766 /* store index pointer to message position in DLT file */
1767 file->index[file->counter] = file->file_position;
1769 file->position = file->counter - 1;
1774 /* increase total message counter */
1775 file->counter_total++;
1777 /* store position to next message */
1778 file->file_position = ftell(file->handle);
1783 int dlt_file_read_raw(DltFile *file,int resync, int verbose)
1790 sprintf(str,"%s: Message %d:\n",__func__, file->counter_total);
1791 dlt_log(LOG_INFO, str);
1797 /* allocate new memory for index if number of messages exceeds a multiple of DLT_COMMON_INDEX_ALLOC (e.g.: 1000) */
1798 if (file->counter % DLT_COMMON_INDEX_ALLOC == 0)
1800 ptr = (long *) malloc(((file->counter/DLT_COMMON_INDEX_ALLOC) + 1) * DLT_COMMON_INDEX_ALLOC * sizeof(long));
1809 memcpy(ptr,file->index,file->counter * sizeof(long));
1815 /* set to end of last succesful read message, because of conflicting calls to dlt_file_read and dlt_file_message */
1816 fseek(file->handle,file->file_position,SEEK_SET);
1818 /* get file position at start of DLT message */
1821 sprintf(str,"Position in file: %ld\n",file->file_position);
1822 dlt_log(LOG_INFO, str);
1826 if (dlt_file_read_header_raw(file,resync,verbose)<0)
1828 /* go back to last position in file */
1829 fseek(file->handle,file->file_position,SEEK_SET);
1833 /* read the extended header if filter is enabled and extended header exists */
1834 if (dlt_file_read_header_extended(file, verbose)<0)
1836 /* go back to last position in file */
1837 fseek(file->handle,file->file_position,SEEK_SET);
1841 if (dlt_file_read_data(file,verbose)<0)
1843 /* go back to last position in file */
1844 fseek(file->handle,file->file_position,SEEK_SET);
1848 /* store index pointer to message position in DLT file */
1849 file->index[file->counter] = file->file_position;
1851 file->position = file->counter - 1;
1855 /* increase total message counter */
1856 file->counter_total++;
1858 /* store position to next message */
1859 file->file_position = ftell(file->handle);
1864 int dlt_file_close(DltFile *file,int verbose)
1866 PRINT_FUNCTION_VERBOSE(verbose);
1875 fclose(file->handle);
1883 int dlt_file_message(DltFile *file,int index,int verbose)
1885 PRINT_FUNCTION_VERBOSE(verbose);
1892 /* check if message is in range */
1893 if (index >= file->counter)
1895 sprintf(str,"Message %d out of range!\r\n",index);
1896 dlt_log(LOG_ERR, str);
1900 /* seek to position in file */
1901 if (fseek(file->handle,file->index[index],SEEK_SET)!=0)
1903 sprintf(str,"Seek to message %d to position %ld failed!\r\n",index,file->index[index]);
1904 dlt_log(LOG_ERR, str);
1908 /* read all header and payload */
1909 if (dlt_file_read_header(file,verbose)<0)
1914 if (dlt_file_read_header_extended(file,verbose)<0)
1919 if (dlt_file_read_data(file,verbose)<0)
1924 /* set current position in file */
1925 file->position = index;
1930 int dlt_file_free(DltFile *file,int verbose)
1932 PRINT_FUNCTION_VERBOSE(verbose);
1939 /* delete index lost if exists */
1949 fclose(file->handle);
1953 return dlt_message_free(&(file->msg),verbose);
1956 void dlt_log_init(int mode)
1958 log_as_daemon = mode;
1961 void dlt_log_free(void)
1963 /* Nothing to be done yet */
1966 int dlt_log(int prio, char *s)
1968 char logfmtstring[DLT_COMMON_BUFFER_LENGTH];
1979 strcpy(logfmtstring,"DLT| EMERGENCY: %s");
1984 strcpy(logfmtstring,"DLT| ALERT: %s");
1989 strcpy(logfmtstring,"DLT| CRITICAL: %s");
1994 strcpy(logfmtstring,"DLT| ERROR: %s");
1999 strcpy(logfmtstring,"DLT| WARNING: %s");
2004 strcpy(logfmtstring,"DLT| NOTICE: %s");
2009 strcpy(logfmtstring,"DLT| INFO: %s");
2014 strcpy(logfmtstring,"DLT| DEBUG: %s");
2019 strcpy(logfmtstring,"DLT| %s");
2024 #if !defined (__WIN32__) && !defined(_MSC_VER)
2027 openlog("DLT",LOG_PID,LOG_DAEMON);
2028 syslog(prio, logfmtstring, s);
2034 printf(logfmtstring, s);
2040 int dlt_receiver_init(DltReceiver *receiver,int fd, int buffersize)
2047 receiver->lastBytesRcvd = 0;
2048 receiver->bytesRcvd = 0;
2049 receiver->totalBytesRcvd = 0;
2050 receiver->buffersize = buffersize;
2052 receiver->buffer = (char*)malloc(receiver->buffersize);
2054 if (receiver->buffer == 0)
2061 receiver->buf = receiver->buffer;
2067 int dlt_receiver_free(DltReceiver *receiver)
2075 if (receiver->buffer)
2077 free(receiver->buffer);
2080 receiver->buffer = 0;
2087 int dlt_receiver_receive_socket(DltReceiver *receiver)
2094 if (receiver->buffer==0)
2099 receiver->buf = (char *)receiver->buffer;
2100 receiver->lastBytesRcvd = receiver->bytesRcvd;
2102 /* wait for data from socket */
2103 if ((receiver->bytesRcvd = recv(receiver->fd, receiver->buf + receiver->lastBytesRcvd, receiver->buffersize - receiver->lastBytesRcvd , 0)) <= 0)
2105 receiver->bytesRcvd = 0;
2107 return receiver->bytesRcvd;
2110 receiver->totalBytesRcvd += receiver->bytesRcvd;
2111 receiver->bytesRcvd += receiver->lastBytesRcvd;
2113 return receiver->bytesRcvd;
2117 int dlt_receiver_receive_fd(DltReceiver *receiver)
2124 if (receiver->buffer==0)
2129 receiver->buf = (char *)receiver->buffer;
2130 receiver->lastBytesRcvd = receiver->bytesRcvd;
2132 /* wait for data from fd */
2133 if ((receiver->bytesRcvd = read(receiver->fd, receiver->buf + receiver->lastBytesRcvd, receiver->buffersize - receiver->lastBytesRcvd)) <= 0)
2135 receiver->bytesRcvd = 0;
2137 return receiver->bytesRcvd;
2140 receiver->totalBytesRcvd += receiver->bytesRcvd;
2141 receiver->bytesRcvd += receiver->lastBytesRcvd;
2143 return receiver->bytesRcvd;
2146 int dlt_receiver_remove(DltReceiver *receiver,int size)
2153 if (receiver->buf==0)
2158 receiver->bytesRcvd = receiver->bytesRcvd - size;
2159 receiver->buf = receiver->buf + size;
2164 int dlt_receiver_move_to_begin(DltReceiver *receiver)
2171 if ((receiver->buffer==0) || (receiver->buf==0))
2176 if ((receiver->buffer!=receiver->buf) && (receiver->bytesRcvd!=0))
2178 memmove(receiver->buffer,receiver->buf,receiver->bytesRcvd);
2184 int dlt_set_storageheader(DltStorageHeader *storageheader, const char *ecu)
2187 #if !defined(_MSC_VER)
2191 if (storageheader==0)
2196 /* get time of day */
2197 #if defined(_MSC_VER)
2198 time(&(storageheader->seconds));
2200 gettimeofday(&tv, NULL);
2203 /* prepare storage header */
2204 storageheader->pattern[0] = 'D';
2205 storageheader->pattern[1] = 'L';
2206 storageheader->pattern[2] = 'T';
2207 storageheader->pattern[3] = 0x01;
2209 dlt_set_id(storageheader->ecu,ecu);
2211 /* Set current time */
2212 #if defined(_MSC_VER)
2213 storageheader->microseconds = 0;
2215 storageheader->seconds = (time_t)tv.tv_sec; /* value is long */
2216 storageheader->microseconds = (int32_t)tv.tv_usec; /* value is long */
2222 int dlt_check_storageheader(DltStorageHeader *storageheader)
2224 if (storageheader==0)
2229 return ((storageheader->pattern[0] == 'D') &&
2230 (storageheader->pattern[1] == 'L') &&
2231 (storageheader->pattern[2] == 'T') &&
2232 (storageheader->pattern[3] == 1));
2235 int dlt_ringbuffer_init(DltRingBuffer *dltbuf, uint32_t size)
2243 if (size<=sizeof(uint32_t))
2248 dltbuf->buffer=(char*)malloc(size);
2249 if (dltbuf->buffer==0)
2256 dltbuf->pos_write=0;
2264 int dlt_ringbuffer_free(DltRingBuffer *dltbuf)
2274 free(dltbuf->buffer);
2281 dltbuf->pos_write=0;
2289 int dlt_ringbuffer_put(DltRingBuffer *dltbuf, void *data, uint32_t size)
2291 uint32_t sui, part1, part2;
2298 if (dltbuf->buffer==0)
2308 sui = sizeof(uint32_t);
2310 if ((size+sui)>dltbuf->size)
2315 dlt_ringbuffer_checkandfreespace(dltbuf, (size+sui));
2317 if (dltbuf->pos_write >= dltbuf->size)
2319 dltbuf->pos_write = 0;
2322 /* Not enough space for one uint available before end of linear buffer */
2323 /* Start at begin of linear buffer */
2324 if ((dltbuf->size - dltbuf->pos_write) < sui)
2326 dltbuf->pos_write = 0;
2329 /* Write length of following data to buffer */
2330 memcpy(&(dltbuf->buffer[dltbuf->pos_write]), &size, sui);
2331 dltbuf->pos_write+=sui;
2333 if (dltbuf->pos_write >= dltbuf->size)
2335 dltbuf->pos_write = 0;
2338 if ((dltbuf->size - dltbuf->pos_write) < size)
2340 /* Not enough space til end of linear buffer, */
2341 /* split up write call */
2342 part1 = dltbuf->size - dltbuf->pos_write;
2343 part2 = size - part1;
2345 memcpy(dltbuf->buffer + dltbuf->pos_write, data, part1);
2346 memcpy(dltbuf->buffer, ((char*)data) + part1, part2);
2347 dltbuf->pos_write = part2;
2352 /* Enough space til end of linear buffer */
2353 memcpy(&(dltbuf->buffer[dltbuf->pos_write]), data, size);
2354 dltbuf->pos_write+=size;
2363 int dlt_ringbuffer_put3(DltRingBuffer *dltbuf, void *data1, uint32_t size1, void *data2, uint32_t size2, void *data3, uint32_t size3)
2365 uint32_t sui, part1, part2;
2366 uint32_t total_size;
2373 if (dltbuf->buffer==0)
2378 sui = sizeof(uint32_t);
2380 total_size = size1+size2+size3;
2382 if ((total_size+sui)>dltbuf->size)
2387 dlt_ringbuffer_checkandfreespace(dltbuf, (total_size+sui));
2389 if (dltbuf->pos_write >= dltbuf->size)
2391 dltbuf->pos_write = 0;
2394 /* Not enough space for one uint available before end of linear buffer */
2395 /* Start at begin of linear buffer */
2396 if ((dltbuf->size - dltbuf->pos_write) < sui)
2398 dltbuf->pos_write = 0;
2401 /* Write length of following data to buffer */
2402 memcpy(&(dltbuf->buffer[dltbuf->pos_write]), &total_size, sui);
2403 dltbuf->pos_write+=sui;
2405 if (dltbuf->pos_write >= dltbuf->size)
2407 dltbuf->pos_write = 0;
2410 /* First chunk of data (data1, size1) */
2411 if ((dltbuf->size - dltbuf->pos_write) < size1)
2413 /* Not enough space til end of linear buffer, */
2414 /* split up write call */
2415 part1 = dltbuf->size - dltbuf->pos_write;
2416 part2 = size1 - part1;
2418 memcpy(dltbuf->buffer + dltbuf->pos_write, data1, part1);
2419 memcpy(dltbuf->buffer, ((char*)data1) + part1, part2);
2420 dltbuf->pos_write = part2;
2425 /* Enough space til end of linear buffer */
2426 memcpy(&(dltbuf->buffer[dltbuf->pos_write]), data1, size1);
2427 dltbuf->pos_write+=size1;
2430 if (dltbuf->pos_write >= dltbuf->size)
2432 dltbuf->pos_write = 0;
2435 /* Second chunk of data (data2, size2) */
2436 if ((dltbuf->size - dltbuf->pos_write) < size2)
2438 /* Not enough space til end of linear buffer, */
2439 /* split up write call */
2440 part1 = dltbuf->size - dltbuf->pos_write;
2441 part2 = size2 - part1;
2443 memcpy(dltbuf->buffer + dltbuf->pos_write, data2, part1);
2444 memcpy(dltbuf->buffer, ((char*)data2) + part1, part2);
2445 dltbuf->pos_write = part2;
2450 /* Enough space til end of linear buffer */
2451 memcpy(&(dltbuf->buffer[dltbuf->pos_write]), data2, size2);
2452 dltbuf->pos_write+=size2;
2455 if (dltbuf->pos_write >= dltbuf->size)
2457 dltbuf->pos_write = 0;
2460 /* Third chunk of data (data3, size3) */
2461 if ((dltbuf->size - dltbuf->pos_write) < size3)
2463 /* Not enough space til end of linear buffer, */
2464 /* split up write call */
2465 part1 = dltbuf->size - dltbuf->pos_write;
2466 part2 = size3 - part1;
2468 memcpy(dltbuf->buffer + dltbuf->pos_write, data3, part1);
2469 memcpy(dltbuf->buffer, ((char*)data3) + part1, part2);
2470 dltbuf->pos_write = part2;
2475 /* Enough space til end of linear buffer */
2476 memcpy(dltbuf->buffer + dltbuf->pos_write, data3, size3);
2477 dltbuf->pos_write+=size3;
2485 int dlt_ringbuffer_get(DltRingBuffer *dltbuf, void *data, size_t *size)
2490 uint32_t part1, part2;
2497 if (dltbuf->buffer==0)
2502 if (dltbuf->count==0)
2507 sui = sizeof(uint32_t);
2509 if (dltbuf->pos_read >= dltbuf->size)
2511 dltbuf->pos_read = 0;
2514 if ((dltbuf->size - dltbuf->pos_read) < sui)
2516 dltbuf->pos_read = 0;
2519 /* printf("Reading at offset: %d\n", dltbuf->pos_read); */
2521 memcpy(&tmpsize,&(dltbuf->buffer[dltbuf->pos_read]), sui);
2522 dltbuf->pos_read += sui;
2524 if (dltbuf->pos_read >= dltbuf->size)
2526 dltbuf->pos_read = 0;
2529 if ((tmpsize>0) && ((tmpsize+sizeof(uint32_t))<=dltbuf->size))
2531 if ((dltbuf->size - dltbuf->pos_read) < tmpsize)
2533 /* Not enough space til end of linear buffer, */
2534 /* split up read call */
2535 part1 = dltbuf->size - dltbuf->pos_read;
2536 part2 = tmpsize - part1;
2538 memcpy(data, dltbuf->buffer + dltbuf->pos_read, part1);
2539 memcpy(((char*)data)+part1, dltbuf->buffer, part2);
2540 dltbuf->pos_read = part2;
2544 /* Enough space til end of linear buffer */
2545 /* no split up read call */
2546 memcpy(data, &(dltbuf->buffer[dltbuf->pos_read]), tmpsize);
2547 dltbuf->pos_read+=tmpsize;
2562 int dlt_ringbuffer_get_skip(DltRingBuffer *dltbuf)
2567 uint32_t part1, part2;
2574 if (dltbuf->buffer==0)
2579 if (dltbuf->count==0)
2584 sui = sizeof(uint32_t);
2586 if (dltbuf->pos_read >= dltbuf->size)
2588 dltbuf->pos_read = 0;
2591 if ((dltbuf->size - dltbuf->pos_read) < sui)
2593 dltbuf->pos_read = 0;
2596 memcpy(&tmpsize,&(dltbuf->buffer[dltbuf->pos_read]), sui);
2597 dltbuf->pos_read += sui;
2599 if (dltbuf->pos_read >= dltbuf->size)
2601 dltbuf->pos_read = 0;
2604 if ((tmpsize>0) && ((tmpsize+sui)<=dltbuf->size))
2606 if ((dltbuf->size - dltbuf->pos_read) < tmpsize)
2608 /* Not enough space til end of linear buffer */
2609 part1 = dltbuf->size - dltbuf->pos_read;
2610 part2 = tmpsize - part1;
2612 dltbuf->pos_read = part2;
2616 /* Enough space til end of linear buffer */
2617 dltbuf->pos_read+=tmpsize;
2626 int dlt_ringbuffer_freespacewrite(DltRingBuffer *dltbuf, uint32_t *freespace)
2628 if ((dltbuf==0) || (freespace==0))
2635 /* Space til pos_read */
2636 if (dltbuf->pos_read > dltbuf->pos_write)
2638 *freespace=(dltbuf->pos_read - dltbuf->pos_write);
2641 else if (dltbuf->pos_read < dltbuf->pos_write)
2643 *freespace=(dltbuf->size - dltbuf->pos_write + dltbuf->pos_read );
2654 *freespace=dltbuf->size;
2661 int dlt_ringbuffer_checkandfreespace(DltRingBuffer *dltbuf, uint32_t reqspace)
2663 uint32_t space_left;
2670 if (dlt_ringbuffer_freespacewrite(dltbuf,&space_left) == -1)
2675 /* printf("Now reading at: %d, space_left = %d, req = %d, r=%d, w=%d, count=%d \n",
2676 dltbuf->pos_read,space_left, reqspace, dltbuf->pos_read, dltbuf->pos_write, dltbuf->count); */
2678 while (space_left<reqspace)
2680 /* Overwrite, correct read position */
2682 /* Read and skip one element */
2683 dlt_ringbuffer_get_skip(dltbuf);
2685 /* Space until pos_read */
2686 if (dlt_ringbuffer_freespacewrite(dltbuf,&space_left) == -1)
2691 /* printf("Overwrite: Now reading at: %d, space_left = %d, req = %d, r=%d, w=%d, count=%d \n",
2692 dltbuf->pos_read,space_left, reqspace, dltbuf->pos_read, dltbuf->pos_write, dltbuf->count); */
2698 #if !defined (__WIN32__)
2700 int dlt_setup_serial(int fd, speed_t speed)
2702 #if !defined (__WIN32__) && !defined(_MSC_VER)
2703 struct termios config;
2710 if (tcgetattr(fd, &config) < 0)
2715 /* Input flags - Turn off input processing
2716 convert break to null byte, no CR to NL translation,
2717 no NL to CR translation, don't mark parity errors or breaks
2718 no input parity check, don't strip high bit off,
2719 no XON/XOFF software flow control
2721 config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL |
2722 INLCR | PARMRK | INPCK | ISTRIP | IXON);
2724 /* Output flags - Turn off output processing
2725 no CR to NL translation, no NL to CR-NL translation,
2726 no NL to CR translation, no column 0 CR suppression,
2727 no Ctrl-D suppression, no fill characters, no case mapping,
2728 no local output processing
2730 config.c_oflag &= ~(OCRNL | ONLCR | ONLRET |
2731 ONOCR | ONOEOT| OFILL | OLCUC | OPOST);
2735 /* No line processing:
2736 echo off, echo newline off, canonical mode off,
2737 extended input processing off, signal chars off
2739 config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
2741 /* Turn off character processing
2742 clear current char size mask, no parity checking,
2743 no output processing, force 8 bit input
2745 config.c_cflag &= ~(CSIZE | PARENB);
2746 config.c_cflag |= CS8;
2748 /* One input byte is enough to return from read()
2749 Inter-character timer off
2751 config.c_cc[VMIN] = 1;
2752 config.c_cc[VTIME] = 0;
2754 /* Communication speed (simple version, using the predefined
2757 if (cfsetispeed(&config, speed) < 0 || cfsetospeed(&config, speed) < 0)
2762 /* Finally, apply the configuration
2764 if (tcsetattr(fd, TCSAFLUSH, &config) < 0)
2775 speed_t dlt_convert_serial_speed(int baudrate)
2777 #if !defined (__WIN32__) && !defined(_MSC_VER)
2947 void dlt_get_version(char *buf)
2949 sprintf(buf,"DLT Package Version: %s %s, Package Revision: %s, build on %s %s\n",
2950 PACKAGE_VERSION, PACKAGE_VERSION_STATE, SVN_VERSION, __DATE__ , __TIME__ );
2953 uint32_t dlt_uptime(void)
2956 #if defined (__WIN32__) || defined(_MSC_VER)
2958 return (uint32_t)(GetTickCount()*10); /* GetTickCount() return DWORD */
2963 if (clock_gettime(CLOCK_MONOTONIC,&ts)==0)
2965 return (uint32_t)((((ts.tv_sec*1000000)+(ts.tv_nsec/1000)))/100); // in 0.1 ms = 100 us
2976 int dlt_message_print_header(DltMessage *message, char *text, uint32_t size, int verbose)
2978 if ((message==0) || (text==0))
2983 dlt_message_header(message,text,size,verbose);
2984 printf("%s\n",text);
2989 int dlt_message_print_hex(DltMessage *message, char *text, uint32_t size, int verbose)
2991 if ((message==0) || (text==0))
2996 dlt_message_header(message,text,size,verbose);
2998 dlt_message_payload(message,text,size,DLT_OUTPUT_HEX,verbose);
2999 printf("[%s]\n",text);
3004 int dlt_message_print_ascii(DltMessage *message, char *text, uint32_t size, int verbose)
3006 if ((message==0) || (text==0))
3011 dlt_message_header(message,text,size,verbose);
3013 dlt_message_payload(message,text,size,DLT_OUTPUT_ASCII,verbose);
3014 printf("[%s]\n",text);
3019 int dlt_message_print_mixed_plain(DltMessage *message, char *text, uint32_t size, int verbose)
3021 if ((message==0) || (text==0))
3026 dlt_message_header(message,text,size,verbose);
3027 printf("%s \n",text);
3028 dlt_message_payload(message,text,size,DLT_OUTPUT_MIXED_FOR_PLAIN,verbose);
3029 printf("[%s]\n",text);
3034 int dlt_message_print_mixed_html(DltMessage *message, char *text, uint32_t size, int verbose)
3036 if ((message==0) || (text==0))
3041 dlt_message_header(message,text,size,verbose);
3042 printf("%s \n",text);
3043 dlt_message_payload(message,text,size,DLT_OUTPUT_MIXED_FOR_HTML,verbose);
3044 printf("[%s]\n",text);
3049 int dlt_message_argument_print(DltMessage *msg,uint32_t type_info,uint8_t **ptr,int32_t *datalength,char *text,int textlength,int byteLength,int __attribute__((unused)) verbose)
3051 int16_t length=0,length_tmp=0; /* the macro can set this variable to -1 */
3052 uint16_t length2=0,length2_tmp=0,length3=0,length3_tmp=0;
3055 uint16_t value16u=0,value16u_tmp=0;
3056 uint32_t value32u=0,value32u_tmp=0;
3057 uint64_t value64u=0,value64u_tmp=0;
3060 int16_t value16i=0,value16i_tmp=0;
3061 int32_t value32i=0,value32i_tmp=0;
3062 int64_t value64i=0,value64i_tmp=0;
3064 float32_t value32f=0,value32f_tmp=0;
3065 int32_t value32f_tmp_int32i=0,value32f_tmp_int32i_swaped=0;
3066 float64_t value64f=0,value64f_tmp=0;
3067 int64_t value64f_tmp_int64i=0,value64f_tmp_int64i_swaped=0;
3069 uint32_t quantisation=0, quantisation_tmp=0;
3071 if (type_info & DLT_TYPE_INFO_STRG)
3077 DLT_MSG_READ_VALUE(length_tmp,*ptr,*datalength,uint16_t);
3080 length=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length_tmp);
3084 length=(int16_t)byteLength;
3087 if (type_info & DLT_TYPE_INFO_VARI)
3089 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3092 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3093 if((*datalength)<length2)
3096 *datalength-=length2;
3099 DLT_MSG_READ_STRING((text+strlen(text)),*ptr,*datalength,length);
3104 else if (type_info & DLT_TYPE_INFO_BOOL)
3107 if (type_info & DLT_TYPE_INFO_VARI)
3109 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3112 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3113 if((*datalength)<length2)
3116 *datalength-=length2;
3119 DLT_MSG_READ_VALUE(value8u,*ptr,*datalength,uint8_t); /* No endian conversion necessary */
3122 sprintf(text+strlen(text),"%d",value8u);
3124 else if (type_info & DLT_TYPE_INFO_SINT || type_info & DLT_TYPE_INFO_UINT)
3126 /* signed or unsigned argument received */
3127 if (type_info & DLT_TYPE_INFO_VARI)
3129 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3132 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3133 DLT_MSG_READ_VALUE(length3_tmp,*ptr,*datalength,uint16_t);
3136 length3=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length3_tmp);
3137 if((*datalength)<length2)
3140 *datalength-=length2;
3141 if((*datalength)<length3)
3144 *datalength-=length3;
3146 if (type_info & DLT_TYPE_INFO_FIXP)
3150 DLT_MSG_READ_VALUE(quantisation_tmp,*ptr,*datalength,uint32_t);
3153 quantisation=DLT_ENDIAN_GET_32(msg->standardheader->htyp, quantisation_tmp);
3155 switch ( type_info & DLT_TYPE_INFO_TYLE)
3158 case DLT_TYLE_16BIT:
3159 case DLT_TYLE_32BIT:
3167 case DLT_TYLE_64BIT:
3175 case DLT_TYLE_128BIT:
3177 if((*datalength)<16)
3189 switch ( type_info & DLT_TYPE_INFO_TYLE)
3193 if (type_info & DLT_TYPE_INFO_SINT)
3196 DLT_MSG_READ_VALUE(value8i,*ptr,*datalength,int8_t); /* No endian conversion necessary */
3199 sprintf(text+strlen(text),"%d",value8i);
3204 DLT_MSG_READ_VALUE(value8u,*ptr,*datalength,uint8_t); /* No endian conversion necessary */
3207 sprintf(text+strlen(text),"%d",value8u);
3211 case DLT_TYLE_16BIT:
3213 if (type_info & DLT_TYPE_INFO_SINT)
3217 DLT_MSG_READ_VALUE(value16i_tmp,*ptr,*datalength,int16_t);
3220 value16i=DLT_ENDIAN_GET_16(msg->standardheader->htyp, value16i_tmp);
3221 sprintf(text+strlen(text),"%hd",value16i);
3227 DLT_MSG_READ_VALUE(value16u_tmp,*ptr,*datalength,uint16_t);
3230 value16u=DLT_ENDIAN_GET_16(msg->standardheader->htyp, value16u_tmp);
3231 sprintf(text+strlen(text),"%hu",value16u);
3235 case DLT_TYLE_32BIT:
3237 if (type_info & DLT_TYPE_INFO_SINT)
3241 DLT_MSG_READ_VALUE(value32i_tmp,*ptr,*datalength,int32_t);
3244 value32i=DLT_ENDIAN_GET_32(msg->standardheader->htyp, (uint32_t)value32i_tmp);
3245 sprintf(text+strlen(text),"%d",value32i);
3251 DLT_MSG_READ_VALUE(value32u_tmp,*ptr,*datalength,uint32_t);
3254 value32u=DLT_ENDIAN_GET_32(msg->standardheader->htyp, value32u_tmp);
3255 sprintf(text+strlen(text),"%u",value32u);
3259 case DLT_TYLE_64BIT:
3261 if (type_info & DLT_TYPE_INFO_SINT)
3265 DLT_MSG_READ_VALUE(value64i_tmp,*ptr,*datalength,int64_t);
3268 value64i=DLT_ENDIAN_GET_64(msg->standardheader->htyp, (uint64_t)value64i_tmp);
3269 #if defined (__WIN32__) && !defined(_MSC_VER)
3270 sprintf(text+strlen(text),"%I64d",value64i);
3272 sprintf(text+strlen(text),"%lld",value64i);
3279 DLT_MSG_READ_VALUE(value64u_tmp,*ptr,*datalength,uint64_t);
3282 value64u=DLT_ENDIAN_GET_64(msg->standardheader->htyp, value64u_tmp);
3283 #if defined (__WIN32__) && !defined(_MSC_VER)
3284 sprintf(text+strlen(text),"%I64u",value64u);
3286 sprintf(text+strlen(text),"%llu",value64u);
3291 case DLT_TYLE_128BIT:
3293 if (*datalength>=16)
3294 dlt_print_hex_string(text+strlen(text),textlength,*ptr,16);
3295 if((*datalength)<16)
3307 else if (type_info & DLT_TYPE_INFO_FLOA)
3309 /* float data argument */
3310 if (type_info & DLT_TYPE_INFO_VARI)
3312 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3315 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3316 DLT_MSG_READ_VALUE(length3_tmp,*ptr,*datalength,uint16_t);
3319 length3=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length3_tmp);
3320 if((*datalength)<length2)
3323 *datalength-=length2;
3324 if((*datalength)<length3)
3327 *datalength-=length3;
3329 switch ( type_info & DLT_TYPE_INFO_TYLE)
3334 dlt_print_hex_string(text+strlen(text),textlength,*ptr,1);
3341 case DLT_TYLE_16BIT:
3344 dlt_print_hex_string(text+strlen(text),textlength,*ptr,2);
3351 case DLT_TYLE_32BIT:
3353 if (sizeof(float32_t)==4)
3357 value32f_tmp_int32i=0;
3358 value32f_tmp_int32i_swaped=0;
3359 DLT_MSG_READ_VALUE(value32f_tmp,*ptr,*datalength,float32_t);
3362 memcpy(&value32f_tmp_int32i,&value32f_tmp,sizeof(float32_t));
3363 value32f_tmp_int32i_swaped=DLT_ENDIAN_GET_32(msg->standardheader->htyp, (uint32_t)value32f_tmp_int32i);
3364 memcpy(&value32f,&value32f_tmp_int32i_swaped,sizeof(float32_t));
3365 sprintf(text+strlen(text),"%g",value32f);
3369 dlt_log(LOG_ERR, "Invalid size of float32_t\n");
3374 case DLT_TYLE_64BIT:
3376 if (sizeof(float64_t)==8)
3380 value64f_tmp_int64i=0;
3381 value64f_tmp_int64i_swaped=0;
3382 DLT_MSG_READ_VALUE(value64f_tmp,*ptr,*datalength,float64_t);
3385 memcpy(&value64f_tmp_int64i,&value64f_tmp,sizeof(float64_t));
3386 value64f_tmp_int64i_swaped=DLT_ENDIAN_GET_64(msg->standardheader->htyp, (uint64_t)value64f_tmp_int64i);
3387 memcpy(&value64f,&value64f_tmp_int64i_swaped,sizeof(float64_t));
3388 sprintf(text+strlen(text),"%g",value64f);
3392 dlt_log(LOG_ERR, "Invalid size of float64_t\n");
3397 case DLT_TYLE_128BIT:
3399 if (*datalength>=16)
3400 dlt_print_hex_string(text+strlen(text),textlength,*ptr,16);
3401 if((*datalength)<16)
3414 else if (type_info & DLT_TYPE_INFO_RAWD)
3416 /* raw data argument */
3417 DLT_MSG_READ_VALUE(length_tmp,*ptr,*datalength,uint16_t);
3420 length=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length_tmp);
3421 if (type_info & DLT_TYPE_INFO_VARI)
3423 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3426 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3427 if((*datalength)<length2)
3430 *datalength-=length2;
3432 if((*datalength)<length)
3434 dlt_print_hex_string(text+strlen(text),textlength,*ptr,length);
3436 *datalength-=length;
3438 else if (type_info & DLT_TYPE_INFO_TRAI)
3440 /* trace info argument */
3441 DLT_MSG_READ_VALUE(length_tmp,*ptr,*datalength,uint16_t);
3444 length=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length_tmp);
3445 DLT_MSG_READ_STRING((text+strlen(text)),*ptr,*datalength,length);
3456 dlt_log(LOG_ERR, "Payload of DLT message corrupted\n");