log2asc: support CANFD format also for Classic CAN

The CANFD tagged format also supports the encapsulation of Classic CAN
frames which is selected when logging on CAN FD capable CAN interfaces.

With a new option '-f' this CANFD format is selected.

Although this representation is even more inefficient it is seems to be
the common way and increases the readability for mixed CAN/CANFD logs.

Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
pull/203/head
Oliver Hartkopp 2020-05-10 11:22:05 +02:00
parent ad9fc28f9e
commit 3014d390b4
1 changed files with 35 additions and 19 deletions

View File

@ -67,6 +67,7 @@ void print_usage(char *prg)
fprintf(stderr, " -O <outfile> (default stdout)\n");
fprintf(stderr, " -4 (reduce decimal place to 4 digits)\n");
fprintf(stderr, " -n (set newline to cr/lf - default lf)\n");
fprintf(stderr, " -f (use CANFD format also for Classic CAN)\n");
}
void can_asc(struct canfd_frame *cf, int devno, FILE *outfile)
@ -95,11 +96,18 @@ void can_asc(struct canfd_frame *cf, int devno, FILE *outfile)
}
}
void canfd_asc(struct canfd_frame *cf, int devno, FILE *outfile)
void canfd_asc(struct canfd_frame *cf, int devno, int mtu, FILE *outfile)
{
int i;
char id[10];
unsigned int flags;
unsigned int flags = 0;
unsigned int dlen = cf->len;
/* relevant flags in Flags field */
#define ASC_F_RTR 0x00000010
#define ASC_F_FDF 0x00001000
#define ASC_F_BRS 0x00002000
#define ASC_F_ESI 0x00004000
fprintf(outfile, "CANFD %3d Rx ", devno); /* 3 column channel number right aligned */
@ -108,23 +116,27 @@ void canfd_asc(struct canfd_frame *cf, int devno, FILE *outfile)
fprintf(outfile, "%11s ", id);
fprintf(outfile, "%c ", (cf->flags & CANFD_BRS)?'1':'0');
fprintf(outfile, "%c ", (cf->flags & CANFD_ESI)?'1':'0');
fprintf(outfile, "%x ", can_len2dlc(cf->len));
fprintf(outfile, "%2d", cf->len);
fprintf(outfile, "%x ", can_len2dlc(dlen));
for (i = 0; i < cf->len; i++) {
fprintf(outfile, " %02X", cf->data[i]);
if (mtu == CAN_MTU) {
if (cf->can_id & CAN_RTR_FLAG) {
/* no data length but dlc for RTR frames */
dlen = 0;
flags = ASC_F_RTR;
}
} else {
flags = ASC_F_FDF;
if (cf->flags & CANFD_BRS)
flags |= ASC_F_BRS;
if (cf->flags & CANFD_ESI)
flags |= ASC_F_ESI;
}
/* relevant flags in Flags field */
#define ASC_F_FDF 0x00001000
#define ASC_F_BRS 0x00002000
#define ASC_F_ESI 0x00004000
fprintf(outfile, "%2d", dlen);
flags = ASC_F_FDF;
if (cf->flags & CANFD_BRS)
flags |= ASC_F_BRS;
if (cf->flags & CANFD_ESI)
flags |= ASC_F_ESI;
for (i = 0; i < dlen; i++) {
fprintf(outfile, " %02X", cf->data[i]);
}
fprintf(outfile, " %8d %4d %8X 0 0 0 0 0", 130000, 130, flags);
}
@ -137,9 +149,9 @@ int main(int argc, char **argv)
static struct timeval tv, start_tv;
FILE *infile = stdin;
FILE *outfile = stdout;
static int maxdev, devno, i, crlf, d4, opt, mtu;
static int maxdev, devno, i, crlf, fdfmt, d4, opt, mtu;
while ((opt = getopt(argc, argv, "I:O:4n?")) != -1) {
while ((opt = getopt(argc, argv, "I:O:4nf?")) != -1) {
switch (opt) {
case 'I':
infile = fopen(optarg, "r");
@ -161,6 +173,10 @@ int main(int argc, char **argv)
crlf = 1;
break;
case 'f':
fdfmt = 1;
break;
case '4':
d4 = 1;
break;
@ -242,10 +258,10 @@ int main(int argc, char **argv)
else
fprintf(outfile, "%4ld.%06ld ", tv.tv_sec, tv.tv_usec);
if (mtu == CAN_MTU)
if ((mtu == CAN_MTU) && (fdfmt == 0))
can_asc(&cf, devno, outfile);
else
canfd_asc(&cf, devno, outfile);
canfd_asc(&cf, devno, mtu, outfile);
if (crlf)
fprintf(outfile, "\r");