|
|
@ -33,26 +33,49 @@ |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @file modified from sf0x_parser.cpp |
|
|
|
* @file modified from sf0x_parser.cpp |
|
|
|
* @author |
|
|
|
* @author Lorenz Meier <lm@inf.ethz.ch> |
|
|
|
|
|
|
|
* @author Chuong Nguyen <chnguye7@asu.edu> |
|
|
|
|
|
|
|
* @author Ayush Gaud <ayush.gaud@gmail.com> |
|
|
|
|
|
|
|
* @author Jim Brown <zbr3550@163.com> |
|
|
|
* |
|
|
|
* |
|
|
|
* Declarations of parser for the Benewake TFmini laser rangefinder series |
|
|
|
* Declarations of parser for the Benewake Rds02UF rangefinder series |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
#include "rds02uf_parser.h" |
|
|
|
#include "rds02uf_parser.h" |
|
|
|
#include <string.h> |
|
|
|
#include <string.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
|
|
|
uint16_t data_len; |
|
|
|
// #define RDS02UF_DEBUG
|
|
|
|
uint16_t data_index; |
|
|
|
|
|
|
|
uint8_t crc_data; |
|
|
|
|
|
|
|
uint16_t fc_code; |
|
|
|
|
|
|
|
uint8_t err_code; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef RDS02UF_DEBUG |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char *parser_state[] = { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"0_STATE1_SYNC_1", |
|
|
|
|
|
|
|
"1_STATE2_SYNC_2", |
|
|
|
|
|
|
|
"2_STATE3_ADDRESS", |
|
|
|
|
|
|
|
"3_STATE4_ERROR_CODE", |
|
|
|
|
|
|
|
"4_STATE5_FC_CODE_L", |
|
|
|
|
|
|
|
"5_STATE6_FC_CODE_H", |
|
|
|
|
|
|
|
"6_STATE7_LENGTH_L", |
|
|
|
|
|
|
|
"7_STATE8_LENGTH_H", |
|
|
|
|
|
|
|
"8_STATE9_REAL_DATA", |
|
|
|
|
|
|
|
"9_STATE10_CRC", |
|
|
|
|
|
|
|
"10_STATE11_END_1", |
|
|
|
|
|
|
|
"11_STATE12_END_2" |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t data_len = 0; |
|
|
|
|
|
|
|
uint16_t data_index = 0; |
|
|
|
|
|
|
|
uint16_t fc_code = 0; |
|
|
|
|
|
|
|
uint8_t err_code = 0; |
|
|
|
int rds02uf_parse(char c, char *parserbuf, unsigned *parserbuf_index, RDS02UF_PARSE_STATE *state, float *dist) |
|
|
|
int rds02uf_parse(char c, char *parserbuf, unsigned *parserbuf_index, RDS02UF_PARSE_STATE *state, float *dist) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int ret = -1; |
|
|
|
int ret = -1; |
|
|
|
char data = c; |
|
|
|
char data = c; |
|
|
|
//char *end;
|
|
|
|
uint8_t crc_data = 0; |
|
|
|
|
|
|
|
|
|
|
|
switch (*state) { |
|
|
|
switch (*state) { |
|
|
|
case RDS02UF_PARSE_STATE::STATE1_SYNC_1: |
|
|
|
case RDS02UF_PARSE_STATE::STATE1_SYNC_1: |
|
|
@ -69,10 +92,9 @@ int rds02uf_parse(char c, char *parserbuf, unsigned *parserbuf_index, RDS02UF_PA |
|
|
|
parserbuf[*parserbuf_index] = data; |
|
|
|
parserbuf[*parserbuf_index] = data; |
|
|
|
(*parserbuf_index)++; |
|
|
|
(*parserbuf_index)++; |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE3_ADDRESS; |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE3_ADDRESS; |
|
|
|
} |
|
|
|
}else{ |
|
|
|
else |
|
|
|
*parserbuf_index = 0; |
|
|
|
{ |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE1_SYNC_1; |
|
|
|
ParseDataFailed(parserbuf, sizeof(parserbuf)); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case RDS02UF_PARSE_STATE::STATE3_ADDRESS: // address
|
|
|
|
case RDS02UF_PARSE_STATE::STATE3_ADDRESS: // address
|
|
|
@ -106,43 +128,49 @@ int rds02uf_parse(char c, char *parserbuf, unsigned *parserbuf_index, RDS02UF_PA |
|
|
|
break; |
|
|
|
break; |
|
|
|
case RDS02UF_PARSE_STATE::STATE8_LENGTH_H: // lengh_high
|
|
|
|
case RDS02UF_PARSE_STATE::STATE8_LENGTH_H: // lengh_high
|
|
|
|
data_len = data << 8 | data_len; |
|
|
|
data_len = data << 8 | data_len; |
|
|
|
|
|
|
|
if (data_len == 10) |
|
|
|
|
|
|
|
{ |
|
|
|
parserbuf[*parserbuf_index] = data; |
|
|
|
parserbuf[*parserbuf_index] = data; |
|
|
|
(*parserbuf_index)++; |
|
|
|
(*parserbuf_index)++; |
|
|
|
|
|
|
|
data_index = 0; |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE9_REAL_DATA; |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE9_REAL_DATA; |
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
*parserbuf_index = 0; |
|
|
|
|
|
|
|
*state = RDS02UF_PARSE_STATE::STATE1_SYNC_1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
break; |
|
|
|
break; |
|
|
|
case RDS02UF_PARSE_STATE::STATE9_REAL_DATA: // real_data
|
|
|
|
case RDS02UF_PARSE_STATE::STATE9_REAL_DATA: // real_data
|
|
|
|
parserbuf[*parserbuf_index + data_index] = data; |
|
|
|
parserbuf[*parserbuf_index] = data; |
|
|
|
|
|
|
|
|
|
|
|
data_index++; |
|
|
|
data_index++; |
|
|
|
|
|
|
|
(*parserbuf_index)++; |
|
|
|
if (data_index == data_len) |
|
|
|
if (data_index == data_len) |
|
|
|
{ |
|
|
|
{ |
|
|
|
(*parserbuf_index)++; |
|
|
|
|
|
|
|
*state = RDS02UF_PARSE_STATE::STATE10_CRC; |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE10_CRC; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case RDS02UF_PARSE_STATE::STATE10_CRC: // crc
|
|
|
|
case RDS02UF_PARSE_STATE::STATE10_CRC: // crc
|
|
|
|
crc_data = crc8(&parserbuf[2], 6 + data_len); |
|
|
|
crc_data = crc8(&parserbuf[2], 6 + data_len); |
|
|
|
parserbuf[*parserbuf_index + data_index] = data; |
|
|
|
parserbuf[*parserbuf_index] = data; |
|
|
|
if (crc_data == data || data == 0xff) |
|
|
|
if (crc_data == data || data == 0xff) |
|
|
|
{ |
|
|
|
{ |
|
|
|
(*parserbuf_index)++; |
|
|
|
(*parserbuf_index)++; |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE11_END_1; |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE11_END_1; |
|
|
|
} |
|
|
|
}else{ |
|
|
|
else |
|
|
|
*parserbuf_index = 0; |
|
|
|
{ |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE1_SYNC_1; |
|
|
|
ParseDataFailed(parserbuf, sizeof(parserbuf)); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case RDS02UF_PARSE_STATE::STATE11_END_1: //
|
|
|
|
case RDS02UF_PARSE_STATE::STATE11_END_1: //
|
|
|
|
if (data == RDS02_END) |
|
|
|
if (data == RDS02_END) |
|
|
|
{ |
|
|
|
{ |
|
|
|
parserbuf[*parserbuf_index + data_index] = data; |
|
|
|
parserbuf[*parserbuf_index] = data; |
|
|
|
(*parserbuf_index)++; |
|
|
|
(*parserbuf_index)++; |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE12_END_2; |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE12_END_2; |
|
|
|
} |
|
|
|
}else{ |
|
|
|
else |
|
|
|
*parserbuf_index = 0; |
|
|
|
{ |
|
|
|
*state = RDS02UF_PARSE_STATE::STATE1_SYNC_1; |
|
|
|
ParseDataFailed(parserbuf, sizeof(parserbuf)); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
break; |
|
|
|
break; |
|
|
@ -158,28 +186,29 @@ int rds02uf_parse(char c, char *parserbuf, unsigned *parserbuf_index, RDS02UF_PA |
|
|
|
ret = true; |
|
|
|
ret = true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
ParseDataFailed(parserbuf, sizeof(parserbuf)); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*parserbuf_index = 0; |
|
|
|
|
|
|
|
*state = RDS02UF_PARSE_STATE::STATE1_SYNC_1; |
|
|
|
|
|
|
|
|
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef RDS02UF_DEBUG |
|
|
|
#ifdef RDS02UF_DEBUG |
|
|
|
printf("state: RDS02UF_PARSE_STATE%s\n", parser_state[*state]); |
|
|
|
static u_int16_t cnt; |
|
|
|
|
|
|
|
cnt += 1; |
|
|
|
|
|
|
|
static RDS02UF_PARSE_STATE last_state = RDS02UF_PARSE_STATE::STATE12_END_2; |
|
|
|
|
|
|
|
if (*state != last_state || cnt > 500) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
printf("state: %s,read: %02x\n", parser_state[*state],data); |
|
|
|
|
|
|
|
last_state = *state; |
|
|
|
|
|
|
|
cnt = 0; |
|
|
|
|
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void ParseDataFailed(char* data_in, uint8_t datalengh) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
memset(data_in, 0, datalengh); |
|
|
|
|
|
|
|
data_len = 0; |
|
|
|
|
|
|
|
data_index = 0; |
|
|
|
|
|
|
|
crc_data = 0; |
|
|
|
|
|
|
|
fc_code = 0; |
|
|
|
|
|
|
|
err_code = 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t crc8(char* pbuf, int32_t len) |
|
|
|
uint8_t crc8(char* pbuf, int32_t len) |
|
|
|
{ |
|
|
|
{ |
|
|
|
char* data = pbuf; |
|
|
|
char* data = pbuf; |
|
|
|