Example #1
0
        private void SendActions(JoystickState state)
        {
            int          actionCode  = -1;
            GamePadState betterState = new GamePadState(_diListener.Converter, ref state);

            // buttons
            if (actionCode == -1)
            {
                int button = -1;
                for (int i = 0; i < betterState.ButtonCount; i++)
                {
                    if (betterState.IsButtonDown(i))
                    {
                        button = i;
                        break;
                    }
                }

                if (button != -1)
                {
                    if ((button >= 0) && (button <= 19))
                    {
                        // don't need no stinkin' enum-constants here....
                        actionCode = 3030 + button;
                    }
                }
            }

            // pov
            if (actionCode == -1)
            {
                for (int i = 0; i < betterState.PovCount; i++)
                {
                    switch (betterState.GetPov(i))
                    {
                    case 0:
                        actionCode = (int)joyButton.povN;
                        break;

                    case 4500:
                        actionCode = (int)joyButton.povNE;
                        break;

                    case 9000:
                        actionCode = (int)joyButton.povE;
                        break;

                    case 13500:
                        actionCode = (int)joyButton.povSE;
                        break;

                    case 18000:
                        actionCode = (int)joyButton.povS;
                        break;

                    case 22500:
                        actionCode = (int)joyButton.povSW;
                        break;

                    case 27000:
                        actionCode = (int)joyButton.povW;
                        break;

                    case 31500:
                        actionCode = (int)joyButton.povNW;
                        break;
                    }

                    if (actionCode != -1)
                    {
                        break;
                    }
                }
            }

            // axes
            if (actionCode == -1)
            {
                if (betterState.AvailableAxes.HasFlag(Axes.X) &&
                    Math.Abs(betterState.GetAxis(Axes.X)) > _config.AxisLimit)
                {
                    if (betterState.GetAxis(Axes.X) > 0)
                    {
                        actionCode = (int)joyButton.axisXUp; // right
                    }
                    else
                    {
                        actionCode = (int)joyButton.axisXDown; // left
                    }
                }
                else if (betterState.AvailableAxes.HasFlag(Axes.Y) &&
                         Math.Abs(betterState.GetAxis(Axes.Y)) > _config.AxisLimit)
                {
                    if (betterState.GetAxis(Axes.Y) > 0)
                    {
                        actionCode = (int)joyButton.axisYUp; // down
                    }
                    else
                    {
                        actionCode = (int)joyButton.axisYDown; // up
                    }
                }
                else if (betterState.AvailableAxes.HasFlag(Axes.Z) &&
                         Math.Abs(betterState.GetAxis(Axes.Z)) > _config.AxisLimit)
                {
                    if (betterState.GetAxis(Axes.Z) > 0)
                    {
                        actionCode = (int)joyButton.axisZUp;
                    }
                    else
                    {
                        actionCode = (int)joyButton.axisZDown;
                    }
                }
                else if (betterState.AvailableAxes.HasFlag(Axes.RotationX) &&
                         Math.Abs(betterState.GetAxis(Axes.RotationX)) > _config.AxisLimit)
                {
                    if (betterState.GetAxis(Axes.RotationX) > 0)
                    {
                        actionCode = (int)joyButton.rotationXUp;
                    }
                    else
                    {
                        actionCode = (int)joyButton.rotationXDown;
                    }
                }
                else if (betterState.AvailableAxes.HasFlag(Axes.RotationY) &&
                         Math.Abs(betterState.GetAxis(Axes.RotationY)) > _config.AxisLimit)
                {
                    if (betterState.GetAxis(Axes.RotationY) > 0)
                    {
                        actionCode = (int)joyButton.rotationYUp;
                    }
                    else
                    {
                        actionCode = (int)joyButton.rotationYDown;
                    }
                }
                else if (betterState.AvailableAxes.HasFlag(Axes.RotationZ) &&
                         Math.Abs(betterState.GetAxis(Axes.RotationZ)) > _config.AxisLimit)
                {
                    if (betterState.GetAxis(Axes.RotationZ) > 0)
                    {
                        actionCode = (int)joyButton.rotationZUp;
                    }
                    else
                    {
                        actionCode = (int)joyButton.rotationZDown;
                    }
                }
            }

            if (actionCode != -1 && RemoteCallback != null)
            {
                string keyCode = TranslateActionCode(actionCode);
                IrssLog.Debug("DirectInput action mapped actionCode={0} to keyCode={1}", actionCode, keyCode);

                RemoteCallback(Name, keyCode);
            }
        }