From f4f84f430ac698bb783485ee70be770169f45c91 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 2 Dec 2014 10:13:08 -0600 Subject: A more more input positional logic --- apps/graphics/traveler/include/trv_input.h | 13 ++- apps/graphics/traveler/include/trv_trigtbl.h | 75 ++++++++++++++++ apps/graphics/traveler/include/trv_world.h | 21 +++++ apps/graphics/traveler/src/trv_input.c | 129 +++++++++++++++++++++++++-- 4 files changed, 225 insertions(+), 13 deletions(-) create mode 100644 apps/graphics/traveler/include/trv_trigtbl.h diff --git a/apps/graphics/traveler/include/trv_input.h b/apps/graphics/traveler/include/trv_input.h index 1c2e7e724..9650089cf 100644 --- a/apps/graphics/traveler/include/trv_input.h +++ b/apps/graphics/traveler/include/trv_input.h @@ -46,19 +46,24 @@ * Pre-processor Definitions ****************************************************************************/ +/* Number of units player moves forward or backward. */ + +#define STEP_DISTANCE 15 + +/**************************************************************************** + * Public Types + ****************************************************************************/ + struct trv_input_s { 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 */ + int16_t stepheight; /* Size a a vertical step, if applicable */ bool dooropen; /* True: Open a door */ }; -/**************************************************************************** - * Public Types - ****************************************************************************/ - /**************************************************************************** * Public Data ****************************************************************************/ diff --git a/apps/graphics/traveler/include/trv_trigtbl.h b/apps/graphics/traveler/include/trv_trigtbl.h new file mode 100644 index 000000000..2b73647c2 --- /dev/null +++ b/apps/graphics/traveler/include/trv_trigtbl.h @@ -0,0 +1,75 @@ +/**************************************************************************** + * apps/graphics/traveler/include/trv_trigtbl.h + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_TRIGTBL_H +#define __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_TRIGTBL_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include "trv_types.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* These are definitions of commonly used angles. */ + +#define TWOPI 1920 +#define PI 960 +#define HALFPI 480 +#define QTRPI 240 + +/* Here are definitions for those who prefer degrees */ +/* NOTE: ANGLE_60 and ANGLE_30 are special values. They were */ +/* chosen to match the horizontal screen resolution of 320 pixels. */ +/* These, in fact, drive the entire angular measurement system */ + +#define ANGLE_0 0 +#define ANGLE_6 32 +#define ANGLE_9 48 +#define ANGLE_30 160 +#define ANGLE_60 320 +#define ANGLE_90 480 +#define ANGLE_180 960 +#define ANGLE_270 1440 +#define ANGLE_360 1920 + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#endif /* __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_TRIGTBL_H */ diff --git a/apps/graphics/traveler/include/trv_world.h b/apps/graphics/traveler/include/trv_world.h index 939ec1820..3461fd792 100644 --- a/apps/graphics/traveler/include/trv_world.h +++ b/apps/graphics/traveler/include/trv_world.h @@ -59,6 +59,27 @@ struct trv_camera_s int16_t pitch; /* Camera pitch orientation */ }; +/**************************************************************************** + * Public Data + ****************************************************************************/ +/* This is the starting position and orientation of the camera in the world */ + +extern struct trv_camera_s g_initial_camera; + +/* This is the height of player (distance from the camera Z position to + * the position of the player's "feet" + */ + +extern trv_coord_t g_player_height; + +/* This is size of something that the player can step over when "walking" */ + +extern trv_coord_t g_walk_stepheight; + +/* This is size of something that the player can step over when "running" */ + +extern trv_coord_t g_run_stepheight; + /**************************************************************************** * Public Function Prototypes ****************************************************************************/ diff --git a/apps/graphics/traveler/src/trv_input.c b/apps/graphics/traveler/src/trv_input.c index ba8d987e7..ea100de5c 100644 --- a/apps/graphics/traveler/src/trv_input.c +++ b/apps/graphics/traveler/src/trv_input.c @@ -39,6 +39,8 @@ ****************************************************************************/ #include "trv_types.h" +#include "trv_world.h" +#include "trv_trigtbl.h" #include "trv_input.h" #if defined(CONFIG_GRAPHICS_TRAVELER_JOYSTICK) @@ -46,6 +48,7 @@ # include #if defined(CONFIG_GRAPHICS_TRAVELER_AJOYSTICK) +# include # include #elif defined(CONFIG_GRAPHICS_TRAVELER_DJOYSTICK) # include @@ -68,11 +71,11 @@ struct trv_input_info_s 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 */ + b16_t leftslope; /* Slope for left of center */ + b16_t rightslope; /* Slope for left of center */ int16_t centery; /* Center Y position */ - int16_t maxforward; /* Maximum forward Y position */ - int16_t maxback; /* Maximum backward Y position */ + b16_t fwdslope; /* Slope for forward from center */ + b16_t backslope; /* Slope for backward from center */ #endif #elif defined(CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT) trv_coord_t xpos; /* Reported X position */ @@ -169,6 +172,8 @@ void trv_input_read(void) #if defined(CONFIG_GRAPHICS_TRAVELER_JOYSTICK) #if defined(CONFIG_GRAPHICS_TRAVELER_AJOYSTICK) struct ajoy_sample_s sample; + int16_t move_rate; + int16_t turn_rate; ssize_t nread; /* Read data from the analog joystick */ @@ -187,25 +192,131 @@ void trv_input_read(void) #warning Missing logic #elif defined(CONFIG_GRAPHICS_TRAVELER_DJOYSTICK) - struct djoy_sample_s sample; + struct djoy_buttonset_t buttonset; ssize_t nread; /* Read data from the discrete joystick */ - nread = read(g_trv_input_info.fd, &sample, sizeof(struct djoy_sample_s)); + nread = read(g_trv_input_info.fd, &buttonset, sizeof(djoy_buttonset_t)); if (nread < 0) { trv_abort("ERROR: Joystick read error: %d\n", errno); } - else if (nread != sizeof(struct djoy_sample_s)) + else if (nread != sizeof(struct djoy_buttonset_t)) { 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 + if ((buttonset & DJOY_BUTTON_RUN_BIT) != 0) + { + /* Run faster/step higher */ + + g_trv_input.stepheight = g_run_step_height; + move_rate = 2 * STEP_DISTANCE; + turn_rate = ANGLE_9; + } + else + { + /* Normal walking rate and stepping height */ + + g_trv_input.stepheight = g_walk_step_height; + move_rate = STEP_DISTANCE; + turn_rate = ANGLE_6; + } + + /* Move forward or backward OR look up or down */ + + g_trv_input.pitchrate = 0; + g_trv_input.fwdrate = 0; + + switch (buttonset & (DJOY_UP_BIT | DJOY_DOWN_BIT)) + { + case 0: + case (DJOY_UP_BIT | DJOY_DOWN_BIT): + /* Don't move, don't nod */ + + break; + + case DJOY_UP_BIT: + if ((buttonset & DJOY_BUTTON_FIRE_BIT) != 0) + { + /* Look upward */ + + g_trv_input.pitchrate = turn_rate; + } + else + { + /* Move forward */ + + g_trv_input.fwdrate = move_rate; + } + break; + + case DJOY_DOWN_BIT: + if ((buttonset & DJOY_BUTTON_FIRE_BIT) != 0) + { + /* Look downward */ + + g_trv_input.pitchrate = -turn_rate; + } + else + { + /* Move Backward */ + + g_trv_input.fwdrate = -move_rate; + } + break; + } + + /* Move forward or backward OR look up or down */ + + g_trv_input.yawrate = 0; + g_trv_input.leftrate = 0; + + switch (buttonset & (DJOY_LEFT_BIT | DJOY_RIGHT_BIT)) + { + case 0: + case (DJOY_LEFT_BIT | DJOY_RIGHT_BIT): + /* Don't move, don't nod */ + + break; + + case DJOY_LEFT_BIT: + if ((buttonset & DJOY_BUTTON_FIRE_BIT) != 0) + { + /* Turn left */ + + g_trv_input.yawrate = turn_rate; + } + else + { + /* Move left */ + + g_trv_input.leftrate = move_rate; + } + break; + + case DJOY_RIGHT_BIT: + if ((buttonset & DJOY_BUTTON_FIRE_BIT) != 0) + { + /* Turn right */ + + g_trv_input.yawrate = -turn_rate; + } + else + { + /* Move right */ + + g_trv_input.leftrate = -move_rate; + } + break; + } + + g_trv_input.leftrate = ((buttonset & DJOY_BUTTON_SELECT) != 0); + +#endif /* CONFIG_GRAPHICS_TRAVELER_DJOYSTICK */ #elif defined(CONFIG_GRAPHICS_TRAVELER_NX_XYINPUT) /* Make position decision based on last sampled X/Y input data */ #warning Missing logic -- cgit v1.2.3