5454
5555#include "lib.h"
5656
57+ /* relevant flags in Flags field */
58+ #define ASC_F_RTR 0x00000010
59+ #define ASC_F_FDF 0x00001000
60+ #define ASC_F_BRS 0x00002000
61+ #define ASC_F_ESI 0x00004000
62+ #define ASC_F_XLF 0x00400000
63+ #define ASC_F_RES 0x00800000
64+ #define ASC_F_SEC 0x01000000
65+
5766extern int optind , opterr , optopt ;
5867
5968static void print_usage (char * prg )
@@ -65,18 +74,17 @@ static void print_usage(char *prg)
6574 fprintf (stderr , " -O <outfile> (default stdout)\n" );
6675 fprintf (stderr , " -4 (reduce decimal place to 4 digits)\n" );
6776 fprintf (stderr , " -n (set newline to cr/lf - default lf)\n" );
68- fprintf (stderr , " -f (use CANFD format also for Classic CAN)\n" );
77+ fprintf (stderr , " -f (use CANFD format also for CAN CC)\n" );
78+ fprintf (stderr , " -x (use CANXL format also for CAN CC/FD)\n" );
6979 fprintf (stderr , " -r (suppress dlc for RTR frames - pre v8.5 tools)\n" );
7080}
7181
72- static void can_asc (struct canfd_frame * cfd , int devno , int nortrdlc ,
82+ static void can_asc (struct can_frame * cf , int devno , int nortrdlc ,
7383 char * extra_info , FILE * outfile )
7484{
75- int i ;
85+ unsigned int i , dlc ;
7686 char id [10 ];
7787 char * dir = "Rx" ;
78- int dlc ;
79- struct can_frame * cf = (struct can_frame * )cfd ; /* for len8_dlc */
8088
8189 fprintf (outfile , "%-2d " , devno ); /* channel number left aligned */
8290
@@ -93,7 +101,7 @@ static void can_asc(struct canfd_frame *cfd, int devno, int nortrdlc,
93101 dir = "Tx" ;
94102 }
95103
96- fprintf (outfile , "%-15s %s " , id , dir );
104+ fprintf (outfile , "%-15s %-4s " , id , dir );
97105
98106 if (cf -> len == CAN_MAX_DLC &&
99107 cf -> len8_dlc > CAN_MAX_DLC &&
@@ -120,27 +128,21 @@ static void can_asc(struct canfd_frame *cfd, int devno, int nortrdlc,
120128static void canfd_asc (struct canfd_frame * cf , int devno , int mtu ,
121129 char * extra_info , FILE * outfile )
122130{
123- int i ;
131+ unsigned int i ;
124132 char id [10 ];
125133 char * dir = "Rx" ;
126134 unsigned int flags = 0 ;
127135 unsigned int dlen = cf -> len ;
128136 unsigned int dlc = can_fd_len2dlc (dlen );
129137
130- /* relevant flags in Flags field */
131- #define ASC_F_RTR 0x00000010
132- #define ASC_F_FDF 0x00001000
133- #define ASC_F_BRS 0x00002000
134- #define ASC_F_ESI 0x00004000
135-
136138 /* check for extra info */
137139 if (strlen (extra_info ) > 0 ) {
138140 /* only the first char is defined so far */
139141 if (extra_info [0 ] == 'T' )
140142 dir = "Tx" ;
141143 }
142144
143- fprintf (outfile , "CANFD %3d %s " , devno , dir ); /* 3 column channel number right aligned */
145+ fprintf (outfile , "CANFD %3d %-4s " , devno , dir ); /* 3 column channel number right aligned */
144146
145147 sprintf (id , "%X%c" , cf -> can_id & CAN_EFF_MASK ,
146148 (cf -> can_id & CAN_EFF_FLAG )?'x' :' ' );
@@ -174,13 +176,124 @@ static void canfd_asc(struct canfd_frame *cf, int devno, int mtu,
174176
175177 fprintf (outfile , "%2d" , dlen );
176178
177- for (i = 0 ; i < ( int ) dlen ; i ++ ) {
179+ for (i = 0 ; i < dlen ; i ++ ) {
178180 fprintf (outfile , " %02X" , cf -> data [i ]);
179181 }
180182
181183 fprintf (outfile , " %8d %4d %8X 0 0 0 0 0" , 130000 , 130 , flags );
182184}
183185
186+ static void canxl_asc (cu_t * cu , int devno , int mtu ,
187+ char * extra_info , FILE * outfile )
188+ {
189+ char id [10 ];
190+ char * dir = "Rx" ;
191+ char * frametype ;
192+ unsigned char * dataptr ;
193+ unsigned int i , dlen , dlc , flags = 0 ;
194+
195+ /* check for extra info */
196+ if (strlen (extra_info ) > 0 ) {
197+ /* only the first char is defined so far */
198+ if (extra_info [0 ] == 'T' )
199+ dir = "Tx" ;
200+ }
201+
202+ switch (mtu ) {
203+ case CANXL_MTU :
204+ sprintf (id , "%X" , cu -> xl .prio & CANXL_PRIO_MASK );
205+ frametype = "XLFF" ;
206+
207+ dataptr = & cu -> xl .data [0 ];
208+ dlen = cu -> xl .len ;
209+ dlc = dlen - 1 ;
210+ flags = (ASC_F_XLF | ASC_F_FDF | ASC_F_BRS );
211+
212+ if (cu -> xl .flags & CANXL_SEC )
213+ flags |= ASC_F_SEC ;
214+ if (cu -> xl .flags & CANXL_RRS )
215+ flags |= ASC_F_RES ;
216+ break ;
217+
218+ case CANFD_MTU :
219+ if (cu -> fd .can_id & CAN_EFF_FLAG ) {
220+ sprintf (id , "%Xx" , cu -> fd .can_id & CAN_EFF_MASK );
221+ frametype = "FEFF" ;
222+ } else {
223+ sprintf (id , "%X" , cu -> fd .can_id & CAN_SFF_MASK );
224+ frametype = "FBFF" ;
225+ }
226+
227+ dataptr = & cu -> fd .data [0 ];
228+ dlen = cu -> fd .len ;
229+ dlc = can_fd_len2dlc (dlen );
230+ flags = ASC_F_FDF ;
231+ if (cu -> fd .flags & CANFD_BRS )
232+ flags |= ASC_F_BRS ;
233+ if (cu -> fd .flags & CANFD_ESI )
234+ flags |= ASC_F_ESI ;
235+ break ;
236+
237+ case CAN_MTU :
238+ if (cu -> cc .can_id & CAN_EFF_FLAG ) {
239+ sprintf (id , "%Xx" , cu -> cc .can_id & CAN_EFF_MASK );
240+ frametype = "CEFF" ;
241+ } else {
242+ sprintf (id , "%X" , cu -> cc .can_id & CAN_SFF_MASK );
243+ frametype = "CBFF" ;
244+ }
245+
246+ dataptr = & cu -> cc .data [0 ];
247+ dlen = cu -> cc .len ;
248+ dlc = dlen ;
249+
250+ /* check for extra DLC when having a Classic CAN with 8 bytes payload */
251+ if ((dlen == CAN_MAX_DLEN ) && (cu -> cc .len8_dlc > CAN_MAX_DLEN ) &&
252+ (cu -> cc .len8_dlc <= CAN_MAX_RAW_DLC ))
253+ dlc = cu -> cc .len8_dlc ;
254+
255+ if (cu -> cc .can_id & CAN_RTR_FLAG ) {
256+ /* no data length but dlc for RTR frames */
257+ dlen = 0 ;
258+ flags = ASC_F_RTR ;
259+ }
260+ break ;
261+
262+ default :
263+ return ;
264+ }
265+
266+ fprintf (outfile , "CANXL %3d %-4s " , devno , dir ); /* 3 column channel number and direction */
267+
268+ fprintf (outfile , "%s 984438 4656 " , frametype ); /* frame type / msg duration / bit count */
269+
270+ fprintf (outfile , "%9s " , id ); /* ID / symbolic name (empty) */
271+
272+ if (mtu == CANXL_MTU ) /* SDT, SEC bit for CAN XL only */
273+ fprintf (outfile , "%02x %d " , cu -> xl .sdt , (cu -> xl .flags & CANXL_SEC )?1 :0 );
274+
275+ fprintf (outfile , "%x %d" , dlc , dlen ); /* DLC and data length */
276+
277+ if (mtu == CANXL_MTU ) /* SBC / PCRC / VCID / AF */
278+ fprintf (outfile , " 1 1f96 %02x %08x" ,
279+ (unsigned char )((cu -> xl .prio >> CANXL_VCID_OFFSET ) & CANXL_VCID_VAL_MASK ),
280+ cu -> xl .af );
281+
282+ for (i = 0 ; i < dlen ; i ++ ) {
283+ fprintf (outfile , " %02x" , dataptr [i ]);
284+ }
285+
286+ if (mtu == CANFD_MTU ) /* stuff field */
287+ fprintf (outfile , " 8" );
288+
289+ fprintf (outfile , " 123123 %08x %08x" , flags , 0 ); /* fcsc, msg flags, msg flags ext */
290+
291+ fprintf (outfile , /* bitrate settings for CC/FD/XL */
292+ " 000000050005000e 0000000000a00010"
293+ " 0000000a000a001d 0000000000a00002"
294+ " 000000100010000f 0000000000a00001" );
295+ }
296+
184297#define DEVSZ 22
185298#define EXTRASZ 20
186299#define TIMESZ sizeof("(1345212884.318850) ")
@@ -205,11 +318,11 @@ int main(int argc, char **argv)
205318 static struct timeval tv , start_tv ;
206319 FILE * infile = stdin ;
207320 FILE * outfile = stdout ;
208- static int maxdev , devno , i , crlf , fdfmt , nortrdlc , d4 , opt , mtu ;
321+ static int maxdev , devno , i , crlf , fdfmt , xlfmt , nortrdlc , d4 , opt , mtu ;
209322 int print_banner = 1 ;
210323 unsigned long long sec , usec ;
211324
212- while ((opt = getopt (argc , argv , "I:O:4nfr ?" )) != -1 ) {
325+ while ((opt = getopt (argc , argv , "I:O:4nfxr ?" )) != -1 ) {
213326 switch (opt ) {
214327 case 'I' :
215328 infile = fopen (optarg , "r" );
@@ -235,6 +348,10 @@ int main(int argc, char **argv)
235348 fdfmt = 1 ;
236349 break ;
237350
351+ case 'x' :
352+ xlfmt = 1 ;
353+ break ;
354+
238355 case 'r' :
239356 nortrdlc = 1 ;
240357 break ;
@@ -300,6 +417,9 @@ int main(int argc, char **argv)
300417 (crlf )?"\r\n" :"\n" );
301418 fprintf (outfile , "no internal events logged%s" ,
302419 (crlf )?"\r\n" :"\n" );
420+ fprintf (outfile , "// version 18.2.0%s" , (crlf )?"\r\n" :"\n" );
421+ fprintf (outfile , "// Measurement UUID: cc9c7b54-68ae-"
422+ "46d2-a43a-6aa87df7dd74%s" , (crlf )?"\r\n" :"\n" );
303423 }
304424
305425 for (i = 0 , devno = 0 ; i < maxdev ; i ++ ) {
@@ -313,14 +433,8 @@ int main(int argc, char **argv)
313433
314434 mtu = parse_canframe (afrbuf , & cu );
315435
316- /* convert only CAN CC and CAN FD frames */
317- if ((mtu != CAN_MTU ) && (mtu != CANFD_MTU )) {
318- printf ("no valid CAN CC/FD frame\n" );
319- return 1 ;
320- }
321-
322- /* we don't support error message frames in CAN FD */
323- if ((mtu == CANFD_MTU ) && (cu .cc .can_id & CAN_ERR_FLAG ))
436+ /* no error message frames in non CAN CC frames */
437+ if ((mtu != CAN_MTU ) && (cu .cc .can_id & CAN_ERR_FLAG ))
324438 continue ;
325439
326440 tv .tv_sec = tv .tv_sec - start_tv .tv_sec ;
@@ -335,10 +449,12 @@ int main(int argc, char **argv)
335449 else
336450 fprintf (outfile , "%4llu.%06llu " , (unsigned long long )tv .tv_sec , (unsigned long long )tv .tv_usec );
337451
338- if ((mtu == CAN_MTU ) && (fdfmt == 0 ))
339- can_asc (& cu .fd , devno , nortrdlc , extra_info , outfile );
340- else
452+ if ((mtu == CAN_MTU ) && (fdfmt == 0 ) && ( xlfmt == 0 ) )
453+ can_asc (& cu .cc , devno , nortrdlc , extra_info , outfile );
454+ else if (( mtu != CANXL_MTU ) && ( xlfmt == 0 ))
341455 canfd_asc (& cu .fd , devno , mtu , extra_info , outfile );
456+ else
457+ canxl_asc (& cu , devno , mtu , extra_info , outfile );
342458
343459 if (crlf )
344460 fprintf (outfile , "\r" );
0 commit comments