SDL-1.2.14
[sdl_omap.git] / test / testjoystick.c
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 }