diff --git a/bits_button.c b/bits_button.c index 5e335f1..4d8b37d 100644 --- a/bits_button.c +++ b/bits_button.c @@ -398,58 +398,57 @@ size_t get_bits_btn_buffer_capacity(void) #endif } -int32_t bits_button_init(button_obj_t* btns , \ - uint16_t btns_cnt , \ - button_obj_combo_t *btns_combo , \ - uint16_t btns_combo_cnt , \ - bits_btn_read_button_level read_button_level_func , \ - bits_btn_result_callback bits_btn_result_cb , \ - bits_btn_debug_printf_func bis_btn_debug_printf \ - ) +int32_t bits_button_init(const bits_btn_config_t *config) { bits_button_t *button = &bits_btn_entity; - debug_printf = bis_btn_debug_printf; - if ((btns == NULL) - || (btns_cnt == 0) - || (read_button_level_func == NULL) - || (btns_combo_cnt > 0 && btns_combo == NULL)) + if (config == NULL) + { + return -2; + } + + debug_printf = config->bits_btn_debug_printf; + + if ((config->btns == NULL) + || (config->btns_cnt == 0) + || (config->read_button_level_func == NULL) + || (config->btns_combo_cnt > 0 && config->btns_combo == NULL)) { if(debug_printf) debug_printf("Invalid init parameters !\n"); return -2; } - if (btns_cnt > BITS_BTN_MAX_BUTTONS) + if (config->btns_cnt > BITS_BTN_MAX_BUTTONS) { if (debug_printf) - debug_printf("Error: Too many buttons (%d > max %d)\n", btns_cnt, (int)BITS_BTN_MAX_BUTTONS); + debug_printf("Error: Too many buttons (%d > max %d)\n", config->btns_cnt, (int)BITS_BTN_MAX_BUTTONS); return -5; } memset(button, 0, sizeof(bits_button_t)); - button->btns = btns; - button->btns_cnt = btns_cnt; - button->btns_combo = btns_combo; - button->btns_combo_cnt = btns_combo_cnt; - button->_read_button_level = read_button_level_func; - button->bits_btn_result_cb = bits_btn_result_cb; + button->btns = config->btns; + button->btns_cnt = config->btns_cnt; + button->btns_combo = config->btns_combo; + button->btns_combo_cnt = config->btns_combo_cnt; + button->_read_button_level = config->read_button_level_func; + button->bits_btn_result_cb = config->bits_btn_result_cb; - if (btns_combo_cnt > BITS_BTN_MAX_COMBO_BUTTONS) + if (config->btns_combo_cnt > BITS_BTN_MAX_COMBO_BUTTONS) { if (debug_printf) { debug_printf("Error: Too many combo buttons (%d > max %d)\n", - btns_combo_cnt, BITS_BTN_MAX_COMBO_BUTTONS); + config->btns_combo_cnt, BITS_BTN_MAX_COMBO_BUTTONS); } return -3; } // Check single button param pointers - for (uint16_t i = 0; i < btns_cnt; i++) + for (uint16_t i = 0; i < config->btns_cnt; i++) { - if (btns[i].param == NULL) + if (config->btns[i].param == NULL) { if (debug_printf) debug_printf("Error: Button[%d] param is NULL\n", i); @@ -458,9 +457,9 @@ int32_t bits_button_init(button_obj_t* btns } // Check combo button param pointers - for (uint16_t i = 0; i < btns_combo_cnt; i++) + for (uint16_t i = 0; i < config->btns_combo_cnt; i++) { - if (btns_combo[i].btn.param == NULL) + if (config->btns_combo[i].btn.param == NULL) { if (debug_printf) debug_printf("Error: Combo button[%d] param is NULL\n", i); @@ -468,7 +467,7 @@ int32_t bits_button_init(button_obj_t* btns } } - for(uint16_t i = 0; i < btns_combo_cnt; i++) + for(uint16_t i = 0; i < config->btns_combo_cnt; i++) { button_obj_combo_t *combo = &button->btns_combo[i]; combo->combo_mask = 0; diff --git a/bits_button.h b/bits_button.h index 34baa5a..9c01916 100644 --- a/bits_button.h +++ b/bits_button.h @@ -8,8 +8,9 @@ extern "C" { #include #include +// The maximum number of combined buttons supported #ifndef BITS_BTN_MAX_COMBO_BUTTONS -#define BITS_BTN_MAX_COMBO_BUTTONS 8 // 默认最大支持8个组合按钮 +#define BITS_BTN_MAX_COMBO_BUTTONS 8 #endif typedef uint32_t key_value_type_t; @@ -154,43 +155,34 @@ typedef struct uint8_t (*peek)(bits_btn_result_t *result); } bits_btn_buffer_ops_t; +typedef struct +{ + button_obj_t *btns; + uint16_t btns_cnt; + button_obj_combo_t *btns_combo; + uint16_t btns_combo_cnt; + bits_btn_read_button_level read_button_level_func; + bits_btn_result_callback bits_btn_result_cb; + bits_btn_debug_printf_func bits_btn_debug_printf; +} bits_btn_config_t; + /** * @brief Initialize the button structure and configure button detection parameters. - * This function sets up the button system, including single and combination buttons, - * and registers callback functions for button state changes. + * This function sets up the button system using the provided configuration. * - * @param btns: Pointer to an array of button objects. Each object contains button-specific - * parameters such as key ID, debounce time, and callback functions. - * @param btns_cnt: Number of button objects in the array (i.e., the number of single buttons). - * @param btns_combo: Pointer to an array of button combination objects. These define - * multi-button presses (e.g., simultaneous key combinations). - * @param btns_combo_cnt: Number of button combination objects. - * @param read_button_level_func: Function pointer to the button level reading function. - * This function should return the current state (pressed/released) - * of the physical button. - * @param bits_btn_result_cb: Callback function pointer for button state changes. - * This function is called when a button event (press, release, etc.) is detected. - * @param bis_btn_debug_printf: Function pointer for debug logging. Pass NULL if debug output is not needed. + * @param config: Pointer to the configuration structure containing all initialization parameters. * -* @retval Status code indicating the result of the initialization: + * @retval Status code indicating the result of the initialization: * - 0: Success. All parameters are valid, and the button system is initialized. - * - -1: Invalid key ID in combination button configuration. A key ID specified in a - * combination button configuration does not exist in the single button array. - * - -2: Invalid input parameters. Returned if either `btns` or `read_button_level_func` is NULL. + * - -1: Invalid key ID in combination button configuration. + * - -2: Invalid input parameters. Returned if config is NULL or required fields are missing. * - -3: Too many combo buttons. The number of combo buttons exceeds BITS_BTN_MAX_COMBO_BUTTONS. * - -4: User buffer mode requires setting buffer ops before init. * - -5: Too many buttons. The number of buttons exceeds BITS_BTN_MAX_BUTTONS. * - -6: Button param is NULL. A single button has NULL param pointer. * - -7: Combo button param is NULL. A combo button has NULL param pointer. */ -int32_t bits_button_init(button_obj_t* btns , \ - uint16_t btns_cnt , \ - button_obj_combo_t *btns_combo , \ - uint16_t btns_combo_cnt , \ - bits_btn_read_button_level read_button_level_func , \ - bits_btn_result_callback bits_btn_result_cb , \ - bits_btn_debug_printf_func bis_btn_debug_printf \ -); +int32_t bits_button_init(const bits_btn_config_t *config); /** * @brief Background ticks function, called repeatedly by the timer with an interval of 5ms. diff --git a/docs/api.md b/docs/api.md index a125081..cbba208 100644 --- a/docs/api.md +++ b/docs/api.md @@ -5,31 +5,23 @@ ### 初始化函数 ```c -int32_t bits_button_init(button_obj_t* btns, - uint16_t btns_cnt, - button_obj_combo_t *btns_combo, - uint16_t btns_combo_cnt, - uint8_t (*read_button_level_func)(struct button_obj_t *btn), - void (*bits_btn_result_cb)(struct button_obj_t *btn, struct bits_btn_result button_result), - int (*bis_btn_debug_printf)(const char* format, ...)); +int32_t bits_button_init(const bits_btn_config_t *config); ``` -初始化按键检测库,传入单按键数组、组合按键数组、按键状态读取函数、结果回调函数和日志打印函数。 +使用配置结构体初始化按键检测库。 **参数:** -- `btns`: 单按键对象数组 -- `btns_cnt`: 单按键对象数量 -- `btns_combo`: 组合按键对象数组 -- `btns_combo_cnt`: 组合按键对象数量 -- `read_button_level_func`: 读取按键状态的回调函数 -- `bits_btn_result_cb`: 按键事件结果回调函数 -- `bis_btn_debug_printf`: 日志打印函数 +- `config`: 指向配置结构体的指针,包含所有初始化参数 **返回值:** - 0: 成功 - -1: 组合按键配置中存在无效的按键ID - -2: 输入参数无效 - -3: 组合按键过多 +- -4: 需要外部缓冲区操作但未设置 +- -5: 按键数量过多 +- -6: 单按键参数无效 +- -7: 组合按键参数无效 --- @@ -135,6 +127,20 @@ void bits_btn_register_result_filter_callback(bits_btn_result_user_filter_callba ## 数据结构 +### 配置结构体 + +```c +typedef struct { + button_obj_t *btns; // 单按键对象数组 + uint16_t btns_cnt; // 单按键对象数量 + button_obj_combo_t *btns_combo; // 组合按键对象数组 + uint16_t btns_combo_cnt; // 组合按键对象数量 + bits_btn_read_button_level read_button_level_func; // 状态读取函数 + bits_btn_result_callback bits_btn_result_cb; // 结果回调函数 + bits_btn_debug_printf_func bits_btn_debug_printf; // 日志打印函数 +} bits_btn_config_t; +``` + ### 按键结果结构 ```c @@ -199,11 +205,16 @@ typedef struct button_obj_combo ```c // 初始化按键库 -int32_t ret = bits_button_init(btns, BTN_CNT, - combo_btns, COMBO_BTN_COUNT, - read_button_level_func, - result_callback, - debug_printf_func); +bits_btn_config_t config = { + .btns = btns, + .btns_cnt = BTN_CNT, + .btns_combo = combo_btns, + .btns_combo_cnt = COMBO_BTN_COUNT, + .read_button_level_func = read_button_level_func, + .bits_btn_result_cb = result_callback, + .bits_btn_debug_printf = debug_printf_func +}; +int32_t ret = bits_button_init(&config); if(ret != 0) { printf("Init failed, code: %d\n", ret); } diff --git a/docs/usage_guide.md b/docs/usage_guide.md index 32103f7..fee512c 100644 --- a/docs/usage_guide.md +++ b/docs/usage_guide.md @@ -170,7 +170,16 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) int main() { // 6. 按键初始化; - int32_t ret = bits_button_init(btns, ARRAY_SIZE(btns), btns_combo, ARRAY_SIZE(btns_combo), read_key_state, bits_btn_result_cb, my_log_printf); + bits_btn_config_t config = { + .btns = btns, + .btns_cnt = ARRAY_SIZE(btns), + .btns_combo = btns_combo, + .btns_combo_cnt = ARRAY_SIZE(btns_combo), + .read_button_level_func = read_key_state, + .bits_btn_result_cb = bits_btn_result_cb, + .bits_btn_debug_printf = my_log_printf + }; + int32_t ret = bits_button_init(&config); if(ret) { printf("bits button init failed, ret:%d \r\n", ret); @@ -276,7 +285,16 @@ int my_log_printf(const char* format, ...) { int main() { // 5. 按键初始化; - int32_t ret = bits_button_init(btns, ARRAY_SIZE(btns), btns_combo, ARRAY_SIZE(btns_combo), read_key_state, NULL, my_log_printf); + bits_btn_config_t config = { + .btns = btns, + .btns_cnt = ARRAY_SIZE(btns), + .btns_combo = btns_combo, + .btns_combo_cnt = ARRAY_SIZE(btns_combo), + .read_button_level_func = read_key_state, + .bits_btn_result_cb = NULL, + .bits_btn_debug_printf = my_log_printf + }; + int32_t ret = bits_button_init(&config); if(ret) { printf("bits button init failed, ret:%d \r\n", ret); @@ -305,7 +323,7 @@ int main() ### 按键初始化 -使用`bits_button_init()`函数初始化按键系统,需要提供单按键数组、组合按键数组、状态读取函数、结果回调函数和日志函数。 +使用`bits_button_init()`函数初始化按键系统,需要提供`bits_btn_config_t`配置结构体,包含单按键数组、组合按键数组、状态读取函数、结果回调函数和日志函数。 ### 事件类型 @@ -383,4 +401,4 @@ void low_power_handler(void) { 2. **按键ID**:使用有意义的枚举值,避免冲突 3. **激活电平**:根据硬件电路确定(上拉电阻用1,下拉电阻用0) 4. **参数调优**:根据实际用户体验调整时间参数 -5. **错误处理**:在初始化函数调用后检查返回值 \ No newline at end of file +5. **错误处理**:在初始化函数调用后检查返回值 diff --git a/examples/example_callback.c b/examples/example_callback.c index cee1024..3a123a5 100644 --- a/examples/example_callback.c +++ b/examples/example_callback.c @@ -137,7 +137,16 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) int main() { // 6. 按键初始化; - int32_t ret = bits_button_init(btns, ARRAY_SIZE(btns), btns_combo, ARRAY_SIZE(btns_combo), read_key_state, bits_btn_result_cb, my_log_printf); + bits_btn_config_t config = { + .btns = btns, + .btns_cnt = ARRAY_SIZE(btns), + .btns_combo = btns_combo, + .btns_combo_cnt = ARRAY_SIZE(btns_combo), + .read_button_level_func = read_key_state, + .bits_btn_result_cb = bits_btn_result_cb, + .bits_btn_debug_printf = my_log_printf + }; + int32_t ret = bits_button_init(&config); if(ret) { printf("bits button init failed, ret:%d \r\n", ret); @@ -150,4 +159,4 @@ int main() while(1) {} -} \ No newline at end of file +} diff --git a/examples/example_poll.c b/examples/example_poll.c index 25bddd0..b576713 100644 --- a/examples/example_poll.c +++ b/examples/example_poll.c @@ -81,7 +81,16 @@ int my_log_printf(const char* format, ...) { int main() { // 5. 按键初始化; - int32_t ret = bits_button_init(btns, ARRAY_SIZE(btns), btns_combo, ARRAY_SIZE(btns_combo), read_key_state, NULL, my_log_printf); + bits_btn_config_t config = { + .btns = btns, + .btns_cnt = ARRAY_SIZE(btns), + .btns_combo = btns_combo, + .btns_combo_cnt = ARRAY_SIZE(btns_combo), + .read_button_level_func = read_key_state, + .bits_btn_result_cb = NULL, + .bits_btn_debug_printf = my_log_printf + }; + int32_t ret = bits_button_init(&config); if(ret) { printf("bits button init failed, ret:%d \r\n", ret); diff --git a/simulator/adapter_layer/button_adapter.c b/simulator/adapter_layer/button_adapter.c index 95ede8e..4ef1133 100644 --- a/simulator/adapter_layer/button_adapter.c +++ b/simulator/adapter_layer/button_adapter.c @@ -121,8 +121,16 @@ void bits_btn_result_cb(struct button_obj_t *btn, struct bits_btn_result result) // 初始化适配器 __attribute__((constructor)) static void init_adapter() { - // int32_t ret = bits_button_init(btns, ARRAY_SIZE(btns), btns_combo, ARRAY_SIZE(btns_combo), read_key_state, bits_btn_result_cb, my_log_printf); - int32_t ret = bits_button_init(btns, ARRAY_SIZE(btns), btns_combo, ARRAY_SIZE(btns_combo), read_key_state, bits_btn_result_cb, NULL); + bits_btn_config_t config = { + .btns = btns, + .btns_cnt = ARRAY_SIZE(btns), + .btns_combo = btns_combo, + .btns_combo_cnt = ARRAY_SIZE(btns_combo), + .read_button_level_func = read_key_state, + .bits_btn_result_cb = bits_btn_result_cb, + .bits_btn_debug_printf = NULL + }; + int32_t ret = bits_button_init(&config); if(ret) { printf("bits button init failed, ret:%d \r\n", ret); diff --git a/test/cases/basic/test_buffer_operations.c b/test/cases/basic/test_buffer_operations.c index 1439170..7ab2cf7 100644 --- a/test/cases/basic/test_buffer_operations.c +++ b/test/cases/basic/test_buffer_operations.c @@ -27,10 +27,15 @@ void test_buffer_overflow_protection(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 记录初始的溢出计数 size_t initial_overwrite_count = get_bits_btn_buffer_overwrite_count(); @@ -114,10 +119,15 @@ void test_buffer_state_tracking(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 初始状态应该是空的 TEST_ASSERT_TRUE(bits_btn_is_buffer_empty()); @@ -152,10 +162,15 @@ void test_buffer_edge_cases(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 测试从空缓冲区读取 bits_btn_result_t result; @@ -217,10 +232,14 @@ void test_buffer_overwrite_data_correctness(void) { buttons[i] = (button_obj_t)BITS_BUTTON_INIT(i + 1, 1, ¶m); } - bits_button_init(buttons, 10, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 10, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); size_t capacity = get_bits_btn_buffer_capacity(); @@ -263,10 +282,15 @@ void test_buffer_overwrite_multiple_cycles(void) { static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); size_t capacity = get_bits_btn_buffer_capacity(); size_t total_writes = capacity * 2 + 5; // 写入超过2轮 @@ -308,10 +332,15 @@ void test_buffer_overwrite_count_accuracy(void) { static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); size_t capacity = get_bits_btn_buffer_capacity(); diff --git a/test/cases/basic/test_initialization.c b/test/cases/basic/test_initialization.c index 728ca98..a0068bb 100644 --- a/test/cases/basic/test_initialization.c +++ b/test/cases/basic/test_initialization.c @@ -33,10 +33,14 @@ void test_successful_initialization(void) { }; // 测试成功初始化 - int32_t result = bits_button_init(buttons, 3, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 3, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t result = bits_button_init(&config); // 应该返回成功 TEST_ASSERT_EQUAL(0, result); @@ -60,10 +64,14 @@ void test_different_active_levels(void) { BITS_BUTTON_INIT(2, 1, ¶m) // 也使用高电平激活,确保测试稳定 }; - bits_button_init(buttons, 2, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 2, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 测试第一个按键 mock_button_click(1, STANDARD_CLICK_TIME_MS); @@ -95,10 +103,15 @@ void test_custom_parameters(void) { }; button_obj_t button = BITS_BUTTON_INIT(1, 1, &custom_param); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 测试自定义短按时间 - 使用标准点击 mock_button_click(1, STANDARD_CLICK_TIME_MS); @@ -117,10 +130,15 @@ void test_custom_parameters(void) { test_framework_clear_events(); static const bits_btn_obj_param_t default_param = TEST_DEFAULT_PARAM(); button_obj_t default_button = BITS_BUTTON_INIT(1, 1, &default_param); - bits_button_init(&default_button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t def_config = { + .btns = &default_button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&def_config); mock_button_click(1, STANDARD_CLICK_TIME_MS); time_simulate_time_window_end(); @@ -148,10 +166,14 @@ void test_multiple_button_initialization(void) { } // 初始化所有按键 - int32_t result = bits_button_init(buttons, MAX_TEST_BUTTONS, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = MAX_TEST_BUTTONS, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t result = bits_button_init(&config); TEST_ASSERT_EQUAL(0, result); @@ -181,10 +203,14 @@ void test_callback_functions(void) { // 1. 只有事件回调,没有调试回调 printf("测试场景1: 只有事件回调,没有调试回调\n"); - int32_t init_result1 = bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - NULL); // 无调试回调 + bits_btn_config_t config1 = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = NULL + }; + int32_t init_result1 = bits_button_init(&config1); TEST_ASSERT_EQUAL_MESSAGE(0, init_result1, "只有事件回调的初始化应该成功"); @@ -200,10 +226,14 @@ void test_callback_functions(void) { // 2. 没有事件回调,只有调试回调 printf("测试场景2: 没有事件回调,只有调试回调\n"); - int32_t init_result2 = bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - NULL, // 无事件回调 - test_framework_log_printf); + bits_btn_config_t config2 = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = NULL, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t init_result2 = bits_button_init(&config2); TEST_ASSERT_EQUAL_MESSAGE(0, init_result2, "只有调试回调的初始化应该成功"); @@ -220,10 +250,14 @@ void test_callback_functions(void) { // 3. 都没有回调 printf("测试场景3: 都没有回调\n"); - int32_t init_result3 = bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - NULL, // 无事件回调 - NULL); // 无调试回调 + bits_btn_config_t config3 = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = NULL, + .bits_btn_debug_printf = NULL + }; + int32_t init_result3 = bits_button_init(&config3); TEST_ASSERT_EQUAL_MESSAGE(0, init_result3, "无回调的初始化应该成功"); @@ -240,10 +274,14 @@ void test_callback_functions(void) { // 4. 验证读取按键函数为NULL的错误处理 printf("测试场景4: 读取按键函数为NULL的错误处理\n"); - int32_t init_result4 = bits_button_init(&button, 1, NULL, 0, - NULL, // 无读取函数 - 这应该失败 - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config4 = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = NULL, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t init_result4 = bits_button_init(&config4); TEST_ASSERT_NOT_EQUAL_MESSAGE(0, init_result4, "读取按键函数为NULL时初始化应该失败"); @@ -251,10 +289,14 @@ void test_callback_functions(void) { // 5. 恢复正常配置进行最终验证 printf("测试场景5: 恢复完整回调配置\n"); - int32_t init_result5 = bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config5 = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t init_result5 = bits_button_init(&config5); TEST_ASSERT_EQUAL_MESSAGE(0, init_result5, "完整回调配置的初始化应该成功"); @@ -266,5 +308,4 @@ void test_callback_functions(void) { printf("✓ 完整回调配置正常工作\n"); printf("✓ 回调函数测试通过: 所有回调组合都经过验证\n"); -} - +} \ No newline at end of file diff --git a/test/cases/basic/test_peek_functionality.c b/test/cases/basic/test_peek_functionality.c index b3036e1..53af596 100644 --- a/test/cases/basic/test_peek_functionality.c +++ b/test/cases/basic/test_peek_functionality.c @@ -30,10 +30,14 @@ void test_peek_functionality(void) { button_obj_t button = CREATE_TEST_BUTTON(1, 1, ¶m); // 初始化按键系统 - int32_t ret = bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t ret = bits_button_init(&config); TEST_ASSERT_EQUAL_MESSAGE(0, ret, "按键初始化应成功"); // 验证初始状态下peek应该返回false(缓冲区为空) @@ -90,10 +94,14 @@ void test_peek_vs_get_behavior(void) { button_obj_t button = CREATE_TEST_BUTTON(2, 1, ¶m); // 初始化按键系统 - int32_t ret = bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t ret = bits_button_init(&config); TEST_ASSERT_EQUAL_MESSAGE(0, ret, "按键初始化应成功"); // 模拟一个按键事件 diff --git a/test/cases/basic/test_single_operations.c b/test/cases/basic/test_single_operations.c index 8e71ee9..482e965 100644 --- a/test/cases/basic/test_single_operations.c +++ b/test/cases/basic/test_single_operations.c @@ -27,10 +27,15 @@ void test_single_click_event(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟单击 mock_button_click(1, STANDARD_CLICK_TIME_MS); @@ -49,10 +54,15 @@ void test_double_click_event(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟双击 mock_multiple_clicks(1, 2, STANDARD_CLICK_TIME_MS, 200); @@ -71,10 +81,15 @@ void test_triple_click_event(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟快速双击(库不支持三连击,所以测试双击) mock_multiple_clicks(1, 2, STANDARD_CLICK_TIME_MS, 150); @@ -93,10 +108,15 @@ void test_long_press_event(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟长按 mock_button_press(1); @@ -125,10 +145,15 @@ void test_long_press_hold_event(void) { }; button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟长按并保持 mock_button_press(1); diff --git a/test/cases/basic/test_state_reset.c b/test/cases/basic/test_state_reset.c index 7fe8cbb..52b86c5 100644 --- a/test/cases/basic/test_state_reset.c +++ b/test/cases/basic/test_state_reset.c @@ -17,10 +17,15 @@ void test_state_reset_functionality(void) { // 1. 初始化按键系统 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); printf("✓ 按键系统初始化完成\n"); // 2. 模拟按键进入长按状态 @@ -77,10 +82,17 @@ void test_combo_button_reset(void) { }; // 3. 初始化按键系统(包含组合按键) - int32_t init_result = bits_button_init(buttons, 2, &combo_button, 1, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 2, + .btns_combo = &combo_button, + .btns_combo_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t init_result = bits_button_init(&config); + TEST_ASSERT_EQUAL_INT32(0, init_result); printf("✓ 按键系统(含组合按键)初始化完成\n"); @@ -122,4 +134,4 @@ void test_combo_button_reset(void) { 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 b4a9fe2..13e12e9 100644 --- a/test/cases/combo/test_advanced_combo.c +++ b/test/cases/combo/test_advanced_combo.c @@ -36,10 +36,16 @@ void test_advanced_three_key_combo(void) { static uint16_t combo_keys[] = {1, 2, 3}; button_obj_combo_t combo = BITS_BUTTON_COMBO_INIT(100, 1, ¶m, combo_keys, 3, 1); - bits_button_init(buttons, 3, &combo, 1, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 3, + .btns_combo = &combo, + .btns_combo_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 同时按下三个键 mock_set_button_state(1, 1); @@ -79,10 +85,16 @@ void test_combo_with_different_timing(void) { static uint16_t combo_keys[] = {1, 2}; button_obj_combo_t combo = BITS_BUTTON_COMBO_INIT(100, 1, ¶m, combo_keys, 2, 1); - bits_button_init(buttons, 2, &combo, 1, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 2, + .btns_combo = &combo, + .btns_combo_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 测试1: 先按键1,后按键2 mock_set_button_state(1, 1); @@ -138,10 +150,16 @@ void test_multiple_combos_conflict(void) { BITS_BUTTON_COMBO_INIT(101, 1, ¶m, combo2_keys, 2, 1) }; - bits_button_init(buttons, 3, combos, 2, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 3, + .btns_combo = combos, + .btns_combo_cnt = 2, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 按下键1和键2(应该触发组合键100) mock_set_button_state(1, 1); @@ -175,5 +193,4 @@ void test_multiple_combos_conflict(void) { ASSERT_EVENT_NOT_EXISTS(100, BTN_STATE_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 fcb278e..2829109 100644 --- a/test/cases/combo/test_combo_buttons.c +++ b/test/cases/combo/test_combo_buttons.c @@ -42,10 +42,16 @@ void test_basic_combo_button(void) { 1 // 抑制单键事件 ); - bits_button_init(buttons, 2, &combo_button, 1, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 2, + .btns_combo = &combo_button, + .btns_combo_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟组合按键按下 mock_button_press(1); @@ -89,10 +95,16 @@ void test_combo_long_press(void) { 1 // 抑制单键事件 ); - bits_button_init(buttons, 2, &combo_button, 1, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 2, + .btns_combo = &combo_button, + .btns_combo_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟组合按键长按 mock_button_press(1); @@ -107,5 +119,4 @@ void test_combo_long_press(void) { // 验证组合按键长按事件 ASSERT_EVENT_EXISTS(300, BTN_STATE_LONG_PRESS); printf("组合按键长按测试通过\n"); -} - +} \ No newline at end of file diff --git a/test/cases/edge/test_edge_cases.c b/test/cases/edge/test_edge_cases.c index ee162a6..a66ee68 100644 --- a/test/cases/edge/test_edge_cases.c +++ b/test/cases/edge/test_edge_cases.c @@ -27,10 +27,15 @@ void test_slow_double_click_timeout(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟过慢的双击 mock_button_click(1, STANDARD_CLICK_TIME_MS); // 第一次点击 @@ -57,10 +62,15 @@ void test_debounce_functionality(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟按键抖动 - 快速按下释放多次 for (int i = 0; i < 5; i++) { @@ -87,10 +97,15 @@ void test_very_short_press(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟极短按键(小于消抖时间) mock_button_press(1); @@ -112,10 +127,15 @@ void test_long_press_boundary(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 测试刚好达到长按阈值 mock_button_press(1); @@ -138,10 +158,15 @@ void test_rapid_clicks_boundary(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟在时间窗口边界的快速连击 mock_button_click(1, 50); // 第一次点击 @@ -154,5 +179,4 @@ void test_rapid_clicks_boundary(void) { // 应该识别为三连击 ASSERT_EVENT_WITH_VALUE(1, BTN_STATE_FINISH, 0b101010); // 三连击: 010 + 010 + 10 = 101010 printf("快速连击边界测试通过: 时间窗口边界三连击\n"); -} - +} \ No newline at end of file diff --git a/test/cases/edge/test_error_handling.c b/test/cases/edge/test_error_handling.c index 8dd6c8f..5640db9 100644 --- a/test/cases/edge/test_error_handling.c +++ b/test/cases/edge/test_error_handling.c @@ -24,35 +24,55 @@ void error_handling_tearDown(void) { void test_null_pointer_handling(void) { printf("\n=== 测试空指针处理 ===\n"); + // 新增:测试配置结构体为NULL + int32_t result = bits_button_init(NULL); + TEST_ASSERT_EQUAL(-2, result); + // 测试空按键数组 - int32_t result = bits_button_init(NULL, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config1 = { + .btns = NULL, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + result = bits_button_init(&config1); TEST_ASSERT_EQUAL(-2, result); // 应该返回无效参数错误 // 测试空读取函数 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - result = bits_button_init(&button, 1, NULL, 0, - NULL, // 空读取函数 - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config2 = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = NULL, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + result = bits_button_init(&config2); TEST_ASSERT_EQUAL(-2, result); // 应该返回无效参数错误 // 测试空事件回调(这个应该是允许的) - result = bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - NULL, // 空事件回调 - test_framework_log_printf); + bits_btn_config_t config3 = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = NULL, + .bits_btn_debug_printf = test_framework_log_printf + }; + result = bits_button_init(&config3); TEST_ASSERT_EQUAL(0, result); // 应该成功 // 测试空调试函数(这个应该是允许的) - result = bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - NULL); // 空调试函数 + bits_btn_config_t config4 = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = NULL + }; + result = bits_button_init(&config4); TEST_ASSERT_EQUAL(0, result); // 应该成功 printf("空指针处理测试通过: 正确处理各种空指针情况\n"); @@ -65,10 +85,14 @@ void test_invalid_parameters(void) { button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); // 测试零按键数量 - int32_t result = bits_button_init(&button, 0, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config1 = { + .btns = &button, + .btns_cnt = 0, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t result = bits_button_init(&config1); // 根据实现,这可能是有效的或无效的 printf("零按键数量初始化结果: %d\n", result); @@ -77,10 +101,16 @@ void test_invalid_parameters(void) { button_obj_combo_t invalid_combo = BITS_BUTTON_COMBO_INIT(200, 1, ¶m, invalid_combo_keys, 2, 1); - result = bits_button_init(&button, 1, &invalid_combo, 1, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config2 = { + .btns = &button, + .btns_cnt = 1, + .btns_combo = &invalid_combo, + .btns_combo_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + result = bits_button_init(&config2); TEST_ASSERT_EQUAL(-1, result); // 应该返回无效按键ID错误 printf("无效参数测试通过: 正确检测和处理无效参数\n"); @@ -98,18 +128,26 @@ void test_boundary_values(void) { }; button_obj_t button = BITS_BUTTON_INIT(1, 1, &extreme_param); - int32_t result = bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config1 = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t result = bits_button_init(&config1); TEST_ASSERT_EQUAL(0, result); // 应该能成功初始化 // 测试极端按键ID button_obj_t extreme_button = BITS_BUTTON_INIT(65535, 1, &extreme_param); - result = bits_button_init(&extreme_button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config2 = { + .btns = &extreme_button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + result = bits_button_init(&config2); TEST_ASSERT_EQUAL(0, result); // 应该能成功初始化 // 测试基本功能是否正常(使用合理的按键ID避免溢出) @@ -143,11 +181,16 @@ void test_resource_exhaustion(void) { } // 尝试初始化超过最大数量的组合按键 - int32_t result = bits_button_init(buttons, BITS_BTN_MAX_COMBO_BUTTONS + 2, - combo_buttons, BITS_BTN_MAX_COMBO_BUTTONS + 1, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = BITS_BTN_MAX_COMBO_BUTTONS + 2, + .btns_combo = combo_buttons, + .btns_combo_cnt = BITS_BTN_MAX_COMBO_BUTTONS + 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t result = bits_button_init(&config); // 根据实现,可能成功或失败 printf("超过最大组合按键数量的初始化结果: %d\n", result); @@ -169,10 +212,14 @@ void test_max_buttons_boundary(void) { buttons[i] = (button_obj_t)BITS_BUTTON_INIT(i + 1, 1, ¶m); } - int32_t result = bits_button_init(buttons, BITS_BTN_MAX_BUTTONS, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = BITS_BTN_MAX_BUTTONS, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t result = bits_button_init(&config); TEST_ASSERT_EQUAL(0, result); // 应成功 @@ -191,10 +238,14 @@ void test_too_many_buttons(void) { buttons[i] = (button_obj_t)BITS_BUTTON_INIT(i + 1, 1, ¶m); } - int32_t result = bits_button_init(buttons, BITS_BTN_MAX_BUTTONS + 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = BITS_BTN_MAX_BUTTONS + 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t result = bits_button_init(&config); TEST_ASSERT_EQUAL(-5, result); // 应返回按钮数量超限错误 @@ -213,10 +264,14 @@ void test_button_param_null(void) { BITS_BUTTON_INIT(3, 1, ¶m) }; - int32_t result = bits_button_init(buttons, 3, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 3, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t result = bits_button_init(&config); TEST_ASSERT_EQUAL(-6, result); // 应返回按钮 param 为空错误 @@ -239,13 +294,18 @@ void test_combo_button_param_null(void) { button_obj_combo_t combo = BITS_BUTTON_COMBO_INIT(100, 1, NULL, combo_keys, 2, 1); // param 为 NULL - int32_t result = bits_button_init(buttons, 2, &combo, 1, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 2, + .btns_combo = &combo, + .btns_combo_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + int32_t result = bits_button_init(&config); TEST_ASSERT_EQUAL(-7, result); // 应返回组合按钮 param 为空错误 printf("组合按钮 param 为 NULL 测试通过: 正确返回错误码 -7\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 5974269..7a8ad5d 100644 --- a/test/cases/edge/test_state_machine_edge.c +++ b/test/cases/edge/test_state_machine_edge.c @@ -27,10 +27,15 @@ void test_state_transition_timing(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 测试按下状态到长按状态的临界时间 mock_button_press(1); @@ -57,10 +62,15 @@ void test_time_window_boundary(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 第一次点击 mock_button_click(1, STANDARD_CLICK_TIME_MS); @@ -84,10 +94,15 @@ void test_long_press_period_boundary(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 按下按键并触发长按 mock_button_press(1); @@ -135,10 +150,15 @@ void test_rapid_state_changes(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 快速的按下-释放序列,但要确保每次都超过消抖时间 mock_button_press(1); diff --git a/test/cases/performance/test_performance.c b/test/cases/performance/test_performance.c index 47dfa52..05e9aab 100644 --- a/test/cases/performance/test_performance.c +++ b/test/cases/performance/test_performance.c @@ -27,10 +27,15 @@ void test_high_frequency_button_presses(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟快速连续点击 int expected_clicks = 5; @@ -57,10 +62,14 @@ void test_multiple_buttons_concurrent(void) { BITS_BUTTON_INIT(4, 1, ¶m) }; - bits_button_init(buttons, 4, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = 4, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟多个按键同时操作 mock_button_click(1, STANDARD_CLICK_TIME_MS); // 按键1单击 @@ -93,10 +102,15 @@ void test_long_running_stability(void) { // 创建按键对象 static const bits_btn_obj_param_t param = TEST_DEFAULT_PARAM(); button_obj_t button = BITS_BUTTON_INIT(1, 1, ¶m); - bits_button_init(&button, 1, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + + bits_btn_config_t config = { + .btns = &button, + .btns_cnt = 1, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 模拟连续的按键操作序列 for (int cycle = 0; cycle < 5; cycle++) { @@ -129,10 +143,14 @@ void test_memory_usage(void) { buttons[i] = (button_obj_t)BITS_BUTTON_INIT(i, 1, ¶m); } - bits_button_init(buttons, MAX_TEST_BUTTONS, NULL, 0, - test_framework_mock_read_button, - test_framework_event_callback, - test_framework_log_printf); + bits_btn_config_t config = { + .btns = buttons, + .btns_cnt = MAX_TEST_BUTTONS, + .read_button_level_func = test_framework_mock_read_button, + .bits_btn_result_cb = test_framework_event_callback, + .bits_btn_debug_printf = test_framework_log_printf + }; + bits_button_init(&config); // 同时操作所有按键 for (int i = 0; i < MAX_TEST_BUTTONS; i++) { @@ -146,5 +164,4 @@ void test_memory_usage(void) { } printf("内存使用测试通过: %d个按键同时工作\n", MAX_TEST_BUTTONS); -} - +} \ No newline at end of file