diff --git a/application/samples/wifi/ohos_connect/hilink_adapt/product/hilink_device.c b/application/samples/wifi/ohos_connect/hilink_adapt/product/hilink_device.c index adff4ec..f62c153 100755 --- a/application/samples/wifi/ohos_connect/hilink_adapt/product/hilink_device.c +++ b/application/samples/wifi/ohos_connect/hilink_adapt/product/hilink_device.c @@ -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的长度 diff --git a/application/ws63/user_main/app_main.c b/application/ws63/user_main/app_main.c index da4c8e1..3798030 100755 --- a/application/ws63/user_main/app_main.c +++ b/application/ws63/user_main/app_main.c @@ -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]= diff --git a/application/ws63/user_main/switch_panel/switch_panel_keys.c b/application/ws63/user_main/switch_panel/switch_panel_keys.c index 09c9ac4..2b87771 100644 --- a/application/ws63/user_main/switch_panel/switch_panel_keys.c +++ b/application/ws63/user_main/switch_panel/switch_panel_keys.c @@ -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]; } diff --git a/application/ws63/user_main/switch_panel/switch_panel_main.c b/application/ws63/user_main/switch_panel/switch_panel_main.c index 335cd54..274da83 100644 --- a/application/ws63/user_main/switch_panel/switch_panel_main.c +++ b/application/ws63/user_main/switch_panel/switch_panel_main.c @@ -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"}, };