diff options
Diffstat (limited to 'distrib/sdl-1.2.15/test/testjoystick.c')
-rw-r--r-- | distrib/sdl-1.2.15/test/testjoystick.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.15/test/testjoystick.c b/distrib/sdl-1.2.15/test/testjoystick.c new file mode 100644 index 0000000..1cd8234 --- /dev/null +++ b/distrib/sdl-1.2.15/test/testjoystick.c @@ -0,0 +1,188 @@ + +/* Simple program to test the SDL joystick routines */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "SDL.h" + +#define SCREEN_WIDTH 640 +#define SCREEN_HEIGHT 480 + +void WatchJoystick(SDL_Joystick *joystick) +{ + SDL_Surface *screen; + const char *name; + int i, done; + SDL_Event event; + int x, y, draw; + SDL_Rect axis_area[2]; + + /* Set a video mode to display joystick axis position */ + screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, 0); + if ( screen == NULL ) { + fprintf(stderr, "Couldn't set video mode: %s\n",SDL_GetError()); + return; + } + + /* Print info about the joystick we are watching */ + name = SDL_JoystickName(SDL_JoystickIndex(joystick)); + printf("Watching joystick %d: (%s)\n", SDL_JoystickIndex(joystick), + name ? name : "Unknown Joystick"); + printf("Joystick has %d axes, %d hats, %d balls, and %d buttons\n", + SDL_JoystickNumAxes(joystick), SDL_JoystickNumHats(joystick), + SDL_JoystickNumBalls(joystick),SDL_JoystickNumButtons(joystick)); + + /* Initialize drawing rectangles */ + memset(axis_area, 0, (sizeof axis_area)); + draw = 0; + + /* Loop, getting joystick events! */ + done = 0; + while ( ! done ) { + while ( SDL_PollEvent(&event) ) { + switch (event.type) { + case SDL_JOYAXISMOTION: + printf("Joystick %d axis %d value: %d\n", + event.jaxis.which, + event.jaxis.axis, + event.jaxis.value); + break; + case SDL_JOYHATMOTION: + printf("Joystick %d hat %d value:", + event.jhat.which, + event.jhat.hat); + if ( event.jhat.value == SDL_HAT_CENTERED ) + printf(" centered"); + if ( event.jhat.value & SDL_HAT_UP ) + printf(" up"); + if ( event.jhat.value & SDL_HAT_RIGHT ) + printf(" right"); + if ( event.jhat.value & SDL_HAT_DOWN ) + printf(" down"); + if ( event.jhat.value & SDL_HAT_LEFT ) + printf(" left"); + printf("\n"); + break; + case SDL_JOYBALLMOTION: + printf("Joystick %d ball %d delta: (%d,%d)\n", + event.jball.which, + event.jball.ball, + event.jball.xrel, + event.jball.yrel); + break; + case SDL_JOYBUTTONDOWN: + printf("Joystick %d button %d down\n", + event.jbutton.which, + event.jbutton.button); + break; + case SDL_JOYBUTTONUP: + printf("Joystick %d button %d up\n", + event.jbutton.which, + event.jbutton.button); + break; + case SDL_KEYDOWN: + if ( event.key.keysym.sym != SDLK_ESCAPE ) { + break; + } + /* Fall through to signal quit */ + case SDL_QUIT: + done = 1; + break; + default: + break; + } + } + /* Update visual joystick state */ + for ( i=0; i<SDL_JoystickNumButtons(joystick); ++i ) { + SDL_Rect area; + + area.x = i*34; + area.y = SCREEN_HEIGHT-34; + area.w = 32; + area.h = 32; + if (SDL_JoystickGetButton(joystick, i) == SDL_PRESSED) { + SDL_FillRect(screen, &area, 0xFFFF); + } else { + SDL_FillRect(screen, &area, 0x0000); + } + SDL_UpdateRects(screen, 1, &area); + } + + /* Erase previous axes */ + SDL_FillRect(screen, &axis_area[draw], 0x0000); + + /* Draw the X/Y axis */ + draw = !draw; + x = (((int)SDL_JoystickGetAxis(joystick, 0))+32768); + x *= SCREEN_WIDTH; + x /= 65535; + if ( x < 0 ) { + x = 0; + } else + if ( x > (SCREEN_WIDTH-16) ) { + x = SCREEN_WIDTH-16; + } + y = (((int)SDL_JoystickGetAxis(joystick, 1))+32768); + y *= SCREEN_HEIGHT; + y /= 65535; + if ( y < 0 ) { + y = 0; + } else + if ( y > (SCREEN_HEIGHT-16) ) { + y = SCREEN_HEIGHT-16; + } + axis_area[draw].x = (Sint16)x; + axis_area[draw].y = (Sint16)y; + axis_area[draw].w = 16; + axis_area[draw].h = 16; + SDL_FillRect(screen, &axis_area[draw], 0xFFFF); + + SDL_UpdateRects(screen, 2, axis_area); + } +} + +int main(int argc, char *argv[]) +{ + const char *name; + int i; + SDL_Joystick *joystick; + + /* Initialize SDL (Note: video is required to start event loop) */ + if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 ) { + fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); + exit(1); + } + + /* Print information about the joysticks */ + printf("There are %d joysticks attached\n", SDL_NumJoysticks()); + for ( i=0; i<SDL_NumJoysticks(); ++i ) { + name = SDL_JoystickName(i); + printf("Joystick %d: %s\n",i,name ? name : "Unknown Joystick"); + joystick = SDL_JoystickOpen(i); + if (joystick == NULL) { + fprintf(stderr, "SDL_JoystickOpen(%d) failed: %s\n", i, SDL_GetError()); + } else { + printf(" axes: %d\n", SDL_JoystickNumAxes(joystick)); + printf(" balls: %d\n", SDL_JoystickNumBalls(joystick)); + printf(" hats: %d\n", SDL_JoystickNumHats(joystick)); + printf(" buttons: %d\n", SDL_JoystickNumButtons(joystick)); + SDL_JoystickClose(joystick); + } + } + + if ( argv[1] ) { + joystick = SDL_JoystickOpen(atoi(argv[1])); + if ( joystick == NULL ) { + printf("Couldn't open joystick %d: %s\n", atoi(argv[1]), + SDL_GetError()); + } else { + WatchJoystick(joystick); + SDL_JoystickClose(joystick); + } + } + SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK); + + return(0); +} |