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) 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[]) 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 joystick = SDL_JoystickOpen(i); 164 if (joystick == NULL) { 165 fprintf(stderr, "SDL_JoystickOpen(%d) failed: %s\n", i, SDL_GetError()); 166 } else { 167 printf(" axes: %d\n", SDL_JoystickNumAxes(joystick)); 168 printf(" balls: %d\n", SDL_JoystickNumBalls(joystick)); 169 printf(" hats: %d\n", SDL_JoystickNumHats(joystick)); 170 printf(" buttons: %d\n", SDL_JoystickNumButtons(joystick)); 171 SDL_JoystickClose(joystick); 172 } 173 } 174 175 if ( argv[1] ) { 176 joystick = SDL_JoystickOpen(atoi(argv[1])); 177 if ( joystick == NULL ) { 178 printf("Couldn't open joystick %d: %s\n", atoi(argv[1]), 179 SDL_GetError()); 180 } else { 181 WatchJoystick(joystick); 182 SDL_JoystickClose(joystick); 183 } 184 } 185 SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK); 186 187 return(0); 188 } 189