Home | History | Annotate | Download | only in test
      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