This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git

commit 36b117c00ab570bde3f0186ec745cf20189eeb06
Author: liuchan3 <liuch...@xiaomi.com>
AuthorDate: Wed Mar 19 14:49:56 2025 +0800

    apps/graphics: Refactor monkey using input generator library
    
    Signed-off-by: liuchan3 <liuch...@xiaomi.com>
---
 graphics/input/CMakeLists.txt        |  2 +
 graphics/input/Kconfig               |  3 +-
 graphics/input/monkey/monkey.c       | 37 +++++++++++++--
 graphics/input/monkey/monkey_dev.c   | 85 +++++++++++++++------------------
 graphics/input/monkey/monkey_dev.h   |  2 +-
 graphics/input/monkey/monkey_event.c | 91 +++++++++---------------------------
 graphics/input/monkey/monkey_main.c  |  2 +-
 graphics/input/monkey/monkey_proc.c  | 48 +++++--------------
 graphics/input/monkey/monkey_type.h  |  2 +
 graphics/input/monkey/monkey_utils.c | 42 +----------------
 graphics/input/monkey/monkey_utils.h |  6 ---
 11 files changed, 113 insertions(+), 207 deletions(-)

diff --git a/graphics/input/CMakeLists.txt b/graphics/input/CMakeLists.txt
index 57abc0fc6..b9ae1adec 100644
--- a/graphics/input/CMakeLists.txt
+++ b/graphics/input/CMakeLists.txt
@@ -41,6 +41,8 @@ if(CONFIG_GRAPHICS_INPUT_MONKEY)
     ${CONFIG_GRAPHICS_INPUT_MONKEY_STACKSIZE}
     MODULE
     ${CONFIG_GRAPHICS_INPUT_MONKEY}
+    DEPENDS
+    input_generator
     SRCS
     ${SRCS})
 endif()
diff --git a/graphics/input/Kconfig b/graphics/input/Kconfig
index a2719fc90..126898bec 100644
--- a/graphics/input/Kconfig
+++ b/graphics/input/Kconfig
@@ -4,7 +4,7 @@
 #
 
 config GRAPHICS_INPUT_GENERATOR
-       bool "Input generator library"
+       bool
        default n
        ---help---
                This is a simple input generator library that can be used to
@@ -14,6 +14,7 @@ menuconfig GRAPHICS_INPUT_MONKEY
        tristate "Monkey test"
        select UINPUT_TOUCH
        select UINPUT_BUTTONS
+       select GRAPHICS_INPUT_GENERATOR
        select LIBC_PRINT_EXTENSION
        default n
 
diff --git a/graphics/input/monkey/monkey.c b/graphics/input/monkey/monkey.c
index c79e94751..3ba0d10b3 100644
--- a/graphics/input/monkey/monkey.c
+++ b/graphics/input/monkey/monkey.c
@@ -25,6 +25,7 @@
  ****************************************************************************/
 
 #include <nuttx/config.h>
+#include <graphics/input_gen.h>
 #include <stdlib.h>
 #include <string.h>
 #include <inttypes.h>
@@ -41,8 +42,6 @@
 
 #define MONKEY_DEV_PATH_TOUCH "/dev/input0"
 #define MONKEY_DEV_PATH_BUTTON "/dev/buttons"
-#define MONKEY_DEV_PATH_UTOUCH "/dev/utouch"
-#define MONKEY_DEV_PATH_UBUTTON "/dev/ubutton"
 
 #define MONKEY_DEV_CREATE_MATCH(monkey, type_mask, type)                  \
 do {                                                                      \
@@ -60,6 +59,23 @@ do {                                                         
             \
     }                                                                     \
 } while (0)
 
+#define MONKEY_DEV_CREATE_UINPUT(monkey, _type)                              \
+do {                                                                         \
+  if (input_gen_query_device(monkey->input_gen_ctx, INPUT_GEN_DEV_##_type))  \
+    {                                                                        \
+      FAR struct monkey_dev_s *dev = calloc(1, sizeof(struct monkey_dev_s)); \
+      if (!dev)                                                              \
+        {                                                                    \
+          MONKEY_LOG_ERROR("Failed to create virtual device");               \
+          goto failed;                                                       \
+        }                                                                    \
+      dev->type = MONKEY_DEV_TYPE_##_type;                                   \
+      dev->is_available = true;                                              \
+      (monkey)->devs[(monkey)->dev_num] = dev;                               \
+      (monkey)->dev_num++;                                                   \
+  }                                                                          \
+} while (0)
+
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -75,8 +91,15 @@ FAR struct monkey_s *monkey_create(int dev_type_mask)
 
   if (MONKEY_IS_UINPUT_TYPE(dev_type_mask))
     {
-      MONKEY_DEV_CREATE_MATCH(monkey, dev_type_mask, UTOUCH);
-      MONKEY_DEV_CREATE_MATCH(monkey, dev_type_mask, UBUTTON);
+      if (input_gen_create(&monkey->input_gen_ctx,
+                           MONKEY_GET_DEV_TYPE(dev_type_mask)) < 0)
+        {
+          MONKEY_LOG_ERROR("input generator create failed");
+          goto failed;
+        }
+
+      MONKEY_DEV_CREATE_UINPUT(monkey, UTOUCH);
+      MONKEY_DEV_CREATE_UINPUT(monkey, UBUTTON);
     }
   else
     {
@@ -110,6 +133,12 @@ void monkey_delete(FAR struct monkey_s *monkey)
   int i;
   MONKEY_ASSERT_NULL(monkey);
 
+  if (monkey->input_gen_ctx)
+    {
+      input_gen_reset_devices(monkey->input_gen_ctx, INPUT_GEN_DEV_ALL);
+      input_gen_destroy(monkey->input_gen_ctx);
+    }
+
   for (i = 0; i < monkey->dev_num; i++)
     {
       monkey_dev_delete(monkey->devs[i]);
diff --git a/graphics/input/monkey/monkey_dev.c 
b/graphics/input/monkey/monkey_dev.c
index 47c1a82f1..ec63d8d79 100644
--- a/graphics/input/monkey/monkey_dev.c
+++ b/graphics/input/monkey/monkey_dev.c
@@ -27,6 +27,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
+#include <graphics/input_gen.h>
 #include <nuttx/input/buttons.h>
 #include <nuttx/input/touchscreen.h>
 #include <poll.h>
@@ -48,41 +49,43 @@
  * Name: utouch_write
  ****************************************************************************/
 
-static void utouch_write(int fd, int x, int y, int touch_down)
+static void utouch_write(input_gen_ctx_t input_gen_ctx,
+                         FAR const struct monkey_dev_state_s *state)
 {
   struct touch_sample_s sample;
+  sample.npoints = 1;
+  input_gen_fill_point(sample.point, state->data.touch.x,
+                       state->data.touch.y,
+                       state->data.touch.is_pressed ? TOUCH_DOWN : TOUCH_UP);
 
-  if (touch_down)
+  if (input_gen_write_raw(input_gen_ctx, INPUT_GEN_DEV_UTOUCH, &sample,
+                          sizeof(struct touch_sample_s)) < 0)
     {
-      sample.point[0].x        = x;
-      sample.point[0].y        = y;
-      sample.point[0].pressure = 42;
-      sample.point[0].flags    = TOUCH_DOWN | TOUCH_ID_VALID |
-                                 TOUCH_POS_VALID | TOUCH_PRESSURE_VALID;
+      MONKEY_LOG_WARN("unsupported device type: %d", INPUT_GEN_DEV_UTOUCH);
+      return;
     }
-  else
-    {
-      sample.point[0].flags = TOUCH_UP | TOUCH_ID_VALID;
-    }
-
-  sample.npoints    = 1;
-  sample.point[0].h = 1;
-  sample.point[0].w = 1;
 
-  write(fd, &sample, sizeof(struct touch_sample_s));
   MONKEY_LOG_INFO("%s at x = %d, y = %d",
-                  touch_down ? "PRESS  " : "RELEASE", x, y);
+                  state->data.touch.is_pressed ? "PRESS" : "RELEASE",
+                  state->data.touch.x, state->data.touch.y);
 }
 
 /****************************************************************************
  * Name: ubutton_write
  ****************************************************************************/
 
-static void ubutton_write(int fd, uint32_t btn_bits)
+static void ubutton_write(input_gen_ctx_t input_gen_ctx,
+                          FAR const struct monkey_dev_state_s *state)
 {
-  btn_buttonset_t buttonset = btn_bits;
-  write(fd, &buttonset, sizeof(buttonset));
-  MONKEY_LOG_INFO("btn = 0x%08X", btn_bits);
+  btn_buttonset_t buttonset = state->data.button.value;
+  if (input_gen_write_raw(input_gen_ctx, INPUT_GEN_DEV_UBUTTON, &buttonset,
+                          sizeof(buttonset)) < 0)
+    {
+      MONKEY_LOG_WARN("unsupported device type: %d", INPUT_GEN_DEV_UBUTTON);
+      return;
+    }
+
+  MONKEY_LOG_INFO("btn = 0x%08X", state->data.button.value);
 }
 
 /****************************************************************************
@@ -152,18 +155,12 @@ FAR struct monkey_dev_s *monkey_dev_create(FAR const char 
*dev_path,
   int fd;
 
   MONKEY_ASSERT_NULL(dev_path);
+  MONKEY_ASSERT(!MONKEY_IS_UINPUT_TYPE(type));
 
   dev = calloc(1, sizeof(struct monkey_dev_s));
   MONKEY_ASSERT_NULL(dev);
 
-  if (MONKEY_IS_UINPUT_TYPE(type))
-    {
-      oflag = O_RDWR | O_NONBLOCK;
-    }
-  else
-    {
-      oflag = O_RDONLY | O_NONBLOCK;
-    }
+  oflag = O_RDONLY | O_NONBLOCK;
 
   fd = open(dev_path, oflag);
   if (fd < 0)
@@ -204,13 +201,6 @@ void monkey_dev_delete(FAR struct monkey_dev_s *dev)
 
   if (dev->fd > 0)
     {
-      /* Reset input state */
-
-      struct monkey_dev_state_s state;
-      memset(&state, 0, sizeof(state));
-      state.type = dev->type;
-      monkey_dev_set_state(dev, &state);
-
       MONKEY_LOG_NOTICE("close fd: %d", dev->fd);
       close(dev->fd);
     }
@@ -222,23 +212,24 @@ void monkey_dev_delete(FAR struct monkey_dev_s *dev)
  * Name: monkey_dev_set_state
  ****************************************************************************/
 
-void monkey_dev_set_state(FAR struct monkey_dev_s *dev,
+void monkey_dev_set_state(input_gen_ctx_t input_gen_ctx,
                           FAR const struct monkey_dev_state_s *state)
 {
-  MONKEY_ASSERT_NULL(dev);
+  MONKEY_ASSERT_NULL(input_gen_ctx);
 
-  switch (MONKEY_GET_DEV_TYPE(dev->type))
+  switch (MONKEY_GET_DEV_TYPE(state->type))
     {
       case MONKEY_DEV_TYPE_TOUCH:
-        utouch_write(dev->fd,
-                    state->data.touch.x,
-                    state->data.touch.y,
-                    state->data.touch.is_pressed);
-        break;
+        {
+          utouch_write(input_gen_ctx, state);
+          break;
+        }
 
       case MONKEY_DEV_TYPE_BUTTON:
-        ubutton_write(dev->fd, state->data.button.value);
-        break;
+        {
+          ubutton_write(input_gen_ctx, state);
+          break;
+        }
 
       default:
         break;
@@ -280,7 +271,7 @@ bool monkey_dev_get_state(FAR struct monkey_dev_s *dev,
 }
 
 /****************************************************************************
- * Name: monkey_dev_get_state
+ * Name: monkey_dev_get_type
  ****************************************************************************/
 
 enum monkey_dev_type_e monkey_dev_get_type(
diff --git a/graphics/input/monkey/monkey_dev.h 
b/graphics/input/monkey/monkey_dev.h
index cdfcd4b6c..48a76f36e 100644
--- a/graphics/input/monkey/monkey_dev.h
+++ b/graphics/input/monkey/monkey_dev.h
@@ -69,7 +69,7 @@ void monkey_dev_delete(FAR struct monkey_dev_s *dev);
  * Name: monkey_dev_set_state
  ****************************************************************************/
 
-void monkey_dev_set_state(FAR struct monkey_dev_s *dev,
+void monkey_dev_set_state(input_gen_ctx_t input_gen_ctx,
                           FAR const struct monkey_dev_state_s *state);
 
 /****************************************************************************
diff --git a/graphics/input/monkey/monkey_event.c 
b/graphics/input/monkey/monkey_event.c
index 3f8239186..a8fac696c 100644
--- a/graphics/input/monkey/monkey_event.c
+++ b/graphics/input/monkey/monkey_event.c
@@ -26,47 +26,12 @@
 
 #include <string.h>
 #include <unistd.h>
+#include <graphics/input_gen.h>
 #include "monkey_dev.h"
 #include "monkey_event.h"
 #include "monkey_log.h"
 #include "monkey_utils.h"
 
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: monkey_exec_darg
- ****************************************************************************/
-
-static bool monkey_exec_darg(FAR struct monkey_dev_s *dev,
-                             FAR struct monkey_dev_state_s *state,
-                             FAR const struct monkey_event_param_s *param)
-{
-  int t = 0;
-  uint32_t start;
-  state->data.touch.is_pressed = true;
-
-  start = monkey_tick_get();
-
-  while (t < param->duration)
-    {
-      t = monkey_tick_elaps(monkey_tick_get(), start);
-      state->data.touch.x = monkey_map(t, 0, param->duration,
-                                       param->x1, param->x2);
-      state->data.touch.y = monkey_map(t, 0, param->duration,
-                                       param->y1, param->y2);
-      monkey_dev_set_state(dev, state);
-
-      if (usleep(1000) < 0)
-        {
-          return false;
-        }
-    }
-
-  return true;
-}
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -143,60 +108,46 @@ bool monkey_event_exec(FAR struct monkey_s *monkey,
                        FAR const struct monkey_event_param_s *param)
 {
   bool retval = false;
-  struct monkey_dev_state_s state;
-  memset(&state, 0, sizeof(struct monkey_dev_state_s));
-  state.type = monkey_dev_get_type(dev);
-
+  enum monkey_dev_type_e dev_type = monkey_dev_get_type(dev);
   MONKEY_LOG_INFO("dev=0x%x event=%d(%s) duration=%d"
                   " x1=%d y1=%d x2=%d y2=%d",
-                  state.type,
+                  dev_type,
                   param->event,
                   monkey_event_type2name(param->event),
                   param->duration,
                   param->x1, param->y1,
                   param->x2, param->y2);
 
-  if (state.type & MONKEY_DEV_TYPE_TOUCH)
+  if (dev_type & MONKEY_DEV_TYPE_TOUCH)
     {
-      state.data.touch.x = param->x1;
-      state.data.touch.y = param->y1;
-      state.data.touch.is_pressed = true;
-      monkey_dev_set_state(dev, &state);
-
       if (param->event == MONKEY_EVENT_DRAG)
         {
-          retval = monkey_exec_darg(dev, &state, param);
+          retval = !input_gen_drag(monkey->input_gen_ctx,
+                                   param->x1, param->y1,
+                                   param->x2, param->y2,
+                                   param->duration);
         }
       else
         {
-          retval = usleep(param->duration * 1000) == 0;
+          /* Use swipe with same start and end point to simulate click or
+           * longpress.
+           */
+
+          retval = !input_gen_swipe(monkey->input_gen_ctx,
+                                    param->x1, param->y1,
+                                    param->x1, param->y1,
+                                    param->duration);
         }
-
-      if (!retval)
-        {
-          MONKEY_LOG_NOTICE("detect monkey killed");
-        }
-
-      state.data.touch.is_pressed = false;
-      monkey_dev_set_state(dev, &state);
     }
-  else if (state.type & MONKEY_DEV_TYPE_BUTTON)
+  else if (dev_type & MONKEY_DEV_TYPE_BUTTON)
     {
-      /* press button */
-
-      state.data.button.value = 1 << monkey->config.btn_bit;
-      monkey_dev_set_state(dev, &state);
-
-      retval = usleep(param->duration * 1000) == 0;
-
-      /* release button */
-
-      state.data.button.value = 0;
-      monkey_dev_set_state(dev, &state);
+      retval = !input_gen_button_longpress(monkey->input_gen_ctx,
+                                           1 << monkey->config.btn_bit,
+                                           param->duration);
     }
   else
     {
-      MONKEY_LOG_WARN("unsupport device type: %d", state.type);
+      MONKEY_LOG_WARN("unsupported device type: %d", dev_type);
     }
 
   return retval;
diff --git a/graphics/input/monkey/monkey_main.c 
b/graphics/input/monkey/monkey_main.c
index 72fdc6bd4..43b0561c0 100644
--- a/graphics/input/monkey/monkey_main.c
+++ b/graphics/input/monkey/monkey_main.c
@@ -532,7 +532,7 @@ static enum monkey_wait_res_e monkey_wait(uint32_t ms)
         }
       else
         {
-          MONKEY_LOG_ERROR("Unknow error: %d", errcode);
+          MONKEY_LOG_ERROR("Unknown error: %d", errcode);
         }
     }
   else if (ret == SIGTSTP)
diff --git a/graphics/input/monkey/monkey_proc.c 
b/graphics/input/monkey/monkey_proc.c
index 9bd0ccd01..fb09b074d 100644
--- a/graphics/input/monkey/monkey_proc.c
+++ b/graphics/input/monkey/monkey_proc.c
@@ -41,10 +41,10 @@
  ****************************************************************************/
 
 /****************************************************************************
- * Name: monkey_update_uinput_ramdom
+ * Name: monkey_update_uinput_random
  ****************************************************************************/
 
-static bool monkey_update_uinput_ramdom(FAR struct monkey_s *monkey)
+static bool monkey_update_uinput_random(FAR struct monkey_s *monkey)
 {
   int i;
   bool retval = false;
@@ -65,29 +65,15 @@ static bool monkey_update_uinput_ramdom(FAR struct monkey_s 
*monkey)
   return retval;
 }
 
-/****************************************************************************
- * Name: monkey_search_dev
- ****************************************************************************/
-
-static FAR struct monkey_dev_s *monkey_search_dev(
-                                              FAR struct monkey_s *monkey,
-                                              enum monkey_dev_type_e type)
-{
-  int i;
-  for (i = 0; i < monkey->dev_num; i++)
-    {
-      FAR struct monkey_dev_s *dev = monkey->devs[i];
-      if (type == dev->type)
-        {
-          return dev;
-        }
-    }
-
-  return NULL;
-}
-
 /****************************************************************************
  * Name: monkey_recorder_get_next
+ *
+ * Description:
+ *   Gets the next recorder state
+ *
+ * Returned Value:
+ *   0 on error, 1 on end of file, 2 on success.
+ *
  ****************************************************************************/
 
 static int monkey_recorder_get_next(FAR struct monkey_s *monkey,
@@ -149,7 +135,6 @@ static bool monkey_update_uinput_playback(FAR struct 
monkey_s *monkey)
   struct monkey_dev_state_s next_state;
 
   uint32_t tick_elaps;
-  FAR struct monkey_dev_s *dev;
 
   int num_of_get;
 
@@ -168,18 +153,7 @@ static bool monkey_update_uinput_playback(FAR struct 
monkey_s *monkey)
         memset(&monkey->playback_ctx, 0, sizeof(monkey->playback_ctx));
         monkey_recorder_reset(monkey->recorder);
       case 2:
-        dev = monkey_search_dev(monkey,
-                                MONKEY_UINPUT_TYPE_MASK | cur_state.type);
-
-        if (dev)
-          {
-            monkey_dev_set_state(dev, &cur_state);
-          }
-        else
-          {
-            MONKEY_LOG_WARN("unsupport device type: %d", cur_state.type);
-          }
-
+        monkey_dev_set_state(monkey->input_gen_ctx, &cur_state);
         tick_elaps = monkey_tick_elaps(next_time_stamp, cur_time_stamp);
         monkey_set_period(monkey, tick_elaps);
         break;
@@ -203,7 +177,7 @@ static bool monkey_update_uinput(FAR struct monkey_s 
*monkey)
 
   if (monkey->mode == MONKEY_MODE_RANDOM)
     {
-      retval = monkey_update_uinput_ramdom(monkey);
+      retval = monkey_update_uinput_random(monkey);
     }
   else if(monkey->mode == MONKEY_MODE_PLAYBACK)
     {
diff --git a/graphics/input/monkey/monkey_type.h 
b/graphics/input/monkey/monkey_type.h
index 46dc644ad..90fe442b7 100644
--- a/graphics/input/monkey/monkey_type.h
+++ b/graphics/input/monkey/monkey_type.h
@@ -27,6 +27,7 @@
  * Included Files
  ****************************************************************************/
 
+#include <graphics/input_gen.h>
 #include <stdint.h>
 #include <stdbool.h>
 
@@ -124,6 +125,7 @@ struct monkey_s
   FAR struct monkey_dev_s *devs[MONKEY_DEV_MAX_NUM];
   int dev_num;
   FAR struct monkey_recorder_s *recorder;
+  input_gen_ctx_t input_gen_ctx;
   struct
   {
     struct monkey_dev_state_s state;
diff --git a/graphics/input/monkey/monkey_utils.c 
b/graphics/input/monkey/monkey_utils.c
index 829f81399..57c6c4fac 100644
--- a/graphics/input/monkey/monkey_utils.c
+++ b/graphics/input/monkey/monkey_utils.c
@@ -155,44 +155,6 @@ bool monkey_dir_check(FAR const char *dir_path)
   return retval;
 }
 
-/****************************************************************************
- * Name: monkey_map
- ****************************************************************************/
-
-int monkey_map(int x, int min_in, int max_in, int min_out, int max_out)
-{
-  if (max_in >= min_in && x >= max_in)
-    {
-      return max_out;
-    }
-
-  if (max_in >= min_in && x <= min_in)
-    {
-      return min_out;
-    }
-
-  if (max_in <= min_in && x <= max_in)
-    {
-      return max_out;
-    }
-
-  if (max_in <= min_in && x >= min_in)
-    {
-      return min_out;
-    }
-
-  /* The equation should be:
-   *   ((x - min_in) * delta_out) / delta in) + min_out
-   * To avoid rounding error reorder the operations:
-   *   (x - min_in) * (delta_out / delta_min) + min_out
-   */
-
-  int delta_in = max_in - min_in;
-  int delta_out = max_out - min_out;
-
-  return ((x - min_in) * delta_out) / delta_in + min_out;
-}
-
 /****************************************************************************
  * Name: monkey_dev_type2name
  ****************************************************************************/
@@ -210,7 +172,7 @@ FAR const char *monkey_dev_type2name(enum monkey_dev_type_e 
type)
         }
     }
 
-  return "unknow";
+  return "unknown";
 }
 
 /****************************************************************************
@@ -254,5 +216,5 @@ FAR const char *monkey_event_type2name(enum monkey_event_e 
event)
         break;
     }
 
-  return "unknow";
+  return "unknown";
 }
diff --git a/graphics/input/monkey/monkey_utils.h 
b/graphics/input/monkey/monkey_utils.h
index 59e63b577..3577390e3 100644
--- a/graphics/input/monkey/monkey_utils.h
+++ b/graphics/input/monkey/monkey_utils.h
@@ -76,12 +76,6 @@ void monkey_get_localtime_str(FAR char *str_buf, size_t 
buf_size);
 
 bool monkey_dir_check(FAR const char *dir_path);
 
-/****************************************************************************
- * Name: monkey_map
- ****************************************************************************/
-
-int monkey_map(int x, int min_in, int max_in, int min_out, int max_out);
-
 /****************************************************************************
  * Name: monkey_dev_type2name
  ****************************************************************************/

Reply via email to