127 lines
3.4 KiB
C
127 lines
3.4 KiB
C
#include "at_bluetooth.h"
|
||
|
||
#define MEM_CACHE_LEN (64U)
|
||
|
||
unsigned char bluetooth_state = 0;
|
||
static unsigned char at_memcmp_cache[MEM_CACHE_LEN];
|
||
|
||
static unsigned char at_cmd_test(unsigned char *p, unsigned char len);
|
||
static unsigned char at_cmd_name(unsigned char *p, unsigned char len);
|
||
|
||
#if BLE_TYPE == BLE_TYPE_HC42
|
||
/* AT指令表 */
|
||
const at_cmd_func_t at_cmd_func[] = {
|
||
{AT_CMD_TEST, "AT", at_cmd_test},
|
||
{AT_CMD_NAME_REQ, "AT+NAME", at_cmd_name},
|
||
{AT_CMD_NAME, "AT+NAME=", at_cmd_name},
|
||
{AT_END, NULL, NULL}};
|
||
|
||
const char split_c = '=';
|
||
#elif BLE_TYPE == BLE_TYPE_MX02
|
||
/* AT指令表 */
|
||
const at_cmd_func_t at_cmd_func[] = {
|
||
{AT_CMD_TEST, "AT", at_cmd_test}, // 这个指令没用,为了和HC42统一
|
||
{AT_GET_VER, "AT+VER", at_cmd_test},
|
||
{AT_CMD_NAME_REQ, "AT+NAME", at_cmd_name},
|
||
{AT_CMD_NAME, "AT+NAME=", at_cmd_name},
|
||
{AT_END, NULL, NULL}};
|
||
|
||
const char split_c = ':';
|
||
#endif
|
||
|
||
void at_set_memcmp_cache(unsigned char *p, unsigned char len)
|
||
{
|
||
osel_memset(at_memcmp_cache, 0, MEM_CACHE_LEN);
|
||
osel_memcpy(at_memcmp_cache, p, len);
|
||
}
|
||
|
||
/* 指令执行函数 */
|
||
static unsigned char at_cmd_test(unsigned char *p, unsigned char len)
|
||
{
|
||
BIT_SET(bluetooth_state, BIT0);
|
||
return 0;
|
||
}
|
||
|
||
static unsigned char at_cmd_name(unsigned char *p, unsigned char len)
|
||
{
|
||
if (*p == split_c)
|
||
{
|
||
p++; // 偏移一个字节split_c
|
||
if (osel_memcmp(p, at_memcmp_cache, osel_mstrlen(at_memcmp_cache)) == 0) // 去掉最后\r\n
|
||
{
|
||
BIT_SET(bluetooth_state, BIT1);
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
/* 查找指令表中对应的指令 */
|
||
unsigned char at_cmd_search(unsigned char *p, unsigned char len)
|
||
{
|
||
|
||
unsigned char ret = 0;
|
||
// unsigned char* pstr;
|
||
unsigned char i, n;
|
||
|
||
for (i = 1; at_cmd_func[i].cmd != AT_END; i++)
|
||
{
|
||
|
||
n = osel_mstrlen((unsigned char *)at_cmd_func[i].str);
|
||
if (!osel_memcmp(p, (unsigned char *)at_cmd_func[i].str, n))
|
||
{
|
||
ret = i;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
/* AT指令解析 */
|
||
unsigned char at_cmd_parse(unsigned char *p, unsigned char len)
|
||
{
|
||
|
||
unsigned char ret = AT_SUCCESS;
|
||
unsigned char index = 0;
|
||
|
||
if (len < 2)
|
||
return AT_ERR; /* 不符合指令最小长度 */
|
||
|
||
if ((p[0] == 'A') && (p[1] == 'T'))
|
||
{
|
||
if (len == 2)
|
||
{ /* 测试指令 */
|
||
|
||
if (at_cmd_func[AT_CMD_TEST].cb != NULL)
|
||
at_cmd_func[AT_CMD_TEST].cb(NULL, 0); /* 执行测试指令 */
|
||
}
|
||
else if (p[2] == '+')
|
||
{ /* 执行指令解析 */
|
||
|
||
index = at_cmd_search(p, len); /* 查找匹配的执行指令,0-已匹配,!0-未匹配 */
|
||
if (index)
|
||
{
|
||
if (at_cmd_func[index].cb != NULL)
|
||
{ /* 判断指令对应执行函数是否存在 */
|
||
unsigned char n;
|
||
n = osel_mstrlen((unsigned char *)at_cmd_func[index].str);
|
||
ret = at_cmd_func[index].cb(p + n, len - n); /* 执行对应的指令函数, p+n:将指令参数传输执行函数,len-n-2:指令参数有效长度 */
|
||
}
|
||
else
|
||
ret = AT_ERR_FUN_UNUSED; /* 没有可执行函数 */
|
||
}
|
||
else
|
||
{
|
||
ret = AT_ERR_UNINVAIL; /* 未找到匹配的指令 */
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{ /* 格式不匹配 */
|
||
|
||
return AT_ERR;
|
||
}
|
||
|
||
return ret;
|
||
}
|