private static void AddGamePadInstance(int deviceId) { if (GamePad.ConnectedGamePads == GamePad.GamepadMaxCount) { return; } Console.WriteLine("GamePad Added"); // Clear the error buffer. We're about to do a LOT of dangerous stuff. SDL_ClearError(); int which = GamePad.ConnectedGamePads++; // Open the device! _gamepadDevices[which] = SDL_GameControllerOpen(deviceId); // We use this when dealing with GUID initialization. IntPtr thisJoystick = SDL_GameControllerGetJoystick(_gamepadDevices[which]); int thisInstance = SDL_JoystickInstanceID(thisJoystick); GamepadInstances.Add(thisInstance, which); // Start with a fresh state. GamepadStates[which] = new GamePadState(); GamepadStates[which].IsConnected = true; // Initialize the haptics for the joystick, if applicable. bool hasRumble = SDL_GameControllerRumble( _gamepadDevices[which], 0, 0, 0 ) == 0; GamePadCapabilities caps = new GamePadCapabilities(); caps.IsConnected = true; caps.GamePadType = GamepadTypes[(int)SDL_JoystickGetType(thisJoystick)]; caps.HasAButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonA ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasBButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonB ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasXButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonX ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasYButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonY ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasBackButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonBack ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasBigButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonGuide ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasStartButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonStart ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasLeftStickButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonLeftstick ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasRightStickButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonRightstick ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasLeftShoulderButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonLeftshoulder ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasRightShoulderButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonRightshoulder ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasDPadUpButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonDpadUp ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasDPadDownButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonDpadDown ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasDPadLeftButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonDpadLeft ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasDPadRightButton = SDL_GameControllerGetBindForButton( _gamepadDevices[which], SdlGameControllerButton.SdlControllerButtonDpadRight ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasLeftXThumbStick = SDL_GameControllerGetBindForAxis( _gamepadDevices[which], SdlGameControllerAxis.SdlControllerAxisLeftx ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasLeftYThumbStick = SDL_GameControllerGetBindForAxis( _gamepadDevices[which], SdlGameControllerAxis.SdlControllerAxisLefty ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasRightXThumbStick = SDL_GameControllerGetBindForAxis( _gamepadDevices[which], SdlGameControllerAxis.SdlControllerAxisRightx ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasRightYThumbStick = SDL_GameControllerGetBindForAxis( _gamepadDevices[which], SdlGameControllerAxis.SdlControllerAxisRighty ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasLeftTrigger = SDL_GameControllerGetBindForAxis( _gamepadDevices[which], SdlGameControllerAxis.SdlControllerAxisTriggerleft ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasRightTrigger = SDL_GameControllerGetBindForAxis( _gamepadDevices[which], SdlGameControllerAxis.SdlControllerAxisTriggerright ).bindType != SdlGameControllerBindType.SdlControllerBindtypeNone; caps.HasLeftVibrationMotor = hasRumble; caps.HasRightVibrationMotor = hasRumble; caps.HasVoiceSupport = false; GamepadCaps[which] = caps; ushort vendor = SDL_JoystickGetVendor(thisJoystick); ushort product = SDL_JoystickGetProduct(thisJoystick); if (vendor == 0x00 && product == 0x00) { GamepadGuids[which] = "xinput"; } else { GamepadGuids[which] = string.Format( "{0:x2}{1:x2}{2:x2}{3:x2}", vendor & 0xFF, vendor >> 8, product & 0xFF, product >> 8 ); } // Initialize light bar if (RunningPlatform == RunningPlatform.Linux && (GamepadGuids[which].Equals("4c05c405") || GamepadGuids[which].Equals("4c05cc09"))) { // Get all of the individual PS4 LED instances List <string> ledList = new List <string>(); string[] dirs = Directory.GetDirectories("/sys/class/leds/"); foreach (string dir in dirs) { if (dir.EndsWith("blue") && (dir.Contains("054C:05C4") || dir.Contains("054C:09CC"))) { ledList.Add(dir.Substring(0, dir.LastIndexOf(':') + 1)); } } // Find how many of these are already in use int numLights = 0; for (int i = 0; i < GamepadLightBars.Length; i += 1) { if (!string.IsNullOrEmpty(GamepadLightBars[i])) { numLights += 1; } } // If all are not already in use, use the first unused light if (numLights < ledList.Count) { GamepadLightBars[which] = ledList[numLights]; } } }