1. 更新按键检测写法,忽略使用定时器。2. 调试按键无法检测到KEY2中。。。
This commit is contained in:
@ -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为服务的ID,payload为接收到需要修改的Json格式的字段与其值,len为payload的长度
|
||||
|
@ -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]=
|
||||
|
@ -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];
|
||||
}
|
||||
|
@ -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"},
|
||||
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user