From 7ffa9b27ca921a347efc13f29b9dd6d5c2a5b354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20H=C3=B6pfinger?= Date: Wed, 6 Jul 2022 10:10:08 +0200 Subject: [PATCH 1/5] button: Fix Test. https://github.com/espressif/esp-iot-solution/pull/200 --- components/button/test/CMakeLists.txt | 2 +- components/button/test/button_test.c | 98 +++++++++++++-------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/components/button/test/CMakeLists.txt b/components/button/test/CMakeLists.txt index 3ab71c30b..4f195487e 100644 --- a/components/button/test/CMakeLists.txt +++ b/components/button/test/CMakeLists.txt @@ -1,3 +1,3 @@ idf_component_register(SRC_DIRS "." PRIV_INCLUDE_DIRS "." - PRIV_REQUIRES unity test_utils button) + PRIV_REQUIRES cmock button) diff --git a/components/button/test/button_test.c b/components/button/test/button_test.c index bb81c3855..07720935f 100644 --- a/components/button/test/button_test.c +++ b/components/button/test/button_test.c @@ -39,45 +39,45 @@ static int get_btn_index(button_handle_t btn) return -1; } -static void button_press_down_cb(void *arg) +static void button_press_down_cb(void *hardware_data, void *usr_data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_PRESS_DOWN, iot_button_get_event(arg)); - ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_DOWN", get_btn_index((button_handle_t)arg)); + TEST_ASSERT_EQUAL_HEX(BUTTON_PRESS_DOWN, iot_button_get_event(hardware_data)); + ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_DOWN", get_btn_index((button_handle_t)hardware_data)); } -static void button_press_up_cb(void *arg) +static void button_press_up_cb(void *hardware_data, void *usr_data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_PRESS_UP, iot_button_get_event(arg)); - ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_UP", get_btn_index((button_handle_t)arg)); + TEST_ASSERT_EQUAL_HEX(BUTTON_PRESS_UP, iot_button_get_event(hardware_data)); + ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_UP", get_btn_index((button_handle_t)hardware_data)); } -static void button_press_repeat_cb(void *arg) +static void button_press_repeat_cb(void *hardware_data, void *usr_data) { - ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_REPEAT[%d]", get_btn_index((button_handle_t)arg), iot_button_get_repeat((button_handle_t)arg)); + ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_REPEAT[%d]", get_btn_index((button_handle_t)hardware_data), iot_button_get_repeat((button_handle_t)hardware_data)); } -static void button_single_click_cb(void *arg) +static void button_single_click_cb(void *hardware_data, void *usr_data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_SINGLE_CLICK, iot_button_get_event(arg)); - ESP_LOGI(TAG, "BTN%d: BUTTON_SINGLE_CLICK", get_btn_index((button_handle_t)arg)); + TEST_ASSERT_EQUAL_HEX(BUTTON_SINGLE_CLICK, iot_button_get_event(hardware_data)); + ESP_LOGI(TAG, "BTN%d: BUTTON_SINGLE_CLICK", get_btn_index((button_handle_t)hardware_data)); } -static void button_double_click_cb(void *arg) +static void button_double_click_cb(void *hardware_data, void *usr_data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_DOUBLE_CLICK, iot_button_get_event(arg)); - ESP_LOGI(TAG, "BTN%d: BUTTON_DOUBLE_CLICK", get_btn_index((button_handle_t)arg)); + TEST_ASSERT_EQUAL_HEX(BUTTON_DOUBLE_CLICK, iot_button_get_event(hardware_data)); + ESP_LOGI(TAG, "BTN%d: BUTTON_DOUBLE_CLICK", get_btn_index((button_handle_t)hardware_data)); } -static void button_long_press_start_cb(void *arg) +static void button_long_press_start_cb(void *hardware_data, void *usr_data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_LONG_PRESS_START, iot_button_get_event(arg)); - ESP_LOGI(TAG, "BTN%d: BUTTON_LONG_PRESS_START", get_btn_index((button_handle_t)arg)); + TEST_ASSERT_EQUAL_HEX(BUTTON_LONG_PRESS_START, iot_button_get_event(hardware_data)); + ESP_LOGI(TAG, "BTN%d: BUTTON_LONG_PRESS_START", get_btn_index((button_handle_t)hardware_data)); } -static void button_long_press_hold_cb(void *arg) +static void button_long_press_hold_cb(void *hardware_data, void *usr_data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_LONG_PRESS_HOLD, iot_button_get_event(arg)); - ESP_LOGI(TAG, "BTN%d: BUTTON_LONG_PRESS_HOLD", get_btn_index((button_handle_t)arg)); + TEST_ASSERT_EQUAL_HEX(BUTTON_LONG_PRESS_HOLD, iot_button_get_event(hardware_data)); + ESP_LOGI(TAG, "BTN%d: BUTTON_LONG_PRESS_HOLD", get_btn_index((button_handle_t)hardware_data)); } static void print_button_event(button_handle_t btn) @@ -122,13 +122,13 @@ TEST_CASE("gpio button test", "[button][iot]") }; g_btns[0] = iot_button_create(&cfg); TEST_ASSERT_NOT_NULL(g_btns[0]); - iot_button_register_cb(g_btns[0], BUTTON_PRESS_DOWN, button_press_down_cb); - iot_button_register_cb(g_btns[0], BUTTON_PRESS_UP, button_press_up_cb); - iot_button_register_cb(g_btns[0], BUTTON_PRESS_REPEAT, button_press_repeat_cb); - iot_button_register_cb(g_btns[0], BUTTON_SINGLE_CLICK, button_single_click_cb); - iot_button_register_cb(g_btns[0], BUTTON_DOUBLE_CLICK, button_double_click_cb); - iot_button_register_cb(g_btns[0], BUTTON_LONG_PRESS_START, button_long_press_start_cb); - iot_button_register_cb(g_btns[0], BUTTON_LONG_PRESS_HOLD, button_long_press_hold_cb); + iot_button_register_cb(g_btns[0], BUTTON_PRESS_DOWN, button_press_down_cb, 0); + iot_button_register_cb(g_btns[0], BUTTON_PRESS_UP, button_press_up_cb, 0); + iot_button_register_cb(g_btns[0], BUTTON_PRESS_REPEAT, button_press_repeat_cb, 0); + iot_button_register_cb(g_btns[0], BUTTON_SINGLE_CLICK, button_single_click_cb, 0); + iot_button_register_cb(g_btns[0], BUTTON_DOUBLE_CLICK, button_double_click_cb, 0); + iot_button_register_cb(g_btns[0], BUTTON_LONG_PRESS_START, button_long_press_start_cb, 0); + iot_button_register_cb(g_btns[0], BUTTON_LONG_PRESS_HOLD, button_long_press_hold_cb, 0); while (1) { vTaskDelay(pdMS_TO_TICKS(1000)); } @@ -159,13 +159,13 @@ TEST_CASE("adc button test", "[button][iot]") g_btns[i] = iot_button_create(&cfg); TEST_ASSERT_NOT_NULL(g_btns[i]); - iot_button_register_cb(g_btns[i], BUTTON_PRESS_DOWN, button_press_down_cb); - iot_button_register_cb(g_btns[i], BUTTON_PRESS_UP, button_press_up_cb); - iot_button_register_cb(g_btns[i], BUTTON_PRESS_REPEAT, button_press_repeat_cb); - iot_button_register_cb(g_btns[i], BUTTON_SINGLE_CLICK, button_single_click_cb); - iot_button_register_cb(g_btns[i], BUTTON_DOUBLE_CLICK, button_double_click_cb); - iot_button_register_cb(g_btns[i], BUTTON_LONG_PRESS_START, button_long_press_start_cb); - iot_button_register_cb(g_btns[i], BUTTON_LONG_PRESS_HOLD, button_long_press_hold_cb); + iot_button_register_cb(g_btns[i], BUTTON_PRESS_DOWN, button_press_down_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_PRESS_UP, button_press_up_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_PRESS_REPEAT, button_press_repeat_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_SINGLE_CLICK, button_single_click_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_DOUBLE_CLICK, button_double_click_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_LONG_PRESS_START, button_long_press_start_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_LONG_PRESS_HOLD, button_long_press_hold_cb, 0); } while (1) { @@ -187,13 +187,13 @@ TEST_CASE("adc gpio button test", "[button][iot]") }; g_btns[8] = iot_button_create(&cfg); TEST_ASSERT_NOT_NULL(g_btns[8]); - iot_button_register_cb(g_btns[8], BUTTON_PRESS_DOWN, button_press_down_cb); - iot_button_register_cb(g_btns[8], BUTTON_PRESS_UP, button_press_up_cb); - iot_button_register_cb(g_btns[8], BUTTON_PRESS_REPEAT, button_press_repeat_cb); - iot_button_register_cb(g_btns[8], BUTTON_SINGLE_CLICK, button_single_click_cb); - iot_button_register_cb(g_btns[8], BUTTON_DOUBLE_CLICK, button_double_click_cb); - iot_button_register_cb(g_btns[8], BUTTON_LONG_PRESS_START, button_long_press_start_cb); - iot_button_register_cb(g_btns[8], BUTTON_LONG_PRESS_HOLD, button_long_press_hold_cb); + iot_button_register_cb(g_btns[8], BUTTON_PRESS_DOWN, button_press_down_cb, 0); + iot_button_register_cb(g_btns[8], BUTTON_PRESS_UP, button_press_up_cb, 0); + iot_button_register_cb(g_btns[8], BUTTON_PRESS_REPEAT, button_press_repeat_cb, 0); + iot_button_register_cb(g_btns[8], BUTTON_SINGLE_CLICK, button_single_click_cb, 0); + iot_button_register_cb(g_btns[8], BUTTON_DOUBLE_CLICK, button_double_click_cb, 0); + iot_button_register_cb(g_btns[8], BUTTON_LONG_PRESS_START, button_long_press_start_cb, 0); + iot_button_register_cb(g_btns[8], BUTTON_LONG_PRESS_HOLD, button_long_press_hold_cb, 0); /** ESP32-LyraT-Mini board */ const uint16_t vol[6] = {380, 820, 1180, 1570, 1980, 2410}; @@ -216,13 +216,13 @@ TEST_CASE("adc gpio button test", "[button][iot]") g_btns[i] = iot_button_create(&cfg); TEST_ASSERT_NOT_NULL(g_btns[i]); - iot_button_register_cb(g_btns[i], BUTTON_PRESS_DOWN, button_press_down_cb); - iot_button_register_cb(g_btns[i], BUTTON_PRESS_UP, button_press_up_cb); - iot_button_register_cb(g_btns[i], BUTTON_PRESS_REPEAT, button_press_repeat_cb); - iot_button_register_cb(g_btns[i], BUTTON_SINGLE_CLICK, button_single_click_cb); - iot_button_register_cb(g_btns[i], BUTTON_DOUBLE_CLICK, button_double_click_cb); - iot_button_register_cb(g_btns[i], BUTTON_LONG_PRESS_START, button_long_press_start_cb); - iot_button_register_cb(g_btns[i], BUTTON_LONG_PRESS_HOLD, button_long_press_hold_cb); + iot_button_register_cb(g_btns[i], BUTTON_PRESS_DOWN, button_press_down_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_PRESS_UP, button_press_up_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_PRESS_REPEAT, button_press_repeat_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_SINGLE_CLICK, button_single_click_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_DOUBLE_CLICK, button_double_click_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_LONG_PRESS_START, button_long_press_start_cb, 0); + iot_button_register_cb(g_btns[i], BUTTON_LONG_PRESS_HOLD, button_long_press_hold_cb, 0); } while (1) { @@ -231,4 +231,4 @@ TEST_CASE("adc gpio button test", "[button][iot]") for (size_t i = 0; i < 6; i++) { iot_button_delete(g_btns[i]); } -} \ No newline at end of file +} From 482f0243d14919c6b40e3baa538708a4ee6c3108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20H=C3=B6pfinger?= Date: Wed, 6 Jul 2022 10:25:55 +0200 Subject: [PATCH 2/5] button: Fix usr_data is overwritten. https://github.com/espressif/esp-iot-solution/pull/200 --- components/button/iot_button.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/components/button/iot_button.c b/components/button/iot_button.c index c0e799381..a3c4326d3 100644 --- a/components/button/iot_button.c +++ b/components/button/iot_button.c @@ -41,7 +41,7 @@ typedef struct Button { uint8_t button_level: 1; uint8_t (*hal_button_Level)(void *hardware_data); void *hardware_data; - void *usr_data; + void *usr_data[BUTTON_EVENT_MAX]; button_type_t type; button_cb_t cb[BUTTON_EVENT_MAX]; struct Button *next; @@ -57,7 +57,7 @@ static bool g_is_timer_running = false; #define SHORT_TICKS (CONFIG_BUTTON_SHORT_PRESS_TIME_MS /TICKS_INTERVAL) #define LONG_TICKS (CONFIG_BUTTON_LONG_PRESS_TIME_MS /TICKS_INTERVAL) -#define CALL_EVENT_CB(ev) if(btn->cb[ev])btn->cb[ev](btn, btn->usr_data) +#define CALL_EVENT_CB(ev) if(btn->cb[ev])btn->cb[ev](btn, btn->usr_data[ev]) /** * @brief Button driver core function, driver state machine. @@ -279,7 +279,7 @@ esp_err_t iot_button_register_cb(button_handle_t btn_handle, button_event_t even BTN_CHECK(event < BUTTON_EVENT_MAX, "event is invalid", ESP_ERR_INVALID_ARG); button_dev_t *btn = (button_dev_t *) btn_handle; btn->cb[event] = cb; - btn->usr_data = usr_data; + btn->usr_data[event] = usr_data; return ESP_OK; } @@ -289,6 +289,7 @@ esp_err_t iot_button_unregister_cb(button_handle_t btn_handle, button_event_t ev BTN_CHECK(event < BUTTON_EVENT_MAX, "event is invalid", ESP_ERR_INVALID_ARG); button_dev_t *btn = (button_dev_t *) btn_handle; btn->cb[event] = NULL; + btn->usr_data[event] = NULL; return ESP_OK; } From ceaa5546e1edc7293d4740a3389e9cf22cb6ef4c Mon Sep 17 00:00:00 2001 From: "franz.hoepfinger@ms-muc.de" Date: Wed, 3 Aug 2022 09:39:12 +0200 Subject: [PATCH 3/5] add the "NORMAL" Event. --- components/button/include/iot_button.h | 11 +++++++++-- components/button/iot_button.c | 6 ++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/components/button/include/iot_button.h b/components/button/include/iot_button.h index 420a9bfda..5977cb8e5 100644 --- a/components/button/include/iot_button.h +++ b/components/button/include/iot_button.h @@ -28,8 +28,14 @@ typedef void *button_handle_t; * @brief Button events * */ -typedef enum { - BUTTON_PRESS_DOWN = 0, +#ifdef __cplusplus +typedef enum button_event_e : int { //C++ Definition +#else +typedef enum button_event_e { //C Definition +#endif + BUTTON_PRESS_INVALID = -1, //to enforce signed int also in C. + BUTTON_PRESS_NORMAL = 0, + BUTTON_PRESS_DOWN, BUTTON_PRESS_UP, BUTTON_PRESS_REPEAT, BUTTON_SINGLE_CLICK, @@ -92,6 +98,7 @@ esp_err_t iot_button_delete(button_handle_t btn_handle); * @return * - ESP_OK on success * - ESP_ERR_INVALID_ARG Arguments is invalid. + * - ESP_ERR_INVALID_STATE the Callback is already registered. No free Space for another Callback. */ esp_err_t iot_button_register_cb(button_handle_t btn_handle, button_event_t event, button_cb_t cb, void *usr_data); diff --git a/components/button/iot_button.c b/components/button/iot_button.c index a3c4326d3..621030e13 100644 --- a/components/button/iot_button.c +++ b/components/button/iot_button.c @@ -87,6 +87,7 @@ static void button_handler(button_dev_t *btn) if (btn->button_level == btn->active_level) { btn->event = (uint8_t)BUTTON_PRESS_DOWN; CALL_EVENT_CB(BUTTON_PRESS_DOWN); + CALL_EVENT_CB(BUTTON_PRESS_NORMAL); btn->ticks = 0; btn->repeat = 1; btn->state = 1; @@ -99,6 +100,7 @@ static void button_handler(button_dev_t *btn) if (btn->button_level != btn->active_level) { btn->event = (uint8_t)BUTTON_PRESS_UP; CALL_EVENT_CB(BUTTON_PRESS_UP); + CALL_EVENT_CB(BUTTON_PRESS_NORMAL); btn->ticks = 0; btn->state = 2; @@ -113,6 +115,7 @@ static void button_handler(button_dev_t *btn) if (btn->button_level == btn->active_level) { btn->event = (uint8_t)BUTTON_PRESS_DOWN; CALL_EVENT_CB(BUTTON_PRESS_DOWN); + CALL_EVENT_CB(BUTTON_PRESS_NORMAL); btn->repeat++; CALL_EVENT_CB(BUTTON_PRESS_REPEAT); // repeat hit btn->ticks = 0; @@ -133,6 +136,7 @@ static void button_handler(button_dev_t *btn) if (btn->button_level != btn->active_level) { btn->event = (uint8_t)BUTTON_PRESS_UP; CALL_EVENT_CB(BUTTON_PRESS_UP); + CALL_EVENT_CB(BUTTON_PRESS_NORMAL); if (btn->ticks < SHORT_TICKS) { btn->ticks = 0; btn->state = 2; //repeat press @@ -150,6 +154,7 @@ static void button_handler(button_dev_t *btn) } else { //releasd btn->event = (uint8_t)BUTTON_PRESS_UP; CALL_EVENT_CB(BUTTON_PRESS_UP); + CALL_EVENT_CB(BUTTON_PRESS_NORMAL); btn->state = 0; //reset } break; @@ -278,6 +283,7 @@ esp_err_t iot_button_register_cb(button_handle_t btn_handle, button_event_t even BTN_CHECK(NULL != btn_handle, "Pointer of handle is invalid", ESP_ERR_INVALID_ARG); BTN_CHECK(event < BUTTON_EVENT_MAX, "event is invalid", ESP_ERR_INVALID_ARG); button_dev_t *btn = (button_dev_t *) btn_handle; + BTN_CHECK(NULL == btn->cb[event], "Callback is already registered", ESP_ERR_INVALID_STATE); btn->cb[event] = cb; btn->usr_data[event] = usr_data; return ESP_OK; From 50d63568598f01c8165255cab5ea03f89aeb3a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20H=C3=B6pfinger?= Date: Thu, 24 Nov 2022 15:03:15 +0100 Subject: [PATCH 4/5] fix naming., --- components/button/test/button_test.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/components/button/test/button_test.c b/components/button/test/button_test.c index 9ccd7ce86..05125beb5 100644 --- a/components/button/test/button_test.c +++ b/components/button/test/button_test.c @@ -42,8 +42,8 @@ static int get_btn_index(button_handle_t btn) static void button_press_down_cb(void *arg, void *data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_PRESS_DOWN, iot_button_get_event(hardware_data)); - ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_DOWN", get_btn_index((button_handle_t)hardware_data)); + TEST_ASSERT_EQUAL_HEX(BUTTON_PRESS_DOWN, iot_button_get_event(arg)); + ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_DOWN", get_btn_index((button_handle_t)arg)); } static void button_press_up_cb(void *arg, void *data) @@ -54,25 +54,25 @@ static void button_press_up_cb(void *arg, void *data) static void button_press_repeat_cb(void *arg, void *data) { - ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_REPEAT[%d]", get_btn_index((button_handle_t)hardware_data), iot_button_get_repeat((button_handle_t)hardware_data)); + ESP_LOGI(TAG, "BTN%d: BUTTON_PRESS_REPEAT[%d]", get_btn_index((button_handle_t)arg), iot_button_get_repeat((button_handle_t)arg)); } static void button_single_click_cb(void *arg, void *data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_SINGLE_CLICK, iot_button_get_event(hardware_data)); - ESP_LOGI(TAG, "BTN%d: BUTTON_SINGLE_CLICK", get_btn_index((button_handle_t)hardware_data)); + TEST_ASSERT_EQUAL_HEX(BUTTON_SINGLE_CLICK, iot_button_get_event(arg)); + ESP_LOGI(TAG, "BTN%d: BUTTON_SINGLE_CLICK", get_btn_index((button_handle_t)arg)); } static void button_double_click_cb(void *arg, void *data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_DOUBLE_CLICK, iot_button_get_event(hardware_data)); - ESP_LOGI(TAG, "BTN%d: BUTTON_DOUBLE_CLICK", get_btn_index((button_handle_t)hardware_data)); + TEST_ASSERT_EQUAL_HEX(BUTTON_DOUBLE_CLICK, iot_button_get_event(arg)); + ESP_LOGI(TAG, "BTN%d: BUTTON_DOUBLE_CLICK", get_btn_index((button_handle_t)arg)); } static void button_long_press_start_cb(void *arg, void *data) { - TEST_ASSERT_EQUAL_HEX(BUTTON_LONG_PRESS_START, iot_button_get_event(hardware_data)); - ESP_LOGI(TAG, "BTN%d: BUTTON_LONG_PRESS_START", get_btn_index((button_handle_t)hardware_data)); + TEST_ASSERT_EQUAL_HEX(BUTTON_LONG_PRESS_START, iot_button_get_event(arg)); + ESP_LOGI(TAG, "BTN%d: BUTTON_LONG_PRESS_START", get_btn_index((button_handle_t)arg)); } static void button_long_press_hold_cb(void *arg, void *data) From f19822f99165e70d56eb305781dec18f9ff99465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20H=C3=B6pfinger?= Date: Thu, 24 Nov 2022 15:05:01 +0100 Subject: [PATCH 5/5] same as master ! --- components/button/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/button/test/CMakeLists.txt b/components/button/test/CMakeLists.txt index 4f195487e..3ab71c30b 100644 --- a/components/button/test/CMakeLists.txt +++ b/components/button/test/CMakeLists.txt @@ -1,3 +1,3 @@ idf_component_register(SRC_DIRS "." PRIV_INCLUDE_DIRS "." - PRIV_REQUIRES cmock button) + PRIV_REQUIRES unity test_utils button)