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