一:按键配置
在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