Home | History | Annotate | Download | only in test
      1 /*
      2   Copyright (C) 1997-2014 Sam Lantinga <slouken (at) libsdl.org>
      3 
      4   This software is provided 'as-is', without any express or implied
      5   warranty.  In no event will the authors be held liable for any damages
      6   arising from the use of this software.
      7 
      8   Permission is granted to anyone to use this software for any purpose,
      9   including commercial applications, and to alter it and redistribute it
     10   freely.
     11 */
     12 
     13 /* Simple program to test the SDL joystick hotplugging */
     14 
     15 #include <stdio.h>
     16 #include <stdlib.h>
     17 #include <string.h>
     18 
     19 #include "SDL.h"
     20 #include "SDL_haptic.h"
     21 
     22 #if !defined SDL_JOYSTICK_DISABLED && !defined SDL_HAPTIC_DISABLED
     23 
     24 int
     25 main(int argc, char *argv[])
     26 {
     27     SDL_Joystick *joystick = NULL;
     28     SDL_Haptic *haptic = NULL;
     29     SDL_JoystickID instance = -1;
     30     SDL_bool keepGoing = SDL_TRUE;
     31     int i;
     32     SDL_bool enable_haptic = SDL_TRUE;
     33     Uint32 init_subsystems = SDL_INIT_VIDEO | SDL_INIT_JOYSTICK;
     34 
     35     for (i = 1; i < argc; ++i) {
     36         if (SDL_strcasecmp(argv[i], "--nohaptic") == 0) {
     37             enable_haptic = SDL_FALSE;
     38         }
     39     }
     40 
     41     if(enable_haptic) {
     42         init_subsystems |= SDL_INIT_HAPTIC;
     43     }
     44 
     45     /* Enable standard application logging */
     46     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
     47 
     48     SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1");
     49 
     50     /* Initialize SDL (Note: video is required to start event loop) */
     51     if (SDL_Init(init_subsystems) < 0) {
     52         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
     53         exit(1);
     54     }
     55 
     56     //SDL_CreateWindow("Dummy", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 128, 128, 0);
     57 
     58     SDL_Log("There are %d joysticks at startup\n", SDL_NumJoysticks());
     59     if (enable_haptic)
     60         SDL_Log("There are %d haptic devices at startup\n", SDL_NumHaptics());
     61 
     62     while(keepGoing)
     63     {
     64         SDL_Event event;
     65         while(SDL_PollEvent(&event))
     66         {
     67             switch(event.type)
     68             {
     69                 case SDL_QUIT:
     70                     keepGoing = SDL_FALSE;
     71                     break;
     72                 case SDL_JOYDEVICEADDED:
     73                     if (joystick != NULL)
     74                     {
     75                         SDL_Log("Only one joystick supported by this test\n");
     76                     }
     77                     else
     78                     {
     79                         joystick = SDL_JoystickOpen(event.jdevice.which);
     80                         instance = SDL_JoystickInstanceID(joystick);
     81                         SDL_Log("Joy Added  : %d : %s\n", event.jdevice.which, SDL_JoystickName(joystick));
     82                         if (enable_haptic)
     83                         {
     84                             if (SDL_JoystickIsHaptic(joystick))
     85                             {
     86                                 haptic = SDL_HapticOpenFromJoystick(joystick);
     87                                 if (haptic)
     88                                 {
     89                                     SDL_Log("Joy Haptic Opened\n");
     90                                     if (SDL_HapticRumbleInit( haptic ) != 0)
     91                                     {
     92                                         SDL_Log("Could not init Rumble!: %s\n", SDL_GetError());
     93                                         SDL_HapticClose(haptic);
     94                                         haptic = NULL;
     95                                     }
     96                                 } else {
     97                                     SDL_Log("Joy haptic open FAILED!: %s\n", SDL_GetError());
     98                                 }
     99                             }
    100                             else
    101                             {
    102                                 SDL_Log("No haptic found\n");
    103                             }
    104                         }
    105                     }
    106                     break;
    107                 case SDL_JOYDEVICEREMOVED:
    108                     if (instance == event.jdevice.which)
    109                     {
    110                         SDL_Log("Joy Removed: %d\n", event.jdevice.which);
    111                         instance = -1;
    112                         if(enable_haptic && haptic)
    113                         {
    114                             SDL_HapticClose(haptic);
    115                             haptic = NULL;
    116                         }
    117                         SDL_JoystickClose(joystick);
    118                         joystick = NULL;
    119                     } else {
    120                         SDL_Log("Unknown joystick diconnected\n");
    121                     }
    122                     break;
    123                 case SDL_JOYAXISMOTION:
    124 //                    SDL_Log("Axis Move: %d\n", event.jaxis.axis);
    125                     if (enable_haptic)
    126                         SDL_HapticRumblePlay(haptic, 0.25, 250);
    127                     break;
    128                 case SDL_JOYBUTTONDOWN:
    129                     SDL_Log("Button Press: %d\n", event.jbutton.button);
    130                     if(enable_haptic && haptic)
    131                     {
    132                         SDL_HapticRumblePlay(haptic, 0.25, 250);
    133                     }
    134 					if (event.jbutton.button == 0) {
    135 						SDL_Log("Exiting due to button press of button 0\n");
    136 						keepGoing = SDL_FALSE;
    137 					}
    138                     break;
    139                 case SDL_JOYBUTTONUP:
    140                     SDL_Log("Button Release: %d\n", event.jbutton.button);
    141                     break;
    142             }
    143         }
    144     }
    145 
    146     SDL_Quit();
    147 
    148     return 0;
    149 }
    150 #else
    151 
    152 int
    153 main(int argc, char *argv[])
    154 {
    155     SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL compiled without Joystick and haptic support.\n");
    156     return 1;
    157 }
    158 
    159 #endif
    160