This repository has been archived on 2025-02-28. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hd/User/application/src/at_bluetooth.c

127 lines
3.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}