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