• 络达开发---UI定义+自定义按钮事件


    平台:AB1565M

    SDK版本:V2.11.0

    开发环境:windows10


    络达的SDK中有默认的参考工程,其中包含默认的按钮的事件定义。这些定义是基于官方的评估板进行设计的。通常用户在开发自己的产品时,都是需要对其进行修改和定制。UI 定义的源码文件的路径如下(以EVB为例):

    bta_sdk\mcu\project\ab1565_ab1568_evk\apps\headset_ref_design\src\boards\ab1565_evb\customerized_key_config.c

    对于TWS工程,还有左右两侧独立定义的区别。对于headset来说,只有单侧的按钮。笔者在此以Headset类型的工程为例来进行说明。

    对于headset,在上面提到的源码文件中,用到的定义有:

    1. temp_key_short_click_configs[] ------ 定义按钮单击的事件
    2. temp_key_double_click_configs[] --- 定义按钮双击的事件
    3. temp_key_triple_click_configs[] ----- 定义三击的事件(正常情况下不用该定义,否则UI会太复杂)
    4. temp_key_long_press1_configs[] --- 定义1类长按事件;
    5. temp_key_long_press2_configs[] ---定义2类长按事件;
    6. temp_key_long_press3_configs[] --- 定义3类长按事件;

    上面提到长按的类型有三种,这三种长按可以对应于不同的长按时长,默认的时长定义在工程下面文件中:

    bta_sdk\mcu\project\ab1565_ab1568_evk\apps\headset_ref_design\inc\boards\ab1565_evb\airo_key_config.h

    如下代码所示,其中时间单位为ms:

    1. /*the default time,uint:ms*/
    2. #define default_t_p 300 //the multiple click press time
    3. #define default_t_r 200 //the multiple click release time for waiting next click
    4. #define default_t_end 300 //the silence time when only support someone click
    5. #define default_t_repeat 200 //the repeat time inlcude slong repeat and long repeat
    6. #define default_t_l_p1 500 //the longpress 1 time , long1 = default_t_l_p1
    7. #define default_t_l_p2 1000 //the longpress 1 -> longpress 2 time, long2 = default_t_l_p1 + default_t_l_p2
    8. #define default_t_l_p3 1500 //the longpress 2 -> longpress 3 time, long3 = default_t_l_p1 + default_t_l_p2 + default_t_l_p3
    9. #define default_t_slong 500 //the slong time

    当然,时间也可以通过用ATK配置工具来调整,可以参见笔者如下连接的另一篇文章,在此不在重复:

    络达开发--按键时间长度的配置


    笔者对于单击的UI的定义如下所示:

    1. const apps_config_key_event_map_t temp_key_short_click_configs[] = {
    2. #if GHP_UI_DEF
    3.     {
    4.         DEVICE_KEY_POWER,
    5.         KEY_ACCEPT_CALL,
    6.         (1 << APP_HFP_INCOMING)
    7.     },
    8.     {
    9.         DEVICE_KEY_POWER,
    10.         KEY_3WAY_HOLD_ACTIVE_ACCEPT_OTHER,
    11.         (1 << APP_HFP_TWC_INCOMING)
    12.     },
    13.     {
    14.         DEVICE_KEY_POWER,
    15.         KEY_AVRCP_PLAY,
    16.         (1 << APP_CONNECTED)
    17.     },
    18.     {
    19.         DEVICE_KEY_POWER,
    20.         KEY_AVRCP_PAUSE,
    21.         (1 << APP_A2DP_PLAYING)
    22.     },
    23.     {
    24.         DEVICE_KEY_POWER,
    25.         KEY_END_CALL,
    26.         (1 << APP_HFP_CALLACTIVE) | (1 << APP_HFP_CALLACTIVE_WITHOUT_SCO) | (1 << APP_HFP_MULTITPART_CALL)
    27.         | (1 << APP_HFP_OUTGOING) | (1 << APP_STATE_HELD_ACTIVE) | (1 << APP_HFP_TWC_OUTGOING)
    28.     },
    29.     {
    30.         EINT_KEY_0, //GPIO2---EINT2 --- KEY2
    31.         KEY_ANC_GAIN_UP, //KEY_VOICE_UP,
    32.         (1 << APP_CONNECTED) | (1 << APP_HFP_INCOMING) | (1 << APP_HFP_OUTGOING) | (1 << APP_HFP_CALLACTIVE)
    33.         | (1 << APP_HFP_TWC_INCOMING) | (1 << APP_HFP_TWC_OUTGOING) | (1 << APP_HFP_MULTITPART_CALL) | (1 << APP_A2DP_PLAYING)
    34.         | (1 << APP_STATE_HELD_ACTIVE) | (1 << APP_ULTRA_LOW_LATENCY_PLAYING) | (1 << APP_WIRED_MUSIC_PLAY)
    35.     },
    36.     {
    37.         EINT_KEY_1, //GPIO8---EINT8 --- KEY8
    38.         KEY_ANC_GAIN_DOWN, //KEY_VOICE_DN,
    39.         (1 << APP_CONNECTED) | (1 << APP_HFP_INCOMING) | (1 << APP_HFP_OUTGOING) | (1 << APP_HFP_CALLACTIVE)
    40.         | (1 << APP_HFP_TWC_INCOMING) | (1 << APP_HFP_TWC_OUTGOING) | (1 << APP_HFP_MULTITPART_CALL) | (1 << APP_A2DP_PLAYING)
    41.         | (1 << APP_STATE_HELD_ACTIVE) | (1 << APP_ULTRA_LOW_LATENCY_PLAYING) | (1 << APP_WIRED_MUSIC_PLAY)
    42.     },
    43. #if defined(AIR_BT_ULTRA_LOW_LATENCY_ENABLE)
    44.     {
    45.         EINT_KEY_2, //GPIO8 --- EINT9 ---KEY9
    46.         KEY_ULL_RECONNECT,
    47.         (1 << APP_DISCONNECTED) | (1 << APP_CONNECTED) | (1 << APP_A2DP_PLAYING) | (1 << APP_ULTRA_LOW_LATENCY_PLAYING)
    48.     },
    49. #endif
    50. #endif
    51. };

    可以看到,代码中的事件<KEY_ANC_GAIN_UP>和<KEY_ANC_GAIN_DOWN>,这两个为笔者添加的事件类型,原SDK中没有该定义,其目的是实现通过按钮来实时调整ANC的增益。那么,这个定义添加在哪里呢?如下路径所示:

    bta_sdk\mcu\project\ab1565_ab1568_evk\apps\headset_ref_design\inc\apps\config\apps_config_event_list.h

    文件中的枚举定义:apps_config_key_action_t中就是用来声名事件的类型。如笔者添加的类型:

    1. KEY_AUDIO_PEQ_SWITCH = 0x0220, /** < For PEQ switch key event >*/
    2.     KEY_TEST_MODE_ENTER_DUT_MODE = 0x0300,  /* For test mode, press key to enter DUT mode. */
    3.     KEY_TEST_MODE_ENTER_RELAY_MODE = 0x0301,    /* For test mode, press key to enter Relay mode. */
    4.     KEY_CUSTOMER_DEFINE_ACTIONS = 0xF000,   /**< Value larger than it is for customization. */
    5.     KEY_MS_TEAMS_BTN_INVOKE = 0x0140,         /* Teams BTN press. */
    6.     KEY_MS_TEAMS_BTN_RELEASE = 0x0141,    /* Teams BTN release. */
    7.     /*------------------add by cczy-----------------*/
    8.     KEY_ANC_GAIN_UP   = 0xF010,
    9.     KEY_ANC_GAIN_DOWN = 0xF011,
    10. } apps_config_key_action_t;

    事件类型添加并定义好之后,还要去事件处理器里面去handle这个事件,相关代码文件在如下路径:

    bta_sdk\mcu\project\ab1565_ab1568_evk\apps\headset_ghp\src\apps\app_idle\app_home_screen_idle_activity.c

    上面文件中的函数:

    1. static bool _proc_key_event_group(ui_shell_activity_t *self,
    2.                                   uint32_t event_id,
    3.                                   void *extra_data,
    4.                                   size_t data_len)

    即为处理各按钮事件的函数;

    因为笔者添加的是和ANC相关的事件,所以在该函数处理中,会调用函数:

    app_home_screen_process_anc_and_pass_through()

    并在其中继续识别事件类型;相关代码如下所示:

    1. static bool _proc_key_event_group(......){
    2. ......
    3. #ifdef MTK_ANC_ENABLE
    4.         case KEY_PASS_THROUGH:
    5.         case KEY_ANC:
    6.         case KEY_SWITCH_ANC_AND_PASSTHROUGH:
    7.         case KEY_BETWEEN_ANC_PASSTHROUGH:
    8.         case KEY_ANC_GAIN_UP:
    9.         case KEY_ANC_GAIN_DOWN:
    10.             /* Handle ANC key event. */
    11.             ret = app_home_screen_process_anc_and_pass_through(self, action);
    12.             break;
    13. #endif
    14. ......
    15. }
    16. static bool app_home_screen_process_anc_and_pass_through(......)
    17. {
    18. ......
    19.     }else if(KEY_ANC_GAIN_UP == key_action){
    20.         if(anc_enable)
    21.         {
    22.             bool control_ret = FALSE;
    23.             int16_t newGain = anc_runtime_gain;
    24.             if(newGain < 500)
    25.             {
    26.                 newGain += 100;
    27.                 if(newGain > 500) newGain = 500;
    28.                 control_ret = app_anc_service_set_runtime_gain(target_anc_type,newGain);
    29.             }
    30.             GHP_LOG_MSGID_I("KEY_ANC_GAIN_UP[%d],oldG:%d, newG:%d",3,control_ret,anc_runtime_gain, newGain);
    31.         }
    32.         else
    33.         {
    34.             GHP_LOG_MSGID_I("gain up:ANC not enable",0);
    35.         }
    36.         return true;
    37.     } else if(KEY_ANC_GAIN_DOWN == key_action){
    38.         if(anc_enable)
    39.         {
    40.             bool control_ret = FALSE;
    41.             int16_t newGain = anc_runtime_gain;
    42.             if(anc_runtime_gain > -500)
    43.             {
    44.                 newGain -= 100;
    45.                 if(newGain < -500) newGain = -500;
    46.                 control_ret = app_anc_service_set_runtime_gain(target_anc_type,newGain);
    47.             }
    48.             GHP_LOG_MSGID_I("KEY_ANC_GAIN_DOWN[%d],oldG:%d, newG:%d",3,control_ret,anc_runtime_gain, newGain);
    49.         }
    50.         else
    51.         {
    52.             GHP_LOG_MSGID_I("gain down:ANC not enable",0);
    53.         }
    54.        
    55.         return true;
    56.     }else {
    57.         return false;
    58.     }
    59. ......
    60. }

    至此,自定义按钮事件和UI的关联已经完成建立。

  • 相关阅读:
    【周周Python百日刷题计划】Day5~内置函数和运算符的使用
    前端多环境部署
    CVPR2023 RIFormer, 无需TokenMixer也能达成SOTA性能的极简ViT架构
    InternalResourceViewResolver配置说明(编码utf-8,优先级order,prefix,suffix)
    Qt+FFmpeg+opengl从零制作视频播放器-7.OpenGL播放视频
    SentinelResource注解之blockHander和fallback
    lambda表达式的使用
    jdk1.8中list按对象的某个属性分组
    Jetpack:002-页面与布局
    GitHub 简介
  • 原文地址:https://blog.csdn.net/cczy_/article/details/126124382