Files
2025-12-03 11:12:34 +08:00

142 lines
3.7 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".key.data.bss")
#pragma data_seg(".key.data")
#pragma const_seg(".key.text.const")
#pragma code_seg(".key.text")
#endif
#include "app_msg.h"
#include "key_driver.h"
#include "system/timer.h"
#include "sdk_config.h"
struct key_hold {
u8 send_3s_msg;
u8 send_5s_msg;
u32 start_time;
};
static struct key_hold key_hold_hdl[3];
static struct key_hold *get_key_hold(u8 key_value)
{
if (key_value < ARRAY_SIZE(key_hold_hdl)) {
return &key_hold_hdl[key_value];
}
return NULL;
}
/* --------------------------------------------------------------------------*/
/**
* @brief 多击按键判断
*
* @param key:基础按键动作(mono_click、long、hold、up)和键值
*
* @return 0:不拦截按键事件
* 1:拦截按键事件
*/
/* ----------------------------------------------------------------------------*/
static int multi_clicks_translate(struct key_event *key)
{
static u8 click_cnt;
static u8 notify_value = 0xff;
struct key_hold *hold = get_key_hold(key->value);
if (key->event == KEY_ACTION_LONG) {
if (hold) {
hold->start_time = jiffies;
}
} else if (key->event == KEY_ACTION_HOLD) {
if (hold) {
int time_msec = jiffies_offset_to_msec(hold->start_time, jiffies);
if (time_msec >= 3000 && hold->send_3s_msg == 0) {
hold->send_3s_msg = 1;
key->event = KEY_ACTION_HOLD_3SEC;
} else if (time_msec >= 5000 && hold->send_5s_msg) {
hold->send_5s_msg = 1;
key->event = KEY_ACTION_HOLD_5SEC;
}
}
} else {
if (hold) {
hold->send_3s_msg = 0;
hold->send_5s_msg = 1;
hold->start_time = 0;
}
}
if (key->event == KEY_ACTION_CLICK) {
if (key->value != notify_value) {
click_cnt = 1;
notify_value = key->value;
} else {
click_cnt++;
}
return 1;
}
if (key->event == KEY_ACTION_NO_KEY) {
if (click_cnt >= 2) {
key->event = KEY_ACTION_DOUBLE_CLICK + (click_cnt - 2);
} else {
key->event = KEY_ACTION_CLICK;
}
key->value = notify_value;
click_cnt = 0;
notify_value = NO_KEY;
} else if (key->event > KEY_ACTION_CLICK) {
click_cnt = 0;
notify_value = NO_KEY;
}
return 0;
}
/* --------------------------------------------------------------------------*/
/**
* @brief 联合按键判断
*
* @param key:基础按键动作(mono_click、long、hold、up)和键值
*
* @return 0:不拦截按键事件
* 1:拦截按键事件
*/
/* ----------------------------------------------------------------------------*/
static int combination_key_translate(struct key_event *key)
{
return 0;
}
/* --------------------------------------------------------------------------*/
/**
* @brief 按键事件过滤、检测和发送
*
* @param key:基础按键动作(mono_click、long、hold、up)和键值
*/
/* ----------------------------------------------------------------------------*/
void key_event_handler(struct key_event *key)
{
const struct key_callback *p;
if (multi_clicks_translate(key)) {
return;
}
if (combination_key_translate(key)) {
return;
}
if (key->event == KEY_ACTION_NO_KEY) {
return;
}
//外部需要格外做的处理流程,请通过注册的形式在此处回调
list_for_each_key_callback(p) {
if (p->cb_deal == NULL) {
continue;
}
if (p->cb_deal(key)) {
return;
}
}
app_send_message_from(MSG_FROM_KEY, sizeof(*key), (int *)key);
}