test_touch_slider.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*
  2. * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Unlicense OR CC0-1.0
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <time.h>
  10. #include "freertos/FreeRTOS.h"
  11. #include "freertos/task.h"
  12. #include "freertos/queue.h"
  13. #include "freertos/semphr.h"
  14. #include "unity.h"
  15. #include "touch_element/touch_element_private.h"
  16. #include "touch_element/touch_slider.h"
  17. static const touch_pad_t slider_channel_array[5] = {
  18. TOUCH_PAD_NUM1,
  19. TOUCH_PAD_NUM2,
  20. TOUCH_PAD_NUM3,
  21. TOUCH_PAD_NUM4,
  22. TOUCH_PAD_NUM5
  23. };
  24. static const float slider_sens_array[5] = {
  25. 0.1F,
  26. 0.1F,
  27. 0.1F,
  28. 0.1F,
  29. 0.1F
  30. };
  31. const uint8_t SLIDER_CHANNEL_NUM = sizeof(slider_channel_array) / sizeof(touch_pad_t);
  32. typedef struct {
  33. QueueHandle_t valid_msg_handle;
  34. SemaphoreHandle_t response_sig_handle;
  35. } test_monitor_t;
  36. /* ------------------------------------------------------------------------------------------------------------------ */
  37. void test_slider_event_simulator(touch_slider_handle_t slider_handle, touch_slider_event_t slider_event, uint32_t random);
  38. void test_slider_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message);
  39. static void test_slider_callback_check(touch_slider_handle_t current_handle, touch_slider_message_t *current_message, touch_elem_message_t *valid_message);
  40. void test_slider_event_trigger_and_check(touch_slider_handle_t handle, touch_slider_event_t slider_event, uint32_t random_channel);
  41. void test_slider_callback_trigger_and_check(touch_slider_handle_t handle, touch_slider_event_t slider_event, bool should_trigger, test_monitor_t *monitor, uint32_t random_channel);
  42. /* ------------------------------------------------ Dispatch method test -------------------------------------------- */
  43. static void test_slider_disp_event(void);
  44. static void test_slider_disp_callback(void);
  45. static void test_slider_handler(touch_slider_handle_t handle, touch_slider_message_t *message, void *arg);
  46. /* ------------------------------------------------------------------------------------------------------------------ */
  47. TEST_CASE("Touch slider dispatch methods test", "[slider][touch_element]")
  48. {
  49. touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG();
  50. TEST_ESP_OK(touch_element_install(&global_config));
  51. test_slider_disp_event();
  52. test_slider_disp_callback();
  53. touch_element_uninstall();
  54. }
  55. void test_slider_event_simulator(touch_slider_handle_t slider_handle, touch_slider_event_t slider_event, uint32_t random)
  56. {
  57. te_slider_handle_t te_slider = (te_slider_handle_t) slider_handle;
  58. touch_pad_t channel = te_slider->device[random % te_slider->channel_sum]->channel;
  59. if (slider_event == TOUCH_SLIDER_EVT_ON_PRESS) {
  60. touch_pad_set_cnt_mode(channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT);
  61. } else if (slider_event == TOUCH_SLIDER_EVT_ON_RELEASE) {
  62. touch_pad_set_cnt_mode(channel, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_DEFAULT);
  63. }
  64. }
  65. void test_slider_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message)
  66. {
  67. TEST_ASSERT_MESSAGE(current_message->handle == valid_message->handle, "check handle failed");
  68. TEST_ASSERT_MESSAGE(current_message->element_type == valid_message->element_type, "check element type failed");
  69. const touch_slider_message_t *valid_slider_message = touch_slider_get_message(valid_message);
  70. const touch_slider_message_t *current_slider_message = touch_slider_get_message(current_message);
  71. TEST_ASSERT_MESSAGE(current_slider_message->event == valid_slider_message->event, "check event failed");
  72. }
  73. static void test_slider_callback_check(touch_slider_handle_t current_handle, touch_slider_message_t *current_message, touch_elem_message_t *valid_message)
  74. {
  75. const touch_slider_message_t *valid_slider_message = touch_slider_get_message(valid_message);
  76. TEST_ASSERT_MESSAGE(valid_message->handle == current_handle, "check handle failed");
  77. TEST_ASSERT_MESSAGE(valid_message->element_type == TOUCH_ELEM_TYPE_SLIDER, "check element type failed");
  78. TEST_ASSERT_MESSAGE(valid_slider_message->event == current_message->event, "check event failed");
  79. }
  80. void test_slider_event_trigger_and_check(touch_slider_handle_t handle, touch_slider_event_t slider_event, uint32_t random_channel)
  81. {
  82. touch_elem_message_t valid_message, current_message;
  83. touch_slider_message_t slider_message;
  84. valid_message.handle = handle;
  85. valid_message.element_type = TOUCH_ELEM_TYPE_SLIDER;
  86. slider_message.event = slider_event;
  87. memcpy(valid_message.child_msg, &slider_message, sizeof(touch_slider_message_t));
  88. test_slider_event_simulator(handle, slider_event, random_channel);
  89. esp_err_t ret = touch_element_message_receive(&current_message, 300);
  90. TEST_ASSERT_MESSAGE(ret == ESP_OK, "slider event receive timeout");
  91. test_slider_event_check(&valid_message, &current_message);
  92. }
  93. void test_slider_callback_trigger_and_check(touch_slider_handle_t handle, touch_slider_event_t slider_event, bool should_trigger, test_monitor_t *monitor, uint32_t random_channel)
  94. {
  95. if (should_trigger) {
  96. touch_elem_message_t valid_message = {
  97. .handle = handle,
  98. .element_type = TOUCH_ELEM_TYPE_SLIDER,
  99. .arg = NULL
  100. };
  101. touch_slider_message_t slider_message = {
  102. .event = slider_event,
  103. .position = 0 //No use
  104. };
  105. memcpy(valid_message.child_msg, &slider_message, sizeof(touch_slider_message_t)); //Construct valid_message
  106. xQueueSend(monitor->valid_msg_handle, &valid_message, portMAX_DELAY);
  107. }
  108. test_slider_event_simulator(handle, slider_event, random_channel); //Trigger signal
  109. BaseType_t os_ret = xSemaphoreTake(monitor->response_sig_handle, pdMS_TO_TICKS(300));
  110. if (should_trigger) {
  111. TEST_ASSERT_MESSAGE(os_ret == pdPASS, "Button queue timeout");
  112. } else {
  113. TEST_ASSERT_MESSAGE(os_ret == pdFALSE, "Button invalid trigger");
  114. }
  115. }
  116. static void test_slider_disp_event(void)
  117. {
  118. touch_slider_handle_t slider_handle;
  119. touch_slider_global_config_t global_config = TOUCH_SLIDER_GLOBAL_DEFAULT_CONFIG();
  120. TEST_ESP_OK(touch_slider_install(&global_config));
  121. /*< Create Touch Slider */
  122. touch_slider_config_t slider_config = {
  123. .channel_array = slider_channel_array,
  124. .sensitivity_array = slider_sens_array,
  125. .channel_num = SLIDER_CHANNEL_NUM,
  126. .position_range = 101
  127. };
  128. TEST_ESP_OK(touch_slider_create(&slider_config, &slider_handle));
  129. TEST_ESP_OK(touch_slider_subscribe_event(slider_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, (void *) slider_handle));
  130. TEST_ESP_OK(touch_slider_set_dispatch_method(slider_handle, TOUCH_ELEM_DISP_EVENT));
  131. TEST_ESP_OK(touch_element_start());
  132. vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1
  133. srandom((unsigned int)time(NULL));
  134. //10 times random (x channels) press/release test
  135. printf("Touch slider event test start\n");
  136. for (int i = 0; i < 10; i++) {
  137. printf("Touch slider event test... (%d/10)\n", i + 1);
  138. uint32_t random_channel = random() % SLIDER_CHANNEL_NUM;
  139. test_slider_event_trigger_and_check(slider_handle, TOUCH_SLIDER_EVT_ON_PRESS, random_channel);
  140. test_slider_event_trigger_and_check(slider_handle, TOUCH_SLIDER_EVT_ON_RELEASE, random_channel);
  141. }
  142. printf("Touch slider event test finish\n");
  143. TEST_ESP_OK(touch_element_stop());
  144. TEST_ESP_OK(touch_slider_delete(slider_handle));
  145. touch_slider_uninstall();
  146. }
  147. static void test_slider_disp_callback(void)
  148. {
  149. test_monitor_t monitor;
  150. monitor.valid_msg_handle = xQueueCreate(10, sizeof(touch_elem_message_t));
  151. monitor.response_sig_handle = xSemaphoreCreateBinary();
  152. TEST_ASSERT(monitor.valid_msg_handle != NULL || monitor.response_sig_handle != NULL);
  153. touch_slider_handle_t slider_handle;
  154. touch_slider_global_config_t global_config = TOUCH_SLIDER_GLOBAL_DEFAULT_CONFIG();
  155. TEST_ESP_OK(touch_slider_install(&global_config));
  156. touch_slider_config_t slider_config = {
  157. .channel_array = slider_channel_array,
  158. .sensitivity_array = slider_sens_array,
  159. .channel_num = SLIDER_CHANNEL_NUM,
  160. .position_range = 101
  161. };
  162. TEST_ESP_OK(touch_slider_create(&slider_config, &slider_handle));
  163. TEST_ESP_OK(touch_slider_subscribe_event(slider_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, (void *) &monitor));
  164. TEST_ESP_OK(touch_slider_set_dispatch_method(slider_handle, TOUCH_ELEM_DISP_CALLBACK));
  165. TEST_ESP_OK(touch_slider_set_callback(slider_handle, test_slider_handler));
  166. TEST_ESP_OK(touch_element_start());
  167. vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1
  168. srandom((unsigned int)time(NULL));
  169. printf("Touch slider callback test start\n");
  170. for (int i = 0; i < 10; i++) {
  171. printf("Touch slider callback test... (%d/10)\n", i + 1);
  172. uint32_t random_channel = random() % SLIDER_CHANNEL_NUM;
  173. test_slider_callback_trigger_and_check(slider_handle, TOUCH_SLIDER_EVT_ON_PRESS, true, &monitor, random_channel);
  174. test_slider_callback_trigger_and_check(slider_handle, TOUCH_SLIDER_EVT_ON_RELEASE, true, &monitor, random_channel);
  175. }
  176. printf("Touch slider callback test finish\n");
  177. TEST_ESP_OK(touch_element_stop());
  178. TEST_ESP_OK(touch_slider_delete(slider_handle));
  179. touch_slider_uninstall();
  180. vQueueDelete(monitor.valid_msg_handle);
  181. vSemaphoreDelete(monitor.response_sig_handle);
  182. }
  183. static void test_slider_handler(touch_slider_handle_t handle, touch_slider_message_t *message, void *arg)
  184. {
  185. test_monitor_t *monitor = (test_monitor_t *)arg;
  186. touch_elem_message_t valid_message;
  187. BaseType_t os_ret = xQueueReceive(monitor->valid_msg_handle, &valid_message, pdMS_TO_TICKS(200)); //Get the valid message for verification, 200ms timeout
  188. TEST_ASSERT_MESSAGE(os_ret == pdPASS, "test_slider_handler: queue timeout");
  189. test_slider_callback_check(handle, message, &valid_message); //Verification
  190. xSemaphoreGive(monitor->response_sig_handle);
  191. }