From: hartkopp Date: Fri, 20 Jun 2008 09:15:13 +0000 (+0000) Subject: Introduced new functions: X-Git-Url: http://rtime.felk.cvut.cz/gitweb/socketcan-devel.git/commitdiff_plain/c3c89c41c5c172ce64be772102e85d168f3a7425 Introduced new functions: unsigned char asc2nibble(char c); int hexstring2candata(char *arg, struct can_frame *cf); (see documentation in lib.h) As prerequsite to fix the commandline interface of cangen. git-svn-id: svn://svn.berlios.de//socketcan/trunk@786 030b6a49-0b11-0410-94ab-b0dab22257f2 --- diff --git a/can-utils/lib.c b/can-utils/lib.c index cfc7669..d72a003 100644 --- a/can-utils/lib.c +++ b/can-utils/lib.c @@ -59,7 +59,7 @@ #define MAX_CANFRAME "12345678#01.23.45.67.89.AB.CD.EF" #define MAX_LONG_CANFRAME "12345678 [8] 10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101010 '........'" -static int asc2nibble(char c) { +unsigned char asc2nibble(char c) { if ((c >= '0') && (c <= '9')) return c - '0'; @@ -73,10 +73,38 @@ static int asc2nibble(char c) { return 16; /* error */ } +int hexstring2candata(char *arg, struct can_frame *cf) { + + int len = strlen(arg); + int i; + unsigned char tmp; + + if (!len || len%2 || len > 16) + return 1; + + for (i=0; i < len/2; i++) { + + tmp = asc2nibble(*(arg+(2*i))); + if (tmp > 0x0F) + return 1; + + cf->data[i] = (tmp << 4); + + tmp = asc2nibble(*(arg+(2*i)+1)); + if (tmp > 0x0F) + return 1; + + cf->data[i] |= tmp; + } + + return 0; +} + int parse_canframe(char *cs, struct can_frame *cf) { /* documentation see lib.h */ - int i, idx, dlc, len, tmp; + int i, idx, dlc, len; + unsigned char tmp; len = strlen(cs); //printf("'%s' len %d\n", cs, len); diff --git a/can-utils/lib.h b/can-utils/lib.h index 80dbf45..07daa24 100644 --- a/can-utils/lib.h +++ b/can-utils/lib.h @@ -45,6 +45,34 @@ * */ +unsigned char asc2nibble(char c); +/* + * Returns the decimal value of a given ASCII hex character. + * + * While 0..9, a..f, A..F are valid ASCII hex characters. + * On invalid characters the value 16 is returned for error handling. + */ + +int hexstring2candata(char *arg, struct can_frame *cf); +/* + * Converts a given ASCII hex string to values in the can_frame data[]. + * + * A valid ASCII hex string consists of and even number of up to 16 chars. + * Leading zeros '00' in the ASCII hex string are interpreted. + * + * Examples: + * + * "1234" => data[0] = 0x12, data[1] = 0x34 + * "001234" => data[0] = 0x00, data[1] = 0x12, data[2] = 0x34 + * + * Return values: + * 0 = success + * 1 = error (in length or the given characters are no ASCII hex characters) + * + * Remark: The not written data[] elements remain unchanged. + * + */ + int parse_canframe(char *cs, struct can_frame *cf); /* * Transfers a valid ASCII string decribing a CAN frame into struct can_frame.