From 1b3065da9c164337131c10bcad8770925df45602 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 2 Dec 2014 07:34:51 -0600 Subject: Rethink positional input; Add input configuration logic --- apps/graphics/traveler/Kconfig | 32 ++++++ apps/graphics/traveler/include/trv_input.h | 45 +++----- apps/graphics/traveler/src/trv_input.c | 161 +++++++++++++++++++++++++++-- apps/graphics/traveler/src/trv_nxbkgd.c | 15 ++- 4 files changed, 208 insertions(+), 45 deletions(-) (limited to 'apps/graphics') diff --git a/apps/graphics/traveler/Kconfig b/apps/graphics/traveler/Kconfig index 851ab4ca7..47dd09c1b 100644 --- a/apps/graphics/traveler/Kconfig +++ b/apps/graphics/traveler/Kconfig @@ -17,6 +17,38 @@ config GRAPHICS_TRAVELER_RGB32_888 endchoice # Color format +config GRAPHICS_TRAVELER_JOYSTICK + bool + default n + +choice + prompt "Input device" + default GRAPHICS_TRAVELER_AJOYSTICK if CONFIG_AJOYSTICK + default GRAPHICS_TRAVELER_DJOYSTICK if CONFIG_DJOYSTICK && !CONFIG_AJOYSTICK + default GRAPHICS_TRAVELER_NX_XYINPUT if CONFIG_NX_XYINPUT && !CONFIG_AJOYSTICK && !CONFIG_DJOYSTICK + +config GRAPHICS_TRAVELER_AJOYSTICK + bool "Analog joystick" + depends on CONFIG_AJOYSTICK + select GRAPHICS_TRAVELER_JOYSTICK + +config GRAPHICS_TRAVELER_DJOYSTICK + bool "Discrete joystick" + depends on CONFIG_DJOYSTICK + select GRAPHICS_TRAVELER_JOYSTICK + +config GRAPHICS_TRAVELER_NX_XYINPUT + bool "NX X/Y input" + depends on CONFIG_NX_XYINPUT + +endchoice # Input device + +config GRAPHICS_TRAVELER_JOYDEV + string "Joystick device name" + default "/dev/ajoy0" if GRAPHICS_TRAVELER_AJOYSTICK + default "/dev/djoy0" if GRAPHICS_TRAVELER_DJOYSTICK + depends on GRAPHICS_TRAVELER_JOYSTICK + config GRAPHICS_TRAVELER_PERFMON bool "Performance monitor" default y diff --git a/apps/graphics/traveler/include/trv_input.h b/apps/graphics/traveler/include/trv_input.h index beb3b20a4..1c2e7e724 100644 --- a/apps/graphics/traveler/include/trv_input.h +++ b/apps/graphics/traveler/include/trv_input.h @@ -46,44 +46,26 @@ * Pre-processor Definitions ****************************************************************************/ -/**************************************************************************** - * Public Types - ****************************************************************************/ -/* INPUT */ - -enum trv_move_event_e -{ - INPUT_MOVE_NONE = 0, - INPUT_MOVE_FORWARD, - INPUT_MOVE_BACKWARD, - INPUT_MOVE_LEFT, - INPUT_MOVE_RIGHT -}; - -enum trv_turn_event_e +struct trv_input_s { - INPUT_TURN_NONE = 0, - INPUT_TURN_UP, - INPUT_TURN_DOWN, - INPUT_TURN_LEFT, - INPUT_TURN_RIGHT, + int16_t fwdrate; /* Forward motion rate. Negative is backward */ + int16_t leftrate; /* Left motion rate. Negative is right */ + int16_t yawrate; /* Yaw turn rate. Positive is to the left */ + int16_t pitchrate; /* Pitch turn rate. Positive is upward */ + bool dooropen; /* True: Open a door */ }; -enum trv_door_event_e -{ - INPUT_DOOR_NONE = 0, - INPUT_DOOR_OPEN, -}; +/**************************************************************************** + * Public Types + ****************************************************************************/ /**************************************************************************** * Public Data ****************************************************************************/ -extern enum trv_move_event_e g_move_event; -extern enum trv_turn_event_e g_turn_event; -extern enum trv_door_event_e g_door_event; -extern trv_coord_t g_trv_move_rate; -extern trv_coord_t g_trv_turn_rate; +/* Report positional inputs */ + +extern struct trv_input_s g_trv_input; /**************************************************************************** * Public Function Prototypes @@ -92,5 +74,8 @@ extern trv_coord_t g_trv_turn_rate; void trv_input_initialize(void); void trv_input_read(void); void trv_input_terminate(void); +#ifdef CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT +void trv_input_xyinput(trv_coord_t xpos, trv_coord_t xpos, uint8_t buttons); +#endif #endif /* __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_INPUT_H */ diff --git a/apps/graphics/traveler/src/trv_input.c b/apps/graphics/traveler/src/trv_input.c index 1bc9cbd38..ba8d987e7 100644 --- a/apps/graphics/traveler/src/trv_input.c +++ b/apps/graphics/traveler/src/trv_input.c @@ -41,31 +41,85 @@ #include "trv_types.h" #include "trv_input.h" +#if defined(CONFIG_GRAPHICS_TRAVELER_JOYSTICK) +# include +# include + +#if defined(CONFIG_GRAPHICS_TRAVELER_AJOYSTICK) +# include +#elif defined(CONFIG_GRAPHICS_TRAVELER_DJOYSTICK) +# include +#endif + +#elif defined(CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT) +#endif + +/**************************************************************************** + * Pre-processor Definitions + *************************************************************************/ + +/**************************************************************************** + * Private Types + *************************************************************************/ + +struct trv_input_info_s +{ +#if defined(CONFIG_GRAPHICS_TRAVELER_JOYSTICK) + int fd; /* Open driver descriptor */ +#ifdef CONFIG_GRAPHICS_TRAVELER_AJOYSTICK + int16_t centerx; /* Center X position */ + int16_t maxleft; /* Maximum left X position */ + int16_t maxright; /* Maximum right x position */ + int16_t centery; /* Center Y position */ + int16_t maxforward; /* Maximum forward Y position */ + int16_t maxback; /* Maximum backward Y position */ +#endif +#elif defined(CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT) + trv_coord_t xpos; /* Reported X position */ + trv_coord_t ypos; /* Reported Y position */ + uint8_t buttons; /* Report button set */ +#endif +}; + /**************************************************************************** * Public Data *************************************************************************/ -extern enum trv_move_event_e g_move_event; -extern enum trv_turn_event_e g_turn_event; -extern enum trv_door_event_e g_door_event; -extern trv_coord_t g_trv_move_rate; -extern trv_coord_t g_trv_turn_rate; +/* Report positional inputs */ + +struct trv_input_s g_trv_input; /**************************************************************************** * Private Function Prototypes ****************************************************************************/ +#ifdef CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT +static struct trv_input_info_s g_trv_input_info; +#endif + /**************************************************************************** * Private Data *************************************************************************/ -static const char g_default_worldfile[] = "transfrm.wld"; -static FAR struct trv_graphics_info_s g_trv_ginfo; - /**************************************************************************** * Private Functions ****************************************************************************/ +/**************************************************************************** + * Name: trv_joystick_calibrate + * + * Description: + * Calibrate the joystick + * + ****************************************************************************/ + +#ifdef CONFIG_GRAPHICS_TRAVELER_AJOYSTICK +static void trv_joystick_calibrate(void) +{ +#warning Missing logic" +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -80,20 +134,82 @@ static FAR struct trv_graphics_info_s g_trv_ginfo; void trv_input_initialize(void) { -#warning Missing Logic +#if defined(CONFIG_GRAPHICS_TRAVELER_JOYSTICK) + /* Open the joy stick device */ + + g_trv_input_info.fd = open(CONFIG_GRAPHICS_TRAVELER_JOYDEV, O_RDONLY); + if (g_trv_input_info.fd < 0) + { + trv_abort("ERROR: Failed to open %s: %d\n", + CONFIG_GRAPHICS_TRAVELER_JOYDEV, errno); + } + +#ifdef CONFIG_GRAPHICS_TRAVELER_AJOYSTICK + /* Calibrate the analog joystick device */ + + trv_joystick_calibrate(); +#endif + +#elif defined(CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT) + /* Set the position to the center of the display at eye-level */ +#warning Missing logic +#endif } /**************************************************************************** * Name: trv_input_read * * Description: - * Read the next input froom the input device + * Read the next input from the input device * ****************************************************************************/ void trv_input_read(void) { -#warning Missing Logic +#if defined(CONFIG_GRAPHICS_TRAVELER_JOYSTICK) +#if defined(CONFIG_GRAPHICS_TRAVELER_AJOYSTICK) + struct ajoy_sample_s sample; + ssize_t nread; + + /* Read data from the analog joystick */ + + nread = read(g_trv_input_info.fd, &sample, sizeof(struct ajoy_sample_s)); + if (nread < 0) + { + trv_abort("ERROR: Joystick read error: %d\n", errno); + } + else if (nread != sizeof(struct ajoy_sample_s)) + { + trv_abort("ERROR: Unexpected joystick read size: %ld\n", (long)nread); + } + + /* Determine the input data to return to the POV logic */ +#warning Missing logic + +#elif defined(CONFIG_GRAPHICS_TRAVELER_DJOYSTICK) + struct djoy_sample_s sample; + ssize_t nread; + + /* Read data from the discrete joystick */ + + nread = read(g_trv_input_info.fd, &sample, sizeof(struct djoy_sample_s)); + if (nread < 0) + { + trv_abort("ERROR: Joystick read error: %d\n", errno); + } + else if (nread != sizeof(struct djoy_sample_s)) + { + trv_abort("ERROR: Unexpected joystick read size: %ld\n", (long)nread); + } + + /* Determine the input data to return to the POV logic */ +#warning Missing logic + +#endif +#elif defined(CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT) + /* Make position decision based on last sampled X/Y input data */ +#warning Missing logic +#endif } /**************************************************************************** @@ -106,5 +222,28 @@ void trv_input_read(void) void trv_input_terminate(void) { +#ifdef CONFIG_GRAPHICS_TRAVELER_JOYSTICK +#endif #warning Missing Logic } + +/**************************************************************************** + * Name: trv_input_xyinput + * + * Description: + * Receive X/Y input from NX + * + ****************************************************************************/ + +#ifdef CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT +void trv_input_xyinput(trv_coord_t xpos, trv_coord_t xpos, uint8_t buttons) +{ + /* Just save the positional data and button presses for now. We will + * decide what to do with the data when we are polled for new input. + */ + + g_trv_input_info.xpos = xpos; + g_trv_input_info.ypos = ypos; + g_trv_input_info.buttons = buttons; +} +#endif diff --git a/apps/graphics/traveler/src/trv_nxbkgd.c b/apps/graphics/traveler/src/trv_nxbkgd.c index 4bd8a6997..08a54a834 100644 --- a/apps/graphics/traveler/src/trv_nxbkgd.c +++ b/apps/graphics/traveler/src/trv_nxbkgd.c @@ -38,6 +38,9 @@ ****************************************************************************/ #include "trv_types.h" +#ifdef CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT +# include "trv_input.h" +#endif #include #include @@ -122,7 +125,7 @@ static void trv_nxposition(NXWINDOW hwnd, FAR const struct nxgl_size_s *size, /* Report the position */ - gvdbg("hwnd=%p size=(%d,%d) pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n", + trv_vdebug("hwnd=%p size=(%d,%d) pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n", hwnd, size->w, size->h, pos->x, pos->y, bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y); @@ -141,7 +144,7 @@ static void trv_nxposition(NXWINDOW hwnd, FAR const struct nxgl_size_s *size, g_trv_nxresolution = true; sem_post(&g_trv_nxevent); - gvdbg("Have width=%d height=%d\n", ginfo->width, ginfo->height); + trv_vdebug("Have width=%d height=%d\n", ginfo->width, ginfo->height); } } @@ -153,8 +156,12 @@ static void trv_nxposition(NXWINDOW hwnd, FAR const struct nxgl_size_s *size, static void trv_nxmousein(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, uint8_t buttons, FAR void *arg) { - printf("trv_nxmousein: hwnd=%p pos=(%d,%d) button=%02x\n", + trv_vdebug("trv_nxmousein: hwnd=%p pos=(%d,%d) button=%02x\n", hwnd, pos->x, pos->y, buttons); + +#ifdef CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT + trv_input_xyinput((trv_coord_t)pos->x,(trv_coord_t) pos->y, buttons); +#endif } #endif @@ -166,7 +173,7 @@ static void trv_nxmousein(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, static void trv_nxkbdin(NXWINDOW hwnd, uint8_t nch, FAR const uint8_t *ch, FAR void *arg) { - gvdbg("hwnd=%p nch=%d\n", hwnd, nch); + trv_vdebug("hwnd=%p nch=%d\n", hwnd, nch); } #endif -- cgit v1.2.3