]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
Introduced new functions:
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Fri, 20 Jun 2008 09:15:13 +0000 (09:15 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Fri, 20 Jun 2008 09:15:13 +0000 (09:15 +0000)
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

can-utils/lib.c
can-utils/lib.h

index cfc7669cb43918a786a753962197c2c79e3976f7..d72a003e733e1fb5253c6d3196f11e8f7af24c2c 100644 (file)
@@ -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);
index 80dbf457f4bf2626b258b7a47927b884633d0ad7..07daa247393f15bf992f1af5418235a52e15fe5e 100644 (file)
  *
  */
 
+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.