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

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

开发平台: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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值