public static GamePadState GetGamePadState(int index, GamePadDeadZone deadZoneMode) { IntPtr device = _gamepadDevices[index]; if (device == IntPtr.Zero) { return(new GamePadState()); } GamePadButtons gc_buttonState = 0; // Sticks Vec2 stickLeft = new Vec2( SDL_GameControllerGetAxis( device, SdlGameControllerAxis.SdlControllerAxisLeftx ) / 32767.0f, SDL_GameControllerGetAxis( device, SdlGameControllerAxis.SdlControllerAxisLefty ) / -32767.0f ); Vec2 stickRight = new Vec2( SDL_GameControllerGetAxis( device, SdlGameControllerAxis.SdlControllerAxisRightx ) / 32767.0f, SDL_GameControllerGetAxis( device, SdlGameControllerAxis.SdlControllerAxisRighty ) / -32767.0f ); gc_buttonState |= ConvertStickValuesToButtons( stickLeft, GamePadButtons.LeftThumbstickLeft, GamePadButtons.LeftThumbstickRight, GamePadButtons.LeftThumbstickUp, GamePadButtons.LeftThumbstickDown, GamePad.LEFT_DEAD_ZONE ); gc_buttonState |= ConvertStickValuesToButtons( stickRight, GamePadButtons.RightThumbstickLeft, GamePadButtons.RightThumbstickRight, GamePadButtons.RightThumbstickUp, GamePadButtons.RightThumbstickDown, GamePad.RIGHT_DEAD_ZONE ); // Triggers float triggerLeft = SDL_GameControllerGetAxis( device, SdlGameControllerAxis.SdlControllerAxisTriggerleft ) / 32767.0f; float triggerRight = (float)SDL_GameControllerGetAxis( device, SdlGameControllerAxis.SdlControllerAxisTriggerright ) / 32767.0f; if (triggerLeft > GamePad.TRIGGER_THRESHOLD) { gc_buttonState |= GamePadButtons.LeftTrigger; } if (triggerRight > GamePad.TRIGGER_THRESHOLD) { gc_buttonState |= GamePadButtons.RightTrigger; } // Buttons if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonA) != 0) { gc_buttonState |= GamePadButtons.A; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonB) != 0) { gc_buttonState |= GamePadButtons.B; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonX) != 0) { gc_buttonState |= GamePadButtons.X; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonY) != 0) { gc_buttonState |= GamePadButtons.Y; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonBack) != 0) { gc_buttonState |= GamePadButtons.Back; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonGuide) != 0) { gc_buttonState |= GamePadButtons.BigButton; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonStart) != 0) { gc_buttonState |= GamePadButtons.Start; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonLeftstick) != 0) { gc_buttonState |= GamePadButtons.LeftStick; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonRightstick) != 0) { gc_buttonState |= GamePadButtons.RightStick; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonLeftshoulder) != 0) { gc_buttonState |= GamePadButtons.LeftShoulder; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonRightshoulder) != 0) { gc_buttonState |= GamePadButtons.RightShoulder; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonDpadUp) != 0) { gc_buttonState |= GamePadButtons.DPadUp; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonDpadDown) != 0) { gc_buttonState |= GamePadButtons.DPadDown; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonDpadLeft) != 0) { gc_buttonState |= GamePadButtons.DPadLeft; } if (SDL_GameControllerGetButton(device, SdlGameControllerButton.SdlControllerButtonDpadRight) != 0) { gc_buttonState |= GamePadButtons.DPadRight; } // Build the GamePadState, increment PacketNumber if state changed. GamePadState gc_builtState = new GamePadState( new GamePadThumbSticks(stickLeft, stickRight, deadZoneMode), new GamePadTriggers(triggerLeft, triggerRight, deadZoneMode), gc_buttonState ); gc_builtState.IsConnected = true; gc_builtState.PacketNumber = GamepadStates[index].PacketNumber; if (gc_builtState != GamepadStates[index]) { gc_builtState.PacketNumber += 1; GamepadStates[index] = gc_builtState; } return(gc_builtState); }
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]; } } }