/*****************************************用户自定义SPP指令区域*************************************/
static u8 (*user_buffer)[6] = (u8[][6]) { {0x65,0x74,0x3A,0x76,0x65,0x72}, //软件版本号
{0x65,0x74,0x3A,0x64,0x75,0x74}, //DUT模式
{0x65,0x74,0x3A,0x63,0x6C,0x72}, //清除手机配对
{0x65,0x74,0x3A,0x6F,0x66,0x66}, //耳机关机
{0x65,0x74,0x3A,0x61,0x64,0x64}, //蓝牙地址
{0x65,0x74,0x3A,0x64,0x75,0x73}}; //恢复出厂设置
static u8 (*user_buffer_mode)[4] = (u8[][4]) {{0x65,0x74,0x3A,0x30}, //关闭ANC
{0x65,0x74,0x3A,0x31}, //开启ANC
{0x65,0x74,0x3A,0x32}}; //监听模式
static u8 *buffer_ret[] = {0x6F,0x6B}; //成功后返回的命令
static u8 *software_version = "V005.20231229"; //用户自定义软件版本号
static u8 user_count = 0; //计算耳机实际收到的命令长度
extern u8 user_mac_buf[6]; //用于存放蓝牙MAC地址
//计算buffer长度
u8 col = GET_SIZE(user_buffer[0]) / \
GET_SIZE(user_buffer[0][0]); //实际单列命令的长度
u8 user_col = GET_SIZE(user_buffer_mode[0]) / \
GET_SIZE(user_buffer_mode[0][0]);
#define ROWS GET_SIZE(user_buffer[0]) / \
GET_SIZE(user_buffer[0][0])
#define USER_ROWS (GET_SIZE(user_buffer[0]) / \
GET_SIZE(user_buffer[0][0])) / \
(GET_SIZE(buffer_ret) / \
GET_SIZE(buffer_ret[0]))
static void spp_buffer_cmp_func(u8 *buffer, u16 len, u8 rows)
{
log_info("row = %d",rows);
log_info("ROW = %d , USER_ROW = %d",ROWS,USER_ROWS);
switch (rows)
{
case USER_ROWS:
for(u8 i = 0; i < rows; i++,__CLEAR_DATA(user_count))
{
for (u8 j = 0; j < len; j++)
{
if(IS_EQUALS((*(buffer+j)),user_buffer_mode[i][j]))
{
user_count++;
log_info("user_count = %d",user_count);
log_info("buffer+j = 0x%X,user_buffer_mode = 0x%X",(*(buffer+j)),user_buffer_mode[i][j]);
}
}
if(IS_EQUALS(user_count,len)){
log_info("__PROVIDED_SPP_VECTOR__(i) = %d",i);
__PROVIDED_SPP_VECTOR__(i+ROWS);
break; //成功匹配,跳出循环
}
}
break;
case ROWS:
for(u8 i = 0; i < rows; i++,__CLEAR_DATA(user_count))
{
for (u8 j = 0; j < len; j++)
{
if(IS_EQUALS((*(buffer+j)),user_buffer[i][j]))
{
user_count++;
log_info("user_count = %d",user_count);
log_info("buffer+j = 0x%X,user_buffer_mode = 0x%X",(*(buffer+j)),user_buffer_mode[i][j]);
}
}
if(IS_EQUALS(user_count,len)){
log_info("__PROVIDED_SPP_VECTOR__(i) = %d",i);
if(!i) online_spp_send_data(software_version,strlen(software_version));
else if(IS_EQUALS(i,user_col)) online_spp_send_data(user_mac_buf,GET_SIZE(user_mac_buf));
else __PROVIDED_SPP_VECTOR__(i);
break; //成功匹配,跳出循环
}
}
break;
default:
//命令超出实际长度,返回0xFF
online_spp_send_data(0xFF,4);
break;
}
}
static void spp_main_func(u8 *buf, u16 len) //用户自定义SPP主题函数
{
if(IS_EQUALS(len, col)) spp_buffer_cmp_func(buf , len, ROWS);
if(IS_EQUALS(len, user_col)) spp_buffer_cmp_func(buf , len, USER_ROWS);
//命令超出实际长度,返回0xFF
// online_spp_send_data(0xFF,4);
if(IS_EQUALS(len,user_count))
{
__LOG_DEBUG("CMD IS EQUAL,VERSION SENT SUCCESSFUL");
online_spp_send_data(buffer_ret,GET_SIZE(buffer_ret));
}
else
{
online_spp_send_data("ERROR",GET_SIZE("ERROR"));
__LOG_DEBUG("CMD ISN'T EQUAL,VERSION SENT FAILED");
}
__CLEAR_DATA(user_count);
}
/*************************************************结束***********************************************/
static void online_spp_recieve_cbk(void *priv, u8 *buf, u16 len)
{
log_info("spp_api_rx(%d) \n", len);
for(u8 i = 0; i < len; i++)
{
log_info("buf = 0x%X",*(buf+i));
}
if(IS_EQUALS(col,len) || IS_EQUALS(user_col,len) ? 0 : 1) goto __USER_SPP_CMD; //跳过用户自定义SPP命令
#if SPP_SUPPORT_FUNC_MDOE
spp_main_func(buf, len);
#endif
__USER_SPP_CMD:
/* log_info_hexdump(buf, len); */
#if (TCFG_ANC_TOOL_DEBUG_ONLINE && TCFG_AUDIO_ANC_ENABLE)
if (app_anctool_spp_rx_data(buf, len)) {
return;
}
#endif
#if (TCFG_CFG_TOOL_ENABLE || TCFG_ONLINE_ENABLE)
#if (TCFG_COMM_TYPE == TCFG_SPP_COMM)
extern int cfg_tool_online_parse(u8 * buf, u32 len);
if ((buf[1] == 0x12) || (buf[1] == 0x05) || (buf[1] == 0x11)) {
if (cfg_tool_online_parse(buf, len)) {
return;
}
}
#endif
#endif
/* log_info("spp_rx_channel_handle"); */
db_api->packet_handle(buf, len);
//loop send data for test
/* if (online_spp_send_data_check(len)) { */
/* online_spp_send_data(buf, len); */
/* } */
}
/********************************SPP 自定义指令区域********************************/
void spp_enter_dut_mode(u8 user_steer)
{
switch (user_steer)
{
case 0: //获取软件版本号
__PROVIDED_SPP_VECTOR__(0);
sys_assert("GET SOFTWARE VERSION");
break;
case 1: //DUT模式
ui_update_status(STATUS_CHARGE_ERR);
__CLOSE_ANC_MODE();
extern void bredr_set_dut_enble(u8 en, u8 phone);
bredr_set_dut_enble(1,1);
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
break;
case 2: //清除手机配对
user_send_cmd_prepare(USER_CTRL_DEL_ALL_REMOTE_INFO, 0, NULL);
user_send_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL);
break;
case 3: //耳机关机
sys_enter_soft_poweroff(NULL);
break;
case 4: //获取蓝牙地址
__PROVIDED_SPP_VECTOR__(4);
break;
case 5: //恢复出厂设置
user_send_cmd_prepare(USER_CTRL_DEL_ALL_REMOTE_INFO, 0, NULL);
cpu_reset();
break;
case 6: //关闭ANC
anc_mode_switch(1, 1);
break;
case 7: //ANC模式
anc_mode_switch(2, 1);
break;
case 8: //监听模式
anc_mode_switch(3, 1);
break;
default:
break;
}
}
最终效果展示: