JL701N_V160,SPP自定义指令。

/*****************************************用户自定义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;
    }
}

最终效果展示:

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值