From d1a8536fb535467a22fef8a0504e46db8e6a7b59 Mon Sep 17 00:00:00 2001 From: xueben Date: Sun, 8 Feb 2026 21:41:19 +0800 Subject: [PATCH] =?UTF-8?q?NEW:=20=E5=88=86=E7=A6=BB=E5=86=85=E9=83=A8?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9C=BA=E4=B8=8E=E7=94=A8=E6=88=B7=E5=8F=AF?= =?UTF-8?q?=E8=A7=81=E4=BA=8B=E4=BB=B6=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why: 原设计将内部状态机状态(bits_btn_state_t)直接暴露给用户, 导致 API 边界不清晰,且测试代码使用魔法数字访问内部状态, 一旦内部实现变更容易引发问题。 What: as follows: 1. 将 bits_btn_state_t 枚举移至 bits_button.c 内部,不再对外暴露; 2. 在 bits_button.h 中新增 bits_btn_event_t 用户事件枚举: - BTN_EVENT_PRESSED (1): 按键按下(消抖后) - BTN_EVENT_LONG_PRESS (2): 长按检测或保持中 - BTN_EVENT_RELEASE (3): 按键释放 - BTN_EVENT_FINISH (5): 按键序列完成(时间窗口结束后) 3. 新增 state_to_event() 内部映射函数,添加显式类型转换以支持 C++ 编译; 4. 更新所有测试文件,将 BTN_STATE_xxx 替换为 BTN_EVENT_xxx; 5. 将 test_combo_button_reset 改写为黑盒测试,通过正常按键操作验证 重置功能,消除对内部状态的直接访问; 6. 更新 C++ 兼容性测试,使用 bits_btn_event_t 替代原有类型; 7. 更新 API 文档及使用指南,同步事件枚举说明 TEST: 48 Tests 0 Failures 0 Ignored - C++ 兼容性测试: 全部通过 --- bits_button.c | 33 ++++++++-- bits_button.h | 14 ++-- docs/api.md | 25 +++++-- docs/peek_feature.md | 4 +- docs/testing.md | 2 +- docs/usage_guide.md | 24 +++---- examples/example_callback.c | 10 +-- simulator/adapter_layer/button_adapter.c | 10 +-- test/cases/basic/test_initialization.c | 16 ++--- test/cases/basic/test_peek_functionality.c | 2 +- test/cases/basic/test_single_operations.c | 8 +-- test/cases/basic/test_state_reset.c | 77 ++++++++++++---------- test/cases/combo/test_advanced_combo.c | 20 +++--- test/cases/combo/test_combo_buttons.c | 8 +-- test/cases/compat/test_cpp_compat.cpp | 21 +++--- test/cases/edge/test_edge_cases.c | 14 ++-- test/cases/edge/test_state_machine_edge.c | 12 ++-- test/cases/performance/test_performance.c | 14 ++-- test/config/test_config.h | 10 +-- test/utils/assert_utils.c | 6 +- 20 files changed, 187 insertions(+), 143 deletions(-) diff --git a/bits_button.c b/bits_button.c index bce2cf1..d0dffc4 100644 --- a/bits_button.c +++ b/bits_button.c @@ -5,6 +5,27 @@ static bits_button_t bits_btn_entity; static bits_btn_debug_printf_func debug_printf = NULL; static void debug_print_binary(key_value_type_t num); +// Internal state machine states (not exposed to users) +typedef enum { + BTN_STATE_IDLE , + BTN_STATE_PRESSED , + BTN_STATE_LONG_PRESS , + BTN_STATE_RELEASE , + BTN_STATE_RELEASE_WINDOW , + BTN_STATE_FINISH +} bits_btn_state_t; + +static bits_btn_event_t state_to_event(bits_btn_state_t state) +{ + switch (state) { + case BTN_STATE_PRESSED: return BTN_EVENT_PRESSED; + case BTN_STATE_LONG_PRESS: return BTN_EVENT_LONG_PRESS; + case BTN_STATE_RELEASE: return BTN_EVENT_RELEASE; + case BTN_STATE_FINISH: return BTN_EVENT_FINISH; + default: return (bits_btn_event_t)0; + } +} + // ============================================================================ // Buffer Implementation Selection // ============================================================================ @@ -665,7 +686,7 @@ static void bits_btn_report_event(struct button_obj_t* button, bits_btn_result_t #ifndef BITS_BTN_DISABLE_BUFFER uint8_t is_user_result_filter_exist = (bits_btn_result_user_filter_cb != NULL); - uint8_t default_result_filter_triger = (result->event == BTN_STATE_LONG_PRESS) || (result->event == BTN_STATE_FINISH); + uint8_t default_result_filter_triger = (result->event == BTN_EVENT_LONG_PRESS) || (result->event == BTN_EVENT_FINISH); if (bits_btn_buffer_ops && bits_btn_buffer_ops->write) { @@ -719,7 +740,7 @@ static void update_button_state_machine(struct button_obj_t* button, uint8_t btn button->state_entry_time = current_time; result.key_value = button->state_bits; - result.event = button->current_state; + result.event = state_to_event((bits_btn_state_t)button->current_state); bits_btn_report_event(button, &result); } break; @@ -733,7 +754,7 @@ static void update_button_state_machine(struct button_obj_t* button, uint8_t btn button->long_press_period_trigger_cnt = 0; result.key_value = button->state_bits; - result.event = button->current_state; + result.event = state_to_event((bits_btn_state_t)button->current_state); bits_btn_report_event(button, &result); } else if (btn_pressed == 0) @@ -758,7 +779,7 @@ static void update_button_state_machine(struct button_obj_t* button, uint8_t btn } result.key_value = button->state_bits; - result.event = button->current_state; + result.event = state_to_event((bits_btn_state_t)button->current_state); result.long_press_period_trigger_cnt = button->long_press_period_trigger_cnt; bits_btn_report_event(button, &result); } @@ -767,7 +788,7 @@ static void update_button_state_machine(struct button_obj_t* button, uint8_t btn __append_bit(&button->state_bits, 0); result.key_value = button->state_bits; - result.event = BTN_STATE_RELEASE; + result.event = BTN_EVENT_RELEASE; bits_btn_report_event(button, &result); button->current_state = BTN_STATE_RELEASE_WINDOW; @@ -789,7 +810,7 @@ static void update_button_state_machine(struct button_obj_t* button, uint8_t btn case BTN_STATE_FINISH: result.key_value = button->state_bits; - result.event = BTN_STATE_FINISH; + result.event = BTN_EVENT_FINISH; bits_btn_report_event(button, &result); button->state_bits = 0; diff --git a/bits_button.h b/bits_button.h index 6d8d7bb..5d857b6 100644 --- a/bits_button.h +++ b/bits_button.h @@ -38,13 +38,11 @@ typedef enum { typedef enum { - BTN_STATE_IDLE , - BTN_STATE_PRESSED , - BTN_STATE_LONG_PRESS , - BTN_STATE_RELEASE , - BTN_STATE_RELEASE_WINDOW , - BTN_STATE_FINISH -} bits_btn_state_t; + BTN_EVENT_PRESSED = 1, // Button pressed (after debounce) + BTN_EVENT_LONG_PRESS = 2, // Long press detected or holding + BTN_EVENT_RELEASE = 3, // Button released + BTN_EVENT_FINISH = 5, // Button sequence completed (after time window) +} bits_btn_event_t; //According to your need to modify the constants. #ifndef BITS_BTN_TICKS_INTERVAL @@ -284,7 +282,7 @@ size_t get_bits_btn_buffer_capacity(void); * @param cb: Pointer to the user-defined filter callback function. The callback should * return 1 to write the event to buffer, 0 to filter it out. Pass NULL to disable. * @retval None - * @note Only available in buffer mode. Default behavior writes BTN_STATE_LONG_PRESS and BTN_STATE_FINISH events. + * @note Only available in buffer mode. Default behavior writes BTN_EVENT_LONG_PRESS and BTN_EVENT_FINISH events. */ void bits_btn_register_result_filter_callback(bits_btn_result_user_filter_callback cb); diff --git a/docs/api.md b/docs/api.md index 4648563..f5f87a2 100644 --- a/docs/api.md +++ b/docs/api.md @@ -195,12 +195,23 @@ typedef struct button_obj_combo ## 事件类型 -- `BTN_STATE_IDLE`: 空闲状态 -- `BTN_STATE_PRESSED`: 按下 -- `BTN_STATE_LONG_PRESS`: 长按 -- `BTN_STATE_RELEASE`: 抬起 -- `BTN_STATE_RELEASE_WINDOW`: 释放窗口 -- `BTN_STATE_FINISH`: 完成 +用户可见的事件类型通过 `bits_btn_event_t` 枚举定义: + +```c +typedef enum { + BTN_EVENT_PRESSED = 1, // 按键按下(消抖后) + BTN_EVENT_LONG_PRESS = 2, // 长按检测或保持中 + BTN_EVENT_RELEASE = 3, // 按键释放 + BTN_EVENT_FINISH = 5, // 按键序列完成(时间窗口结束后) +} bits_btn_event_t; +``` + +- `BTN_EVENT_PRESSED`: 按键按下(消抖后触发) +- `BTN_EVENT_LONG_PRESS`: 长按开始或长按保持中 +- `BTN_EVENT_RELEASE`: 按键释放 +- `BTN_EVENT_FINISH`: 按键动作完成(时间窗口结束,可判断单击/双击/连击等) + +> **注意**: 内部状态机状态(如 IDLE, RELEASE_WINDOW 等)不再暴露给用户,仅在库内部使用。 ## 错误码枚举 @@ -250,7 +261,7 @@ while(bits_button_get_key_result(&result)) { bits_btn_result_t preview; if(bits_button_peek_key_result(&preview)) { // 根据预览的事件决定是否进一步处理 - if(preview.event == BTN_STATE_PRESSED) { + if(preview.event == BTN_EVENT_PRESSED) { // 消费事件 bits_button_get_key_result(&result); // 实际处理 diff --git a/docs/peek_feature.md b/docs/peek_feature.md index a4b3abb..10b1098 100644 --- a/docs/peek_feature.md +++ b/docs/peek_feature.md @@ -50,14 +50,14 @@ uint8_t bits_button_peek_key_result(bits_btn_result_t *result); bits_btn_result_t preview_result; if (bits_button_peek_key_result(&preview_result)) { // 根据事件类型决定是否深度处理 - if (preview_result.event == BTN_STATE_PRESSED) { + if (preview_result.event == BTN_EVENT_PRESSED) { // 特定事件才消费并处理 bits_btn_result_t actual_result; if (bits_button_get_key_result(&actual_result)) { // 实际处理事件 handle_single_click(&actual_result); } - } else if (preview_result.event == BTN_STATE_LONG_PRESS) { + } else if (preview_result.event == BTN_EVENT_LONG_PRESS) { // 长按开始事件,可能需要不同处理 bits_btn_result_t actual_result; if (bits_button_get_key_result(&actual_result)) { diff --git a/docs/testing.md b/docs/testing.md index 349a4c8..48bb8a4 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -69,7 +69,7 @@ void test_example_functionality(void) { // 验证结果 bits_btn_result_t result; TEST_ASSERT_TRUE(bits_button_get_key_result(&result)); - TEST_ASSERT_EQUAL(BTN_STATE_FINISH, result.event); + TEST_ASSERT_EQUAL(BTN_EVENT_FINISH, result.event); TEST_ASSERT_EQUAL(KEY_ID_1, result.key_id); // 清理 diff --git a/docs/usage_guide.md b/docs/usage_guide.md index 46bdbb6..b21c585 100644 --- a/docs/usage_guide.md +++ b/docs/usage_guide.md @@ -117,17 +117,17 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) { printf("id:%d, event:%d, key_value:%d, long press period trigger cnt:%d \r\n", result.key_id, result.event, result.key_value, result.long_press_period_trigger_cnt); - if(result.event == BTN_STATE_PRESSED) + if(result.event == BTN_EVENT_PRESSED) { printf("id:%d pressed \n", result.key_id); } - if(result.event == BTN_STATE_RELEASE) + if(result.event == BTN_EVENT_RELEASE) { printf("id:%d release\n", result.key_id); } - if(result.event == BTN_STATE_LONG_PRESS) + if(result.event == BTN_EVENT_LONG_PRESS) { if(result.key_value == 0b11) printf("id:%d, long press start\n", result.key_id); @@ -141,7 +141,7 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) printf("id:%d, double click and long press start\n", result.key_id); } - if(result.event == BTN_STATE_FINISH) + if(result.event == BTN_EVENT_FINISH) { switch(result.key_value) { @@ -158,7 +158,7 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) } // 通用的长按保持处理(不同的方式判别长按保持) - if(result.event == BTN_STATE_LONG_PRESS && result.long_press_period_trigger_cnt > 0) + if(result.event == BTN_EVENT_LONG_PRESS && result.long_press_period_trigger_cnt > 0) { printf("[%d] 长按保持 周期:%d\r\n", result.key_id, @@ -327,10 +327,12 @@ int main() ### 事件类型 -- `BTN_STATE_PRESSED`:按键按下 -- `BTN_STATE_RELEASE`:按键释放 -- `BTN_STATE_LONG_PRESS`:长按事件 -- `BTN_STATE_FINISH`:按键动作完成 +用户可见的事件类型通过 `bits_btn_event_t` 枚举定义: + +- `BTN_EVENT_PRESSED`:按键按下(消抖后触发) +- `BTN_EVENT_RELEASE`:按键释放 +- `BTN_EVENT_LONG_PRESS`:长按开始或长按保持中 +- `BTN_EVENT_FINISH`:按键动作完成(时间窗口结束,可判断单击/双击/连击等) ### 组合按键 @@ -346,12 +348,12 @@ void low_power_handler(void) { // 先预览事件类型,决定是否完全处理 bits_btn_result_t preview; if(bits_button_peek_key_result(&preview)) { - if(preview.event == BTN_STATE_LONG_PRESS && preview.key_id == POWER_KEY_ID) { + if(preview.event == BTN_EVENT_LONG_PRESS && preview.key_id == POWER_KEY_ID) { // 电源键长按,执行关机 bits_btn_result_t actual; bits_button_get_key_result(&actual); // 消费事件 system_shutdown(); - } else if(preview.event == BTN_STATE_PRESSED && preview.key_id == WAKEUP_KEY_ID) { + } else if(preview.event == BTN_EVENT_PRESSED && preview.key_id == WAKEUP_KEY_ID) { // 唤醒键单击,恢复正常模式 bits_btn_result_t actual; bits_button_get_key_result(&actual); // 消费事件 diff --git a/examples/example_callback.c b/examples/example_callback.c index 3a123a5..bd54f4b 100644 --- a/examples/example_callback.c +++ b/examples/example_callback.c @@ -84,17 +84,17 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) { printf("id:%d, event:%d, key_value:%d, long press period trigger cnt:%d \r\n", result.key_id, result.event, result.key_value, result.long_press_period_trigger_cnt); - if(result.event == BTN_STATE_PRESSED) + if(result.event == BTN_EVENT_PRESSED) { printf("id:%d pressed \n", result.key_id); } - if(result.event == BTN_STATE_RELEASE) + if(result.event == BTN_EVENT_RELEASE) { printf("id:%d release\n", result.key_id); } - if(result.event == BTN_STATE_LONG_PRESS) + if(result.event == BTN_EVENT_LONG_PRESS) { if(result.key_value == 0b11) printf("id:%d, long press start\n", result.key_id); @@ -108,7 +108,7 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) printf("id:%d, double click and long press start\n", result.key_id); } - if(result.event == BTN_STATE_FINISH) + if(result.event == BTN_EVENT_FINISH) { switch(result.key_value) { @@ -125,7 +125,7 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) } // 通用的长按保持处理(不同的方式判别长按保持) - if(result.event == BTN_STATE_LONG_PRESS && result.long_press_period_trigger_cnt > 0) + if(result.event == BTN_EVENT_LONG_PRESS && result.long_press_period_trigger_cnt > 0) { printf("[%d] 长按保持 周期:%d\r\n", result.key_id, diff --git a/simulator/adapter_layer/button_adapter.c b/simulator/adapter_layer/button_adapter.c index 4ef1133..d38abdb 100644 --- a/simulator/adapter_layer/button_adapter.c +++ b/simulator/adapter_layer/button_adapter.c @@ -69,17 +69,17 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) { printf("id:%d, event:%d, key_value:%d, long press period trigger cnt:%d \r\n", result.key_id, result.event, result.key_value, result.long_press_period_trigger_cnt); - if(result.event == BTN_STATE_PRESSED) + if(result.event == BTN_EVENT_PRESSED) { printf("id:%d pressed \n", result.key_id); } - if(result.event == BTN_STATE_RELEASE) + if(result.event == BTN_EVENT_RELEASE) { printf("id:%d release\n", result.key_id); } - if(result.event == BTN_STATE_LONG_PRESS) + if(result.event == BTN_EVENT_LONG_PRESS) { if(result.key_value == 0b11) printf("id:%d, long press start\n", result.key_id); @@ -93,7 +93,7 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) printf("id:%d, double click and long press start\n", result.key_id); } - if(result.event == BTN_STATE_FINISH) + if(result.event == BTN_EVENT_FINISH) { switch(result.key_value) { @@ -110,7 +110,7 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) } // 通用的长按保持处理(不同的方式判别长按保持) - if(result.event == BTN_STATE_LONG_PRESS && result.long_press_period_trigger_cnt > 0) + if(result.event == BTN_EVENT_LONG_PRESS && result.long_press_period_trigger_cnt > 0) { printf("[%d] long press hold, period:%d\r\n", result.key_id, diff --git a/test/cases/basic/test_initialization.c b/test/cases/basic/test_initialization.c index a0068bb..9393c2a 100644 --- a/test/cases/basic/test_initialization.c +++ b/test/cases/basic/test_initialization.c @@ -49,7 +49,7 @@ void test_successful_initialization(void) { mock_button_click(1, STANDARD_CLICK_TIME_MS); time_simulate_time_window_end(); - ASSERT_EVENT_EXISTS(1, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_FINISH); printf("成功初始化测试通过: 返回码0,基本功能正常\n"); } @@ -77,7 +77,7 @@ void test_different_active_levels(void) { mock_button_click(1, STANDARD_CLICK_TIME_MS); time_simulate_time_window_end(); - ASSERT_EVENT_EXISTS(1, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_FINISH); // 清空事件 test_framework_clear_events(); @@ -86,7 +86,7 @@ void test_different_active_levels(void) { mock_button_click(2, STANDARD_CLICK_TIME_MS); time_simulate_time_window_end(); - ASSERT_EVENT_EXISTS(2, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(2, BTN_EVENT_FINISH); printf("不同激活电平测试通过: 多个按键都正常工作\n"); } @@ -143,13 +143,13 @@ void test_custom_parameters(void) { mock_button_click(1, STANDARD_CLICK_TIME_MS); time_simulate_time_window_end(); - ASSERT_EVENT_EXISTS(1, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_FINISH); printf("自定义参数测试通过: 默认参数正常工作\n"); return; } // 应该是单击 - ASSERT_EVENT_EXISTS(1, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_FINISH); printf("自定义参数测试通过: 自定义参数正确生效\n"); } @@ -186,7 +186,7 @@ void test_multiple_button_initialization(void) { // 验证所有按键都产生了事件 for (int i = 0; i < test_count; i++) { - ASSERT_EVENT_EXISTS(i + 1, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(i + 1, BTN_EVENT_FINISH); } printf("多按键初始化测试通过: %d个按键都正常工作\n", test_count); @@ -218,7 +218,7 @@ void test_callback_functions(void) { time_simulate_time_window_end(); // 验证事件回调正常工作 - ASSERT_EVENT_EXISTS(1, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_FINISH); printf("✓ 事件回调正常工作\n"); // 清空事件 @@ -304,7 +304,7 @@ void test_callback_functions(void) { mock_button_click(1, STANDARD_CLICK_TIME_MS); time_simulate_time_window_end(); - ASSERT_EVENT_EXISTS(1, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_FINISH); printf("✓ 完整回调配置正常工作\n"); printf("✓ 回调函数测试通过: 所有回调组合都经过验证\n"); diff --git a/test/cases/basic/test_peek_functionality.c b/test/cases/basic/test_peek_functionality.c index 53af596..bd3f4a2 100644 --- a/test/cases/basic/test_peek_functionality.c +++ b/test/cases/basic/test_peek_functionality.c @@ -57,7 +57,7 @@ void test_peek_functionality(void) { // 验证peek获取到的事件信息 TEST_ASSERT_EQUAL_MESSAGE(1, result.key_id, "应为按键1的事件"); - TEST_ASSERT_EQUAL_MESSAGE(BTN_STATE_FINISH, result.event, "应为完成事件"); + TEST_ASSERT_EQUAL_MESSAGE(BTN_EVENT_FINISH, result.event, "应为完成事件"); TEST_ASSERT_EQUAL_MESSAGE(BITS_BTN_SINGLE_CLICK_KV, result.key_value, "应为单击按键值"); // 再次peek,应该仍然能获取到相同的事件(因为peek不会移除事件) diff --git a/test/cases/basic/test_single_operations.c b/test/cases/basic/test_single_operations.c index 482e965..4443a61 100644 --- a/test/cases/basic/test_single_operations.c +++ b/test/cases/basic/test_single_operations.c @@ -42,7 +42,7 @@ void test_single_click_event(void) { time_simulate_time_window_end(); // 验证结果 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, BITS_BTN_SINGLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, BITS_BTN_SINGLE_CLICK_KV); printf("单击测试通过\n"); } @@ -69,7 +69,7 @@ void test_double_click_event(void) { time_simulate_time_window_end(); // 验证结果 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, BITS_BTN_DOUBLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, BITS_BTN_DOUBLE_CLICK_KV); printf("双击测试通过\n"); } @@ -96,7 +96,7 @@ void test_triple_click_event(void) { time_simulate_time_window_end(); // 验证结果 - 使用库定义的双击常量 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, BITS_BTN_DOUBLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, BITS_BTN_DOUBLE_CLICK_KV); printf("快速双击测试通过\n"); } @@ -127,7 +127,7 @@ void test_long_press_event(void) { time_simulate_time_window_end(); // 验证长按开始事件 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_LONG_PRESS, BITS_BTN_LONG_PRESEE_START_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_LONG_PRESS, BITS_BTN_LONG_PRESEE_START_KV); printf("长按测试通过\n"); } diff --git a/test/cases/basic/test_state_reset.c b/test/cases/basic/test_state_reset.c index 52b86c5..c6d8e95 100644 --- a/test/cases/basic/test_state_reset.c +++ b/test/cases/basic/test_state_reset.c @@ -35,7 +35,7 @@ void test_state_reset_functionality(void) { time_simulate_long_press_threshold(); // 验证长按事件 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_LONG_PRESS, BITS_BTN_LONG_PRESEE_START_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_LONG_PRESS, BITS_BTN_LONG_PRESEE_START_KV); printf("✓ 长按状态确认: 按键ID=1, 事件=2\n"); // 3. 调用状态重置函数 @@ -56,7 +56,7 @@ void test_state_reset_functionality(void) { time_simulate_time_window_end(); // 验证单击事件正常 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, BITS_BTN_SINGLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, BITS_BTN_SINGLE_CLICK_KV); printf("✓ 重置后按键功能正常\n"); printf("✓ 状态重置功能测试完成\n"); @@ -72,10 +72,10 @@ void test_combo_button_reset(void) { BITS_BUTTON_INIT(2, 1, ¶m) }; - // 2. 初始化组合按键 + // 2. 初始化组合按键(抑制单键事件) static uint16_t combo_keys[] = {1, 2}; button_obj_combo_t combo_button = { - .suppress = 0, + .suppress = 1, // 抑制单键,只触发组合键事件 .key_count = 2, .key_single_ids = combo_keys, .btn = BITS_BUTTON_INIT(100, 1, ¶m) // 组合按键ID=100 @@ -96,42 +96,49 @@ void test_combo_button_reset(void) { TEST_ASSERT_EQUAL_INT32(0, init_result); printf("✓ 按键系统(含组合按键)初始化完成\n"); - // 4. 直接设置组合按键状态(模拟非空闲状态) - printf("设置组合按键为非空闲状态...\n"); - combo_button.btn.current_state = BTN_STATE_PRESSED; - combo_button.btn.last_state = BTN_STATE_PRESSED; - combo_button.btn.state_bits = 0x5; // 设置一些状态位 - combo_button.btn.state_entry_time = 1000; - combo_button.btn.long_press_period_trigger_cnt = 2; - - // 验证状态确实被设置了 - TEST_ASSERT_EQUAL_INT(BTN_STATE_PRESSED, combo_button.btn.current_state); - TEST_ASSERT_EQUAL_INT(BTN_STATE_PRESSED, combo_button.btn.last_state); - TEST_ASSERT_EQUAL_INT(0x5, combo_button.btn.state_bits); - TEST_ASSERT_EQUAL_INT(1000, combo_button.btn.state_entry_time); - TEST_ASSERT_EQUAL_INT(2, combo_button.btn.long_press_period_trigger_cnt); - printf("✓ 组合按键状态设置确认\n"); + // 4. 通过正常按键操作让组合按键进入长按状态 + printf("模拟组合按键进入长按状态...\n"); + mock_button_press(1); + mock_button_press(2); + time_simulate_debounce_delay(); + time_simulate_long_press_threshold(); + + // 验证组合按键长按事件 + ASSERT_EVENT_WITH_VALUE(100, BTN_EVENT_LONG_PRESS, BITS_BTN_LONG_PRESEE_START_KV); + printf("✓ 组合按键长按状态确认: 按键ID=100, 事件=2\n"); // 5. 调用状态重置函数 printf("调用状态重置函数...\n"); bits_button_reset_states(); printf("✓ 状态重置函数调用成功\n"); - // 6. 验证组合按键状态是否被重置 - printf("验证组合按键状态重置结果...\n"); - - // 这里是关键测试:如果组合按键重置代码被注释掉,这些断言会失败 - TEST_ASSERT_EQUAL_INT_MESSAGE(BTN_STATE_IDLE, combo_button.btn.current_state, - "组合按键 current_state 应该被重置为 BTN_STATE_IDLE"); - TEST_ASSERT_EQUAL_INT_MESSAGE(BTN_STATE_IDLE, combo_button.btn.last_state, - "组合按键 last_state 应该被重置为 BTN_STATE_IDLE"); - TEST_ASSERT_EQUAL_INT_MESSAGE(0, combo_button.btn.state_bits, - "组合按键 state_bits 应该被重置为 0"); - TEST_ASSERT_EQUAL_INT_MESSAGE(0, combo_button.btn.state_entry_time, - "组合按键 state_entry_time 应该被重置为 0"); - TEST_ASSERT_EQUAL_INT_MESSAGE(0, combo_button.btn.long_press_period_trigger_cnt, - "组合按键 long_press_period_trigger_cnt 应该被重置为 0"); - - printf("✓ 组合按键状态重置验证通过\n"); + // 6. 清理并验证重置后组合按键能正常工作 + printf("验证组合按键重置后的正常功能...\n"); + + // 释放所有按键并清理事件缓冲区 + mock_button_release(1); + mock_button_release(2); + time_simulate_debounce_delay(); + test_framework_reset(); // 清理事件缓冲区 + + // 重新模拟组合按键单击操作 + mock_button_press(1); + mock_button_press(2); + time_simulate_debounce_delay(); + time_simulate_standard_click(); + mock_button_release(1); + mock_button_release(2); + time_simulate_debounce_delay(); + time_simulate_time_window_end(); + + // 验证组合按键单击事件正常(说明状态已被正确重置) + ASSERT_EVENT_WITH_VALUE(100, BTN_EVENT_FINISH, BITS_BTN_SINGLE_CLICK_KV); + printf("✓ 重置后组合按键功能正常\n"); + + // 验证单键事件被抑制(组合按键正常工作) + ASSERT_EVENT_NOT_EXISTS(1, BTN_EVENT_FINISH); + ASSERT_EVENT_NOT_EXISTS(2, BTN_EVENT_FINISH); + printf("✓ 单键事件正确被抑制\n"); + printf("✓ 组合按键状态重置测试完成\n"); } \ No newline at end of file diff --git a/test/cases/combo/test_advanced_combo.c b/test/cases/combo/test_advanced_combo.c index 13e12e9..1ff70a6 100644 --- a/test/cases/combo/test_advanced_combo.c +++ b/test/cases/combo/test_advanced_combo.c @@ -61,12 +61,12 @@ void test_advanced_three_key_combo(void) { time_simulate_time_window_end(); // 验证组合键事件 - ASSERT_EVENT_EXISTS(100, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(100, BTN_EVENT_FINISH); // 验证单键被抑制 - ASSERT_EVENT_NOT_EXISTS(1, BTN_STATE_FINISH); - ASSERT_EVENT_NOT_EXISTS(2, BTN_STATE_FINISH); - ASSERT_EVENT_NOT_EXISTS(3, BTN_STATE_FINISH); + ASSERT_EVENT_NOT_EXISTS(1, BTN_EVENT_FINISH); + ASSERT_EVENT_NOT_EXISTS(2, BTN_EVENT_FINISH); + ASSERT_EVENT_NOT_EXISTS(3, BTN_EVENT_FINISH); printf("三键组合测试通过: 组合键触发,单键被抑制\n"); } @@ -108,7 +108,7 @@ void test_combo_with_different_timing(void) { time_simulate_time_window_end(); // 验证组合键事件 - ASSERT_EVENT_EXISTS(100, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(100, BTN_EVENT_FINISH); // 清空事件 test_framework_clear_events(); @@ -125,7 +125,7 @@ void test_combo_with_different_timing(void) { time_simulate_time_window_end(); // 验证组合键事件 - ASSERT_EVENT_EXISTS(100, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(100, BTN_EVENT_FINISH); printf("不同时序组合按键测试通过: 按键顺序不影响组合识别\n"); } @@ -172,8 +172,8 @@ void test_multiple_combos_conflict(void) { time_simulate_time_window_end(); // 验证组合键100触发 - ASSERT_EVENT_EXISTS(100, BTN_STATE_FINISH); - ASSERT_EVENT_NOT_EXISTS(101, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(100, BTN_EVENT_FINISH); + ASSERT_EVENT_NOT_EXISTS(101, BTN_EVENT_FINISH); // 清空事件 test_framework_clear_events(); @@ -189,8 +189,8 @@ void test_multiple_combos_conflict(void) { time_simulate_time_window_end(); // 验证组合键101触发 - ASSERT_EVENT_EXISTS(101, BTN_STATE_FINISH); - ASSERT_EVENT_NOT_EXISTS(100, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(101, BTN_EVENT_FINISH); + ASSERT_EVENT_NOT_EXISTS(100, BTN_EVENT_FINISH); printf("多组合键冲突测试通过: 不同组合键正确识别\n"); } \ No newline at end of file diff --git a/test/cases/combo/test_combo_buttons.c b/test/cases/combo/test_combo_buttons.c index 2829109..390bb22 100644 --- a/test/cases/combo/test_combo_buttons.c +++ b/test/cases/combo/test_combo_buttons.c @@ -64,11 +64,11 @@ void test_basic_combo_button(void) { time_simulate_time_window_end(); // 验证组合按键事件 - ASSERT_EVENT_EXISTS(100, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(100, BTN_EVENT_FINISH); // 验证单键被抑制(不应该有单键事件) - ASSERT_EVENT_NOT_EXISTS(1, BTN_STATE_FINISH); - ASSERT_EVENT_NOT_EXISTS(2, BTN_STATE_FINISH); + ASSERT_EVENT_NOT_EXISTS(1, BTN_EVENT_FINISH); + ASSERT_EVENT_NOT_EXISTS(2, BTN_EVENT_FINISH); printf("组合按键测试通过\n"); } @@ -117,6 +117,6 @@ void test_combo_long_press(void) { time_simulate_time_window_end(); // 验证组合按键长按事件 - ASSERT_EVENT_EXISTS(300, BTN_STATE_LONG_PRESS); + ASSERT_EVENT_EXISTS(300, BTN_EVENT_LONG_PRESS); printf("组合按键长按测试通过\n"); } \ No newline at end of file diff --git a/test/cases/compat/test_cpp_compat.cpp b/test/cases/compat/test_cpp_compat.cpp index 8325681..c3a5d52 100644 --- a/test/cases/compat/test_cpp_compat.cpp +++ b/test/cases/compat/test_cpp_compat.cpp @@ -58,11 +58,13 @@ class ButtonManager { } // 测试枚举类型在类中的使用 - bits_btn_state_t getButtonState(int index) { + // 注意:bits_btn_state_t 已移至内部,用户应使用 bits_btn_event_t + bits_btn_event_t getButtonEvent(int index) { if (index >= 0 && index < 3) { - return static_cast(buttons[index].current_state); + // 这里仅用于测试类型兼容性,实际使用应通过 bits_button_get_result 获取事件 + return BTN_EVENT_PRESSED; } - return BTN_STATE_IDLE; + return BTN_EVENT_FINISH; } }; @@ -114,10 +116,13 @@ int main() { ); // 4. 枚举类型测试 + // 注意:bits_btn_state_t 已移至内部,用户应使用 bits_btn_event_t std::cout << "4. 测试枚举类型..." << std::endl; - bits_btn_state_t state = BTN_STATE_IDLE; - state = BTN_STATE_PRESSED; - (void)state; + bits_btn_event_t event = BTN_EVENT_PRESSED; + event = BTN_EVENT_LONG_PRESS; + event = BTN_EVENT_RELEASE; + event = BTN_EVENT_FINISH; + (void)event; // 5. 所有宏定义可用性测试 std::cout << "5. 测试宏定义..." << std::endl; @@ -165,8 +170,8 @@ int main() { std::cout << "9. 测试C++类使用..." << std::endl; ButtonManager manager; button_obj_combo_t combo = manager.createComboButton(); - bits_btn_state_t btn_state = manager.getButtonState(0); - (void)combo; (void)btn_state; + bits_btn_event_t btn_event = manager.getButtonEvent(0); + (void)combo; (void)btn_event; // 10. 命名空间测试 std::cout << "10. 测试命名空间..." << std::endl; diff --git a/test/cases/edge/test_edge_cases.c b/test/cases/edge/test_edge_cases.c index a66ee68..32f3530 100644 --- a/test/cases/edge/test_edge_cases.c +++ b/test/cases/edge/test_edge_cases.c @@ -42,7 +42,7 @@ void test_slow_double_click_timeout(void) { time_simulate_pass(BITS_BTN_TIME_WINDOW_TIME_MS + 50); // 超过时间窗口 // 第一次点击应该已经完成,产生单击事件 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, BITS_BTN_SINGLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, BITS_BTN_SINGLE_CLICK_KV); // 重置事件计数器,测试第二次点击 test_framework_clear_events(); @@ -50,7 +50,7 @@ void test_slow_double_click_timeout(void) { time_simulate_time_window_end(); // 第二次点击也应该是单击,而不是双击 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, BITS_BTN_SINGLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, BITS_BTN_SINGLE_CLICK_KV); printf("超时双击测试通过: 两次独立的单击事件\n"); } @@ -85,7 +85,7 @@ void test_debounce_functionality(void) { time_simulate_time_window_end(); // 应该只有一个有效的按键事件 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, BITS_BTN_SINGLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, BITS_BTN_SINGLE_CLICK_KV); printf("消抖测试通过: 抖动被过滤,只有1个有效事件\n"); } @@ -114,8 +114,8 @@ void test_very_short_press(void) { time_simulate_time_window_end(); // 极短按键应该被消抖过滤掉 - ASSERT_EVENT_COUNT(1, BTN_STATE_PRESSED, 0); - ASSERT_EVENT_NOT_EXISTS(1, BTN_STATE_FINISH); + ASSERT_EVENT_COUNT(1, BTN_EVENT_PRESSED, 0); + ASSERT_EVENT_NOT_EXISTS(1, BTN_EVENT_FINISH); printf("极短按键测试通过: 被消抖过滤\n"); } @@ -146,7 +146,7 @@ void test_long_press_boundary(void) { time_simulate_time_window_end(); // 应该触发长按事件 - ASSERT_EVENT_EXISTS(1, BTN_STATE_LONG_PRESS); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_LONG_PRESS); printf("长按边界测试通过: 刚好达到阈值触发长按\n"); } @@ -177,6 +177,6 @@ void test_rapid_clicks_boundary(void) { time_simulate_time_window_end(); // 应该识别为三连击 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, 0b101010); // 三连击: 010 + 010 + 10 = 101010 + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, 0b101010); // 三连击: 010 + 010 + 10 = 101010 printf("快速连击边界测试通过: 时间窗口边界三连击\n"); } \ No newline at end of file diff --git a/test/cases/edge/test_state_machine_edge.c b/test/cases/edge/test_state_machine_edge.c index 7a8ad5d..4e60b95 100644 --- a/test/cases/edge/test_state_machine_edge.c +++ b/test/cases/edge/test_state_machine_edge.c @@ -42,7 +42,7 @@ void test_state_transition_timing(void) { time_simulate_debounce_delay(); // 验证按下事件 - ASSERT_EVENT_EXISTS(1, BTN_STATE_PRESSED); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_PRESSED); // 在长按阈值前释放 mock_button_release(1); @@ -50,7 +50,7 @@ void test_state_transition_timing(void) { time_simulate_time_window_end(); // 应该是单击,不是长按 - ASSERT_EVENT_EXISTS(1, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_FINISH); printf("状态转换时序测试通过: 长按阈值边界正确\n"); } @@ -83,7 +83,7 @@ void test_time_window_boundary(void) { time_simulate_time_window_end(); // 应该识别为双击 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, BITS_BTN_DOUBLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, BITS_BTN_DOUBLE_CLICK_KV); printf("时间窗口边界测试通过: 时间窗口边界正确处理\n"); } @@ -110,7 +110,7 @@ void test_long_press_period_boundary(void) { time_simulate_long_press_threshold(); // 验证长按开始 - ASSERT_EVENT_EXISTS(1, BTN_STATE_LONG_PRESS); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_LONG_PRESS); // 等待长按周期触发 - 需要额外的时间来触发周期事件 time_simulate_pass(param.long_press_period_triger_ms + 50); @@ -122,7 +122,7 @@ void test_long_press_period_boundary(void) { for (int i = 0; i < event_count; i++) { if (events[i].key_id == 1 && - events[i].event == BTN_STATE_LONG_PRESS && + events[i].event == BTN_EVENT_LONG_PRESS && events[i].long_press_period_trigger_cnt > 0) { hold_count++; } @@ -180,7 +180,7 @@ void test_rapid_state_changes(void) { time_simulate_time_window_end(); // 验证系统能够处理快速状态变化 - 应该识别为三连击 - ASSERT_EVENT_EXISTS(1, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(1, BTN_EVENT_FINISH); printf("快速状态变化测试通过: 系统能处理快速状态变化\n"); } \ No newline at end of file diff --git a/test/cases/performance/test_performance.c b/test/cases/performance/test_performance.c index 05e9aab..55012d0 100644 --- a/test/cases/performance/test_performance.c +++ b/test/cases/performance/test_performance.c @@ -44,7 +44,7 @@ void test_high_frequency_button_presses(void) { // 验证最终的连击序列 - 5连击的位模式(5连击应该是 0b1010101010) uint32_t expected_pattern = 0b1010101010; // 5连击: 010+010+010+010+10 = 1010101010 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, expected_pattern); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, expected_pattern); printf("高频按键测试通过: %d连击\n", expected_clicks); } @@ -86,10 +86,10 @@ void test_multiple_buttons_concurrent(void) { time_simulate_time_window_end(); // 验证各个按键的事件 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, BITS_BTN_SINGLE_CLICK_KV); - ASSERT_EVENT_WITH_VALUE(2, BTN_STATE_FINISH, BITS_BTN_DOUBLE_CLICK_KV); - ASSERT_EVENT_WITH_VALUE(3, BTN_STATE_FINISH, 0b101010); // 三连击: 010 + 010 + 10 = 101010 - ASSERT_EVENT_EXISTS(4, BTN_STATE_LONG_PRESS); + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, BITS_BTN_SINGLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(2, BTN_EVENT_FINISH, BITS_BTN_DOUBLE_CLICK_KV); + ASSERT_EVENT_WITH_VALUE(3, BTN_EVENT_FINISH, 0b101010); // 三连击: 010 + 010 + 10 = 101010 + ASSERT_EVENT_EXISTS(4, BTN_EVENT_LONG_PRESS); printf("多按键并发测试通过: 4个按键同时处理\n"); } @@ -125,7 +125,7 @@ void test_long_running_stability(void) { time_simulate_time_window_end(); // 验证系统在连续操作后仍然稳定 - 应该产生10连击模式 - ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, 0b10101010101010101010); // 10连击模式 + ASSERT_EVENT_WITH_VALUE(1, BTN_EVENT_FINISH, 0b10101010101010101010); // 10连击模式 printf("长时间运行稳定性测试通过: 连续操作稳定\n"); } @@ -160,7 +160,7 @@ void test_memory_usage(void) { // 验证所有按键都产生了事件 for (int i = 0; i < MAX_TEST_BUTTONS; i++) { - ASSERT_EVENT_EXISTS(i, BTN_STATE_FINISH); + ASSERT_EVENT_EXISTS(i, BTN_EVENT_FINISH); } printf("内存使用测试通过: %d个按键同时工作\n", MAX_TEST_BUTTONS); diff --git a/test/config/test_config.h b/test/config/test_config.h index 2ec35fa..f12bfe7 100644 --- a/test/config/test_config.h +++ b/test/config/test_config.h @@ -53,19 +53,19 @@ // ==================== 测试验证宏 ==================== #define VERIFY_SINGLE_CLICK(key_id) \ - ASSERT_EVENT_WITH_VALUE(key_id, BTN_STATE_FINISH, BITS_BTN_SINGLE_CLICK_KV) + ASSERT_EVENT_WITH_VALUE(key_id, BTN_EVENT_FINISH, BITS_BTN_SINGLE_CLICK_KV) #define VERIFY_DOUBLE_CLICK(key_id) \ - ASSERT_EVENT_WITH_VALUE(key_id, BTN_STATE_FINISH, BITS_BTN_DOUBLE_CLICK_KV) + ASSERT_EVENT_WITH_VALUE(key_id, BTN_EVENT_FINISH, BITS_BTN_DOUBLE_CLICK_KV) #define VERIFY_TRIPLE_CLICK(key_id) \ - ASSERT_EVENT_WITH_VALUE(key_id, BTN_STATE_FINISH, 0b101010) // 三连击: 010 + 010 + 10 + ASSERT_EVENT_WITH_VALUE(key_id, BTN_EVENT_FINISH, 0b101010) // 三连击: 010 + 010 + 10 #define VERIFY_LONG_PRESS_START(key_id) \ - ASSERT_EVENT_WITH_VALUE(key_id, BTN_STATE_LONG_PRESS, BITS_BTN_LONG_PRESEE_START_KV) + ASSERT_EVENT_WITH_VALUE(key_id, BTN_EVENT_LONG_PRESS, BITS_BTN_LONG_PRESEE_START_KV) #define VERIFY_SINGLE_THEN_LONG_PRESS(key_id) \ - ASSERT_EVENT_WITH_VALUE(key_id, BTN_STATE_LONG_PRESS, BITS_BTN_SINGLE_CLICK_THEN_LONG_PRESS_KV) + ASSERT_EVENT_WITH_VALUE(key_id, BTN_EVENT_LONG_PRESS, BITS_BTN_SINGLE_CLICK_THEN_LONG_PRESS_KV) // ==================== 调试配置 ==================== #define TEST_ENABLE_DEBUG_PRINT 1 diff --git a/test/utils/assert_utils.c b/test/utils/assert_utils.c index edb6388..3844c4c 100644 --- a/test/utils/assert_utils.c +++ b/test/utils/assert_utils.c @@ -92,7 +92,7 @@ void assert_long_press_count_impl(uint16_t key_id, uint16_t expected_count, int for (int i = 0; i < event_count; i++) { if (events[i].key_id == key_id && - events[i].event == BTN_STATE_LONG_PRESS && + events[i].event == BTN_EVENT_LONG_PRESS && events[i].long_press_period_trigger_cnt > 0) { hold_events++; } @@ -112,7 +112,7 @@ void assert_long_press_count_impl(uint16_t key_id, uint16_t expected_count, int void assert_combo_suppression_impl(uint16_t combo_key_id, uint16_t* suppressed_key_ids, int count, int line) { // 验证组合按键事件存在 - bits_btn_result_t* combo_event = assert_find_event(combo_key_id, BTN_STATE_FINISH); + bits_btn_result_t* combo_event = assert_find_event(combo_key_id, BTN_EVENT_FINISH); if (combo_event == NULL) { printf("断言失败 (行 %d): 组合按键事件不存在 - ID=%d\n", line, combo_key_id); TEST_FAIL_MESSAGE("组合按键事件不存在"); @@ -121,7 +121,7 @@ void assert_combo_suppression_impl(uint16_t combo_key_id, uint16_t* suppressed_k // 验证单键事件被抑制 for (int i = 0; i < count; i++) { - bits_btn_result_t* single_event = assert_find_event(suppressed_key_ids[i], BTN_STATE_FINISH); + bits_btn_result_t* single_event = assert_find_event(suppressed_key_ids[i], BTN_EVENT_FINISH); if (single_event != NULL) { printf("断言失败 (行 %d): 单键事件未被抑制 - ID=%d\n", line, suppressed_key_ids[i]); TEST_FAIL_MESSAGE("单键事件未被抑制");