Пример #1
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);
                }
            });
        }
Пример #2
0
        private void Process()
        {
            while (!_closed)
            {
                _permit.Wait();

                if (!_gamepad.IsConnected())
                {
                    Thread.Sleep(500);
                    continue;
                }
                // update battery info
                GamePadBatteryLevel currentBatteryLevel = _gamepad.GetBatteryInfo();
                if (_batteryLevel != currentBatteryLevel)
                {
                    _batteryLevel = currentBatteryLevel;
                    OnBatteryLevelChanged?.Invoke(_batteryLevel);
                }

                int dwResult = XInputWrapper.XInputGetState(_gamepad.GetNumber(), ref _state);
                if (dwResult == XInputWrapper.ERROR_SUCCESS)
                {
                    // send input
                    SetInput(_state, InputType.Clicked, Controller.GetProfile().RepeatMode);
                }
                Thread.Sleep(_delay);
            }
        }
Пример #3
0
        public bool IsConnected()
        {
            int dwResult;

            for (int i = 0; i < XInputWrapper.XUSER_MAX_COUNT; i++)
            {
                dwResult = XInputWrapper.XInputGetState(i, ref _state);

                if (dwResult == XInputWrapper.ERROR_SUCCESS)
                {
                    _gamepadNumber = i;

                    return(true);
                }
            }
            _gamepadNumber = -1;

            return(false);
        }
Пример #4
0
        public GamePadBatteryLevel GetBatteryInfo()
        {
            uint result = XInputWrapper.XInputGetBatteryInformation(_gamepadNumber, 0x00, ref batteryInfo);

            switch (batteryInfo.BatteryLevel)
            {
            case 0:
                return(GamePadBatteryLevel.Empty);

            case 1:
                return(GamePadBatteryLevel.Low);

            case 2:
                return(GamePadBatteryLevel.Medium);

            case 3:
                return(GamePadBatteryLevel.Full);

            default:
                return(GamePadBatteryLevel.Empty);
            }
        }
Пример #5
0
 public ControlerManager()
 {
     xInput = new XInputWrapper();
 }
Пример #6
0
        private void SetInput(XInputState st, InputType itype, RepeatType rmode)
        {
            bool             isOutDeadzone = false;
            GamePadEventType currentStick  = GamePadEventType.LeftThumbStick;

            //Left Thumb Stick
            float LX = st.Gamepad.SThumbLX;
            float LY = st.Gamepad.SThumbLY;

            float magnitudeL = (float)Math.Sqrt(LX * LX + LY * LY);

            float normalizedLX = LX / magnitudeL;
            float normalizedLY = LY / magnitudeL;

            if (magnitudeL > (float)XInputWrapper.GP.XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE)
            {
                isOutDeadzone = true;
                currentStick  = GamePadEventType.LeftThumbStick;
            }

            //Right Thumb Stick
            float RX = st.Gamepad.SThumbRX;
            float RY = st.Gamepad.SThumbRY;

            float magnitudeR = (float)Math.Sqrt(RX * RX + RY * RY);

            float normalizedRX = RX / magnitudeR;
            float normalizedRY = RY / magnitudeR;

            if (magnitudeR > (float)XInputWrapper.GP.XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
            {
                isOutDeadzone = true;
                currentStick  = GamePadEventType.RightThumbStick;
            }

            //lock
            if ((st.Gamepad.WButtons == 48) && isOutDeadzone == false)
            {
                _isStandby = !_isStandby;
                Thread.Sleep(500);
                _currentPacketNumber = st.DwPacketNumber;
            }
            if (_isStandby)
            {
                return;
            }

            if (isOutDeadzone)
            {
                ExecuteAction(st, currentStick, itype);
            }

            //EMULATE BUTTONS
            if (rmode == RepeatType.NoRepeats && _currentPacketNumber == st.DwPacketNumber)
            {
                return;
            }

            //Buttons
            if (st.Gamepad.WButtons != 0)
            {
                ExecuteAction(st, GamePadEventType.Button, itype);
            }

            //Left trigger
            if (st.Gamepad.BLeftTrigger > 254)
            {
                ExecuteAction(st, GamePadEventType.LeftTrigger, itype);
            }

            //Right trigger
            if (st.Gamepad.BRightTrigger > 254)
            {
                ExecuteAction(st, GamePadEventType.RightTrigger, itype);
            }

            st.ZeroMemory();
            XInputWrapper.XInputGetState(_gamepad.GetNumber(), ref st);
            _currentPacketNumber = st.DwPacketNumber;
        }