From 1be68bcc64773ededcdb67b6456a0edbe8da7dc2 Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Wed, 29 Oct 2008 09:23:48 +0000 Subject: [PATCH] Added support for swapped byte order representation. --- candump.c | 12 +++++++++++- lib.c | 58 +++++++++++++++++++++++++++++++++++++++++-------------- lib.h | 5 ++++- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/candump.c b/candump.c index cc31a39..16f9455 100644 --- a/candump.c +++ b/candump.c @@ -109,6 +109,7 @@ void print_usage(char *prg) fprintf(stderr, " -c (increment color mode level)\n"); fprintf(stderr, " -i (binary output - may exceed 80 chars/line)\n"); fprintf(stderr, " -a (enable additional ASCII output)\n"); + fprintf(stderr, " -S (swap byte order in printed CAN data[] - marked with '%c' )\n", SWAP_DELIMITER); fprintf(stderr, " -s (silent mode - %d: off (default) %d: animation %d: silent)\n", SILENT_OFF, SILENT_ANI, SILENT_ON); fprintf(stderr, " -b (bridge mode - send received frames to )\n"); fprintf(stderr, " -B (bridge mode - like '-b' with disabled loopback)\n"); @@ -235,7 +236,7 @@ int main(int argc, char **argv) last_tv.tv_sec = 0; last_tv.tv_usec = 0; - while ((opt = getopt(argc, argv, "t:cias:b:B:lLh?")) != -1) { + while ((opt = getopt(argc, argv, "t:ciaSs:b:B:lLh?")) != -1) { switch (opt) { case 't': timestamp = optarg[0]; @@ -259,6 +260,10 @@ int main(int argc, char **argv) view |= CANLIB_VIEW_ASCII; break; + case 'S': + view |= CANLIB_VIEW_SWAP; + break; + case 's': silent = atoi(optarg); if (silent > SILENT_ON) { @@ -323,6 +328,11 @@ int main(int argc, char **argv) exit(0); } + if (logfrmt && view) { + fprintf(stderr, "Log file format selected: Please disable ASCII/BINARY/SWAP options!\n"); + exit(0); + } + if (silent == SILENT_INI) { if (log) { printf("\nDisabled standard output while logging."); diff --git a/lib.c b/lib.c index c969df4..7ae308a 100644 --- a/lib.c +++ b/lib.c @@ -244,17 +244,34 @@ void sprint_long_canframe(char *buf , struct can_frame *cf, int view) { if (view & CANLIB_VIEW_BINARY) { dlen = 9; /* _10101010 */ - for (i = 0; i < dlc; i++) { - buf[offset++] = ' '; - for (j = 7; j >= 0; j--) - buf[offset++] = (1<data[i])?'1':'0'; + if (view & CANLIB_VIEW_SWAP) { + for (i = dlc - 1; i >= 0; i--) { + buf[offset++] = (i == dlc-1)?' ':SWAP_DELIMITER; + for (j = 7; j >= 0; j--) + buf[offset++] = (1<data[i])?'1':'0'; + } + } else { + for (i = 0; i < dlc; i++) { + buf[offset++] = ' '; + for (j = 7; j >= 0; j--) + buf[offset++] = (1<data[i])?'1':'0'; + } } buf[offset] = 0; /* terminate string */ } else { dlen = 3; /* _AA */ - for (i = 0; i < dlc; i++) { - sprintf(buf+offset, " %02X", cf->data[i]); - offset += dlen; + if (view & CANLIB_VIEW_SWAP) { + for (i = dlc - 1; i >= 0; i--) { + sprintf(buf+offset, "%c%02X", + (i == dlc-1)?' ':SWAP_DELIMITER, + cf->data[i]); + offset += dlen; + } + } else { + for (i = 0; i < dlc; i++) { + sprintf(buf+offset, " %02X", cf->data[i]); + offset += dlen; + } } } @@ -262,16 +279,27 @@ void sprint_long_canframe(char *buf , struct can_frame *cf, int view) { sprintf(buf+offset, "%*s", dlen*(8-dlc)+13, "ERRORFRAME"); else if (view & CANLIB_VIEW_ASCII) { j = dlen*(8-dlc)+4; - sprintf(buf+offset, "%*s", j, "'"); - offset += j; + if (view & CANLIB_VIEW_SWAP) { + sprintf(buf+offset, "%*s", j, "`"); + offset += j; + for (i = dlc - 1; i >= 0; i--) + if ((cf->data[i] > 0x1F) && (cf->data[i] < 0x7F)) + buf[offset++] = cf->data[i]; + else + buf[offset++] = '.'; - for (i = 0; i < dlc; i++) - if ((cf->data[i] > 0x1F) && (cf->data[i] < 0x7F)) - buf[offset++] = cf->data[i]; - else - buf[offset++] = '.'; + sprintf(buf+offset, "`"); + } else { + sprintf(buf+offset, "%*s", j, "'"); + offset += j; + for (i = 0; i < dlc; i++) + if ((cf->data[i] > 0x1F) && (cf->data[i] < 0x7F)) + buf[offset++] = cf->data[i]; + else + buf[offset++] = '.'; - sprintf(buf+offset, "'"); + sprintf(buf+offset, "'"); + } } } diff --git a/lib.h b/lib.h index b356e3b..cae3d8a 100644 --- a/lib.h +++ b/lib.h @@ -87,7 +87,7 @@ int parse_canframe(char *cs, struct can_frame *cf); * Examples: * * 123# -> standard CAN-Id = 0x123, dlc = 0 - * 12345678# -> exended CAN-Id = 0x12345678, dlc = 0 + * 12345678# -> extended CAN-Id = 0x12345678, dlc = 0 * 123#R -> standard CAN-Id = 0x123, dlc = 0, RTR-frame * 7A1#r -> standard CAN-Id = 0x7A1, dlc = 0, RTR-frame * @@ -126,6 +126,9 @@ void sprint_canframe(char *buf , struct can_frame *cf, int sep); #define CANLIB_VIEW_ASCII 0x1 #define CANLIB_VIEW_BINARY 0x2 +#define CANLIB_VIEW_SWAP 0x4 + +#define SWAP_DELIMITER '`' void fprint_long_canframe(FILE *stream , struct can_frame *cf, char *eol, int view); void sprint_long_canframe(char *buf , struct can_frame *cf, int view);