test/testjoystick.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. WatchJoystick
  2. main

   1 
   2 /* Simple program to test the SDL joystick routines */
   3 
   4 #include <stdio.h>
   5 #include <stdlib.h>
   6 #include <string.h>
   7 
   8 #include "SDL.h"
   9 
  10 #define SCREEN_WIDTH    640
  11 #define SCREEN_HEIGHT   480
  12 
  13 void WatchJoystick(SDL_Joystick *joystick)
     /* [<][>][^][v][top][bottom][index][help] */
  14 {
  15         SDL_Surface *screen;
  16         const char *name;
  17         int i, done;
  18         SDL_Event event;
  19         int x, y, draw;
  20         SDL_Rect axis_area[2];
  21 
  22         /* Set a video mode to display joystick axis position */
  23         screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, 0);
  24         if ( screen == NULL ) {
  25                 fprintf(stderr, "Couldn't set video mode: %s\n",SDL_GetError());
  26                 return;
  27         }
  28 
  29         /* Print info about the joystick we are watching */
  30         name = SDL_JoystickName(SDL_JoystickIndex(joystick));
  31         printf("Watching joystick %d: (%s)\n", SDL_JoystickIndex(joystick),
  32                name ? name : "Unknown Joystick");
  33         printf("Joystick has %d axes, %d hats, %d balls, and %d buttons\n",
  34                SDL_JoystickNumAxes(joystick), SDL_JoystickNumHats(joystick),
  35                SDL_JoystickNumBalls(joystick),SDL_JoystickNumButtons(joystick));
  36 
  37         /* Initialize drawing rectangles */
  38         memset(axis_area, 0, (sizeof axis_area));
  39         draw = 0;
  40 
  41         /* Loop, getting joystick events! */
  42         done = 0;
  43         while ( ! done ) {
  44                 while ( SDL_PollEvent(&event) ) {
  45                         switch (event.type) {
  46                             case SDL_JOYAXISMOTION:
  47                                 printf("Joystick %d axis %d value: %d\n",
  48                                        event.jaxis.which,
  49                                        event.jaxis.axis,
  50                                        event.jaxis.value);
  51                                 break;
  52                             case SDL_JOYHATMOTION:
  53                                 printf("Joystick %d hat %d value:",
  54                                        event.jhat.which,
  55                                        event.jhat.hat);
  56                                 if ( event.jhat.value == SDL_HAT_CENTERED )
  57                                         printf(" centered");
  58                                 if ( event.jhat.value & SDL_HAT_UP )
  59                                         printf(" up");
  60                                 if ( event.jhat.value & SDL_HAT_RIGHT )
  61                                         printf(" right");
  62                                 if ( event.jhat.value & SDL_HAT_DOWN )
  63                                         printf(" down");
  64                                 if ( event.jhat.value & SDL_HAT_LEFT )
  65                                         printf(" left");
  66                                 printf("\n");
  67                                 break;
  68                             case SDL_JOYBALLMOTION:
  69                                 printf("Joystick %d ball %d delta: (%d,%d)\n",
  70                                        event.jball.which,
  71                                        event.jball.ball,
  72                                        event.jball.xrel,
  73                                        event.jball.yrel);
  74                                 break;
  75                             case SDL_JOYBUTTONDOWN:
  76                                 printf("Joystick %d button %d down\n",
  77                                        event.jbutton.which,
  78                                        event.jbutton.button);
  79                                 break;
  80                             case SDL_JOYBUTTONUP:
  81                                 printf("Joystick %d button %d up\n",
  82                                        event.jbutton.which,
  83                                        event.jbutton.button);
  84                                 break;
  85                             case SDL_KEYDOWN:
  86                                 if ( event.key.keysym.sym != SDLK_ESCAPE ) {
  87                                         break;
  88                                 }
  89                                 /* Fall through to signal quit */
  90                             case SDL_QUIT:
  91                                 done = 1;
  92                                 break;
  93                             default:
  94                                 break;
  95                         }
  96                 }
  97                 /* Update visual joystick state */
  98                 for ( i=0; i<SDL_JoystickNumButtons(joystick); ++i ) {
  99                         SDL_Rect area;
 100 
 101                         area.x = i*34;
 102                         area.y = SCREEN_HEIGHT-34;
 103                         area.w = 32;
 104                         area.h = 32;
 105                         if (SDL_JoystickGetButton(joystick, i) == SDL_PRESSED) {
 106                                 SDL_FillRect(screen, &area, 0xFFFF);
 107                         } else {
 108                                 SDL_FillRect(screen, &area, 0x0000);
 109                         }
 110                         SDL_UpdateRects(screen, 1, &area);
 111                 }
 112 
 113                 /* Erase previous axes */
 114                 SDL_FillRect(screen, &axis_area[draw], 0x0000);
 115 
 116                 /* Draw the X/Y axis */
 117                 draw = !draw;
 118                 x = (((int)SDL_JoystickGetAxis(joystick, 0))+32768);
 119                 x *= SCREEN_WIDTH;
 120                 x /= 65535;
 121                 if ( x < 0 ) {
 122                         x = 0;
 123                 } else
 124                 if ( x > (SCREEN_WIDTH-16) ) {
 125                         x = SCREEN_WIDTH-16;
 126                 }
 127                 y = (((int)SDL_JoystickGetAxis(joystick, 1))+32768);
 128                 y *= SCREEN_HEIGHT;
 129                 y /= 65535;
 130                 if ( y < 0 ) {
 131                         y = 0;
 132                 } else
 133                 if ( y > (SCREEN_HEIGHT-16) ) {
 134                         y = SCREEN_HEIGHT-16;
 135                 }
 136                 axis_area[draw].x = (Sint16)x;
 137                 axis_area[draw].y = (Sint16)y;
 138                 axis_area[draw].w = 16;
 139                 axis_area[draw].h = 16;
 140                 SDL_FillRect(screen, &axis_area[draw], 0xFFFF);
 141 
 142                 SDL_UpdateRects(screen, 2, axis_area);
 143         }
 144 }
 145 
 146 int main(int argc, char *argv[])
     /* [<][>][^][v][top][bottom][index][help] */
 147 {
 148         const char *name;
 149         int i;
 150         SDL_Joystick *joystick;
 151 
 152         /* Initialize SDL (Note: video is required to start event loop) */
 153         if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 ) {
 154                 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
 155                 exit(1);
 156         }
 157 
 158         /* Print information about the joysticks */
 159         printf("There are %d joysticks attached\n", SDL_NumJoysticks());
 160         for ( i=0; i<SDL_NumJoysticks(); ++i ) {
 161                 name = SDL_JoystickName(i);
 162                 printf("Joystick %d: %s\n",i,name ? name : "Unknown Joystick");
 163         }
 164 
 165         if ( argv[1] ) {
 166                 joystick = SDL_JoystickOpen(atoi(argv[1]));
 167                 if ( joystick == NULL ) {
 168                         printf("Couldn't open joystick %d: %s\n", atoi(argv[1]),
 169                                SDL_GetError());
 170                 } else {
 171                         WatchJoystick(joystick);
 172                         SDL_JoystickClose(joystick);
 173                 }
 174         }
 175         SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
 176 
 177         return(0);
 178 }

/* [<][>][^][v][top][bottom][index][help] */