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