40 static char *strtokSavePtr = NULL;
44 int dtpHex(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {
51 for(i=0; i<bufLen; i++) {
53 if(len >= stroutSize) {
56 out += sprintf(out,
"%02hhX ", bufSdo[i]);
69 static int dtpStr(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {
79 for(i=0; i<bufLen; i++) {
82 if(n >= stroutSize || c == 0) {
97 static int dtpU8 (
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {
uint8_t num; memcpy(&num, bufSdo, 1);
return sprintf(strout,
"0x%02hhX", num);}
98 static int dtpU16(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {
uint16_t num; CO_memcpySwap2(&num, bufSdo);
return sprintf(strout,
"0x%04hX", num);}
99 static int dtpU32(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {
uint32_t num; CO_memcpySwap4(&num, bufSdo);
return sprintf(strout,
"0x%08X", num);}
100 static int dtpU64(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {uint64_t num; CO_memcpySwap8(&num, bufSdo);
return sprintf(strout,
"0x%016lX", num);}
101 static int dtpI8 (
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {int8_t num; memcpy(&num, bufSdo, 1);
return sprintf(strout,
"%hhd", num);}
102 static int dtpI16(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {int16_t num; CO_memcpySwap2(&num, bufSdo);
return sprintf(strout,
"%hd", num);}
103 static int dtpI32(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {int32_t num; CO_memcpySwap4(&num, bufSdo);
return sprintf(strout,
"%d", num);}
104 static int dtpI64(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {int64_t num; CO_memcpySwap8(&num, bufSdo);
return sprintf(strout,
"%ld", num);}
105 static int dtpR32(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {float32_t num; CO_memcpySwap4(&num, bufSdo);
return sprintf(strout,
"%g", num);}
106 static int dtpR64(
char *strout,
int stroutSize,
char* bufSdo,
int bufLen) {float64_t num; CO_memcpySwap8(&num, bufSdo);
return sprintf(strout,
"%g", num);}
110 int dtsHex(
char* bufSdo,
int bufSdoSize,
char *strin) {
116 token = strtok_r(strin,
spaceDelim, &savePtr);
118 while(token != NULL) {
127 if(strlen(token) != 2 || len >= bufSdoSize) {
131 ubuf[len++] = (
uint8_t)strtoul(token, &sRet, 16);
133 if(sRet != strchr(token,
'\0')) {
143 static int dtsStr(
char* bufSdo,
int bufSdoSize,
char *strin) {
144 size_t len = strlen(strin);
147 int string_closed = 0;
151 char c = strin[in++];
153 if(isspace(c) == 0) {
165 char c = strin[in++];
168 if(out >= bufSdoSize) {
184 if(string_closed == 1) {
187 char c = strin[in++];
189 if(isspace(c) == 0) {
207 static int dtsU8 (
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0;
uint8_t num = (
uint8_t)
getU32(strin, 0, UCHAR_MAX, &err);
if(err != 0)
return 0; memcpy(bufSdo, &num, 1);
return 1;}
208 static int dtsU16(
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0;
uint16_t num = (
uint16_t)
getU32(strin, 0, USHRT_MAX, &err);
if(err != 0)
return 0; CO_memcpySwap2(bufSdo, &num);
return 2;}
209 static int dtsU32(
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0;
uint32_t num =
getU64(strin, 0, UINT_MAX, &err);
if(err != 0)
return 0; CO_memcpySwap4(bufSdo, &num);
return 4;}
210 static int dtsU64(
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0; uint64_t num =
getU64(strin, 0, ULONG_MAX, &err);
if(err != 0)
return 0; CO_memcpySwap8(bufSdo, &num);
return 8;}
211 static int dtsI8 (
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0; int8_t num = (int8_t)
getI32(strin, CHAR_MIN, CHAR_MAX, &err);
if(err != 0)
return 0; memcpy(bufSdo, &num, 1);
return 1;}
212 static int dtsI16(
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0; int16_t num = (int16_t)
getI32(strin, SHRT_MIN, SHRT_MAX, &err);
if(err != 0)
return 0; CO_memcpySwap2(bufSdo, &num);
return 2;}
213 static int dtsI32(
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0; int32_t num =
getI64(strin, INT_MIN, INT_MAX, &err);
if(err != 0)
return 0; CO_memcpySwap4(bufSdo, &num);
return 4;}
214 static int dtsI64(
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0; int64_t num =
getI64(strin, LONG_MIN, LONG_MAX, &err);
if(err != 0)
return 0; CO_memcpySwap8(bufSdo, &num);
return 8;}
215 static int dtsR32(
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0; float32_t num =
getR32(strin, &err);
if(err != 0)
return 0; CO_memcpySwap4(bufSdo, &num);
return 4;}
216 static int dtsR64(
char* bufSdo,
int bufSdoSize,
char *strin) {
int err = 0; float64_t num =
getR64(strin, &err);
if(err != 0)
return 0; CO_memcpySwap8(bufSdo, &num);
return 8;}
220 {
"b", 1, dtpI8, dtsI8 },
221 {
"u8", 1, dtpU8, dtsU8 },
222 {
"u16", 2, dtpU16, dtsU16},
223 {
"u32", 4, dtpU32, dtsU32},
224 {
"u64", 8, dtpU64, dtsU64},
225 {
"i8", 1, dtpI8, dtsI8 },
226 {
"i16", 2, dtpI16, dtsI16},
227 {
"i32", 4, dtpI32, dtsI32},
228 {
"i64", 8, dtpI64, dtsI64},
229 {
"r32", 4, dtpR32, dtsR32},
230 {
"r64", 8, dtpR64, dtsR64},
232 {
"td", 0,
dtpHex, dtsHex},
233 {
"vs", 0, dtpStr, dtsStr},
234 {
"os", 0,
dtpHex, dtsHex},
235 {
"us", 0,
dtpHex, dtsHex},
241 char *
getTok(
char* initStr,
const char *delim,
int *err) {
248 if((token = strtok_r(initStr, delim, &strtokSavePtr)) == NULL) {
257 void lastTok(
char* initStr,
const char *delim,
int *err) {
261 token =
getTok(initStr, delim, &errTokLast);
275 if(token == NULL || *err == 1) {
280 num = strtoul(token, &sRet, 0);
281 if(sRet != strchr(token,
'\0') || num < min || num > max) {
290 int32_t
getI32(
char *token, int32_t min, int32_t max,
int *err) {
294 if(token == NULL || *err == 1) {
299 num = strtol(token, &sRet, 0);
300 if(sRet != strchr(token,
'\0') || num < min || num > max) {
309 uint64_t
getU64(
char *token, uint64_t min, uint64_t max,
int *err) {
313 if(token == NULL || *err == 1) {
318 num = strtoull(token, &sRet, 0);
319 if(sRet != strchr(token,
'\0') || num < min || num > max) {
328 int64_t
getI64(
char *token, int64_t min, int64_t max,
int *err) {
332 if(token == NULL || *err == 1) {
337 num = strtoll(token, &sRet, 0);
338 if(sRet != strchr(token,
'\0') || num < min || num > max) {
347 float32_t
getR32(
char *token,
int *err) {
351 if(token == NULL || *err == 1) {
356 num = strtof(token, &sRet);
357 if(sRet != strchr(token,
'\0')) {
366 float64_t
getR64(
char *token,
int *err) {
370 if(token == NULL || *err == 1) {
375 num = strtod(token, &sRet);
376 if(sRet != strchr(token,
'\0')) {
388 if(token == NULL || *err == 1) {
395 for(i=0; i<len; i++) {
397 if(strcmp(token, dt->
syntax) == 0) {
uint64_t getU64(char *token, uint64_t min, uint64_t max, int *err)
int64_t getI64(char *token, int64_t min, int64_t max, int *err)
uint32_t getU32(char *token, uint32_t min, uint32_t max, int *err)
char * getTok(char *initStr, const char *delim, int *err)
const dataType_t * getDataType(char *token, int *err)
void lastTok(char *initStr, const char *delim, int *err)
float32_t getR32(char *token, int *err)
int32_t getI32(char *token, int32_t min, int32_t max, int *err)
float64_t getR64(char *token, int *err)
Data types structure - Defined in CANOpen Code.
int dtpHex(char *strout, int stroutSize, char *bufSdo, int bufLen)
int dtsHex(char *bufSdo, int bufSdoSize, char *strin)