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

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


The following commit(s) were added to refs/heads/master by this push:
     new db012687f9 arch/sim: support simulator keyboard devices
db012687f9 is described below

commit db012687f976d7ec128d797fce388e631afc9407
Author: yinshengkai <[email protected]>
AuthorDate: Wed Apr 6 12:37:32 2022 +0800

    arch/sim: support simulator keyboard devices
---
 arch/sim/Kconfig                     |  15 +++++
 arch/sim/src/Makefile                |   4 ++
 arch/sim/src/sim/up_internal.h       |   9 ++-
 arch/sim/src/sim/up_keyboard.c       | 115 +++++++++++++++++++++++++++++++++++
 arch/sim/src/sim/up_x11eventloop.c   |  10 +++
 arch/sim/src/sim/up_x11framebuffer.c |   2 +-
 boards/sim/sim/sim/src/sim_bringup.c |  10 +++
 7 files changed, 163 insertions(+), 2 deletions(-)

diff --git a/arch/sim/Kconfig b/arch/sim/Kconfig
index e4a821a23a..2dda5c29dd 100644
--- a/arch/sim/Kconfig
+++ b/arch/sim/Kconfig
@@ -349,6 +349,21 @@ config SIM_NOINPUT
        bool "No input device"
 
 endchoice # Input Device
+
+config SIM_KEYBOARD
+       bool "X11 keyboard"
+       select INPUT_KEYBOARD
+       depends on SIM_X11FB
+       ---help---
+               Support an X11 mouse-based keyboard emulation.  Also needs 
INPUT=y
+
+config SIM_KEYBOARD_BUFFSIZE
+       int "sim keyboard buffer size"
+       default 64
+       depends on SIM_KEYBOARD
+       ---help---
+               Emulator keyboard buffer size
+
 endif # if INPUT
 
 endmenu
diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile
index dd91a6a6bf..d49c1e5354 100644
--- a/arch/sim/src/Makefile
+++ b/arch/sim/src/Makefile
@@ -144,6 +144,10 @@ else ifeq ($(CONFIG_SIM_AJOYSTICK),y)
 else ifeq ($(CONFIG_SIM_BUTTONS),y)
   HOSTSRCS += up_x11eventloop.c
 endif
+
+ifeq ($(CONFIG_SIM_KEYBOARD),y)
+  CSRCS += up_keyboard.c
+endif
 endif
 
 ifeq ($(CONFIG_FS_FAT),y)
diff --git a/arch/sim/src/sim/up_internal.h b/arch/sim/src/sim/up_internal.h
index bdcf87bbf4..1c1d21af17 100644
--- a/arch/sim/src/sim/up_internal.h
+++ b/arch/sim/src/sim/up_internal.h
@@ -231,10 +231,17 @@ int sim_tsc_initialize(int minor);
 int sim_tsc_uninitialize(void);
 #endif
 
+/* up_keyboard.c ************************************************************/
+
+#ifdef CONFIG_SIM_KEYBOARD
+int sim_kbd_initialize(void);
+void up_kbdevent(uint32_t key, bool is_press);
+#endif
+
 /* up_eventloop.c ***********************************************************/
 
 #if defined(CONFIG_SIM_TOUCHSCREEN) || defined(CONFIG_SIM_AJOYSTICK) || \
-    defined(CONFIG_ARCH_BUTTONS)
+    defined(CONFIG_ARCH_BUTTONS) || defined(CONFING_SIM_KEYBOARD)
 void up_x11events(void);
 void up_buttonevent(int x, int y, int buttons);
 #endif
diff --git a/arch/sim/src/sim/up_keyboard.c b/arch/sim/src/sim/up_keyboard.c
new file mode 100644
index 0000000000..bc2636840c
--- /dev/null
+++ b/arch/sim/src/sim/up_keyboard.c
@@ -0,0 +1,115 @@
+/****************************************************************************
+ * arch/sim/src/sim/up_keyboard.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <sys/types.h>
+
+#include <assert.h>
+#include <debug.h>
+#include <string.h>
+
+#include <nuttx/input/keyboard.h>
+
+#include "up_internal.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define DEVNAME "/dev/kbd"
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct up_dev_s
+{
+  int eventloop;
+  struct keyboard_lowerhalf_s lower;
+};
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/* Only one simulated keyboard is supported so the driver state
+ * structure may as well be pre-allocated.
+ */
+
+static struct up_dev_s g_simkeyboard;
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: sim_kbd_initialize
+ ****************************************************************************/
+
+int sim_kbd_initialize(void)
+{
+  int                  ret;
+  FAR struct up_dev_s *priv = &g_simkeyboard;
+
+  memset(priv, 0, sizeof(*priv));
+
+  /* Register the device as an input device */
+
+  ret = keyboard_register(&priv->lower, DEVNAME,
+                          CONFIG_SIM_KEYBOARD_BUFFSIZE);
+  if (ret < 0)
+    {
+      ierr("ERROR: keyboard_register() failed: %d\n", ret);
+      return ret;
+    }
+
+  /* Enable X11 event processing from the IDLE loop */
+
+  priv->eventloop = 1;
+  return OK;
+}
+
+/****************************************************************************
+ * Name: up_kbdevent
+ ****************************************************************************/
+
+void up_kbdevent(uint32_t key, bool is_press)
+{
+  FAR struct up_dev_s *priv = (FAR struct up_dev_s *) &g_simkeyboard;
+  uint32_t types[2] =
+    {
+      KEYBOARD_RELEASE, KEYBOARD_PRESS
+    };
+
+  if (priv->eventloop == 0)
+    {
+      return;
+    }
+
+  iinfo("key=%04x\n", key);
+
+  /* Report data changes */
+
+  keyboard_event(&priv->lower, key, types[is_press]);
+}
diff --git a/arch/sim/src/sim/up_x11eventloop.c 
b/arch/sim/src/sim/up_x11eventloop.c
index bf90d6d00d..4bf95ebf32 100644
--- a/arch/sim/src/sim/up_x11eventloop.c
+++ b/arch/sim/src/sim/up_x11eventloop.c
@@ -24,6 +24,7 @@
 
 #include <stdio.h>
 #include <X11/Xlib.h>
+#include <X11/keysym.h>
 
 #include "up_internal.h"
 
@@ -116,6 +117,15 @@ void up_x11events(void)
 
       switch (event.type)
         {
+          #ifdef CONFIG_SIM_KEYBOARD
+          case KeyPress:
+            up_kbdevent(XLookupKeysym(&event.xkey, 0), true);
+            break;
+          case KeyRelease:
+            up_kbdevent(XLookupKeysym(&event.xkey, 0), false);
+            break;
+          #endif
+
           case MotionNotify : /* Enabled by ButtonMotionMask */
             {
               up_buttonevent(event.xmotion.x, event.xmotion.y,
diff --git a/arch/sim/src/sim/up_x11framebuffer.c 
b/arch/sim/src/sim/up_x11framebuffer.c
index 9bd994eb81..3ba4255ca0 100644
--- a/arch/sim/src/sim/up_x11framebuffer.c
+++ b/arch/sim/src/sim/up_x11framebuffer.c
@@ -115,7 +115,7 @@ static inline int up_x11createframe(void)
 #else
   XSelectInput(g_display, g_window,
                ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
-               KeyPressMask);
+               KeyPressMask | KeyReleaseMask);
 #endif
 
   /* Release queued events on the display */
diff --git a/boards/sim/sim/sim/src/sim_bringup.c 
b/boards/sim/sim/sim/src/sim_bringup.c
index c6404ee1d7..b76651c881 100644
--- a/boards/sim/sim/sim/src/sim_bringup.c
+++ b/boards/sim/sim/sim/src/sim_bringup.c
@@ -318,6 +318,16 @@ int sim_bringup(void)
     }
 #endif
 
+#ifdef CONFIG_SIM_KEYBOARD
+  /* Initialize the keyboard */
+
+  ret = sim_kbd_initialize();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: sim_kbd_initialize failed: %d\n", ret);
+    }
+#endif
+
 #ifdef CONFIG_IEEE802154_LOOPBACK
   /* Initialize and register the IEEE802.15.4 MAC network loop device */
 

Reply via email to