Пример #1
0
        public static GamePad GetPadState(int nUserIdx)
        {
            XINPUT_STATE st = new XINPUT_STATE();
            unsafe
            {
                if (XInputGetState(nUserIdx, &st) != 0)
                    return null;
            }

            GamePad gp = new GamePad();
            gp.dwPacketNumber = st.dwPacketNumber;
            gp.Buttons = st.Gamepad.wButtons;
            gp.LeftTrigger = apply_thresh(st.Gamepad.bLeftTrigger, XInput.TriggerThresh, XInput.TriggerMax);
            gp.RightTrigger = apply_thresh(st.Gamepad.bRightTrigger, XInput.TriggerThresh, XInput.TriggerMax);
            //if (m_settings.LThumbToDPad)
            //{
                gp.ThumbL = apply_thresh_2d(st.Gamepad.sThumbLX, st.Gamepad.sThumbLY, XInput.LeftThumbThresh, XInput.ThumbstickMax);
                gp.ThumbR = apply_thresh_2d(st.Gamepad.sThumbRX, st.Gamepad.sThumbRY, XInput.RightThumbThresh, XInput.ThumbstickMax);
            /*}
            else
            {
                gp.ThumbL = apply_thresh_2d(st.Gamepad.sThumbLX, st.Gamepad.sThumbLY, XInput.LeftThumbThresh, XInput.ThumbstickMax);
                gp.ThumbR = apply_thresh_2d(st.Gamepad.sThumbRX, st.Gamepad.sThumbRY, XInput.RightThumbThresh, XInput.ThumbstickMax);
            }*/
            return gp;
        }
Пример #2
0
        public void Update()
        {
            if (_controller.IsConnected == false)
            {
                return;
            }

            if (XInputGetStateExProc != null)
            {
                _state = new XINPUT_STATE();
                XInputGetStateExProc(_index0, out _state);
            }
            else
            {
                var slimState = _controller.GetState();
                _state.dwPacketNumber        = slimState.PacketNumber;
                _state.Gamepad.wButtons      = (ushort)slimState.Gamepad.Buttons;
                _state.Gamepad.sThumbLX      = slimState.Gamepad.LeftThumbX;
                _state.Gamepad.sThumbLY      = slimState.Gamepad.LeftThumbY;
                _state.Gamepad.sThumbRX      = slimState.Gamepad.RightThumbX;
                _state.Gamepad.sThumbRY      = slimState.Gamepad.RightThumbY;
                _state.Gamepad.bLeftTrigger  = slimState.Gamepad.LeftTrigger;
                _state.Gamepad.bRightTrigger = slimState.Gamepad.RightTrigger;
            }
        }
Пример #3
0
        public MainWindow()
        {
            InitializeComponent();

            Task.Factory.StartNew(() => {
                while (true)
                {
                    XINPUT_STATE nextState = new XINPUT_STATE();
                    int result             = XInputWrapper.GetState(0, ref nextState);
                    if (result == XInput.ERROR_DEVICE_NOT_CONNECTED)
                    {
                        Console.WriteLine("Not Connected");
                    }
                    else
                    {
                        if (!GamePadState.Equals(nextState))
                        {
                            GamePadState = nextState;
                            Dispatcher.Invoke(() =>
                            {
                                Draw();
                            });
                        }
                    }

                    Thread.Sleep(5);
                }
            });
        }
Пример #4
0
        private static bool IsSerialOccupied(int serial)
        {
            if (--serial < 0 || serial > 3)
            {
                throw new ArgumentException(string.Format("Serial index ({0}) must be within range", serial));
            }

            var state = new XINPUT_STATE();

            return(XInputNatives.XInputGetState((uint)serial, ref state) == ResultWin32.ERROR_SUCCESS);
        }
        public static int Poll(int deviceno, out XINPUT_STATE currState, out XINPUT_STATE prevState)
        {
            CurrXInputStateIndices[deviceno] ^= 1;
            var index           = CurrXInputStateIndices[deviceno];
            var currStateHandle = XInputStates[deviceno, index];
            var hr = XInputGetState(deviceno, currStateHandle.AddrOfPinnedObject());

#pragma warning disable CS8605 // Unboxing a possibly null value.
            currState = (XINPUT_STATE)currStateHandle.Target;
            prevState = (XINPUT_STATE)XInputStates[deviceno, index ^ 1].Target;
#pragma warning restore CS8605 // Unboxing a possibly null value.
            return(hr);
        }
Пример #6
0
        public InputState(XINPUT_STATE inputState)
        {
            PacketNumber = inputState.dwPacketNumber;

            LeftAnalogX  = inputState.Gamepad.sThumbLX;
            LeftAnalogY  = inputState.Gamepad.sThumbLY;
            RightAnalogX = inputState.Gamepad.sThumbRX;
            RightAnalogY = inputState.Gamepad.sThumbRY;

            LTPressed = inputState.Gamepad.bLeftTrigger;
            RTPressed = inputState.Gamepad.bRightTrigger;

            AssignButtons(inputState.Gamepad.wButtons);
        }
Пример #7
0
        unsafe bool CreateDevices()
        {
            // check for XInput presense
            haveXInput = XInput.IsXInputPresent();

            if (haveXInput)
            {
                XINPUT_STATE state = new XINPUT_STATE();

                for (int n = 0; n < XInput.MaxControllers; n++)
                {
                    int result = XInput.GetState(n, ref state);
                    if (!XInputNativeWrapper.Wrapper.FAILED(result))
                    {
                        string name = string.Format("XBox Controller {0}", n);

                        WindowsXBoxGamepad device = new WindowsXBoxGamepad(name, n);
                        if (!device.Init())
                        {
                            device.CallOnShutdown();
                            continue;
                        }

                        RegisterDevice(device);
                    }
                }
            }

            // check for DirectInput devices

            //int hr = IDirectInput.EnumDevices( directInput, DInput.DI8DEVCLASS_GAMECTRL,
            //		EnumDevicesHandler, null, DInput.DIEDFL_ATTACHEDONLY );

            //if( global::DirectInput.Wrapper.FAILED( hr ) )
            //{
            //	Log.Warning( "WindowsInputDeviceManager: IDirectInput.EnumDevices failed ({0}).",
            //		DInput.GetOutString( DInput.DXGetErrorStringW( hr ) ) );
            //	return false;
            //}

            return(true);
        }
Пример #8
0
        public void ReadState()
        {
            var inputState = new XINPUT_STATE();

            _driver.GetState(_dwUserIndex, ref inputState);

            PreviousInputState = InputState;
            InputState         = new InputState(inputState);
            if (PreviousInputState == null)
            {
                PreviousInputState = InputState;
            }

            var batteryInformation = new XINPUT_BATTERY_INFORMATION();

            _driver.GetBatteryInformation(_dwUserIndex, _devType, ref batteryInformation);

            PreviousBatteryState = BatteryState;
            BatteryState         = new BatteryState(batteryInformation);
            if (PreviousBatteryState == null)
            {
                PreviousBatteryState = BatteryState;
            }
        }
Пример #9
0
 public static uint XInputGetStateEx(uint dwUserIndex, ref XINPUT_STATE pState)
 {
     throw new NotImplementedException();
 }
Пример #10
0
 public static uint XInputGetState(uint dwUserIndex, ref XINPUT_STATE pState)
 {
     return(OriginalXInputGetStateFunction.Value(dwUserIndex, ref pState));
 }
Пример #11
0
		public static int  GetJoypadXInputState( int  InputType, out XINPUT_STATE  XInputState)
		{
			if( System.IntPtr.Size == 4 )
			{
				return dx_GetJoypadXInputState_x86( InputType , out XInputState );
			}
			else
			{
				return dx_GetJoypadXInputState_x64( InputType , out XInputState );
			}
		}
Пример #12
0
 public static uint XInputGetState(uint dwUserIndex, ref XINPUT_STATE pState)
 {
     return OriginalXInputGetStateFunction.Value(dwUserIndex, ref pState);
 }
Пример #13
0
 public static extern uint XInputGetState(uint dwUserIndex, ref XINPUT_STATE pState);
Пример #14
0
 private static unsafe extern int XInputGetState(int idx, XINPUT_STATE* state);
Пример #15
0
        private bool UpdateState(int controller)
        {
            XINPUT_STATE pState = new XINPUT_STATE();
            UInt32       err    = XInputGetState((UInt32)controller, ref pState);

            if (err != ERROR_SUCCESS)
            {
                return(false);
            }

            if (pState.dwPacketNumber == lastPacketNumber[controller])
            {
                // Controller state hasn't changed since last time
                return(true);
            }

            lastPacketNumber[controller] = pState.dwPacketNumber;

            XINPUT_GAMEPAD_BUTTONS buttons = pState.Gamepad.wButtons;

            // Face buttons
            buttonStates[controller, (int)XInputElement.BTN_A] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_A);
            buttonStates[controller, (int)XInputElement.BTN_B] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_B);
            buttonStates[controller, (int)XInputElement.BTN_X] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_X);
            buttonStates[controller, (int)XInputElement.BTN_Y] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_Y);

            buttonStates[controller, (int)XInputElement.BTN_BACK]  = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_BACK);
            buttonStates[controller, (int)XInputElement.BTN_START] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_START);

            // D-pad
            buttonStates[controller, (int)XInputElement.BTN_DPAD_UP]    = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_UP);
            buttonStates[controller, (int)XInputElement.BTN_DPAD_DOWN]  = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_DOWN);
            buttonStates[controller, (int)XInputElement.BTN_DPAD_LEFT]  = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_LEFT);
            buttonStates[controller, (int)XInputElement.BTN_DPAD_RIGHT] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_RIGHT);

            // Thumb buttons
            buttonStates[controller, (int)XInputElement.BTN_LSTICK] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_LEFT_THUMB);
            buttonStates[controller, (int)XInputElement.BTN_RSTICK] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_RIGHT_THUMB);

            // Shoulder buttons
            buttonStates[controller, (int)XInputElement.BTN_LSHOULDER] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_RIGHT);
            buttonStates[controller, (int)XInputElement.BTN_RSHOULDER] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_RIGHT);

            // Translate analog triggers to buttons
            buttonStates[controller, (int)XInputElement.BTN_LTRIGGER] = pState.Gamepad.bLeftTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
            buttonStates[controller, (int)XInputElement.BTN_RTRIGGER] = pState.Gamepad.bRightTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD;

            // Translate analog sticks to buttons
            Int16 lStickX = pState.Gamepad.sThumbLX;
            Int16 lStickY = pState.Gamepad.sThumbLY;

            if (Math.Sqrt(lStickX * lStickX + lStickY * lStickY) > XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE)
            {
                double angle = Math.Atan2(lStickY, lStickX) + Math.PI;

                buttonStates[controller, (int)XInputElement.BTN_LSTICK_UP]    = (angle >= 3.53429174 && angle <= 5.89048623);
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_DOWN]  = (angle >= 0.39269908 && angle <= 2.74889357);
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_LEFT]  = (angle >= 5.10508806 || angle <= 1.17809725);
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_RIGHT] = (angle >= 1.96349541 && angle <= 4.3196899);
            }
            else
            {
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_UP]    = false;
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_DOWN]  = false;
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_LEFT]  = false;
                buttonStates[controller, (int)XInputElement.BTN_LSTICK_RIGHT] = false;
            }

            Int16 rStickX = pState.Gamepad.sThumbLX;
            Int16 rStickY = pState.Gamepad.sThumbLY;

            if (Math.Sqrt(rStickX * rStickX + rStickY * rStickY) > XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
            {
                double angle = Math.Atan2(lStickY, lStickX) + Math.PI;

                buttonStates[controller, (int)XInputElement.BTN_RSTICK_UP]    = (angle >= 3.53429174 && angle <= 5.89048623);
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_DOWN]  = (angle >= 0.39269908 && angle <= 2.74889357);
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_LEFT]  = (angle >= 5.10508806 || angle <= 1.17809725);
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_RIGHT] = (angle >= 1.96349541 && angle <= 4.3196899);
            }
            else
            {
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_UP]    = false;
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_DOWN]  = false;
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_LEFT]  = false;
                buttonStates[controller, (int)XInputElement.BTN_RSTICK_RIGHT] = false;
            }

            return(true);
        }
Пример #16
0
 private static extern UInt32 XInputGetState(UInt32 dwUserIndex, ref XINPUT_STATE pState);
Пример #17
0
		public void Update()
		{
			if (controller.IsConnected == false)
				return;

			if (XInputGetStateExProc != null)
			{
				state = new XINPUT_STATE();
				XInputGetStateExProc(0, out state);
			}
			else
			{
				var slimstate = controller.GetState();
				state.dwPacketNumber = slimstate.PacketNumber;
				state.Gamepad.wButtons = (ushort)slimstate.Gamepad.Buttons;
				state.Gamepad.sThumbLX = slimstate.Gamepad.LeftThumbX;
				state.Gamepad.sThumbLY = slimstate.Gamepad.LeftThumbY;
				state.Gamepad.sThumbRX = slimstate.Gamepad.RightThumbX;
				state.Gamepad.sThumbRY = slimstate.Gamepad.RightThumbY;
				state.Gamepad.bLeftTrigger = slimstate.Gamepad.LeftTrigger;
				state.Gamepad.bRightTrigger = slimstate.Gamepad.RightTrigger;
			}
		}
Пример #18
0
 public static extern uint XInputGetState
 (
     [In] uint dwUserIndex,     // Index of the gamer associated with the device
     [Out] XINPUT_STATE pState  // Receives the current state
 );
Пример #19
0
 public static uint XInputGetStateEx(uint dwUserIndex, ref XINPUT_STATE pState)
 {
     throw new NotImplementedException();
 }
Пример #20
0
        public static uint XInputGetState(uint dwUserIndex, ref XINPUT_STATE pState)
        {
#if !EXPERIMENTAL
            return(OriginalXInputGetStateFunction.Value(dwUserIndex, ref pState));
#else
            if (OriginalXInputGetStateFunction.Value(dwUserIndex, ref pState) == ResultWin32.ERROR_SUCCESS)
            {
                return(ResultWin32.ERROR_SUCCESS);
            }

            try
            {
                ScpHidReport report = null;

                while (dwUserIndex == 0 && (report = Proxy.GetReport(dwUserIndex)) == null)
                {
                    Thread.Sleep(100);
                }

                if (report == null || report.PadState != DsState.Connected)
                {
                    return(ResultWin32.ERROR_DEVICE_NOT_CONNECTED);
                }

                var xPad = new XINPUT_GAMEPAD();

                pState.dwPacketNumber = report.PacketCounter;

                switch (report.Model)
                {
                case DsModel.DS3:
                {
                    // select & start
                    xPad.wButtons |= (ushort)report[Ds3Button.Select].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Start].Xbox360Button;

                    // d-pad
                    xPad.wButtons |= (ushort)report[Ds3Button.Up].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Right].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Down].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Left].Xbox360Button;

                    // shoulders
                    xPad.wButtons |= (ushort)report[Ds3Button.L1].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.R1].Xbox360Button;

                    // face buttons
                    xPad.wButtons |= (ushort)report[Ds3Button.Triangle].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Circle].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Cross].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Square].Xbox360Button;

                    // PS/Guide
                    xPad.wButtons |= (ushort)report[Ds3Button.Ps].Xbox360Button;

                    // thumbs
                    xPad.wButtons |= (ushort)report[Ds3Button.L3].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.R3].Xbox360Button;

                    // triggers
                    xPad.bLeftTrigger  = report[Ds3Axis.L2].Value;
                    xPad.bRightTrigger = report[Ds3Axis.R2].Value;

                    // thumb axes
                    xPad.sThumbLX = (short)+DsMath.Scale(report[Ds3Axis.Lx].Value, false);
                    xPad.sThumbLY = (short)-DsMath.Scale(report[Ds3Axis.Ly].Value, false);
                    xPad.sThumbRX = (short)+DsMath.Scale(report[Ds3Axis.Rx].Value, false);
                    xPad.sThumbRY = (short)-DsMath.Scale(report[Ds3Axis.Ry].Value, false);
                }
                break;

                case DsModel.DS4:
                {
                    // select & start
                    xPad.wButtons |= (ushort)report[Ds4Button.Share].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Options].Xbox360Button;

                    // d-pad
                    xPad.wButtons |= (ushort)report[Ds4Button.Up].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Right].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Down].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Left].Xbox360Button;

                    // shoulders
                    xPad.wButtons |= (ushort)report[Ds4Button.L1].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.R1].Xbox360Button;

                    // face buttons
                    xPad.wButtons |= (ushort)report[Ds4Button.Triangle].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Circle].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Cross].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Square].Xbox360Button;

                    // PS/Guide
                    xPad.wButtons |= (ushort)report[Ds4Button.Ps].Xbox360Button;

                    // thumbs
                    xPad.wButtons |= (ushort)report[Ds4Button.L3].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.R3].Xbox360Button;

                    // triggers
                    xPad.bLeftTrigger  = report[Ds4Axis.L2].Value;
                    xPad.bRightTrigger = report[Ds4Axis.R2].Value;

                    // thumb axes
                    xPad.sThumbLX = (short)+DsMath.Scale(report[Ds4Axis.Lx].Value, false);
                    xPad.sThumbLY = (short)-DsMath.Scale(report[Ds4Axis.Ly].Value, false);
                    xPad.sThumbRX = (short)+DsMath.Scale(report[Ds4Axis.Rx].Value, false);
                    xPad.sThumbRY = (short)-DsMath.Scale(report[Ds4Axis.Ry].Value, false);
                }
                break;
                }

                pState.Gamepad = xPad;
            }
            catch (Exception ex)
            {
                Log.ErrorFormat("Unexpected error: {0}", ex);
                return(ResultWin32.ERROR_DEVICE_NOT_CONNECTED);
            }

            return(ResultWin32.ERROR_SUCCESS);
#endif
        }
Пример #21
0
		extern static int  dx_GetJoypadXInputState_x64( int  InputType, out XINPUT_STATE  XInputState);
Пример #22
0
 private static extern uint XInputGetState(uint index, ref XINPUT_STATE result);
Пример #23
0
 /// <summary>
 /// XInputGetStateEX OrdinalNo=#100
 /// 非公開関数:ガイドボタン状態もふくむGetState
 /// <summary>
 public static uint GetStateEx(uint dwUserIndex, ref XINPUT_STATE pState)
 {
     return(func_XInputGetStateEx(dwUserIndex, ref pState));
 }
Пример #24
0
        protected override void OnUpdateState()
        {
            XINPUT_STATE state = new XINPUT_STATE();

            int result = XInput.GetState(controllerIndex, ref state);

            if (XInputNativeWrapper.Wrapper.FAILED(result))
            {
                return;
            }

            ////////////////////////////////////////

            if (state.Gamepad.sThumbLX < XInput.XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE &&
                state.Gamepad.sThumbLX > -XInput.XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE)
            {
                state.Gamepad.sThumbLX = 0;
            }

            if (state.Gamepad.sThumbLY < XInput.XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE &&
                state.Gamepad.sThumbLY > -XInput.XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE)
            {
                state.Gamepad.sThumbLY = 0;
            }

            if (state.Gamepad.sThumbRX < XInput.XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&
                state.Gamepad.sThumbRX > -XInput.XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
            {
                state.Gamepad.sThumbRX = 0;
            }

            if (state.Gamepad.sThumbRY < XInput.XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&
                state.Gamepad.sThumbRY > -XInput.XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
            {
                state.Gamepad.sThumbRY = 0;
            }

            if (state.Gamepad.bLeftTrigger < XInput.XINPUT_GAMEPAD_TRIGGER_THRESHOLD)
            {
                state.Gamepad.bLeftTrigger = 0;
            }

            if (state.Gamepad.bRightTrigger < XInput.XINPUT_GAMEPAD_TRIGGER_THRESHOLD)
            {
                state.Gamepad.bRightTrigger = 0;
            }

            ////////////////////////////////////////

            JoystickPOVDirections direction = JoystickPOVDirections.Centered;

            if ((state.Gamepad.wButtons & XInput.XINPUT_GAMEPAD_DPAD_DOWN) != 0)
            {
                direction |= JoystickPOVDirections.South;
            }
            if ((state.Gamepad.wButtons & XInput.XINPUT_GAMEPAD_DPAD_UP) != 0)
            {
                direction |= JoystickPOVDirections.North;
            }
            if ((state.Gamepad.wButtons & XInput.XINPUT_GAMEPAD_DPAD_RIGHT) != 0)
            {
                direction |= JoystickPOVDirections.East;
            }
            if ((state.Gamepad.wButtons & XInput.XINPUT_GAMEPAD_DPAD_LEFT) != 0)
            {
                direction |= JoystickPOVDirections.West;
            }

            if (POVs[0].Value != direction)
            {
                POVs[0].Value = direction;

                InputDeviceManager.Instance.SendEvent(
                    new JoystickPOVChangedEvent(this, POVs[0]));
            }

            ////////////////////////////////////////

            for (int n = 0; n < 10; n++)
            {
                uint bits = 0;

                switch (n)
                {
                case 0: bits = XInput.XINPUT_GAMEPAD_A; break;

                case 1: bits = XInput.XINPUT_GAMEPAD_B; break;

                case 2: bits = XInput.XINPUT_GAMEPAD_X; break;

                case 3: bits = XInput.XINPUT_GAMEPAD_Y; break;

                case 4: bits = XInput.XINPUT_GAMEPAD_LEFT_SHOULDER; break;

                case 5: bits = XInput.XINPUT_GAMEPAD_RIGHT_SHOULDER; break;

                case 6: bits = XInput.XINPUT_GAMEPAD_BACK; break;

                case 7: bits = XInput.XINPUT_GAMEPAD_START; break;

                case 8: bits = XInput.XINPUT_GAMEPAD_LEFT_THUMB; break;

                case 9: bits = XInput.XINPUT_GAMEPAD_RIGHT_THUMB; break;
                }

                bool pressed = (state.Gamepad.wButtons & bits) != 0;

                if (Buttons[n].Pressed != pressed)
                {
                    Buttons[n].Pressed = pressed;

                    if (pressed)
                    {
                        InputDeviceManager.Instance.SendEvent(
                            new JoystickButtonDownEvent(this, Buttons[n]));
                    }
                    else
                    {
                        InputDeviceManager.Instance.SendEvent(
                            new JoystickButtonUpEvent(this, Buttons[n]));
                    }
                }
            }

            ////////////////////////////////////////

            {
                float value = (float)state.Gamepad.sThumbLX;
                value /= (value > 0) ? 32767.0f : 32768.0f;

                if (Axes[0].Value != value)
                {
                    Axes[0].Value = value;
                    InputDeviceManager.Instance.SendEvent(
                        new JoystickAxisChangedEvent(this, Axes[0]));
                }
            }

            {
                float value = (float)state.Gamepad.sThumbLY;
                value /= (value > 0) ? 32767.0f : 32768.0f;

                if (Axes[1].Value != value)
                {
                    Axes[1].Value = value;
                    InputDeviceManager.Instance.SendEvent(
                        new JoystickAxisChangedEvent(this, Axes[1]));
                }
            }

            {
                float value = (float)state.Gamepad.sThumbRX;
                value /= (value > 0) ? 32767.0f : 32768.0f;

                if (Axes[2].Value != value)
                {
                    Axes[2].Value = value;
                    InputDeviceManager.Instance.SendEvent(
                        new JoystickAxisChangedEvent(this, Axes[2]));
                }
            }

            {
                float value = (float)state.Gamepad.sThumbRY;
                value /= (value > 0) ? 32767.0f : 32768.0f;

                if (Axes[3].Value != value)
                {
                    Axes[3].Value = value;
                    InputDeviceManager.Instance.SendEvent(
                        new JoystickAxisChangedEvent(this, Axes[3]));
                }
            }

            {
                float value = (float)state.Gamepad.bLeftTrigger / 255.0f;

                if (Axes[4].Value != value)
                {
                    Axes[4].Value = value;
                    InputDeviceManager.Instance.SendEvent(
                        new JoystickAxisChangedEvent(this, Axes[4]));
                }
            }

            {
                float value = (float)state.Gamepad.bRightTrigger / 255.0f;

                if (Axes[5].Value != value)
                {
                    Axes[5].Value = value;
                    InputDeviceManager.Instance.SendEvent(
                        new JoystickAxisChangedEvent(this, Axes[5]));
                }
            }
        }