1. 更新按键检测写法,忽略使用定时器。2. 调试按键无法检测到KEY2中。。。

This commit is contained in:
2025-07-18 09:23:55 +08:00
parent 6b6e483fa0
commit feef3bf1f7
4 changed files with 90 additions and 105 deletions

View File

@ -368,9 +368,12 @@ int fast_report(const char* svc_id)
return err;
}
err = HILINK_ReportCharState(svc_id, payload, len);
HILINK_Printf("report %s result is %d, payload:%s \r\n", svc_id, err, payload);
HILINK_Printf("report %s result is %d, payload:%s \r\n", svc_id, err, payload);
if (payload != NULL) {
free(payload);
}
return err;
}
}
/*
* 修改服务当前字段值
* svcId为服务的IDpayload为接收到需要修改的Json格式的字段与其值len为payload的长度

View File

@ -48,7 +48,8 @@ const int hf_lpt_262_gpio_fid_to_pid_map_table[HFM_MAX_FUNC_CODE]=
HFM_NOPIN, //HFGPIO_F_RESERVE4
HFM_NOPIN, //HFGPIO_F_RESERVE5
LPT26x_GPIO10, //HFGPIO_F_USER_DEFINE
LPT26x_GPIO4, //HFGPIO_F_USER_DEFINE
LPT26x_GPIO10,
};
const int hf_lpt_263_gpio_fid_to_pid_map_table[HFM_MAX_FUNC_CODE]=

View File

@ -2,17 +2,7 @@
#include "hilink.h"
//====================== 按键检测相关变量 ======================
static bool g_key_states[SWITCH_COUNT] = {true, true, true, true}; // 上一次按键状态
static uint32_t g_key_press_time[SWITCH_COUNT] = {0}; // 按键按下开始时间
static bool g_key_debounce_flag[SWITCH_COUNT] = {false}; // 防抖标志
static bool g_is_long_press_handled[SWITCH_COUNT] = {false}; // 长按处理标志
// 定时器参数
typedef struct {
int key_id;
} key_timer_param_t;
static key_timer_param_t g_timer_params[SWITCH_COUNT];
static bool g_key_states[SWITCH_COUNT] = {true, true, true, true}; // 当前按键状态
//====================== 开关控制函数 ======================
@ -115,81 +105,93 @@ void apply_master_switch_control(void) {
//====================== 按键检测与处理 ======================
// 按键防抖定时器回调
void key_debounce_timer_callback(uintptr_t data) {
key_timer_param_t *param = (key_timer_param_t *)data;
if (!param) return;
int key_id = param->key_id;
if (key_id < 0 || key_id >= SWITCH_COUNT) return;
// 清除防抖标志
g_key_debounce_flag[key_id] = false;
}
// 按键扫描任务
// 按键扫描任务(去除定时器防抖,在线程内直接处理防抖)
int key_scan_task(void *arg) {
(void)arg;
e_printf("[KEY] 按键扫描任务开始\r\n");
// 按键状态记录
bool stable_states[SWITCH_COUNT] = {true, true, true, true}; // 稳定状态
bool raw_states[SWITCH_COUNT] = {true, true, true, true}; // 原始状态
uint32_t last_change_time[SWITCH_COUNT] = {0}; // 上次状态变化时间
uint32_t press_start_time[SWITCH_COUNT] = {0}; // 按键按下开始时间
bool is_long_press_handled[SWITCH_COUNT] = {false}; // 长按处理标志
// 初始化稳定状态
for (int i = 0; i < SWITCH_COUNT; i++) {
stable_states[i] = get_key_input(i);
raw_states[i] = stable_states[i];
g_key_states[i] = stable_states[i];
g_runtime_state.switches[i].physical_key = stable_states[i];
}
while (!osal_kthread_should_stop()) {
uint32_t current_time = hfsys_get_time();
// 扫描所有按键
for (int i = 0; i < SWITCH_COUNT; i++) {
bool current_state = get_key_input(i);
uint32_t current_time = hfsys_get_time();
// 检测按键状态变化
if (current_state != g_key_states[i] && !g_key_debounce_flag[i]) {
if (current_state == KEY_PRESSED) {
// 按键按下
g_key_press_time[i] = current_time;
g_is_long_press_handled[i] = false;
e_printf("[KEY] 按键%d 按下\r\n", i + 1);
} else {
// 按键松开
uint32_t press_duration = current_time - g_key_press_time[i];
if (press_duration >= KEY_LONG_PRESS_MS && !g_is_long_press_handled[i]) {
// 长按事件(如果在按下期间没有处理)
handle_key_long_press(i);
g_is_long_press_handled[i] = true;
} else if (press_duration < KEY_LONG_PRESS_MS) {
// 短按事件
handle_key_press(i);
}
e_printf("[KEY] 按键%d 松开 (持续时间: %ums)\r\n", i + 1, press_duration);
}
// 启动防抖定时器
g_key_debounce_flag[i] = true;
if (g_key_debounce_timer[i]) {
uapi_timer_start(g_key_debounce_timer[i],
KEY_DEBOUNCE_MS * 1000,
key_debounce_timer_callback,
(uintptr_t)&g_timer_params[i]);
}
g_key_states[i] = current_state;
g_runtime_state.switches[i].physical_key = current_state;
bool new_raw_state = get_key_input(i);
// if (i == 1) {
// e_printf("[KEY] 按键%d 状态: %d\r\n", i + 1, new_raw_state);
// }
// 如果原始状态发生变化,重置防抖计时
if (new_raw_state != raw_states[i]) {
raw_states[i] = new_raw_state;
last_change_time[i] = current_time;
}
// 检查是否达到长按时间(在按下期间监测)
if (current_state == KEY_PRESSED && !g_is_long_press_handled[i]) {
uint32_t press_duration = current_time - g_key_press_time[i];
// 检查防抖时间是否达到
if (current_time - last_change_time[i] >= KEY_DEBOUNCE_MS) {
// 状态已稳定,可以处理
if (raw_states[i] != stable_states[i]) {
// 稳定状态发生变化
bool old_stable = stable_states[i];
bool new_stable = raw_states[i];
stable_states[i] = new_stable;
if (new_stable == KEY_PRESSED) {
// 按键按下
press_start_time[i] = current_time;
is_long_press_handled[i] = false;
e_printf("[KEY] 按键%d 按下\r\n", i + 1);
} else {
// 按键松开
uint32_t press_duration = current_time - press_start_time[i];
if (press_duration >= KEY_LONG_PRESS_MS && !is_long_press_handled[i]) {
// 长按事件(如果在按下期间没有处理)
handle_key_long_press(i);
is_long_press_handled[i] = true;
} else if (press_duration < KEY_LONG_PRESS_MS) {
// 短按事件
handle_key_press(i);
}
e_printf("[KEY] 按键%d 松开 (持续时间: %ums)\r\n", i + 1, press_duration);
}
// 更新全局状态
g_key_states[i] = new_stable;
g_runtime_state.switches[i].physical_key = new_stable;
}
}
// 检查长按(在按下期间持续监测)
if (stable_states[i] == KEY_PRESSED && !is_long_press_handled[i]) {
uint32_t press_duration = current_time - press_start_time[i];
if (press_duration >= KEY_LONG_PRESS_MS) {
handle_key_long_press(i);
g_is_long_press_handled[i] = true;
is_long_press_handled[i] = true;
}
}
}
// 休眠一段时间再继续扫描
osal_msleep(10); // 10ms扫描间隔
osal_msleep(10); // 10ms扫描间隔,提高响应性
}
e_printf("[KEY] 按键扫描任务退出\r\n");
return 0;
}
@ -252,29 +254,8 @@ void handle_key_long_press(int key_id) {
int key_system_init(void) {
int ret = ERRCODE_SUCC;
// 初始化定时器
ret = uapi_timer_init();
if (ret != ERRCODE_SUCC) {
e_printf("[KEY] 定时器初始化失败: %d\r\n", ret);
// return HF_FAIL;
}
ret = uapi_timer_adapter(TIMER_INDEX_1, TIMER_1_IRQN, 1);
if (ret != 0) {
e_printf("定时器适配器初始化失败\r\n");
return HF_FAIL;
}
// 初始化定时器参数
// 初始化按键状态
for (int i = 0; i < SWITCH_COUNT; i++) {
g_timer_params[i].key_id = i;
// 创建防抖定时器
ret = uapi_timer_create(TIMER_INDEX_1, &g_key_debounce_timer[i]);
if (ret != ERRCODE_SUCC) {
e_printf("[KEY] 创建按键%d防抖定时器失败: %d\r\n", i + 1, ret);
return HF_FAIL;
}
// 初始化按键状态
g_key_states[i] = get_key_input(i);
g_runtime_state.switches[i].physical_key = g_key_states[i];
}

View File

@ -627,25 +627,25 @@ typedef struct {
// GPIO初始化配置表
static const gpio_config_t gpio_configs[] = {
// 开关控制 - 输出
{SWITCH1_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_4, GPIO_DIRECTION_OUTPUT, "SWITCH1"},
{SWITCH2_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_4, GPIO_DIRECTION_OUTPUT, "SWITCH2"},
{SWITCH3_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_4, GPIO_DIRECTION_OUTPUT, "SWITCH3"},
{SWITCH4_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_4, GPIO_DIRECTION_OUTPUT, "SWITCH4"},
{SWITCH1_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "SWITCH1"},
{SWITCH2_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "SWITCH2"},
{SWITCH3_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "SWITCH3"},
{SWITCH4_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "SWITCH4"},
// 物理按键 - 输入
{KEY1_GPIO, PIN_MODE_0, PIN_PULL_TYPE_STRONG_UP, PIN_DS_3, GPIO_DIRECTION_INPUT, "KEY1"},
{KEY2_GPIO, PIN_MODE_0, PIN_PULL_TYPE_STRONG_UP, PIN_DS_3, GPIO_DIRECTION_INPUT, "KEY2"},
{KEY3_GPIO, PIN_MODE_0, PIN_PULL_TYPE_STRONG_UP, PIN_DS_3, GPIO_DIRECTION_INPUT, "KEY3"},
{KEY4_GPIO, PIN_MODE_0, PIN_PULL_TYPE_STRONG_UP, PIN_DS_3, GPIO_DIRECTION_INPUT, "KEY4"},
{KEY1_GPIO, PIN_MODE_0, PIN_PULL_TYPE_UP, PIN_DS_7, GPIO_DIRECTION_INPUT, "KEY1"},
{KEY2_GPIO, PIN_MODE_0, PIN_PULL_TYPE_UP, PIN_DS_7, GPIO_DIRECTION_INPUT, "KEY2"},
{KEY3_GPIO, PIN_MODE_0, PIN_PULL_TYPE_UP, PIN_DS_7, GPIO_DIRECTION_INPUT, "KEY3"},
{KEY4_GPIO, PIN_MODE_0, PIN_PULL_TYPE_UP, PIN_DS_7, GPIO_DIRECTION_INPUT, "KEY4"},
// 面板背光 - 输出
{PANEL_LED_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DISABLE, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "PANEL_LED"},
{PANEL_LED_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "PANEL_LED"},
// LED指示灯 - 输出
{LED1_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DISABLE, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "LED1"},
{LED2_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DISABLE, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "LED2"},
{LED3_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DISABLE, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "LED3"},
{LED4_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DISABLE, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "LED4"},
{LED1_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "LED1"},
{LED2_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "LED2"},
{LED3_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "LED3"},
{LED4_GPIO, PIN_MODE_1, PIN_PULL_TYPE_DOWN, PIN_DS_7, GPIO_DIRECTION_OUTPUT, "LED4"},
};