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.pull/7/head
parent
278344e5d5
commit
ddbe7d9575
32
lib.c
32
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);
|
||||
|
|
|
|||
28
lib.h
28
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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue