diff options
Diffstat (limited to 'modules/libjoy/libjoy.c')
-rw-r--r-- | modules/libjoy/libjoy.c | 519 |
1 files changed, 519 insertions, 0 deletions
diff --git a/modules/libjoy/libjoy.c b/modules/libjoy/libjoy.c new file mode 100644 index 0000000..c9ec9ca --- /dev/null +++ b/modules/libjoy/libjoy.c @@ -0,0 +1,519 @@ +/* + * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd) + * Copyright © 2002-2006 Fenix Team (Fenix) + * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix) + * + * This file is part of Bennu - Game Development + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +/* --------------------------------------------------------------------------- */ +/* Thanks Sandman for suggest on openjoys at initialization time */ +/* --------------------------------------------------------------------------- */ +/* Credits SplinterGU/Sandman 2007-2009 */ +/* --------------------------------------------------------------------------- */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <SDL.h> + +/* --------------------------------------------------------------------------- */ + +#include "bgddl.h" + +#include "bgdrtm.h" + +#include "files.h" +#include "xstrings.h" + +/* --------------------------------------------------------------------------- */ + +#include "libjoy_exports.h" + +/* --------------------------------------------------------------------------- */ + +#ifdef TARGET_CAANOO +#include "caanoo/te9_tf9_hybrid_driver.c" + +#ifndef ABS +#define ABS(x) (((x) < 0) ? -(x):(x)) +#endif + +#endif + +/* --------------------------------------------------------------------------- */ + +#define MAX_JOYS 32 + +static int _max_joys = 0; +static SDL_Joystick * _joysticks[MAX_JOYS]; +static int _selected_joystick = -1; + +/* --------------------------------------------------------------------------- */ +/* libjoy_num () */ +/* Returns the number of joysticks present in the system */ +/* --------------------------------------------------------------------------- */ + +int libjoy_num( void ) +{ + return _max_joys ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_name (int JOY) */ +/* Returns the name for a given joystick present in the system */ +/* --------------------------------------------------------------------------- */ + +int libjoy_name( int joy ) +{ + int result; + result = string_new( SDL_JoystickName( joy ) ); + string_use( result ); + return result; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_select (int JOY) */ +/* Returns the selected joystick number */ +/* --------------------------------------------------------------------------- */ + +int libjoy_select( int joy ) +{ + return ( _selected_joystick = joy ); +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_buttons () */ +/* Returns the selected joystick total buttons */ +/* --------------------------------------------------------------------------- */ + +int libjoy_buttons( void ) +{ + if ( _selected_joystick >= 0 && _selected_joystick < _max_joys ) + { +#ifdef TARGET_CAANOO + if ( _selected_joystick == 0 ) return 21; +#endif + return SDL_JoystickNumButtons( _joysticks[ _selected_joystick ] ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_axes () */ +/* Returns the selected joystick total axes */ +/* --------------------------------------------------------------------------- */ + +int libjoy_axes( void ) +{ + if ( _selected_joystick >= 0 && _selected_joystick < _max_joys ) + { + return SDL_JoystickNumAxes( _joysticks[ _selected_joystick ] ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_get_button ( int button ) */ +/* Returns the selected joystick state for the given button */ +/* --------------------------------------------------------------------------- */ + +int libjoy_get_button( int button ) +{ + if ( _selected_joystick >= 0 && _selected_joystick < _max_joys ) + { +#ifdef TARGET_CAANOO + if ( _selected_joystick == 0 ) + { + int vax; + + switch ( button ) + { + case 1: /* UPLF */ return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) < -16384 && SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) < -16384 ); + case 3: /* DWLF */ return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) > 16384 && SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) < -16384 ); + case 5: /* DWRT */ return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) > 16384 && SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) > 16384 ); + case 7: /* UPRT */ return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) < -16384 && SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) > 16384 ); + case 0: /* UP */ vax = SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) ; return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) < -16384 && ABS( vax ) < 16384 ); + case 4: /* DW */ vax = SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) ; return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) > 16384 && ABS( vax ) < 16384 ); + case 2: /* LF */ vax = SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) ; return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) < -16384 && ABS( vax ) < 16384 ); + case 6: /* RT */ vax = SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) ; return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) > 16384 && ABS( vax ) < 16384 ); + + case 8: /* MENU->HOME */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 6 ) ); + case 9: /* SELECT->HELP-II */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 9 ) ); + case 10: /* L */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 4 ) ); + case 11: /* R */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 5 ) ); + case 12: /* A */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 0 ) ); + case 13: /* B */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 2 ) ); + case 14: /* X */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 1 ) ); + case 15: /* Y */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 3 ) ); + case 16: /* VOLUP */ return ( 0 ); + case 17: /* VOLDOWN */ return ( 0 ); + case 18: /* CLICK */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 10 ) ); + case 19: /* POWER-LOCK (CAANOO) */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 7 ) ); /* Only Caanoo */ + case 20: /* HELP-I (CAANOO) */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 8 ) ); /* Only Caanoo */ + default: return ( 0 ); + } + } +#endif + return SDL_JoystickGetButton( _joysticks[ _selected_joystick ], button ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_get_position ( int axis ) */ +/* Returns the selected joystick state for the given axis */ +/* --------------------------------------------------------------------------- */ + +int libjoy_get_position( int axis ) +{ + if ( _selected_joystick >= 0 && _selected_joystick < _max_joys ) + { + return SDL_JoystickGetAxis( _joysticks[ _selected_joystick ], axis ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_hats () */ +/* Returns the total number of POV hats of the current selected joystick */ +/* --------------------------------------------------------------------------- */ + +int libjoy_hats( void ) +{ + if ( _selected_joystick >= 0 && _selected_joystick < _max_joys ) + { + return SDL_JoystickNumHats( _joysticks[ _selected_joystick ] ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_balls () */ +/* Returns the total number of balls of the current selected joystick */ +/* --------------------------------------------------------------------------- */ + +int libjoy_balls( void ) +{ + if ( _selected_joystick >= 0 && _selected_joystick < _max_joys ) + { + return SDL_JoystickNumBalls( _joysticks[ _selected_joystick ] ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_get_hat (int HAT) */ +/* Returns the state of the specfied hat on the current selected joystick */ +/* --------------------------------------------------------------------------- */ + +int libjoy_get_hat( int hat ) +{ + if ( _selected_joystick >= 0 && _selected_joystick < _max_joys ) + { + if ( hat >= 0 && hat <= SDL_JoystickNumHats( _joysticks[ _selected_joystick ] ) ) + { + return SDL_JoystickGetHat( _joysticks[ _selected_joystick ], hat ) ; + } + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_get_ball (int BALL, int* dx, int* dy) */ +/* Returns the state of the specfied ball on the current selected joystick */ +/* --------------------------------------------------------------------------- */ + +int libjoy_get_ball( int ball, int * dx, int * dy ) +{ + if ( _selected_joystick >= 0 && _selected_joystick < _max_joys ) + { + if ( ball >= 0 && ball <= SDL_JoystickNumBalls( _joysticks[ball] ) ) + { + return SDL_JoystickGetBall( _joysticks[ _selected_joystick ], ball, dx, dy ) ; + } + } + return -1 ; +} + +/* --------------------------------------------------------------------------- */ + +int libjoy_get_accel( int * x, int * y, int * z ) +{ +#ifdef TARGET_CAANOO + if ( _selected_joystick == 0 ) + { + KIONIX_ACCEL_read_LPF_g( x, y, z ); + } + return 0; +#else + return -1; +#endif +} + +/* --------------------------------------------------------------------------- */ +/* --------------------------------------------------------------------------- */ +/* --------------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------------- */ +/* libjoy_buttons_specific (int JOY) */ +/* Returns the selected joystick total buttons */ +/* --------------------------------------------------------------------------- */ + +int libjoy_buttons_specific( int joy ) +{ + if ( joy >= 0 && joy < _max_joys ) + { +#ifdef TARGET_CAANOO + if ( joy == 0 ) return 21; +#endif + return SDL_JoystickNumButtons( _joysticks[ joy ] ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_axes_specific (int JOY) */ +/* Returns the selected joystick total axes */ +/* --------------------------------------------------------------------------- */ + +int libjoy_axes_specific( int joy ) +{ + if ( joy >= 0 && joy < _max_joys ) + { + return SDL_JoystickNumAxes( _joysticks[ joy ] ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_get_button_specific (int JOY, int button) */ +/* Returns the selected joystick state for the given button */ +/* --------------------------------------------------------------------------- */ + +int libjoy_get_button_specific( int joy, int button ) +{ + if ( joy >= 0 && joy < _max_joys ) + { +#ifdef TARGET_CAANOO + if ( button >= 0 && ( ( joy == 0 && button <= 21 ) || ( joy != 0 && SDL_JoystickNumButtons( _joysticks[ joy ] ) ) ) ) +#else + if ( button >= 0 && button <= SDL_JoystickNumButtons( _joysticks[ joy ] ) ) +#endif + { +#ifdef TARGET_CAANOO + if ( joy == 0 ) + { + int vax; + + switch ( button ) + { + case 1: /* UPLF */ return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) < -16384 && SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) < -16384 ); + case 3: /* DWLF */ return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) > 16384 && SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) < -16384 ); + case 5: /* DWRT */ return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) > 16384 && SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) > 16384 ); + case 7: /* UPRT */ return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) < -16384 && SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) > 16384 ); + case 0: /* UP */ vax = SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) ; return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) < -16384 && ABS( vax ) < 16384 ); + case 4: /* DW */ vax = SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) ; return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) > 16384 && ABS( vax ) < 16384 ); + case 2: /* LF */ vax = SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) ; return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) < -16384 && ABS( vax ) < 16384 ); + case 6: /* RT */ vax = SDL_JoystickGetAxis( _joysticks[ 0 ], 1 ) ; return ( SDL_JoystickGetAxis( _joysticks[ 0 ], 0 ) > 16384 && ABS( vax ) < 16384 ); + + case 8: /* MENU->HOME */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 6 ) ); + case 9: /* SELECT->HELP-II */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 9 ) ); + case 10: /* L */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 4 ) ); + case 11: /* R */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 5 ) ); + case 12: /* A */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 0 ) ); + case 13: /* B */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 2 ) ); + case 14: /* X */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 1 ) ); + case 15: /* Y */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 3 ) ); + case 16: /* VOLUP */ return ( 0 ); + case 17: /* VOLDOWN */ return ( 0 ); + case 18: /* CLICK */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 10 ) ); + case 19: /* POWER-LOCK (CAANOO) */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 7 ) ); /* Only Caanoo */ + case 20: /* HELP-I (CAANOO) */ return ( SDL_JoystickGetButton( _joysticks[ 0 ], 8 ) ); /* Only Caanoo */ + default: return ( 0 ); + } + } +#endif + return SDL_JoystickGetButton( _joysticks[ joy ], button ) ; + } + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_get_position_specific (int JOY, int axis) */ +/* Returns the selected joystick state for the given axis */ +/* --------------------------------------------------------------------------- */ + +int libjoy_get_position_specific( int joy, int axis ) +{ + if ( joy >= 0 && joy < _max_joys ) + { + if ( axis >= 0 && axis <= SDL_JoystickNumAxes( _joysticks[ joy ] ) ) + { + return SDL_JoystickGetAxis( _joysticks[ joy ], axis ) ; + } + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* Added by Sandman */ +/* --------------------------------------------------------------------------- */ +/* --------------------------------------------------------------------------- */ +/* libjoy_hats_specific (int JOY) */ +/* Returns the total number of POV hats of the specified joystick */ +/* --------------------------------------------------------------------------- */ + +int libjoy_hats_specific( int joy ) +{ + if ( joy >= 0 && joy < _max_joys ) + { + return SDL_JoystickNumHats( _joysticks[ joy ] ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_balls_specific (int JOY) */ +/* Returns the total number of balls of the specified joystick */ +/* --------------------------------------------------------------------------- */ + +int libjoy_balls_specific( int joy ) +{ + if ( joy >= 0 && joy < _max_joys ) + { + return SDL_JoystickNumBalls( _joysticks[ joy ] ) ; + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_get_hat_specific (int JOY, int HAT) */ +/* Returns the state of the specfied hat on the specified joystick */ +/* --------------------------------------------------------------------------- */ + +int libjoy_get_hat_specific( int joy, int hat ) +{ + if ( joy >= 0 && joy < _max_joys ) + { + if ( hat >= 0 && hat <= SDL_JoystickNumHats( _joysticks[ joy ] ) ) + { + return SDL_JoystickGetHat( _joysticks[ joy ], hat ) ; + } + } + return 0 ; +} + +/* --------------------------------------------------------------------------- */ +/* libjoy_get_ball_specific (int JOY, int BALL, int* dx, int* dy) */ +/* Returns the state of the specfied ball on the specified joystick */ +/* --------------------------------------------------------------------------- */ + +int libjoy_get_ball_specific( int joy, int ball, int * dx, int * dy ) +{ + if ( joy >= 0 && joy < _max_joys ) + { + if ( ball >= 0 && ball <= SDL_JoystickNumBalls( _joysticks[ joy ] ) ) + { + return SDL_JoystickGetBall( _joysticks[ joy ], ball, dx, dy ) ; + } + } + return -1 ; +} + +/* --------------------------------------------------------------------------- */ + +int libjoy_get_accel_specific( int joy, int * x, int * y, int * z ) +{ +#ifdef TARGET_CAANOO + if ( joy == 0 ) + { + KIONIX_ACCEL_read_LPF_g( x, y, z ); + return 0; + } +#endif + return -1; +} + +/* --------------------------------------------------------------------------- */ +/* Funciones de inicializacion del modulo/plugin */ +/* --------------------------------------------------------------------------- */ + +void __bgdexport( libjoy, module_initialize )() +{ + int i; + + if ( !SDL_WasInit( SDL_INIT_JOYSTICK ) ) + { + SDL_InitSubSystem( SDL_INIT_JOYSTICK ); + SDL_JoystickEventState( SDL_ENABLE ) ; + } + + /* Open all joysticks */ + if (( _max_joys = SDL_NumJoysticks() ) > MAX_JOYS ) + { + printf( "[JOY] Warning: maximum number of joysticks exceeded (%i>%i)", _max_joys, MAX_JOYS ); + _max_joys = MAX_JOYS; + } + + for ( i = 0; i < _max_joys; i++ ) + { + _joysticks[i] = SDL_JoystickOpen( i ) ; + if ( !_joysticks[ i ] ) printf( "[JOY] Failed to open joystick '%i'", i ); + } + + SDL_JoystickUpdate() ; + +#ifdef TARGET_CAANOO + KIONIX_ACCEL_init(); + + if ( KIONIX_ACCEL_get_device_type() != DEVICE_TYPE_KIONIX_KXTF9 ) KIONIX_ACCEL_deinit(); + + KXTF9_set_G_range(2); + KXTF9_set_resolution(12); + KXTF9_set_lpf_odr(400); + + KIONIX_ACCEL_enable_outputs(); +#endif +} + +/* ----------------------------------------------------------------- */ + +void __bgdexport( libjoy, module_finalize )() +{ + int i; + +#ifdef TARGET_CAANOO + KIONIX_ACCEL_deinit(); +#endif + + for ( i = 0; i < _max_joys; i++ ) + if ( _joysticks[ i ] ) SDL_JoystickClose( _joysticks[ i ] ) ; + + if ( SDL_WasInit( SDL_INIT_JOYSTICK ) ) SDL_QuitSubSystem( SDL_INIT_JOYSTICK ); + +} + +/* ----------------------------------------------------------------- */ |