杰理芯片SDK-详细讲解AC695N/AC696N芯片SDK中APP模式流程

前言

现在为止也开发了许多杰理TWS蓝牙耳机、音响项目SDK的案子,在调试案子时不断的向前辈们学习到了很多关于蓝牙音响、蓝牙TWS耳机专业的知识。想在这里做一个学习汇总,方便各位同行和对杰理芯片SDK感兴趣的小伙伴们学习;

本章详细介绍杰理AC695N/AC696N芯片SDK中APP模式流程

在我们开发蓝牙产品时有产品可能有许多模式,这时候就需要一个模式配置管理,本章详细介绍AC695N/AC696N芯片SDK中APP模式流程;

APP模式设置

上电设置app模式,在app_main.c文件中app_main()函数中设置开机默认模式任务有APP_POWERON_TASK模式如图所示:


PWERON开机模式进入

依靠应用任务主循环(任务调度器)app_task_loop()函数进入app_poweron_tassk() 开机模式任务,如图所示:


APP模式切换

(1)进入app_poweron_task()函数中

(2)进入tone_play_end_callback(void *priv, int flag)函数中,如图所示:

(3)进入power_on_init(void)函数中设置下一模式值

可以看到开机后,会进入蓝牙模式;如果想开机后进入某种模式在此函数中进行设置就好;如图所示,如果音乐模式使能后。会检测是否有设备(U盘/TF卡插入),插入会直接进入音乐模式;

(4)发送APP_MSG_SWITCH_TASK切换消息

(5)power模式退出。跳出while(1)循环


APP模式配置表和APP模式管理函数

APP模式配置表和APP模式管理函数集中在" app_task_switch.c "文件中

(1)APP模式配置表,在这里可以配置切换模式的顺序,方案根据需求定义;

(2)APP模式管理函数

cpp 复制代码
//*----------------------------------------------------------------------------*/
/**@brief    模式退出检查
   @param    curr_task:当前模式
   @return   TRUE可以退出, FALSE不可以退出
   @note
*/
/*----------------------------------------------------------------------------*/
static int app_task_switch_exit_check(u8 curr_task)
{
    int ret = false;
    switch (curr_task) {
    case APP_BT_TASK:
        ret = bt_app_exit_check();
        break;
    default:
        ret = TRUE;
        break;

    }
    return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief    模式进入检查
   @param    app_task:目标模式
   @return   TRUE可以进入, FALSE不可以进入
   @note	 例如一些需要设备在线的任务(music/record/linein等),
   			 如果设备在线可以进入, 没有设备在线不进入可以在这里处理
*/
/*----------------------------------------------------------------------------*/
static int app_task_switch_check(u8 app_task)
{
    int ret = false;
    switch (app_task) {
#if TCFG_APP_MUSIC_EN
    case APP_MUSIC_TASK:
        ret = music_app_check();
        break;
#endif
#if TCFG_APP_LINEIN_EN
    case APP_LINEIN_TASK:
        ret = linein_app_check();
        break;
#endif
#if TCFG_APP_PC_EN
    case APP_PC_TASK:
        ret = pc_app_check();
        break;
#endif
    case APP_FM_TASK:
        ret = TRUE;
        break;
#if TCFG_APP_RECORD_EN
    case APP_RECORD_TASK:
        ret = record_app_check();
        break;
#endif
    default:
        ret = TRUE;
        break;

    }
    return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief    切换到上一个模式
   @param
   @return
   @note
*/
/*----------------------------------------------------------------------------*/
void app_task_switch_prev()
{
    int i = 0;
    int cur_index = 0;

    if (app_next_task) {
        printf("app_task_switch_prev busy \n");
    }

    for (cur_index = 0; cur_index < ARRAY_SIZE(app_task_list); cur_index++) {
        if (app_curr_task == app_task_list[cur_index]) {//遍历当前索引
            break;
        }
    }

    for (i = cur_index; ;) { //遍历一圈
        if (i-- == 0) {
            i = ARRAY_SIZE(app_task_list) - 1;
        }
        if (i == cur_index) {
            return;
        }
        if (app_task_switch_to(app_task_list[i])) {
            return;
        }
    }
}
//*----------------------------------------------------------------------------*/
/**@brief    切换到下一个模式
   @param
   @return
   @note
*/
/*----------------------------------------------------------------------------*/
void app_task_switch_next()
{
    int i = 0;
    int cur_index = 0;

    if (app_next_task) {
        printf("app_task_switch_next busy \n");
    }

    for (cur_index = 0; cur_index < ARRAY_SIZE(app_task_list); cur_index++) {
        if (app_curr_task == app_task_list[cur_index]) {//遍历当前索引
            break;
        }
    }

    for (i = cur_index ;;) { //遍历一圈
        if (++i >= ARRAY_SIZE(app_task_list)) {
            i = 0;
        }
        if (i == cur_index) {
            return;
        }
        if (app_task_switch_to(app_task_list[i])) {
            return;
        }
    }
}
//*----------------------------------------------------------------------------*/
/**@brief    切换到指定模式
   @param    app_task:指定模式
   @return
   @note
*/
/*----------------------------------------------------------------------------*/
int app_task_switch_to(u8 app_task)
{
    if (app_curr_task == app_task) {
        return false;
    }

    if (!app_task_switch_check(app_task)) {
        return false;
    }

    if (!app_task_switch_exit_check(app_curr_task)) {
        return false;
    }

    printf("cur --- %x \n", app_curr_task);
    printf("new +++ %x \n", app_task);

    /* if(app_next_task) */
    /* printf("app_task_switch_to busy \n"); */
#if (defined SMART_BOX_EN) && (SMART_BOX_EN)
    extern void function_change_inform(u8 app_mode, u8 ret);
    function_change_inform(app_task, TRUE);
#endif

#if (RECORDER_MIX_EN)
    recorder_mix_stop();
#endif/*RECORDER_MIX_EN*/

    // 这是状态机的核心变量,app_task_loop 将根据这两个变量执行切换。

    app_prev_task = app_curr_task;              //记录从那个模式来
    app_next_task = app_task;                   //记录要求那个模式
    app_task_put_usr_msg(APP_MSG_SWITCH_TASK, 0);   //发送切换模式消息

    return TRUE;
}

//*----------------------------------------------------------------------------*/
/**@brief    跳回到原来的模式
   @param
   @return
   @note
*/
/*----------------------------------------------------------------------------*/
int app_task_switch_back()
{
    if (app_prev_task == 0) {
        return -EINVAL;
    }
    return app_task_switch_to(app_prev_task);
}

//*----------------------------------------------------------------------------*/
/**@brief    模式切换退出检测
   @param
   @return   1:响应退出模式, 0:不响应
   @note
*/
/*----------------------------------------------------------------------------*/
u8 app_task_exitting()//
{
    struct sys_event clear_key_event = {.type =  SYS_KEY_EVENT, .arg = (void *)DEVICE_EVENT_FROM_KEY};
    if (app_next_task != 0) {
        app_curr_task = app_next_task;
        app_next_task = 0;
        sys_key_event_disable();
        sys_event_clear(&clear_key_event);
        return 1;
    }
    return 0;
}

//*----------------------------------------------------------------------------*/
/**@brief    获取当前模式
   @param
   @return   当前模式id
   @note
*/
/*----------------------------------------------------------------------------*/
u8 app_get_curr_task()
{
    return app_curr_task;
}

//*----------------------------------------------------------------------------*/
/**@brief    通过指定id检查是否是当前模式
   @param
   @return   true:是当前模式,false:不是当前模式
   @note
*/
/*----------------------------------------------------------------------------*/
u8 app_check_curr_task(u8 app)
{
    if (app == app_curr_task) {
        return true;
    }
    return false;
}

制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

相关推荐
笨笨饿2 小时前
30_泰勒级数
c语言·stm32·嵌入式硬件·线性代数·机器学习·自动化·概率论
季鹏EthanJ2 小时前
VCC上电慢导致STM32无法复位
stm32·单片机·嵌入式硬件·上电复位故障·bor
点灯小铭3 小时前
基于单片机的太阳能12V蓄电池光控时控路灯智能控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
LCG元3 小时前
STM32实战:基于STM32F103的智能体重秤(HX711+OLED)
stm32·单片机·嵌入式硬件
TDengine (老段)3 小时前
TDengine IDMP 可视化 —— 面板
大数据·数据库·人工智能·物联网·ai·时序数据库·tdengine
小白zlm3 小时前
预畸变双线性变换
单片机·嵌入式硬件·算法·电机控制
无垠的广袤3 小时前
【Titan RA8P1 Board】J-Link 调试
单片机·嵌入式·开发板·调试器·jlink
LaughingZhu6 小时前
移动端 AI 的价值重估:设备端智能的拐点
大数据·人工智能·经验分享·搜索引擎·语音识别
12.=0.7 小时前
【stm32_3】嵌入式软件系统架构
stm32·单片机·嵌入式硬件