络达开发---- AB1562x左右两侧同一按钮不同功能

文章介绍了如何在AB1562X开发平台的SDKV1.5.2版本中,针对TWS耳机的同一IO口按键实现左右耳不同功能。通过分析SDK的MCSync通信协议和特定的事件判断函数app_AwsMce_IsSystemKeyNeedSync,可以利用非同步事件如ENABLE_LED/DISABLE_LED来区分左右耳动作。代码示例展示了如何根据声道配置判断耳机是左侧还是右侧,从而执行不同的操作。
摘要由CSDN通过智能技术生成

开发平台:AB1562X

SDK版本:V1.5.2

说明:AB1562X支持TWS,左右两个的耳机的按钮在硬件上是芯片的同一个IO口;那如何实现左右按键对应动作A,右侧按钮对应动作B呢?即左右两侧同一按钮的动作对应不同的功能;


SDK支持MSync通信,即左右两个耳机之前的直接数据同步,比如对于音量+/-来说,默认情况下,按左侧和按右侧都会实现同样的动作,即音量+或者-,这是因为系统采用MCsync会自动同步一侧的动作到另一个。

                但是并不是所有的事件都会被同步的另一个,这个在SDK中有定义哪些事件会被同步,在SDK的下面文件中有这些说明:

SDK\V1.5.2\project\AB1562\apps\mcsync_ref_design\src\APP\APP_MCSync\App_MCSync.c

其中的函数:static BOOL app_AwsMce_IsSystemKeyNeedSync(U16 keyEventCode)

中会判断哪些事件支持MCSync同步:


static BOOL app_AwsMce_IsSystemKeyNeedSync(U16 keyEventCode)
{
    BD_ADDR_T *pServiceBdAddr = (BD_ADDR_T *)APP_GetServiceBdAddr();

    switch(keyEventCode)
    {
        case KEY_VOICE_COMMAND_ENABLE:
        case KEY_MIC_MUTE_TOGGLE:
        case KEY_MIC_MUTE_ON:
        case KEY_MIC_MUTE_OFF:
        case KEY_RECONNECT_USER_INIT:
        case KEY_CONNECTED_TO_DISCOVERABLE:
        case KEY_VOICEUP:
        case KEY_VOICEDN:
        case KEY_AIROTHRU:
        case KEY_PEQ_GROUP_CHANGE:
        case KEY_GAME_MODE_ON:
        case KEY_GAME_MODE_OFF:
        case KEY_GAME_MODE_TOGGLE:
        case KEY_MEDIA_TRIGGER_1:
        case KEY_MEDIA_TRIGGER_2:
        case KEY_RESET_PAIRED_DEVICES:
        case KEY_ANC_SWITCH:
        case KEY_TOGGLE_LED:
        case KEY_VOICE_PROMPT_LANG_CHANGE:
        case KEY_NONDISCOVERABLE:
        case KEY_DISCOVERABLE:
            return TRUE;

        #ifdef AIR_MCSYNC_SHARE_MODE_ENABLE
        case KEY_SHARE_PAIRING_START:
        case KEY_SHARE_PAIRING_STOP:
        case KEY_MASTER_SHARE_MODE_START:
        case KEY_MASTER_SHARE_MODE_STOP:
        case KEY_FOLLOWER_SHARE_MODE_START:
        case KEY_FOLLOWER_SHARE_MODE_STOP:
        case KEY_MASTER_SHARE_MODE_TOGGLE:
        case KEY_FOLLOWER_SHARE_MODE_TOGGLE:
            return APP_MCSync_Share_IsKeyNeedSync(keyEventCode);
        #endif

        default:
            return FALSE;
    }

    return FALSE;
}

如上面代码所示,可以发现音量的+/-在支持的case中,即KEY_VOICEUP/KEY_VOICEDN;该函数的主调函数是该文件中的:

BOOL APP_AWSMCE_KeyEvent(U8 keyIndex, U8 keyAction)

通过上面分析可以知道,如果左右想实现不同的事件,可以在UI定义中使用不被MCSync支持的事件来做,如下面的UI定义:

ENABLE_LED/DISABLE_LED 在代码中可以知道是不被MCSync同步支持的,因此左右两侧可以判断自己所在的哪一侧来执行相应的动作。

那么代码中如何判断自己是哪一侧呢?

       其中一个办法是通过声道的配置来判断,如下图中所示:

代码中是可以获取该通道的配置的,这个在生产的时候是写死的,下面代码即用来判断当前的耳机是左侧还是右侧:

 

U8 AudioDsp_GetAudioChannel()
{
    U8 ch_sel;
    #ifdef CHANNEL_SELECTION_ENABLE
    if(drv_audio_nvkey_a2dp_get_audio_mode_setting() == AUDIO_CHANNEL_SW_MODE)
    {
        ch_sel = drv_audio_nvkey_a2dp_get_sw_audio_channel_setting();
    }
    else if(drv_audio_nvkey_a2dp_get_audio_mode_setting() == AUDIO_CHANNEL_HW_MODE)
    {
        if(drv_audio_nvkey_a2dp_get_audio_channel_gpio_h())
        {
            ch_sel = AU_DSP_CH_L;
        }
        else
        {
            ch_sel = AU_DSP_CH_R;
        }
    }
    else
    {
        ch_sel = AU_DSP_CH_LR;
    }
    #else
    ---
    ch_sel = (BtAwsMce_IsDefaultRoleAgent())?AU_DSP_CH_R : AU_DSP_CH_L;
    #endif
    return ch_sel;
}

ENABLE_LED/DISABLE_LED 对应的事件是在文件App_SystemKey.c中处理的,以DISABLE_LED事件为例,判断的代码如下所示:

static void app_SystemKey_DisableLED(BD_ADDR_T *pBdAddr)
{
    UNUSED(pBdAddr);
    DBG_LOG_APP_SYSTEM( "[Key]: GHP: DisableLED, bdAddr: 0x%x%x, Size:%d, IsPartener:%d", 4, 
                FW_bdaddr_to_2U32(pBdAddr,TRUE),
                FW_bdaddr_to_2U32(pBdAddr,FALSE),
                AudioDsp_GetAudioChannel(), BtMCSync_PartnerMode());
    if(AudioDsp_GetAudioChannel() == AU_DSP_CH_R)
    {
        DBG_LOG_APP_SYSTEM("[Key]GHP: Disable:Key From Right", 0);
    }
    else if(AudioDsp_GetAudioChannel() == AU_DSP_CH_L)
    {
        DBG_LOG_APP_SYSTEM("[Key]cs: Disable:Key From Left", 0);
    }
    else
    {
        DBG_LOG_APP_SYSTEM("[Key]: Disable:Key From LR", 0);
    }
    //MMI_LED_KeyOnOffHandler(DISABLE_LED);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenStack SDK是用于编写OpenStack API客户端的软件开发工具包,它提供了一组Python库和工具,用于编写和管理OpenStack云基础架构服务。学习OpenStack SDK可以帮助您更好地了解如何使用OpenStack API进行云资源管理。 以下是学习OpenStack SDK的建议步骤: 1. 熟悉OpenStack基础知识:在开始学习OpenStack SDK之前,您需要了解OpenStack的基础知识,例如OpenStack组件和架构、OpenStack API等。 2. 安装OpenStack SDK:在学习OpenStack SDK之前,您需要安装OpenStack SDK。您可以使用pip或者从源代码中安装。 3. 熟悉OpenStack SDK文档:OpenStack SDK提供了详细的文档,包括API参考、示例和教程等。熟悉这些文档可以帮助您更好地了解OpenStack SDK的使用。 4. 编写OpenStack SDK应用程序:使用OpenStack SDK,您可以编写Python应用程序,用于创建、更新和删除OpenStack云资源。为了使学习更加容易,可以从一些简单的应用程序开始,例如创建虚拟机或者存储卷。 5. 学习OpenStack SDK的高级特性:OpenStack SDK还提供了一些高级特性,例如任务管理、错误处理和异步操作等。学习这些特性可以让您更好地管理和监视OpenStack云资源。 6. 参与OpenStack社区:OpenStack社区提供了许多资源和工具,帮助您更好地了解和使用OpenStack。参加OpenStack社区活动,例如邮件列表、IRC和会议,可以帮助您更好地了解OpenStack SDK和其他OpenStack技术。 总的来说,学习OpenStack SDK需要一定的时间和精力,但是它可以帮助您更好地管理和监视OpenStack云资源。通过熟悉OpenStack SDK的基础知识、阅读文档、编写应用程序以及参与OpenStack社区活动,您可以成为一名优秀的OpenStack开发者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值