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"
89 #include "dlt_version.h"
91 #if defined (__WIN32__) || defined (_MSC_VER)
92 #include <winsock2.h> /* for socket(), connect(), send(), and recv() */
94 #include <sys/socket.h> /* for socket(), connect(), send(), and recv() */
96 #include <time.h> /* for clock_gettime() */
99 #if defined (_MSC_VER)
102 #include <unistd.h> /* for read(), close() */
103 #include <sys/time.h> /* for gettimeofday() */
106 #if defined (__MSDOS__) || defined (_MSC_VER)
107 #pragma warning(disable : 4996) /* Switch off C4996 warnings */
112 static char str[DLT_COMMON_BUFFER_LENGTH];
114 const char dltSerialHeader[DLT_ID_SIZE] = { 'D','L','S',1 };
115 char dltSerialHeaderChar[DLT_ID_SIZE] = { 'D','L','S',1 };
117 /* internal logging parameters */
118 static int logging_mode = 0;
119 static int logging_level = 6;
120 static char logging_filename[256] = "";
121 static FILE *logging_handle = 0;
123 char *message_type[] = {"log","app_trace","nw_trace","control","","","",""};
124 char *log_info[] = {"","fatal","error","warn","info","debug","verbose","","","","","","","","",""};
125 char *trace_type[] = {"","variable","func_in","func_out","state","vfb","","","","","","","","","",""};
126 char *nw_trace_type[] = {"","ipc","can","flexray","most","vfb","","","","","","","","","",""};
127 char *control_type[] = {"","request","response","time","","","","","","","","","","","",""};
128 static char *service_id[] = {"","set_log_level","set_trace_status","get_log_info","get_default_log_level","store_config","reset_to_factory_default",
129 "set_com_interface_status","set_com_interface_max_bandwidth","set_verbose_mode","set_message_filtering","set_timing_packets",
130 "get_local_time","use_ecu_id","use_session_id","use_timestamp","use_extended_header","set_default_log_level","set_default_trace_status",
131 "get_software_version","message_buffer_overflow"
133 static char *return_type[] = {"ok","not_supported","error","","","","","","no_matching_context_id"};
135 /* internal function definitions */
136 int dlt_buffer_get(DltBuffer *buf,unsigned char *data, int max_size,int delete);
137 int dlt_buffer_reset(DltBuffer *buf);
138 int dlt_buffer_increase_size(DltBuffer *buf);
139 int dlt_buffer_minimize_size(DltBuffer *buf);
140 void dlt_buffer_write_block(DltBuffer *buf,int *write, const unsigned char *data,unsigned int size);
141 void dlt_buffer_read_block(DltBuffer *buf,int *read,unsigned char *data,unsigned int size);
143 void dlt_print_hex(uint8_t *ptr,int size)
152 for (num=0;num<size;num++)
159 printf("%.2x",((uint8_t*)ptr)[num]);
163 int dlt_print_hex_string(char *text,int textlength,uint8_t *ptr,int size)
167 if ((ptr==0) || (text==0) || (textlength<=0) || (size<0))
172 /* Length 3: AB_ , A is first digit of hex number, B is second digit of hex number, _ is space */
173 if (textlength<(size*3))
175 dlt_log(LOG_ERR, "String does not fit binary data!\n");
179 for (num=0;num<size;num++)
187 sprintf(text,"%.2x",((uint8_t*)ptr)[num]);
188 text+=2; /* 2 chars */
194 int dlt_print_mixed_string(char *text,int textlength,uint8_t *ptr,int size,int html)
196 int required_size = 0;
199 if ((ptr==0) || (text==0) || (textlength<=0) || (size<0))
204 /* Check maximum required size and do a length check */
207 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) *
208 ((size/DLT_COMMON_HEX_CHARS) + 1);
209 /* Example: (8 chars line number + (2*16 chars + 15 spaces) + space + 16 ascii chars + CR) *
210 ((size/16) lines + extra line for the rest) */
214 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) *
215 ((size/DLT_COMMON_HEX_CHARS) + 1);
216 /* Example: (8 chars line number + (2*16 chars + 15 spaces) + space + 16 ascii chars + 4 [HTML CR: <BR>]) *
217 ((size/16) lines + extra line for the rest) */
220 if (textlength<required_size)
222 sprintf(str, "String does not fit mixed data (available=%d, required=%d) !\n", textlength, required_size);
223 dlt_log(LOG_ERR, str);
227 /* print full lines */
228 for (lines=0; lines< (size / DLT_COMMON_HEX_CHARS); lines++)
231 sprintf(text,"%.6x: ",lines * DLT_COMMON_HEX_CHARS);
232 text+=DLT_COMMON_HEX_LINELEN; /* 'XXXXXX: ' */
235 /* It is not required to decrement textlength, as it was already checked, that
236 there is enough space for the complete output */
237 dlt_print_hex_string(text,textlength,(uint8_t*)(ptr+(lines*DLT_COMMON_HEX_CHARS)),DLT_COMMON_HEX_CHARS);
238 text+=((2*DLT_COMMON_HEX_CHARS)+(DLT_COMMON_HEX_CHARS-1)); /* 32 characters + 15 spaces */
241 text+=DLT_COMMON_CHARLEN;
244 /* It is not required to decrement textlength, as it was already checked, that
245 there is enough space for the complete output */
246 dlt_print_char_string(&text,textlength,(uint8_t*)(ptr+(lines*DLT_COMMON_HEX_CHARS)),DLT_COMMON_HEX_CHARS);
251 text+=DLT_COMMON_CHARLEN;
255 sprintf(text,"<BR>");
256 text+=(4*DLT_COMMON_CHARLEN);
260 /* print partial line */
261 rest = size % DLT_COMMON_HEX_CHARS;
266 sprintf(text,"%.6x: ", (size / DLT_COMMON_HEX_CHARS) * DLT_COMMON_HEX_CHARS);
267 text+=DLT_COMMON_HEX_LINELEN; /* 'XXXXXX: ' */
270 /* It is not required to decrement textlength, as it was already checked, that
271 there is enough space for the complete output */
272 dlt_print_hex_string(text,textlength,(uint8_t*)(ptr+ ((size / DLT_COMMON_HEX_CHARS) * DLT_COMMON_HEX_CHARS)),rest);
273 text+=2*rest+(rest-1);
275 for (i=0;i<(DLT_COMMON_HEX_CHARS-rest);i++)
278 text+=(3*DLT_COMMON_CHARLEN);
282 text+=DLT_COMMON_CHARLEN;
285 /* It is not required to decrement textlength, as it was already checked, that
286 there is enough space for the complete output */
287 dlt_print_char_string(&text,textlength,(uint8_t*)(ptr+ ((size / DLT_COMMON_HEX_CHARS) * DLT_COMMON_HEX_CHARS)),rest);
293 int dlt_print_char_string(char **text,int textlength,uint8_t *ptr,int size)
302 if ((ptr==0) || (*text==0) || (textlength<=0) || (size<0))
307 if (textlength< size)
309 dlt_log(LOG_ERR, "String does not fit character data!\n");
313 for (num=0;num<size;num++)
315 if ( (((char*)ptr)[num]<DLT_COMMON_ASCII_CHAR_SPACE) || (((char*)ptr)[num]>DLT_COMMON_ASCII_CHAR_TILDE) )
321 /* replace < with . */
322 if (((char*)ptr)[num]!=DLT_COMMON_ASCII_CHAR_LT)
324 sprintf(*text,"%c",((char *)ptr)[num]);
337 void dlt_print_id(char *text,const char *id)
346 /* Initialize text */
347 for (i=0; i<DLT_ID_SIZE; i++)
352 text[DLT_ID_SIZE] = 0;
354 len = ((strlen(id)<=DLT_ID_SIZE)?strlen(id):DLT_ID_SIZE);
357 for (i=0; i<len; i++)
361 void dlt_set_id(char *id,const char *text)
410 void dlt_clean_string(char *text,int length)
419 for (num=0;num<length;num++)
421 if (text[num]=='\r' || text[num]=='\n')
428 int dlt_filter_init(DltFilter *filter,int verbose)
430 PRINT_FUNCTION_VERBOSE(verbose);
442 int dlt_filter_free(DltFilter *filter,int verbose)
444 PRINT_FUNCTION_VERBOSE(verbose);
454 int dlt_filter_load(DltFilter *filter,const char *filename,int verbose)
457 char str1[DLT_COMMON_BUFFER_LENGTH];
458 char apid[DLT_ID_SIZE],ctid[DLT_ID_SIZE];
460 PRINT_FUNCTION_VERBOSE(verbose);
467 handle = fopen(filename,"r");
470 sprintf(str,"Filter file %s cannot be opened!\n",filename);
471 dlt_log(LOG_ERR, str);
478 while (!feof(handle))
481 if (fscanf(handle,"%s",str1)!=1)
490 if (strcmp(str1,"----")==0)
496 dlt_set_id(apid,str1);
500 if (fscanf(handle,"%s",str1)!=1)
508 printf(" %s\r\n",str1);
509 if (strcmp(str1,"----")==0)
515 dlt_set_id(ctid,str1);
518 if (filter->counter<DLT_FILTER_MAX)
520 dlt_filter_add(filter,apid,ctid,verbose);
524 sprintf(str, "Maximum number (%d) of allowed filters reached!\n", DLT_FILTER_MAX);
525 dlt_log(LOG_ERR, str);
535 int dlt_filter_save(DltFilter *filter,const char *filename,int verbose)
539 char buf[DLT_COMMON_BUFFER_LENGTH];
541 PRINT_FUNCTION_VERBOSE(verbose);
548 handle = fopen(filename,"w");
551 sprintf(str,"Filter file %s cannot be opened!\n",filename);
552 dlt_log(LOG_ERR, str);
556 for (num=0;num<filter->counter;num++)
558 if (filter->apid[num][0]==0)
560 fprintf(handle,"---- ");
564 dlt_print_id(buf,filter->apid[num]);
565 fprintf(handle,"%s ",buf);
567 if (filter->ctid[num][0]==0)
569 fprintf(handle,"---- ");
573 dlt_print_id(buf,filter->ctid[num]);
574 fprintf(handle,"%s ",buf);
583 int dlt_filter_find(DltFilter *filter,const char *apid,const char *ctid, int verbose)
587 PRINT_FUNCTION_VERBOSE(verbose);
589 if ((filter==0) || (apid==0))
594 for (num=0; num<filter->counter; num++)
596 if (memcmp(filter->apid[num],apid,DLT_ID_SIZE)==0)
598 /* apid matches, now check for ctid */
601 /* check if empty ctid matches */
602 if (memcmp(filter->ctid[num],"",DLT_ID_SIZE)==0)
609 if (memcmp(filter->ctid[num],ctid,DLT_ID_SIZE)==0)
617 return -1; /* Not found */
620 int dlt_filter_add(DltFilter *filter,const char *apid,const char *ctid, int verbose)
622 PRINT_FUNCTION_VERBOSE(verbose);
624 if ((filter==0) || (apid==0))
629 if (filter->counter >= DLT_FILTER_MAX)
631 dlt_log(LOG_ERR, "Maximum numbers of allowed filters reached!\n");
635 /* add each filter (apid, ctid) only once to filter array */
636 if (dlt_filter_find(filter,apid,ctid,verbose)<0)
638 /* filter not found, so add it to filter array */
639 if (filter->counter<DLT_FILTER_MAX)
641 dlt_set_id(filter->apid[filter->counter],apid);
642 dlt_set_id(filter->ctid[filter->counter],(ctid?ctid:""));
653 int dlt_filter_delete(DltFilter *filter,const char *apid,const char *ctid, int verbose)
658 PRINT_FUNCTION_VERBOSE(verbose);
660 if ((filter==0) || (apid==0))
665 if (filter->counter>0)
667 /* Get first occurence of apid and ctid in filter array */
668 for (j=0; j<filter->counter; j++)
670 if ((memcmp(filter->apid[j],apid,DLT_ID_SIZE)==0) &&
671 (memcmp(filter->ctid[j],ctid,DLT_ID_SIZE)==0)
683 /* Copy from j+1 til end to j til end-1 */
685 dlt_set_id(filter->apid[j],"");
686 dlt_set_id(filter->ctid[j],"");
688 for (k=j; k<(filter->counter-1); k++)
690 dlt_set_id(filter->apid[k],filter->apid[k+1]);
691 dlt_set_id(filter->ctid[k],filter->ctid[k+1]);
702 int dlt_message_init(DltMessage *msg,int verbose)
704 PRINT_FUNCTION_VERBOSE(verbose);
711 /* initalise structure parameters */
717 msg->storageheader = 0;
718 msg->standardheader = 0;
719 msg->extendedheader = 0;
721 msg->found_serialheader = 0;
726 int dlt_message_free(DltMessage *msg,int verbose)
728 PRINT_FUNCTION_VERBOSE(verbose);
734 /* delete databuffer if exists */
737 free(msg->databuffer);
744 int dlt_message_header(DltMessage *msg,char *text,int textlength,int verbose)
746 return dlt_message_header_flags(msg,text,textlength,DLT_HEADER_SHOW_ALL,verbose);
749 int dlt_message_header_flags(DltMessage *msg,char *text,int textlength,int flags, int verbose)
751 struct tm * timeinfo;
752 char buffer [DLT_COMMON_BUFFER_LENGTH];
754 PRINT_FUNCTION_VERBOSE(verbose);
756 if ((msg==0) || (text==0) || (textlength<=0))
761 if ((flags<DLT_HEADER_SHOW_NONE) || (flags>DLT_HEADER_SHOW_ALL))
768 if ((flags & DLT_HEADER_SHOW_TIME) == DLT_HEADER_SHOW_TIME)
770 /* print received time */
771 timeinfo = localtime ((const time_t*)(&(msg->storageheader->seconds)));
775 strftime (buffer,sizeof(buffer),"%Y/%m/%d %H:%M:%S",timeinfo);
776 sprintf(text,"%s.%.6d ",buffer,msg->storageheader->microseconds);
780 if ((flags & DLT_HEADER_SHOW_TMSTP) == DLT_HEADER_SHOW_TMSTP)
782 /* print timestamp if available */
783 if ( DLT_IS_HTYP_WTMS(msg->standardheader->htyp) )
785 sprintf(text+strlen(text),"%10u ",msg->headerextra.tmsp);
789 sprintf(text+strlen(text),"---------- ");
793 if ((flags & DLT_HEADER_SHOW_MSGCNT) == DLT_HEADER_SHOW_MSGCNT)
795 /* print message counter */
796 sprintf(text+strlen(text),"%.3d ",msg->standardheader->mcnt);
799 if ((flags & DLT_HEADER_SHOW_ECUID) == DLT_HEADER_SHOW_ECUID)
801 /* print ecu id, use header extra if available, else storage header value */
802 if ( DLT_IS_HTYP_WEID(msg->standardheader->htyp) )
804 dlt_print_id(text+strlen(text),msg->headerextra.ecu);
808 dlt_print_id(text+strlen(text),msg->storageheader->ecu);
812 /* print app id and context id if extended header available, else '----' */#
813 if ((flags & DLT_HEADER_SHOW_APID) == DLT_HEADER_SHOW_APID)
815 sprintf(text+strlen(text)," ");
816 if ((DLT_IS_HTYP_UEH(msg->standardheader->htyp)) && (msg->extendedheader->apid[0]!=0))
818 dlt_print_id(text+strlen(text),msg->extendedheader->apid);
822 sprintf(text+strlen(text),"----");
825 sprintf(text+strlen(text)," ");
828 if ((flags & DLT_HEADER_SHOW_CTID) == DLT_HEADER_SHOW_CTID)
830 if ((DLT_IS_HTYP_UEH(msg->standardheader->htyp)) && (msg->extendedheader->ctid[0]!=0))
832 dlt_print_id(text+strlen(text),msg->extendedheader->ctid);
836 sprintf(text+strlen(text),"----");
839 sprintf(text+strlen(text)," ");
842 /* print info about message type and length */
843 if (DLT_IS_HTYP_UEH(msg->standardheader->htyp))
845 if ((flags & DLT_HEADER_SHOW_MSGTYPE) == DLT_HEADER_SHOW_MSGTYPE)
847 sprintf(text+strlen(text),"%s",message_type[DLT_GET_MSIN_MSTP(msg->extendedheader->msin)]);
848 sprintf(text+strlen(text)," ");
851 if ((flags & DLT_HEADER_SHOW_MSGSUBTYPE) == DLT_HEADER_SHOW_MSGSUBTYPE)
853 if ((DLT_GET_MSIN_MSTP(msg->extendedheader->msin))==DLT_TYPE_LOG)
855 sprintf(text+strlen(text),"%s",log_info[DLT_GET_MSIN_MTIN(msg->extendedheader->msin)]);
858 if ((DLT_GET_MSIN_MSTP(msg->extendedheader->msin))==DLT_TYPE_APP_TRACE)
860 sprintf(text+strlen(text),"%s",trace_type[DLT_GET_MSIN_MTIN(msg->extendedheader->msin)]);
863 if ((DLT_GET_MSIN_MSTP(msg->extendedheader->msin))==DLT_TYPE_NW_TRACE)
865 sprintf(text+strlen(text),"%s",nw_trace_type[DLT_GET_MSIN_MTIN(msg->extendedheader->msin)]);
868 if ((DLT_GET_MSIN_MSTP(msg->extendedheader->msin))==DLT_TYPE_CONTROL)
870 sprintf(text+strlen(text),"%s",control_type[DLT_GET_MSIN_MTIN(msg->extendedheader->msin)]);
873 sprintf(text+strlen(text)," ");
876 if ((flags & DLT_HEADER_SHOW_VNVSTATUS) == DLT_HEADER_SHOW_VNVSTATUS)
878 /* print verbose status pf message */
879 if (DLT_IS_MSIN_VERB(msg->extendedheader->msin))
881 sprintf(text+strlen(text),"V");
885 sprintf(text+strlen(text),"N");
888 sprintf(text+strlen(text)," ");
891 if ((flags & DLT_HEADER_SHOW_NOARG) == DLT_HEADER_SHOW_NOARG)
893 /* print number of arguments */
894 sprintf(text+strlen(text),"%d", msg->extendedheader->noar);
900 if ((flags & DLT_HEADER_SHOW_MSGTYPE) == DLT_HEADER_SHOW_MSGTYPE)
902 sprintf(text+strlen(text),"--- ");
905 if ((flags & DLT_HEADER_SHOW_MSGSUBTYPE) == DLT_HEADER_SHOW_MSGSUBTYPE)
907 sprintf(text+strlen(text),"--- ");
910 if ((flags & DLT_HEADER_SHOW_VNVSTATUS) == DLT_HEADER_SHOW_VNVSTATUS)
912 sprintf(text+strlen(text),"N ");
915 if ((flags & DLT_HEADER_SHOW_NOARG) == DLT_HEADER_SHOW_NOARG)
917 sprintf(text+strlen(text),"-");
924 int dlt_message_payload(DltMessage *msg,char *text,int textlength,int type,int verbose)
926 uint32_t id=0,id_tmp=0;
932 /* Pointer to ptr and datalength */
934 int32_t *pdatalength;
939 uint32_t type_info=0,type_info_tmp=0;
941 PRINT_FUNCTION_VERBOSE(verbose);
943 if ((msg==0) || (text==0))
950 dlt_log(LOG_ERR, "String does not fit binary data!\n");
954 /* start with empty string */
957 /* print payload only as hex */
958 if (type==DLT_OUTPUT_HEX)
960 return dlt_print_hex_string(text,textlength,msg->databuffer,msg->datasize);
963 /* print payload as mixed */
964 if (type==DLT_OUTPUT_MIXED_FOR_PLAIN)
966 return dlt_print_mixed_string(text,textlength,msg->databuffer,msg->datasize,0);
969 if (type==DLT_OUTPUT_MIXED_FOR_HTML)
971 return dlt_print_mixed_string(text,textlength,msg->databuffer,msg->datasize,1);
974 ptr = msg->databuffer;
975 datalength = msg->datasize;
977 /* Pointer to ptr and datalength */
979 pdatalength = &datalength;
981 /* non-verbose mode */
983 /* print payload as hex */
984 if (DLT_MSG_IS_NONVERBOSE(msg))
987 DLT_MSG_READ_VALUE(id_tmp,ptr,datalength,uint32_t);
988 id=DLT_ENDIAN_GET_32(msg->standardheader->htyp, id_tmp);
990 if (textlength<((datalength*3)+20))
992 dlt_log(LOG_ERR, "String does not fit binary data!\n");
996 /* process message id / service id */
997 if (DLT_MSG_IS_CONTROL(msg))
999 if (id > 0 && id <= DLT_SERVICE_ID_MESSAGE_BUFFER_OVERFLOW)
1001 sprintf(text+strlen(text),"%s",service_id[id]); /* service id */
1005 if (!(DLT_MSG_IS_CONTROL_TIME(msg)))
1007 sprintf(text+strlen(text),"service(%u)",id); /* service id */
1013 sprintf(text+strlen(text),", ");
1018 sprintf(text+strlen(text),"%u, ",id); /* message id */
1021 /* process return value */
1022 if (DLT_MSG_IS_CONTROL_RESPONSE(msg))
1026 DLT_MSG_READ_VALUE(retval,ptr,datalength,uint8_t); /* No endian conversion necessary */
1027 if ( (retval<3) || (retval==8))
1029 sprintf(text+strlen(text),"%s",return_type[retval]);
1033 sprintf(text+strlen(text),"%.2x",retval);
1038 sprintf(text+strlen(text),", ");
1043 if (type==DLT_OUTPUT_ASCII_LIMITED)
1045 ret=dlt_print_hex_string(text+strlen(text),textlength-strlen(text),ptr,
1046 (datalength>DLT_COMMON_ASCII_LIMIT_MAX_CHARS?DLT_COMMON_ASCII_LIMIT_MAX_CHARS:datalength));
1047 if ((datalength>DLT_COMMON_ASCII_LIMIT_MAX_CHARS) &&
1048 ((textlength-strlen(text))>4))
1050 sprintf(text+strlen(text)," ...");
1055 ret=dlt_print_hex_string(text+strlen(text),textlength-strlen(text),ptr,datalength);
1061 /* At this point, it is ensured that a extended header is available */
1067 for (num=0;num<(int)(msg->extendedheader->noar);num++)
1071 sprintf(text+strlen(text)," ");
1074 /* first read the type info of the argument */
1075 DLT_MSG_READ_VALUE(type_info_tmp,ptr,datalength,uint32_t);
1076 type_info=DLT_ENDIAN_GET_32(msg->standardheader->htyp, type_info_tmp);
1078 /* print out argument */
1079 if (dlt_message_argument_print(msg, type_info, pptr, pdatalength, text, textlength, -1, 0)==-1)
1088 int dlt_message_filter_check(DltMessage *msg,DltFilter *filter,int verbose)
1090 /* check the filters if message is used */
1094 PRINT_FUNCTION_VERBOSE(verbose);
1096 if ((msg==0) || (filter==0))
1101 if ((filter->counter==0) || (!(DLT_IS_HTYP_UEH(msg->standardheader->htyp))))
1103 /* no filter is set, or no extended header is available, so do as filter is matching */
1107 for (num=0;num<filter->counter;num++)
1109 /* check each filter if it matches */
1110 if ((DLT_IS_HTYP_UEH(msg->standardheader->htyp)) &&
1111 (filter->apid[num][0]==0 || memcmp(filter->apid[num],msg->extendedheader->apid,DLT_ID_SIZE)==0) &&
1112 (filter->ctid[num][0]==0 || memcmp(filter->ctid[num],msg->extendedheader->ctid,DLT_ID_SIZE)==0) )
1122 int dlt_message_read(DltMessage *msg,uint8_t *buffer,unsigned int length,int resync, int verbose)
1126 PRINT_FUNCTION_VERBOSE(verbose);
1128 if ((msg==0) || (buffer==0) || (length<=0))
1133 /* initialize resync_offset */
1134 msg->resync_offset=0;
1136 /* check if message contains serial header, smaller than standard header */
1137 if (length<sizeof(dltSerialHeader))
1139 /* dlt_log(LOG_ERR, "Length smaller than serial header!\n"); */
1143 if (memcmp(buffer,dltSerialHeader,sizeof(dltSerialHeader)) == 0)
1145 /* serial header found */
1146 msg->found_serialheader = 1;
1147 buffer += sizeof(dltSerialHeader);
1148 length -= sizeof(dltSerialHeader);
1152 /* serial header not found */
1153 msg->found_serialheader = 0;
1156 /* resync if necessary */
1157 msg->resync_offset=0;
1161 if (memcmp(buffer+msg->resync_offset,dltSerialHeader,sizeof(dltSerialHeader)) == 0)
1163 /* serial header found */
1164 msg->found_serialheader = 1;
1165 buffer += sizeof(dltSerialHeader);
1166 length -= sizeof(dltSerialHeader);
1170 msg->resync_offset++;
1172 while ((sizeof(dltSerialHeader)+msg->resync_offset)<=length);
1174 /* Set new start offset */
1175 if (msg->resync_offset>0)
1177 /* Resyncing connection */
1178 buffer+=msg->resync_offset;
1179 length-=msg->resync_offset;
1184 /* check that standard header fits buffer */
1185 if (length<sizeof(DltStandardHeader))
1187 /* dlt_log(LOG_ERR, "Length smaller than standard header!\n"); */
1190 memcpy(msg->headerbuffer+sizeof(DltStorageHeader),buffer,sizeof(DltStandardHeader));
1192 /* set ptrs to structures */
1193 msg->storageheader = (DltStorageHeader*) msg->headerbuffer;
1194 msg->standardheader = (DltStandardHeader*) (msg->headerbuffer + sizeof(DltStorageHeader));
1196 /* calculate complete size of headers */
1197 extra_size = DLT_STANDARD_HEADER_EXTRA_SIZE(msg->standardheader->htyp)+(DLT_IS_HTYP_UEH(msg->standardheader->htyp) ? sizeof(DltExtendedHeader) : 0);
1198 msg->headersize = sizeof(DltStorageHeader) + sizeof(DltStandardHeader) + extra_size;
1199 msg->datasize = DLT_BETOH_16(msg->standardheader->len) - (msg->headersize - sizeof(DltStorageHeader));
1203 sprintf(str,"Buffer length: %d\n",length);
1204 dlt_log(LOG_INFO, str);
1208 sprintf(str,"Header Size: %d\n",msg->headersize);
1209 dlt_log(LOG_INFO, str);
1213 sprintf(str,"Data Size: %d\n",msg->datasize);
1214 dlt_log(LOG_INFO, str);
1217 /* check data size */
1218 if (msg->datasize < 0)
1220 sprintf(str,"Plausibility check failed. Complete message size too short (%d)!\n",msg->datasize);
1221 dlt_log(LOG_ERR, str);
1225 /* load standard header extra parameters and Extended header if used */
1228 if (length < (msg->headersize - sizeof(DltStorageHeader)))
1233 memcpy(msg->headerbuffer+sizeof(DltStorageHeader)+sizeof(DltStandardHeader),buffer+sizeof(DltStandardHeader),extra_size);
1235 /* set extended header ptr and get standard header extra parameters */
1236 if (DLT_IS_HTYP_UEH(msg->standardheader->htyp))
1238 msg->extendedheader = (DltExtendedHeader*) (msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader) +
1239 DLT_STANDARD_HEADER_EXTRA_SIZE(msg->standardheader->htyp));
1243 msg->extendedheader = 0;
1246 dlt_message_get_extraparameters(msg,verbose);
1249 /* check if payload fits length */
1250 if (length < (msg->headersize - sizeof(DltStorageHeader) + msg->datasize))
1252 /* dlt_log(LOG_ERR,"length does not fit!\n"); */
1256 /* free last used memory for buffer */
1257 if (msg->databuffer)
1259 free(msg->databuffer);
1262 /* get new memory for buffer */
1263 msg->databuffer = (uint8_t *)malloc(msg->datasize);
1264 if (msg->databuffer == 0)
1266 sprintf(str,"Cannot allocate memory for payload buffer of size %d!\n",msg->datasize);
1267 dlt_log(LOG_ERR, str);
1271 /* load payload data from buffer */
1272 memcpy(msg->databuffer,buffer+(msg->headersize-sizeof(DltStorageHeader)),msg->datasize);
1277 int dlt_message_get_extraparameters(DltMessage *msg,int verbose)
1279 PRINT_FUNCTION_VERBOSE(verbose);
1286 if (DLT_IS_HTYP_WEID(msg->standardheader->htyp))
1288 memcpy(msg->headerextra.ecu,msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader),DLT_ID_SIZE);
1291 if (DLT_IS_HTYP_WSID(msg->standardheader->htyp))
1293 memcpy(&(msg->headerextra.seid),msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader)
1294 + (DLT_IS_HTYP_WEID(msg->standardheader->htyp) ? DLT_SIZE_WEID : 0), DLT_SIZE_WSID);
1295 msg->headerextra.seid = DLT_BETOH_32(msg->headerextra.seid);
1298 if (DLT_IS_HTYP_WTMS(msg->standardheader->htyp))
1300 memcpy(&(msg->headerextra.tmsp),msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader)
1301 + (DLT_IS_HTYP_WEID(msg->standardheader->htyp) ? DLT_SIZE_WEID : 0)
1302 + (DLT_IS_HTYP_WSID(msg->standardheader->htyp) ? DLT_SIZE_WSID : 0),DLT_SIZE_WTMS);
1303 msg->headerextra.tmsp = DLT_BETOH_32(msg->headerextra.tmsp);
1309 int dlt_message_set_extraparameters(DltMessage *msg,int verbose)
1311 PRINT_FUNCTION_VERBOSE(verbose);
1318 if (DLT_IS_HTYP_WEID(msg->standardheader->htyp))
1320 memcpy(msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader),msg->headerextra.ecu,DLT_ID_SIZE);
1323 if (DLT_IS_HTYP_WSID(msg->standardheader->htyp))
1325 msg->headerextra.seid = DLT_HTOBE_32(msg->headerextra.seid);
1326 memcpy(msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader)
1327 + (DLT_IS_HTYP_WEID(msg->standardheader->htyp) ? DLT_SIZE_WEID : 0), &(msg->headerextra.seid),DLT_SIZE_WSID);
1330 if (DLT_IS_HTYP_WTMS(msg->standardheader->htyp))
1332 msg->headerextra.tmsp = DLT_HTOBE_32(msg->headerextra.tmsp);
1333 memcpy(msg->headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader)
1334 + (DLT_IS_HTYP_WEID(msg->standardheader->htyp) ? DLT_SIZE_WEID : 0)
1335 + (DLT_IS_HTYP_WSID(msg->standardheader->htyp) ? DLT_SIZE_WSID : 0), &(msg->headerextra.tmsp),DLT_SIZE_WTMS);
1341 int dlt_file_init(DltFile *file,int verbose)
1343 PRINT_FUNCTION_VERBOSE(verbose);
1350 /* initalise structure parameters */
1353 file->counter_total = 0;
1357 file->filter_counter = 0;
1358 file->file_position = 0;
1362 file->error_messages = 0;
1364 return dlt_message_init(&(file->msg),verbose);
1367 int dlt_file_set_filter(DltFile *file,DltFilter *filter,int verbose)
1369 PRINT_FUNCTION_VERBOSE(verbose);
1377 file->filter = filter;
1382 int dlt_file_read_header(DltFile *file,int verbose)
1384 PRINT_FUNCTION_VERBOSE(verbose);
1391 /* load header from file */
1392 if (fread(file->msg.headerbuffer,sizeof(DltStorageHeader)+sizeof(DltStandardHeader),1,file->handle)!=1)
1394 if (!feof(file->handle))
1396 dlt_log(LOG_ERR, "Cannot read header from file!\n");
1401 /* set ptrs to structures */
1402 file->msg.storageheader = (DltStorageHeader*) file->msg.headerbuffer;
1403 file->msg.standardheader = (DltStandardHeader*) (file->msg.headerbuffer + sizeof(DltStorageHeader));
1405 /* check id of storage header */
1406 if (dlt_check_storageheader(file->msg.storageheader)==0)
1408 dlt_log(LOG_ERR, "DLT storage header pattern not found!\n");
1412 /* calculate complete size of headers */
1413 file->msg.headersize = sizeof(DltStorageHeader) + sizeof(DltStandardHeader) +
1414 DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp) + (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp) ? sizeof(DltExtendedHeader) : 0);
1415 file->msg.datasize = DLT_BETOH_16(file->msg.standardheader->len) + sizeof(DltStorageHeader) - file->msg.headersize;
1418 sprintf(str,"Header Size: %d\n",file->msg.headersize);
1419 dlt_log(LOG_INFO, str);
1423 sprintf(str,"Data Size: %d\n",file->msg.datasize);
1424 dlt_log(LOG_INFO, str);
1427 /* check data size */
1428 if (file->msg.datasize < 0)
1430 sprintf(str,"Plausibility check failed. Complete message size too short! (%d)\n", file->msg.datasize);
1431 dlt_log(LOG_ERR, str);
1438 int dlt_file_read_header_raw(DltFile *file,int resync,int verbose)
1440 char dltSerialHeaderBuffer[DLT_ID_SIZE];
1442 PRINT_FUNCTION_VERBOSE(verbose);
1449 /* check if serial header exists, ignore if found */
1450 if (fread(dltSerialHeaderBuffer,sizeof(dltSerialHeaderBuffer),1,file->handle)!=1)
1452 /* cannot read serial header, not enough data available in file */
1453 if (!feof(file->handle))
1455 dlt_log(LOG_ERR, "Cannot read header from file!\n");
1459 if (memcmp(dltSerialHeaderBuffer,dltSerialHeader,sizeof(dltSerialHeader)) == 0)
1461 /* serial header found */
1462 /* nothing to do continue reading */
1467 /* serial header not found */
1470 /* increase error counter */
1471 file->error_messages++;
1473 /* resync to serial header */
1476 memmove(dltSerialHeaderBuffer,dltSerialHeaderBuffer+1,sizeof(dltSerialHeader)-1);
1477 if (fread(dltSerialHeaderBuffer+3,1,1,file->handle)!=1)
1479 /* cannot read any data, perhaps end of file reached */
1482 if (memcmp(dltSerialHeaderBuffer,dltSerialHeader,sizeof(dltSerialHeader)) == 0)
1484 /* serial header synchronised */
1491 /* go back to last file position */
1492 fseek(file->handle,file->file_position,SEEK_SET);
1496 /* load header from file */
1497 if (fread(file->msg.headerbuffer+sizeof(DltStorageHeader),sizeof(DltStandardHeader),1,file->handle)!=1)
1499 if (!feof(file->handle))
1501 dlt_log(LOG_ERR, "Cannot read header from file!\n");
1506 /* set ptrs to structures */
1507 file->msg.storageheader = (DltStorageHeader*) file->msg.headerbuffer; // this points now to a empty storage header (filled with '0')
1508 file->msg.standardheader = (DltStandardHeader*) (file->msg.headerbuffer + sizeof(DltStorageHeader));
1510 /* Skip storage header field, fill this field with '0' */
1511 memset(file->msg.storageheader,0,sizeof(DltStorageHeader));
1513 /* Set storage header */
1514 dlt_set_storageheader(file->msg.storageheader,DLT_COMMON_DUMMY_ECUID);
1516 /* no check for storage header id*/
1518 /* calculate complete size of headers */
1519 file->msg.headersize = sizeof(DltStorageHeader) + sizeof(DltStandardHeader) +
1520 DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp) + (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp) ? sizeof(DltExtendedHeader) : 0);
1521 file->msg.datasize = DLT_BETOH_16(file->msg.standardheader->len) + sizeof(DltStorageHeader) - file->msg.headersize;
1524 sprintf(str,"Header Size: %d\n",file->msg.headersize);
1525 dlt_log(LOG_INFO, str);
1529 sprintf(str,"Data Size: %d\n",file->msg.datasize);
1530 dlt_log(LOG_INFO, str);
1533 /* check data size */
1534 if (file->msg.datasize < 0)
1536 sprintf(str,"Plausibility check failed. Complete message size too short! (%d)\n", file->msg.datasize);
1537 dlt_log(LOG_ERR, str);
1544 int dlt_file_read_header_extended(DltFile *file, int verbose)
1546 PRINT_FUNCTION_VERBOSE(verbose);
1553 /* load standard header extra parameters if used */
1554 if (DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp))
1556 if (fread(file->msg.headerbuffer+sizeof(DltStorageHeader)+sizeof(DltStandardHeader),
1557 DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp),
1560 dlt_log(LOG_ERR, "Cannot read standard header extra parameters from file!\n");
1564 dlt_message_get_extraparameters(&(file->msg),verbose);
1567 /* load Extended header if used */
1568 if (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp)==0)
1570 /* there is nothing to be loaded */
1574 if (fread(file->msg.headerbuffer+sizeof(DltStorageHeader)+sizeof(DltStandardHeader)+DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp),
1575 (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp) ? sizeof(DltExtendedHeader) : 0),
1578 dlt_log(LOG_ERR, "Cannot read extended header from file!\n");
1582 /* set extended header ptr */
1583 if (DLT_IS_HTYP_UEH(file->msg.standardheader->htyp))
1585 file->msg.extendedheader = (DltExtendedHeader*) (file->msg.headerbuffer + sizeof(DltStorageHeader) + sizeof(DltStandardHeader) +
1586 DLT_STANDARD_HEADER_EXTRA_SIZE(file->msg.standardheader->htyp));
1590 file->msg.extendedheader = 0;
1596 int dlt_file_read_data(DltFile *file, int verbose)
1598 PRINT_FUNCTION_VERBOSE(verbose);
1605 /* free last used memory for buffer */
1606 if (file->msg.databuffer)
1608 free(file->msg.databuffer);
1611 /* get new memory for buffer */
1612 file->msg.databuffer = (uint8_t *)malloc(file->msg.datasize);
1614 if (file->msg.databuffer == 0)
1616 sprintf(str,"Cannot allocate memory for payload buffer of size %d!\n",file->msg.datasize);
1617 dlt_log(LOG_ERR, str);
1621 /* load payload data from file */
1622 if (fread(file->msg.databuffer,file->msg.datasize,1,file->handle)!=1)
1624 if (file->msg.datasize!=0)
1626 sprintf(str,"Cannot read payload data from file of size %d!\n",file->msg.datasize);
1627 dlt_log(LOG_ERR, str);
1635 int dlt_file_open(DltFile *file,const char *filename,int verbose)
1637 PRINT_FUNCTION_VERBOSE(verbose);
1644 /* reset counters */
1646 file->counter_total = 0;
1648 file->file_position = 0;
1649 file->file_length = 0;
1650 file->error_messages = 0;
1654 fclose(file->handle);
1658 file->handle = fopen(filename,"rb");
1659 if (file->handle == 0)
1661 sprintf(str,"File %s cannot be opened!\n",filename);
1662 dlt_log(LOG_ERR, str);
1666 fseek(file->handle,0,SEEK_END);
1667 file->file_length = ftell(file->handle);
1668 fseek(file->handle,0,SEEK_SET);
1672 /* print file length */
1673 sprintf(str,"File is %lu bytes long\n",file->file_length);
1674 dlt_log(LOG_INFO, str);
1679 int dlt_file_read(DltFile *file,int verbose)
1686 sprintf(str,"%s: Message %d:\n",__func__, file->counter_total);
1687 dlt_log(LOG_INFO, str);
1695 /* allocate new memory for index if number of messages exceeds a multiple of DLT_COMMON_INDEX_ALLOC (e.g.: 1000) */
1696 if (file->counter % DLT_COMMON_INDEX_ALLOC == 0)
1698 ptr = (long *) malloc(((file->counter/DLT_COMMON_INDEX_ALLOC) + 1) * DLT_COMMON_INDEX_ALLOC * sizeof(long));
1707 memcpy(ptr,file->index,file->counter * sizeof(long));
1713 /* set to end of last succesful read message, because of conflicting calls to dlt_file_read and dlt_file_message */
1714 fseek(file->handle,file->file_position,SEEK_SET);
1716 /* get file position at start of DLT message */
1719 sprintf(str,"Position in file: %ld\n",file->file_position);
1720 dlt_log(LOG_INFO, str);
1724 if (dlt_file_read_header(file,verbose)<0)
1726 /* go back to last position in file */
1727 fseek(file->handle,file->file_position,SEEK_SET);
1733 /* read the extended header if filter is enabled and extended header exists */
1734 if (dlt_file_read_header_extended(file, verbose)<0)
1736 /* go back to last position in file */
1737 fseek(file->handle,file->file_position,SEEK_SET);
1741 /* check the filters if message is used */
1742 if (dlt_message_filter_check(&(file->msg),file->filter,verbose) == 1)
1744 /* filter matched, consequently store current message */
1745 /* store index pointer to message position in DLT file */
1746 file->index[file->counter] = file->file_position;
1748 file->position = file->counter - 1;
1753 /* skip payload data */
1754 if (fseek(file->handle,file->msg.datasize,SEEK_CUR)!=0)
1756 /* go back to last position in file */
1757 fseek(file->handle,file->file_position,SEEK_SET);
1758 sprintf(str,"Seek failed to skip payload data of size %d!\n",file->msg.datasize);
1759 dlt_log(LOG_ERR, str);
1765 /* filter is disabled */
1766 /* skip additional header parameters and payload data */
1767 if (fseek(file->handle,file->msg.headersize - sizeof(DltStorageHeader) - sizeof(DltStandardHeader) + file->msg.datasize,SEEK_CUR))
1769 /* go back to last position in file */
1770 fseek(file->handle,file->file_position,SEEK_SET);
1771 sprintf(str,"Seek failed to skip extra header and payload data from file of size %d!\n",
1772 file->msg.headersize - sizeof(DltStorageHeader) - sizeof(DltStandardHeader) + file->msg.datasize);
1773 dlt_log(LOG_ERR, str);
1777 /* store index pointer to message position in DLT file */
1778 file->index[file->counter] = file->file_position;
1780 file->position = file->counter - 1;
1785 /* increase total message counter */
1786 file->counter_total++;
1788 /* store position to next message */
1789 file->file_position = ftell(file->handle);
1794 int dlt_file_read_raw(DltFile *file,int resync, int verbose)
1801 sprintf(str,"%s: Message %d:\n",__func__, file->counter_total);
1802 dlt_log(LOG_INFO, str);
1808 /* allocate new memory for index if number of messages exceeds a multiple of DLT_COMMON_INDEX_ALLOC (e.g.: 1000) */
1809 if (file->counter % DLT_COMMON_INDEX_ALLOC == 0)
1811 ptr = (long *) malloc(((file->counter/DLT_COMMON_INDEX_ALLOC) + 1) * DLT_COMMON_INDEX_ALLOC * sizeof(long));
1820 memcpy(ptr,file->index,file->counter * sizeof(long));
1826 /* set to end of last succesful read message, because of conflicting calls to dlt_file_read and dlt_file_message */
1827 fseek(file->handle,file->file_position,SEEK_SET);
1829 /* get file position at start of DLT message */
1832 sprintf(str,"Position in file: %ld\n",file->file_position);
1833 dlt_log(LOG_INFO, str);
1837 if (dlt_file_read_header_raw(file,resync,verbose)<0)
1839 /* go back to last position in file */
1840 fseek(file->handle,file->file_position,SEEK_SET);
1844 /* read the extended header if filter is enabled and extended header exists */
1845 if (dlt_file_read_header_extended(file, verbose)<0)
1847 /* go back to last position in file */
1848 fseek(file->handle,file->file_position,SEEK_SET);
1852 if (dlt_file_read_data(file,verbose)<0)
1854 /* go back to last position in file */
1855 fseek(file->handle,file->file_position,SEEK_SET);
1859 /* store index pointer to message position in DLT file */
1860 file->index[file->counter] = file->file_position;
1862 file->position = file->counter - 1;
1866 /* increase total message counter */
1867 file->counter_total++;
1869 /* store position to next message */
1870 file->file_position = ftell(file->handle);
1875 int dlt_file_close(DltFile *file,int verbose)
1877 PRINT_FUNCTION_VERBOSE(verbose);
1886 fclose(file->handle);
1894 int dlt_file_message(DltFile *file,int index,int verbose)
1896 PRINT_FUNCTION_VERBOSE(verbose);
1903 /* check if message is in range */
1904 if (index >= file->counter)
1906 sprintf(str,"Message %d out of range!\r\n",index);
1907 dlt_log(LOG_ERR, str);
1911 /* seek to position in file */
1912 if (fseek(file->handle,file->index[index],SEEK_SET)!=0)
1914 sprintf(str,"Seek to message %d to position %ld failed!\r\n",index,file->index[index]);
1915 dlt_log(LOG_ERR, str);
1919 /* read all header and payload */
1920 if (dlt_file_read_header(file,verbose)<0)
1925 if (dlt_file_read_header_extended(file,verbose)<0)
1930 if (dlt_file_read_data(file,verbose)<0)
1935 /* set current position in file */
1936 file->position = index;
1941 int dlt_file_free(DltFile *file,int verbose)
1943 PRINT_FUNCTION_VERBOSE(verbose);
1950 /* delete index lost if exists */
1960 fclose(file->handle);
1964 return dlt_message_free(&(file->msg),verbose);
1967 void dlt_log_set_level(int level)
1969 logging_level = level;
1972 void dlt_log_set_filename(const char *filename)
1974 strncpy(logging_filename,filename,sizeof(logging_filename));
1977 void dlt_log_init(int mode)
1979 logging_mode = mode;
1981 if(logging_mode == 2)
1983 /* internal logging to file */
1984 logging_handle = fopen(logging_filename,"w");
1985 if (logging_handle == 0)
1987 printf("Internal log file %s cannot be opened!\n",logging_filename);
1993 void dlt_log_free(void)
1995 if(logging_mode == 2) {
1996 fclose(logging_handle);
2000 int dlt_log(int prio, char *s)
2002 char logfmtstring[DLT_COMMON_BUFFER_LENGTH];
2008 if(logging_level<prio)
2017 strncpy(logfmtstring,"DLT| EMERGENCY: %s",sizeof(logfmtstring));
2022 strncpy(logfmtstring,"DLT| ALERT: %s",sizeof(logfmtstring));
2027 strncpy(logfmtstring,"DLT| CRITICAL: %s",sizeof(logfmtstring));
2032 strncpy(logfmtstring,"DLT| ERROR: %s",sizeof(logfmtstring));
2037 strncpy(logfmtstring,"DLT| WARNING: %s",sizeof(logfmtstring));
2042 strncpy(logfmtstring,"DLT| NOTICE: %s",sizeof(logfmtstring));
2047 strncpy(logfmtstring,"DLT| INFO: %s",sizeof(logfmtstring));
2052 strncpy(logfmtstring,"DLT| DEBUG: %s",sizeof(logfmtstring));
2057 strncpy(logfmtstring,"DLT| %s",sizeof(logfmtstring));
2062 switch(logging_mode)
2066 printf(logfmtstring, s);
2070 #if !defined (__WIN32__) && !defined(_MSC_VER)
2071 openlog("DLT",LOG_PID,LOG_DAEMON);
2072 syslog(prio, logfmtstring, s);
2078 if(logging_handle) {
2079 fprintf(logging_handle,logfmtstring, s);
2080 fflush(logging_handle);
2088 int dlt_receiver_init(DltReceiver *receiver,int fd, int buffersize)
2095 receiver->lastBytesRcvd = 0;
2096 receiver->bytesRcvd = 0;
2097 receiver->totalBytesRcvd = 0;
2098 receiver->buffersize = buffersize;
2100 receiver->buffer = (char*)malloc(receiver->buffersize);
2102 if (receiver->buffer == 0)
2109 receiver->buf = receiver->buffer;
2115 int dlt_receiver_free(DltReceiver *receiver)
2123 if (receiver->buffer)
2125 free(receiver->buffer);
2128 receiver->buffer = 0;
2135 int dlt_receiver_receive_socket(DltReceiver *receiver)
2142 if (receiver->buffer==0)
2147 receiver->buf = (char *)receiver->buffer;
2148 receiver->lastBytesRcvd = receiver->bytesRcvd;
2150 /* wait for data from socket */
2151 if ((receiver->bytesRcvd = recv(receiver->fd, receiver->buf + receiver->lastBytesRcvd, receiver->buffersize - receiver->lastBytesRcvd , 0)) <= 0)
2153 receiver->bytesRcvd = 0;
2155 return receiver->bytesRcvd;
2158 receiver->totalBytesRcvd += receiver->bytesRcvd;
2159 receiver->bytesRcvd += receiver->lastBytesRcvd;
2161 return receiver->bytesRcvd;
2165 int dlt_receiver_receive_fd(DltReceiver *receiver)
2172 if (receiver->buffer==0)
2177 receiver->buf = (char *)receiver->buffer;
2178 receiver->lastBytesRcvd = receiver->bytesRcvd;
2180 /* wait for data from fd */
2181 if ((receiver->bytesRcvd = read(receiver->fd, receiver->buf + receiver->lastBytesRcvd, receiver->buffersize - receiver->lastBytesRcvd)) <= 0)
2183 receiver->bytesRcvd = 0;
2185 return receiver->bytesRcvd;
2188 receiver->totalBytesRcvd += receiver->bytesRcvd;
2189 receiver->bytesRcvd += receiver->lastBytesRcvd;
2191 return receiver->bytesRcvd;
2194 int dlt_receiver_remove(DltReceiver *receiver,int size)
2201 if (receiver->buf==0)
2206 receiver->bytesRcvd = receiver->bytesRcvd - size;
2207 receiver->buf = receiver->buf + size;
2212 int dlt_receiver_move_to_begin(DltReceiver *receiver)
2219 if ((receiver->buffer==0) || (receiver->buf==0))
2224 if ((receiver->buffer!=receiver->buf) && (receiver->bytesRcvd!=0))
2226 memmove(receiver->buffer,receiver->buf,receiver->bytesRcvd);
2232 int dlt_set_storageheader(DltStorageHeader *storageheader, const char *ecu)
2235 #if !defined(_MSC_VER)
2239 if (storageheader==0)
2244 /* get time of day */
2245 #if defined(_MSC_VER)
2246 time(&(storageheader->seconds));
2248 gettimeofday(&tv, NULL);
2251 /* prepare storage header */
2252 storageheader->pattern[0] = 'D';
2253 storageheader->pattern[1] = 'L';
2254 storageheader->pattern[2] = 'T';
2255 storageheader->pattern[3] = 0x01;
2257 dlt_set_id(storageheader->ecu,ecu);
2259 /* Set current time */
2260 #if defined(_MSC_VER)
2261 storageheader->microseconds = 0;
2263 storageheader->seconds = (time_t)tv.tv_sec; /* value is long */
2264 storageheader->microseconds = (int32_t)tv.tv_usec; /* value is long */
2270 int dlt_check_storageheader(DltStorageHeader *storageheader)
2272 if (storageheader==0)
2277 return ((storageheader->pattern[0] == 'D') &&
2278 (storageheader->pattern[1] == 'L') &&
2279 (storageheader->pattern[2] == 'T') &&
2280 (storageheader->pattern[3] == 1));
2294 int dlt_buffer_init_static_server(DltBuffer *buf, const unsigned char *ptr, uint32_t size)
2297 DltBufferHead *head;
2300 buf->shm = (unsigned char *)ptr;
2301 buf->min_size = size;
2302 buf->max_size = size;
2306 head = (DltBufferHead*)buf->shm;
2310 buf->mem = (unsigned char *)(buf->shm + sizeof(DltBufferHead));
2311 buf->size = buf->min_size - sizeof(DltBufferHead);
2314 memset(buf->mem,0,buf->size);
2316 snprintf(str,sizeof(str),"Buffer: Size %d\n",buf->size);
2317 dlt_log(LOG_INFO, str);
2322 int dlt_buffer_init_static_client(DltBuffer *buf, const unsigned char *ptr, uint32_t size)
2327 buf->shm = (unsigned char *)ptr;
2328 buf->min_size = size;
2329 buf->max_size = size;
2333 buf->mem = (unsigned char *)(buf->shm + sizeof(DltBufferHead));
2334 buf->size = buf->min_size - sizeof(DltBufferHead);
2336 snprintf(str,sizeof(str),"Buffer: Size %d\n",buf->size);
2337 dlt_log(LOG_INFO, str);
2342 int dlt_buffer_init_dynamic(DltBuffer *buf, uint32_t min_size, uint32_t max_size,uint32_t step_size)
2345 DltBufferHead *head;
2348 buf->min_size = min_size;
2349 buf->max_size = max_size;
2350 buf->step_size = step_size;
2353 buf->shm = malloc(buf->min_size);
2354 if(buf->shm == NULL) {
2355 snprintf(str,sizeof(str),"Buffer: Cannot allocate %d bytes\n",buf->min_size);
2356 dlt_log(LOG_EMERG, str);
2361 head = (DltBufferHead*)buf->shm;
2365 buf->mem = (unsigned char *)(buf->shm + sizeof(DltBufferHead));
2366 buf->size = buf->min_size - sizeof(DltBufferHead);
2369 memset(buf->mem,0,buf->size);
2371 snprintf(str,sizeof(str),"Buffer: Size %d bytes\n",buf->size);
2372 dlt_log(LOG_INFO, str);
2377 int dlt_buffer_free_static(DltBuffer *buf)
2380 // buffer not initialised
2381 dlt_log(LOG_ERR,"Buffer: Buffer not initialised\n");
2382 return -1; /* ERROR */
2388 int dlt_buffer_free_dynamic(DltBuffer *buf)
2391 // buffer not initialised
2392 dlt_log(LOG_ERR,"Buffer: Buffer not initialised\n");
2393 return -1; /* ERROR */
2401 void dlt_buffer_write_block(DltBuffer *buf,int *write, const unsigned char *data,unsigned int size)
2403 if((*write+size) <= buf->size) {
2405 memcpy(buf->mem+*write,data,size);
2410 memcpy(buf->mem+*write, data, buf->size-*write);
2411 memcpy(buf->mem, data+buf->size-*write, size-buf->size+*write);
2412 *write += size-buf->size;
2416 void dlt_buffer_read_block(DltBuffer *buf,int *read,unsigned char *data,unsigned int size)
2418 if((*read+size) <= buf->size) {
2420 memcpy(data,buf->mem+*read,size);
2425 memcpy(data, buf->mem+*read, buf->size-*read);
2426 memcpy(data+buf->size-*read, buf->mem, size-buf->size+*read);
2427 *read += size-buf->size;
2431 int dlt_buffer_increase_size(DltBuffer *buf)
2433 DltBufferHead *head,*new_head;
2434 unsigned char *new_ptr;
2437 if(buf->step_size==0) {
2438 /* cannot increase size */
2443 if((buf->size + sizeof(DltBufferHead) + buf->step_size) > buf->max_size) {
2444 /* max size reached, do not increase */
2448 /* allocate new buffer */
2449 new_ptr = malloc(buf->size + sizeof(DltBufferHead) + buf->step_size);
2450 if(new_ptr == NULL) {
2451 snprintf(str,sizeof(str),"Buffer: Cannot increase size because allocate %d bytes failed\n",buf->min_size);
2452 dlt_log(LOG_WARNING, str);
2457 head = (DltBufferHead*)buf->shm;
2458 new_head = (DltBufferHead*)new_ptr;
2459 if(head->read < head->write) {
2460 memcpy(new_ptr+sizeof(DltBufferHead) , buf->mem+head->read , head->write-head->read);
2462 new_head->write = head->write-head->read;
2463 new_head->count = head->count;
2466 memcpy(new_ptr+sizeof(DltBufferHead) , buf->mem+head->read , buf->size-head->read);
2467 memcpy(new_ptr+sizeof(DltBufferHead)+buf->size-head->read , buf->mem , head->write);
2469 new_head->write = buf->size-head->read+head->write;
2470 new_head->count = head->count;
2478 buf->mem = new_ptr+sizeof(DltBufferHead);
2479 buf->size += buf->step_size;
2481 snprintf(str,sizeof(str),"Buffer: Size increased to %d bytes\n",buf->size+sizeof(DltBufferHead));
2482 dlt_log(LOG_INFO, str);
2487 int dlt_buffer_minimize_size(DltBuffer *buf)
2489 unsigned char *new_ptr;
2491 if((buf->size + sizeof(DltBufferHead)) == buf->min_size)
2493 /* already minimized */
2497 /* allocate new buffer */
2498 new_ptr = malloc(buf->min_size);
2499 if(new_ptr == NULL) {
2500 snprintf(str,sizeof(str),"Buffer: Cannot set to min size of %d bytes\n",buf->min_size);
2501 dlt_log(LOG_WARNING, str);
2510 buf->mem = new_ptr+sizeof(DltBufferHead);
2511 buf->size = buf->min_size - sizeof(DltBufferHead);
2513 /* reset pointers and counters */
2514 ((int*)(buf->shm))[0] = 0; // pointer to write memory
2515 ((int*)(buf->shm))[1] = 0; // pointer to read memory
2516 ((int*)(buf->shm))[2] = 0; // number of packets
2519 memset(buf->mem,0,buf->size);
2521 dlt_log(LOG_INFO,"Buffer: Buffer minimized.\n");
2526 int dlt_buffer_reset(DltBuffer *buf)
2528 dlt_log(LOG_ERR,"Buffer: Buffer reset triggered.\n");
2530 /* reset pointers and counters */
2531 ((int*)(buf->shm))[0] = 0; // pointer to write memory
2532 ((int*)(buf->shm))[1] = 0; // pointer to read memory
2533 ((int*)(buf->shm))[2] = 0; // number of packets
2536 memset(buf->mem,0,buf->size);
2541 int dlt_buffer_push(DltBuffer *buf,const unsigned char *data,unsigned int size)
2543 return dlt_buffer_push3(buf,data,size,0,0,0,0);
2546 int dlt_buffer_push3(DltBuffer *buf,const unsigned char *data1,unsigned int size1,const unsigned char *data2,unsigned int size2,const unsigned char *data3,unsigned int size3)
2549 int write, read, count;
2550 DltBufferBlockHead head;
2553 // buffer not initialised
2554 dlt_log(LOG_ERR,"Buffer: Buffer not initialised\n");
2555 return -1; /* ERROR */
2558 // get current write pointer
2559 write = ((int*)(buf->shm))[0];
2560 read = ((int*)(buf->shm))[1];
2561 count = ((int*)(buf->shm))[2];
2564 if((read>buf->size) || (write>buf->size))
2566 dlt_log(LOG_ERR,"Buffer: Pointer out of range\n");
2567 dlt_buffer_reset(buf);
2571 // calculate free size
2573 free_size = read - write;
2574 else if(count && (write == read))
2577 free_size = buf->size - write + read;
2580 if(free_size < (sizeof(DltBufferBlockHead)+size1+size2+size3)) {
2581 // try to increase size if possible
2582 if(dlt_buffer_increase_size(buf)) {
2583 /* increase size is not possible */
2584 dlt_log(LOG_ERR,"Buffer: Buffer is full\n");
2588 write = ((int*)(buf->shm))[0];
2589 read = ((int*)(buf->shm))[1];
2593 strcpy(head.head,DLT_BUFFER_HEAD);
2595 head.size = size1+size2+size3;
2598 dlt_buffer_write_block(buf,&write,(unsigned char*)&head,sizeof(DltBufferBlockHead));
2599 if(size1) dlt_buffer_write_block(buf,&write,data1,size1);
2600 if(size2) dlt_buffer_write_block(buf,&write,data2,size2);
2601 if(size3) dlt_buffer_write_block(buf,&write,data3,size3);
2603 // update global shm pointers
2604 ((int*)(buf->shm))[0] = write; // set new write pointer
2605 ((int*)(buf->shm))[2] += 1; // increase counter
2611 int dlt_buffer_get(DltBuffer *buf,unsigned char *data, int max_size,int delete)
2614 int write, read, count;
2615 char head_compare[] = DLT_BUFFER_HEAD;
2616 DltBufferBlockHead head;
2619 // shm not initialised
2620 dlt_log(LOG_ERR,"Buffer: SHM not initialised\n");
2621 return -1; /* ERROR */
2624 // get current write pointer
2625 write = ((int*)(buf->shm))[0];
2626 read = ((int*)(buf->shm))[1];
2627 count = ((int*)(buf->shm))[2];
2630 if((read>buf->size) || (write>buf->size) || (count<0))
2632 dlt_log(LOG_ERR,"Buffer: Pointer out of range\n");
2633 dlt_buffer_reset(buf);
2637 // check if data is in there
2641 dlt_log(LOG_ERR,"Buffer: SHM should be empty, but is not\n");
2642 dlt_buffer_reset(buf);
2647 // calculate used size
2649 used_size = write - read;
2651 used_size = buf->size - read + write;
2654 if(used_size < (sizeof(DltBufferBlockHead))) {
2655 dlt_log(LOG_ERR,"Buffer: Size check 1 failed\n");
2656 dlt_buffer_reset(buf);
2661 dlt_buffer_read_block(buf,&read,(unsigned char*)&head,sizeof(DltBufferBlockHead));
2664 if(memcmp((unsigned char*)(head.head),head_compare,sizeof(head_compare))!=0)
2666 dlt_log(LOG_ERR,"Buffer: Header head check failed\n");
2667 dlt_buffer_reset(buf);
2670 if(head.status != 2)
2672 dlt_log(LOG_ERR,"Buffer: Header status check failed\n");
2673 dlt_buffer_reset(buf);
2677 // second check size
2678 if(used_size < (sizeof(DltBufferBlockHead)+head.size)) {
2679 dlt_log(LOG_ERR,"Buffer: Size check 2 failed\n");
2680 dlt_buffer_reset(buf);
2685 if(max_size && (head.size > max_size)) {
2686 dlt_log(LOG_ERR,"Buffer: Size check 3 failed\n");
2687 // nothing to do but data does not fit provided buffer
2690 if(data && max_size)
2693 dlt_buffer_read_block(buf,&read,data,head.size);
2697 // update buffer pointers
2698 ((int*)(buf->shm))[1] = read; // set new read pointer
2704 if( (read+head.size) <= buf->size)
2705 ((int*)(buf->shm))[1] = read+head.size; // set new read pointer
2707 ((int*)(buf->shm))[1] = read+head.size-buf->size; // set new read pointer
2711 ((int*)(buf->shm))[2] -= 1; // decrease counter
2713 if(((int*)(buf->shm))[2] == 0)
2715 // try to minimize size
2716 dlt_buffer_minimize_size(buf);
2720 return head.size; // OK
2723 int dlt_buffer_pull(DltBuffer *buf,unsigned char *data, int max_size)
2725 return dlt_buffer_get(buf,data,max_size,1);
2728 int dlt_buffer_copy(DltBuffer *buf,unsigned char *data, int max_size)
2730 return dlt_buffer_get(buf,data,max_size,0);
2733 int dlt_buffer_remove(DltBuffer *buf)
2735 return dlt_buffer_get(buf,0,0,1);
2738 void dlt_buffer_info(DltBuffer *buf)
2742 snprintf(str,sizeof(str),"Buffer: Available size: %d\n",buf->size);
2743 dlt_log(LOG_INFO, str);
2744 snprintf(str,sizeof(str),"Buffer: Buffer full start address: %lX\n",(unsigned long)buf->shm);
2745 dlt_log(LOG_INFO, str);
2746 snprintf(str,sizeof(str),"Buffer: Buffer start address: %lX\n",(unsigned long)buf->mem);
2747 dlt_log(LOG_INFO, str);
2751 void dlt_buffer_status(DltBuffer *buf)
2753 int write, read, count;
2756 write = ((int*)(buf->shm))[0];
2757 read = ((int*)(buf->shm))[1];
2758 count = ((int*)(buf->shm))[2];
2760 snprintf(str,sizeof(str),"Buffer: Write: %d\n",write);
2761 dlt_log(LOG_INFO, str);
2762 snprintf(str,sizeof(str),"Buffer: Read: %d\n",read);
2763 dlt_log(LOG_INFO, str);
2764 snprintf(str,sizeof(str),"Buffer: Count: %d\n",count);
2765 dlt_log(LOG_INFO, str);
2768 int dlt_buffer_get_total_size(DltBuffer *buf)
2770 return buf->max_size;
2773 int dlt_buffer_get_used_size(DltBuffer *buf)
2775 int write, read, count;
2777 write = ((int*)(buf->shm))[0];
2778 read = ((int*)(buf->shm))[1];
2779 count = ((int*)(buf->shm))[2];
2785 return (write - read);
2787 return (buf->size - read + write);
2790 int dlt_buffer_get_message_count(DltBuffer *buf)
2792 return ((int*)(buf->shm))[2];
2795 #if !defined (__WIN32__)
2797 int dlt_setup_serial(int fd, speed_t speed)
2799 #if !defined (__WIN32__) && !defined(_MSC_VER)
2800 struct termios config;
2807 if (tcgetattr(fd, &config) < 0)
2812 /* Input flags - Turn off input processing
2813 convert break to null byte, no CR to NL translation,
2814 no NL to CR translation, don't mark parity errors or breaks
2815 no input parity check, don't strip high bit off,
2816 no XON/XOFF software flow control
2818 config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL |
2819 INLCR | PARMRK | INPCK | ISTRIP | IXON);
2821 /* Output flags - Turn off output processing
2822 no CR to NL translation, no NL to CR-NL translation,
2823 no NL to CR translation, no column 0 CR suppression,
2824 no Ctrl-D suppression, no fill characters, no case mapping,
2825 no local output processing
2827 config.c_oflag &= ~(OCRNL | ONLCR | ONLRET |
2828 ONOCR | ONOEOT| OFILL | OLCUC | OPOST);
2832 /* No line processing:
2833 echo off, echo newline off, canonical mode off,
2834 extended input processing off, signal chars off
2836 config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
2838 /* Turn off character processing
2839 clear current char size mask, no parity checking,
2840 no output processing, force 8 bit input
2842 config.c_cflag &= ~(CSIZE | PARENB);
2843 config.c_cflag |= CS8;
2845 /* One input byte is enough to return from read()
2846 Inter-character timer off
2848 config.c_cc[VMIN] = 1;
2849 config.c_cc[VTIME] = 0;
2851 /* Communication speed (simple version, using the predefined
2854 if (cfsetispeed(&config, speed) < 0 || cfsetospeed(&config, speed) < 0)
2859 /* Finally, apply the configuration
2861 if (tcsetattr(fd, TCSAFLUSH, &config) < 0)
2872 speed_t dlt_convert_serial_speed(int baudrate)
2874 #if !defined (__WIN32__) && !defined(_MSC_VER)
3044 void dlt_get_version(char *buf)
3046 sprintf(buf,"DLT Package Version: %s %s, Package Revision: %s, build on %s %s\n",
3047 _DLT_PACKAGE_VERSION, _DLT_PACKAGE_VERSION_STATE, _DLT_PACKAGE_REVISION, __DATE__ , __TIME__ );
3050 void dlt_get_major_version(char *buf)
3052 sprintf(buf,"%s",_DLT_PACKAGE_MAJOR_VERSION);
3055 void dlt_get_minor_version(char *buf)
3057 sprintf(buf,"%s",_DLT_PACKAGE_MINOR_VERSION);
3061 uint32_t dlt_uptime(void)
3064 #if defined (__WIN32__) || defined(_MSC_VER)
3066 return (uint32_t)(GetTickCount()*10); /* GetTickCount() return DWORD */
3071 if (clock_gettime(CLOCK_MONOTONIC,&ts)==0)
3073 return (uint32_t)((((ts.tv_sec*1000000)+(ts.tv_nsec/1000)))/100); // in 0.1 ms = 100 us
3084 int dlt_message_print_header(DltMessage *message, char *text, uint32_t size, int verbose)
3086 if ((message==0) || (text==0))
3091 dlt_message_header(message,text,size,verbose);
3092 printf("%s\n",text);
3097 int dlt_message_print_hex(DltMessage *message, char *text, uint32_t size, int verbose)
3099 if ((message==0) || (text==0))
3104 dlt_message_header(message,text,size,verbose);
3106 dlt_message_payload(message,text,size,DLT_OUTPUT_HEX,verbose);
3107 printf("[%s]\n",text);
3112 int dlt_message_print_ascii(DltMessage *message, char *text, uint32_t size, int verbose)
3114 if ((message==0) || (text==0))
3119 dlt_message_header(message,text,size,verbose);
3121 dlt_message_payload(message,text,size,DLT_OUTPUT_ASCII,verbose);
3122 printf("[%s]\n",text);
3127 int dlt_message_print_mixed_plain(DltMessage *message, char *text, uint32_t size, int verbose)
3129 if ((message==0) || (text==0))
3134 dlt_message_header(message,text,size,verbose);
3135 printf("%s \n",text);
3136 dlt_message_payload(message,text,size,DLT_OUTPUT_MIXED_FOR_PLAIN,verbose);
3137 printf("[%s]\n",text);
3142 int dlt_message_print_mixed_html(DltMessage *message, char *text, uint32_t size, int verbose)
3144 if ((message==0) || (text==0))
3149 dlt_message_header(message,text,size,verbose);
3150 printf("%s \n",text);
3151 dlt_message_payload(message,text,size,DLT_OUTPUT_MIXED_FOR_HTML,verbose);
3152 printf("[%s]\n",text);
3157 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)
3159 int16_t length=0,length_tmp=0; /* the macro can set this variable to -1 */
3160 uint16_t length2=0,length2_tmp=0,length3=0,length3_tmp=0;
3163 uint16_t value16u=0,value16u_tmp=0;
3164 uint32_t value32u=0,value32u_tmp=0;
3165 uint64_t value64u=0,value64u_tmp=0;
3168 int16_t value16i=0,value16i_tmp=0;
3169 int32_t value32i=0,value32i_tmp=0;
3170 int64_t value64i=0,value64i_tmp=0;
3172 float32_t value32f=0,value32f_tmp=0;
3173 int32_t value32f_tmp_int32i=0,value32f_tmp_int32i_swaped=0;
3174 float64_t value64f=0,value64f_tmp=0;
3175 int64_t value64f_tmp_int64i=0,value64f_tmp_int64i_swaped=0;
3177 uint32_t quantisation=0, quantisation_tmp=0;
3179 if (type_info & DLT_TYPE_INFO_STRG)
3185 DLT_MSG_READ_VALUE(length_tmp,*ptr,*datalength,uint16_t);
3188 length=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length_tmp);
3192 length=(int16_t)byteLength;
3195 if (type_info & DLT_TYPE_INFO_VARI)
3197 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3200 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3201 if((*datalength)<length2)
3204 *datalength-=length2;
3207 DLT_MSG_READ_STRING((text+strlen(text)),*ptr,*datalength,length);
3212 else if (type_info & DLT_TYPE_INFO_BOOL)
3215 if (type_info & DLT_TYPE_INFO_VARI)
3217 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3220 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3221 if((*datalength)<length2)
3224 *datalength-=length2;
3227 DLT_MSG_READ_VALUE(value8u,*ptr,*datalength,uint8_t); /* No endian conversion necessary */
3230 sprintf(text+strlen(text),"%d",value8u);
3232 else if (type_info & DLT_TYPE_INFO_SINT || type_info & DLT_TYPE_INFO_UINT)
3234 /* signed or unsigned argument received */
3235 if (type_info & DLT_TYPE_INFO_VARI)
3237 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3240 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3241 DLT_MSG_READ_VALUE(length3_tmp,*ptr,*datalength,uint16_t);
3244 length3=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length3_tmp);
3245 if((*datalength)<length2)
3248 *datalength-=length2;
3249 if((*datalength)<length3)
3252 *datalength-=length3;
3254 if (type_info & DLT_TYPE_INFO_FIXP)
3258 DLT_MSG_READ_VALUE(quantisation_tmp,*ptr,*datalength,uint32_t);
3261 quantisation=DLT_ENDIAN_GET_32(msg->standardheader->htyp, quantisation_tmp);
3263 switch ( type_info & DLT_TYPE_INFO_TYLE)
3266 case DLT_TYLE_16BIT:
3267 case DLT_TYLE_32BIT:
3275 case DLT_TYLE_64BIT:
3283 case DLT_TYLE_128BIT:
3285 if((*datalength)<16)
3297 switch ( type_info & DLT_TYPE_INFO_TYLE)
3301 if (type_info & DLT_TYPE_INFO_SINT)
3304 DLT_MSG_READ_VALUE(value8i,*ptr,*datalength,int8_t); /* No endian conversion necessary */
3307 sprintf(text+strlen(text),"%d",value8i);
3312 DLT_MSG_READ_VALUE(value8u,*ptr,*datalength,uint8_t); /* No endian conversion necessary */
3315 sprintf(text+strlen(text),"%d",value8u);
3319 case DLT_TYLE_16BIT:
3321 if (type_info & DLT_TYPE_INFO_SINT)
3325 DLT_MSG_READ_VALUE(value16i_tmp,*ptr,*datalength,int16_t);
3328 value16i=DLT_ENDIAN_GET_16(msg->standardheader->htyp, value16i_tmp);
3329 sprintf(text+strlen(text),"%hd",value16i);
3335 DLT_MSG_READ_VALUE(value16u_tmp,*ptr,*datalength,uint16_t);
3338 value16u=DLT_ENDIAN_GET_16(msg->standardheader->htyp, value16u_tmp);
3339 sprintf(text+strlen(text),"%hu",value16u);
3343 case DLT_TYLE_32BIT:
3345 if (type_info & DLT_TYPE_INFO_SINT)
3349 DLT_MSG_READ_VALUE(value32i_tmp,*ptr,*datalength,int32_t);
3352 value32i=DLT_ENDIAN_GET_32(msg->standardheader->htyp, (uint32_t)value32i_tmp);
3353 sprintf(text+strlen(text),"%d",value32i);
3359 DLT_MSG_READ_VALUE(value32u_tmp,*ptr,*datalength,uint32_t);
3362 value32u=DLT_ENDIAN_GET_32(msg->standardheader->htyp, value32u_tmp);
3363 sprintf(text+strlen(text),"%u",value32u);
3367 case DLT_TYLE_64BIT:
3369 if (type_info & DLT_TYPE_INFO_SINT)
3373 DLT_MSG_READ_VALUE(value64i_tmp,*ptr,*datalength,int64_t);
3376 value64i=DLT_ENDIAN_GET_64(msg->standardheader->htyp, (uint64_t)value64i_tmp);
3377 #if defined (__WIN32__) && !defined(_MSC_VER)
3378 sprintf(text+strlen(text),"%I64d",value64i);
3380 sprintf(text+strlen(text),"%lld",value64i);
3387 DLT_MSG_READ_VALUE(value64u_tmp,*ptr,*datalength,uint64_t);
3390 value64u=DLT_ENDIAN_GET_64(msg->standardheader->htyp, value64u_tmp);
3391 #if defined (__WIN32__) && !defined(_MSC_VER)
3392 sprintf(text+strlen(text),"%I64u",value64u);
3394 sprintf(text+strlen(text),"%llu",value64u);
3399 case DLT_TYLE_128BIT:
3401 if (*datalength>=16)
3402 dlt_print_hex_string(text+strlen(text),textlength,*ptr,16);
3403 if((*datalength)<16)
3415 else if (type_info & DLT_TYPE_INFO_FLOA)
3417 /* float data argument */
3418 if (type_info & DLT_TYPE_INFO_VARI)
3420 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3423 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3424 DLT_MSG_READ_VALUE(length3_tmp,*ptr,*datalength,uint16_t);
3427 length3=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length3_tmp);
3428 if((*datalength)<length2)
3431 *datalength-=length2;
3432 if((*datalength)<length3)
3435 *datalength-=length3;
3437 switch ( type_info & DLT_TYPE_INFO_TYLE)
3442 dlt_print_hex_string(text+strlen(text),textlength,*ptr,1);
3449 case DLT_TYLE_16BIT:
3452 dlt_print_hex_string(text+strlen(text),textlength,*ptr,2);
3459 case DLT_TYLE_32BIT:
3461 if (sizeof(float32_t)==4)
3465 value32f_tmp_int32i=0;
3466 value32f_tmp_int32i_swaped=0;
3467 DLT_MSG_READ_VALUE(value32f_tmp,*ptr,*datalength,float32_t);
3470 memcpy(&value32f_tmp_int32i,&value32f_tmp,sizeof(float32_t));
3471 value32f_tmp_int32i_swaped=DLT_ENDIAN_GET_32(msg->standardheader->htyp, (uint32_t)value32f_tmp_int32i);
3472 memcpy(&value32f,&value32f_tmp_int32i_swaped,sizeof(float32_t));
3473 sprintf(text+strlen(text),"%g",value32f);
3477 dlt_log(LOG_ERR, "Invalid size of float32_t\n");
3482 case DLT_TYLE_64BIT:
3484 if (sizeof(float64_t)==8)
3488 value64f_tmp_int64i=0;
3489 value64f_tmp_int64i_swaped=0;
3490 DLT_MSG_READ_VALUE(value64f_tmp,*ptr,*datalength,float64_t);
3493 memcpy(&value64f_tmp_int64i,&value64f_tmp,sizeof(float64_t));
3494 value64f_tmp_int64i_swaped=DLT_ENDIAN_GET_64(msg->standardheader->htyp, (uint64_t)value64f_tmp_int64i);
3495 memcpy(&value64f,&value64f_tmp_int64i_swaped,sizeof(float64_t));
3497 sprintf(text+strlen(text),"ILLEGAL");
3499 sprintf(text+strlen(text),"%g",value64f);
3504 dlt_log(LOG_ERR, "Invalid size of float64_t\n");
3509 case DLT_TYLE_128BIT:
3511 if (*datalength>=16)
3512 dlt_print_hex_string(text+strlen(text),textlength,*ptr,16);
3513 if((*datalength)<16)
3526 else if (type_info & DLT_TYPE_INFO_RAWD)
3528 /* raw data argument */
3529 DLT_MSG_READ_VALUE(length_tmp,*ptr,*datalength,uint16_t);
3532 length=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length_tmp);
3533 if (type_info & DLT_TYPE_INFO_VARI)
3535 DLT_MSG_READ_VALUE(length2_tmp,*ptr,*datalength,uint16_t);
3538 length2=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length2_tmp);
3539 if((*datalength)<length2)
3542 *datalength-=length2;
3544 if((*datalength)<length)
3546 dlt_print_hex_string(text+strlen(text),textlength,*ptr,length);
3548 *datalength-=length;
3550 else if (type_info & DLT_TYPE_INFO_TRAI)
3552 /* trace info argument */
3553 DLT_MSG_READ_VALUE(length_tmp,*ptr,*datalength,uint16_t);
3556 length=DLT_ENDIAN_GET_16(msg->standardheader->htyp, length_tmp);
3557 DLT_MSG_READ_STRING((text+strlen(text)),*ptr,*datalength,length);
3568 dlt_log(LOG_ERR, "Payload of DLT message corrupted\n");