BES2500X开发---按键处理

一:按键配置

在tgt_hardware.c中对按键进行配置,包括按键名称、引脚映射、上下拉设置等,和LED的配置类似,且PWR按键无需单独配置

二:按键处理的流程

程序从main函数开始运行,并进入app_init()中,在app_init()函数中,对按键进行初始化

app_key_init();

void app_key_init(void)//注册上层按键处理事件
{
#if defined(IBRT)//TWS工程,注册按键
    app_ibrt_ui_test_key_init();
	TRACE(1,"%s1221",__func__);

#else
    uint8_t i = 0;
    TRACE(1,"%s",__func__);

    app_key_handle_clear();
    for (i=0; i<(sizeof(app_key_handle_cfg)/sizeof(APP_KEY_HANDLE)); i++){
        app_key_handle_registration(&app_key_handle_cfg[i]);
    }
#endif
}

 

当前为TWS工程,因而进入app_ibrt_ui_test_key_init()函数中,对按键进行注册

void app_ibrt_ui_test_key_init(void)
{
	TRACE(1,"%s", __func__);
    app_key_handle_clear();
	TRACE(1,"ARRAY_SIZE %d", ARRAY_SIZE(app_ibrt_ui_test_key_cfg));
    for (uint8_t i=0; i<ARRAY_SIZE(app_ibrt_ui_test_key_cfg); i++)
    {
        app_key_handle_registration(&app_ibrt_ui_test_key_cfg[i]);
    }
}

app_key_handle_registration(&app_ibrt_ui_test_key_cfg[i]);即为按键的注册,将app_ibrt_ui_test_key_cfg数组中包含的按键注册

const APP_KEY_HANDLE  app_ibrt_ui_test_key_cfg[] =
{
#if defined( __BT_ANC_KEY__)&&defined(ANC_APP)
    {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt anc key",app_anc_key, NULL},
#else
    {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
#endif
    
    {{APP_KEY_CODE_PWR,APP_KEY_EVENT_SHORTPRESS},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
	{{APP_KEY_CODE_PWR,APP_KEY_EVENT_FOURCLICK},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
    
    {{APP_KEY_CODE_PWR,APP_KEY_EVENT_DOUBLECLICK},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
    {{APP_KEY_CODE_PWR,APP_KEY_EVENT_TRIPLECLICK},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
    {{APP_KEY_CODE_PWR,APP_KEY_EVENT_ULTRACLICK},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
    {{APP_KEY_CODE_PWR,APP_KEY_EVENT_RAMPAGECLICK},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
    {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGPRESS},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
    {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGLONGPRESS},"app_ibrt_ui_test_key", app_ibrt_ui_test_key, NULL},
};

 系统根据按键事件(单击,双击,长按,短按等)进入按键处理函数app_ibrt_ui_test_key();

进入按键中断处理函数app_ibrt_search_ui_handle_key(status,param);

中断处理函数根据不同的按键事件,选择不同的case分支执行,从而实现按键控制不同功能的要求。

三:按键处理的底层实现

通过上面两步,已经可以简单的使用按键控制,但是上述两步只能实现系统预设的按键事件的处理,如果需要新增按键事件,需要了解按键处理的底层实现,了解按键底层的逻辑判断

按键底层的逻辑判断通过static void hal_key_debounce_handler(void *param)函数进行,

在该函数中获取按键的状态和持续时间,通过按键的状态和时间去判断按键事件

if (key_status.event == HAL_KEY_EVENT_UP) {
        //ASSERT(key_status.code_ready != HAL_KEY_CODE_NONE, "Bad code_ready");

        if (key_status.code_click == HAL_KEY_CODE_NONE || key_status.code_click != key_status.code_ready) {
            if (key_status.code_click != HAL_KEY_CODE_NONE) {
                send_key_event(key_status.code_click, HAL_KEY_EVENT_CLICK + key_status.cnt_click);
            }
            key_status.code_click = key_status.code_ready;
            key_status.cnt_click = 0;
            key_status.time_click = time;
        } else if (up_new && (up_new | key_status.code_down) == key_status.code_click) {
            key_status.cnt_click++;
            key_status.time_click = time;
        }
        if (time - key_status.time_click >= KEY_DOUBLECLICK_THRESHOLD || key_status.cnt_click >= MAX_KEY_CLICK_COUNT) {
            send_key_event(key_status.code_click, HAL_KEY_EVENT_CLICK + key_status.cnt_click);
            key_status.code_click = HAL_KEY_CODE_NONE;
            key_status.cnt_click = 0;
            key_status.event = HAL_KEY_EVENT_NONE;
        }
    }



if ((code_down & key_status.code_ready) == key_status.code_ready) {
        if (key_status.event == HAL_KEY_EVENT_DOWN) {
            if (time - key_status.time_updown >= KEY_LONGPRESS_THRESHOLD) {
                key_status.cnt_repeat = 0;
                key_status.event = HAL_KEY_EVENT_LONGPRESS;
                send_key_event(key_status.code_ready, key_status.event);
            }
        } else if (key_status.event == HAL_KEY_EVENT_LONGPRESS || key_status.event == HAL_KEY_EVENT_LONGLONGPRESS) {
            key_status.cnt_repeat++;
            if (key_status.cnt_repeat == KEY_LONGPRESS_REPEAT_THRESHOLD / KEY_CHECKER_INTERVAL) {
                key_status.cnt_repeat = 0;
                send_key_event(key_status.code_ready, HAL_KEY_EVENT_REPEAT);
            }
            if (key_status.event == HAL_KEY_EVENT_LONGPRESS) {
                if (time - key_status.time_updown >= KEY_LONGLONGPRESS_THRESHOLD) {
                    key_status.event = HAL_KEY_EVENT_LONGLONGPRESS;
                    send_key_event(key_status.code_ready, key_status.event);
                }
            }
        }
    }

长按时间的设置,时间单位为ms

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值