示例#1
0
        public JoystickStatus PollStatus()
        {
            JoyInfoEx info = new JoyInfoEx();

            info.Size      = (uint)Marshal.SizeOf(info);
            info.SetFields = JoySetFields.ReturnAll;

            JoyResult result = NativeMethods.JoyGetPosEx(_info.Id, ref info);

            if (result != JoyResult.OK)
            {
                throw new InvalidOperationException("Could not poll joystick status. Error returned: " + result);
            }

            return(new JoystickStatus(_info, info));
        }
        protected unsafe override void UpdateGamePadStates()
        {
            uint    index = GetJoystickByNumber();
            JoyCaps caps;

            joyGetDevCaps(index, out caps, joyCapsSize);
            var info = new JoyInfoEx
            {
                Size  = (uint)Marshal.SizeOf(typeof(JoyInfoEx)),
                Flags = (uint)JoystickDwFlags.JoyAll
            };

            joyGetPosEx(index, &info);
            UpdateAllButtons((JoystickButtons)info.Buttons);
            UpdateDPadButtons(info.Pov);
            triggerLeft  = info.Zpos == 65407 ? 1 : 0;
            triggerRight = info.Zpos == 127 ? 1 : 0;
            xAxisLeft    = ((info.Xpos - caps.wXmin) * (2f / (caps.wXmax - caps.wXmin))) - 1f;
            yAxisLeft    = ((info.Ypos - caps.wYmin) * (2f / (caps.wYmax - caps.wYmin))) - 1f;
            xAxisRight   = ((info.Upos - caps.wUmin) * (2f / (caps.wUmax - caps.wUmin))) - 1f;
            yAxisRight   = ((info.Rpos - caps.wRmin) * (2f / (caps.wRmax - caps.wRmin))) - 1f;
        }
示例#3
0
 public static extern int joyGetPosEx(int uJoyID, ref JoyInfoEx joyInfo);
示例#4
0
 public static extern JoystickError joyGetPosEx(int uJoyID, ref JoyInfoEx pji);
示例#5
0
        public JoystickState GetState(int index)
        {
            JoystickState state = new JoystickState();

            if (IsValid(index))
            {
                JoyInfoEx info = new JoyInfoEx();
                info.Size = JoyInfoEx.SizeInBytes;
                info.Flags = JoystickFlags.All;

                JoystickError result = UnsafeNativeMethods.joyGetPosEx(index, ref info);
                if (result == JoystickError.NoError)
                {
                    JoyCaps caps;
                    result = UnsafeNativeMethods.joyGetDevCaps(index, out caps, JoyCaps.SizeInBytes);
                    if (result == JoystickError.NoError)
                    {
                        state.SetAxis(JoystickAxis.Axis0, CalculateOffset(info.XPos, caps.XMin, caps.XMax));
                        state.SetAxis(JoystickAxis.Axis1, CalculateOffset(info.YPos, caps.YMin, caps.YMax));
                        state.SetAxis(JoystickAxis.Axis2, CalculateOffset(info.ZPos, caps.ZMin, caps.ZMax));
                        state.SetAxis(JoystickAxis.Axis3, CalculateOffset(info.RPos, caps.RMin, caps.RMax));
                        state.SetAxis(JoystickAxis.Axis4, CalculateOffset(info.UPos, caps.UMin, caps.UMax));
                        state.SetAxis(JoystickAxis.Axis5, CalculateOffset(info.VPos, caps.VMin, caps.VMax));

                        for (int i = 0; i < 16; i++)
                        {
                            state.SetButton(JoystickButton.Button0 + i, (info.Buttons & 1 << i) != 0);
                        }

                        state.SetIsConnected(true);
                    }
                }

                if (result == JoystickError.Unplugged)
                {
                    UnplugJoystick(index);
                }
            }
            else
            {
                Debug.Print("[Win] Invalid WinMM joystick device {0}", index);
            }

            return state;
        }
示例#6
0
 public static extern JoystickError joyGetPosEx(int uJoyID, ref JoyInfoEx pji);
示例#7
0
		private static extern unsafe uint joyGetPosEx(uint id, JoyInfoEx* info);
示例#8
0
 public static extern uint joyGetPosEx(int uJoyID, ref JoyInfoEx pji);
示例#9
0
 public static extern uint joyGetPosEx(int uJoyID, ref JoyInfoEx pji);
示例#10
0
        public JoystickState GetState(int player_index)
        {
            lock (sync)
            {
                JoystickState state = new JoystickState();

                if (IsValid(player_index))
                {
                    int device_index = player_to_index[player_index];
                    int index        = index_to_stick[device_index];
                    JoystickDevice <WinMMJoyDetails> stick =
                        sticks[index] as JoystickDevice <WinMMJoyDetails>;

                    // For joysticks with fewer than three axes or four buttons, we must
                    // use joyGetPos; otherwise, joyGetPosEx. This is not just a cosmetic
                    // difference, simple devices will return incorrect results if we use
                    // joyGetPosEx on them.
                    if (stick.Details.Capabilities.AxisCount <= 3 || stick.Details.Capabilities.ButtonCount <= 4)
                    {
                        // Use joyGetPos
                        JoyInfo info = new JoyInfo();

                        JoystickError result = UnsafeNativeMethods.joyGetPos(device_index, ref info);
                        if (result == JoystickError.NoError)
                        {
                            for (int i = 0; i < stick.Details.Capabilities.AxisCount; i++)
                            {
                                state.SetAxis(JoystickAxis.Axis0 + i, CalculateOffset(info.GetAxis(i), stick.Details.Min[i], stick.Details.Max[i]));
                            }

                            for (int i = 0; i < stick.Details.Capabilities.ButtonCount; i++)
                            {
                                state.SetButton(JoystickButton.Button0 + i, (info.Buttons & 1 << i) != 0);
                            }

                            state.SetIsConnected(true);
                        }
                        else if (result == JoystickError.Unplugged)
                        {
                            UnplugJoystick(player_index);
                        }
                    }
                    else
                    {
                        // Use joyGetPosEx
                        JoyInfoEx info_ex = new JoyInfoEx();
                        info_ex.Size  = JoyInfoEx.SizeInBytes;
                        info_ex.Flags = JoystickFlags.All;

                        JoystickError result = UnsafeNativeMethods.joyGetPosEx(device_index, ref info_ex);
                        if (result == JoystickError.NoError)
                        {
                            for (int i = 0; i < stick.Details.Capabilities.AxisCount; i++)
                            {
                                state.SetAxis(JoystickAxis.Axis0 + i, CalculateOffset(info_ex.GetAxis(i), stick.Details.Min[i], stick.Details.Max[i]));
                            }

                            for (int i = 0; i < stick.Details.Capabilities.ButtonCount; i++)
                            {
                                state.SetButton(JoystickButton.Button0 + i, (info_ex.Buttons & 1 << i) != 0);
                            }

                            for (int i = 0; i < stick.Details.Capabilities.HatCount; i++)
                            {
                                // A discrete POV returns specific values for left, right, etc.
                                // A continuous POV returns an integer indicating an angle in degrees * 100, e.g. 18000 == 180.00 degrees.
                                // The vast majority of joysticks have discrete POVs, so we'll treat all of them as discrete for simplicity.
                                if ((JoystickPovPosition)info_ex.Pov != JoystickPovPosition.Centered)
                                {
                                    HatPosition hatpos = HatPosition.Centered;
                                    if (info_ex.Pov < 4500 || info_ex.Pov >= 31500)
                                    {
                                        hatpos |= HatPosition.Up;
                                    }
                                    if (info_ex.Pov >= 4500 && info_ex.Pov < 13500)
                                    {
                                        hatpos |= HatPosition.Right;
                                    }
                                    if (info_ex.Pov >= 13500 && info_ex.Pov < 22500)
                                    {
                                        hatpos |= HatPosition.Down;
                                    }
                                    if (info_ex.Pov >= 22500 && info_ex.Pov < 31500)
                                    {
                                        hatpos |= HatPosition.Left;
                                    }

                                    state.SetHat(JoystickHat.Hat0 + i, new JoystickHatState(hatpos));
                                }
                            }

                            state.SetIsConnected(true);
                        }
                        else if (result == JoystickError.Unplugged)
                        {
                            UnplugJoystick(player_index);
                        }
                    }
                }

                return(state);
            }
        }
示例#11
0
 internal JoystickStatus(JoystickInfo deviceInfo, JoyInfoEx statusInfo)
 {
     _info   = deviceInfo;
     _status = statusInfo;
 }
示例#12
0
 public static extern JoyResult JoyGetPosEx(int uJoyID, ref JoyInfoEx pji);
示例#13
0
		protected unsafe override void UpdateGamePadStates()
		{
			uint index = GetJoystickByNumber();
			JoyCaps caps;
			joyGetDevCaps(index, out caps, joyCapsSize);
			var info = new JoyInfoEx
			{
				Size = (uint)Marshal.SizeOf(typeof(JoyInfoEx)),
				Flags = (uint)JoystickDwFlags.JoyAll
			};
			joyGetPosEx(index, &info);
			UpdateAllButtons((JoystickButtons)info.Buttons);
			UpdateDPadButtons(info.Pov);
			triggerLeft = info.Zpos == 65407 ? 1 : 0;
			triggerRight = info.Zpos == 127 ? 1 : 0;
			xAxisLeft = ((info.Xpos - caps.wXmin) * (2f / (caps.wXmax - caps.wXmin))) - 1f;
			yAxisLeft = ((info.Ypos - caps.wYmin) * (2f / (caps.wYmax - caps.wYmin))) - 1f;
			xAxisRight = ((info.Upos - caps.wUmin) * (2f / (caps.wUmax - caps.wUmin))) - 1f;
			yAxisRight = ((info.Rpos - caps.wRmin) * (2f / (caps.wRmax - caps.wRmin))) - 1f;			
		}
示例#14
0
 public static extern int joyGetPosEx(int uJoyID, ref JoyInfoEx joyInfo);
示例#15
0
        public JoystickState GetState(int player_index)
        {
            lock (sync)
            {
                JoystickState state = new JoystickState();

                if (IsValid(player_index))
                {
                    int device_index = player_to_index[player_index];
                    int index = index_to_stick[device_index];
                    JoystickDevice<WinMMJoyDetails> stick =
                        sticks[index] as JoystickDevice<WinMMJoyDetails>;

                    // For joysticks with fewer than three axes or four buttons, we must
                    // use joyGetPos; otherwise, joyGetPosEx. This is not just a cosmetic
                    // difference, simple devices will return incorrect results if we use
                    // joyGetPosEx on them.
                    if (stick.Details.Capabilities.AxisCount <= 3 || stick.Details.Capabilities.ButtonCount <= 4)
                    {
                        // Use joyGetPos
                        JoyInfo info = new JoyInfo();

                        JoystickError result = UnsafeNativeMethods.joyGetPos(device_index, ref info);
                        if (result == JoystickError.NoError)
                        {
                            for (int i = 0; i < stick.Details.Capabilities.AxisCount; i++)
                            {
                                state.SetAxis(JoystickAxis.Axis0 + i, CalculateOffset(info.GetAxis(i), stick.Details.Min[i], stick.Details.Max[i]));
                            }

                            for (int i = 0; i < stick.Details.Capabilities.ButtonCount; i++)
                            {
                                state.SetButton(JoystickButton.Button0 + i, (info.Buttons & 1 << i) != 0);
                            }

                            state.SetIsConnected(true);
                        }
                        else if (result == JoystickError.Unplugged)
                        {
                            UnplugJoystick(player_index);
                        }
                    }
                    else
                    {
                        // Use joyGetPosEx
                        JoyInfoEx info_ex = new JoyInfoEx();
                        info_ex.Size = JoyInfoEx.SizeInBytes;
                        info_ex.Flags = JoystickFlags.All;

                        JoystickError result = UnsafeNativeMethods.joyGetPosEx(device_index, ref info_ex);
                        if (result == JoystickError.NoError)
                        {
                            for (int i = 0; i < stick.Details.Capabilities.AxisCount; i++)
                            {
                                state.SetAxis(JoystickAxis.Axis0 + i, CalculateOffset(info_ex.GetAxis(i), stick.Details.Min[i], stick.Details.Max[i]));
                            }

                            for (int i = 0; i < stick.Details.Capabilities.ButtonCount; i++)
                            {
                                state.SetButton(JoystickButton.Button0 + i, (info_ex.Buttons & 1 << i) != 0);
                            }

                            for (int i = 0; i < stick.Details.Capabilities.HatCount; i++)
                            {
                                // A discrete POV returns specific values for left, right, etc.
                                // A continuous POV returns an integer indicating an angle in degrees * 100, e.g. 18000 == 180.00 degrees.
                                // The vast majority of joysticks have discrete POVs, so we'll treat all of them as discrete for simplicity.
                                if ((JoystickPovPosition)info_ex.Pov != JoystickPovPosition.Centered)
                                {
                                    HatPosition hatpos = HatPosition.Centered;
                                    if (info_ex.Pov < 4500 || info_ex.Pov >= 31500)
                                        hatpos |= HatPosition.Up;
                                    if (info_ex.Pov >= 4500 && info_ex.Pov < 13500)
                                        hatpos |= HatPosition.Right;
                                    if (info_ex.Pov >= 13500 && info_ex.Pov < 22500)
                                        hatpos |= HatPosition.Down;
                                    if (info_ex.Pov >= 22500 && info_ex.Pov < 31500)
                                        hatpos |= HatPosition.Left;

                                    state.SetHat(JoystickHat.Hat0 + i, new JoystickHatState(hatpos));
                                }
                            }

                            state.SetIsConnected(true);
                        }
                        else if (result == JoystickError.Unplugged)
                        {
                            UnplugJoystick(player_index);
                        }
                    }
                }

                return state;
            }
        }
示例#16
0
        public void Poll()
        {
            foreach (JoystickDevice<WinMMJoyDetails> js in sticks)
            {
                JoyInfoEx info = new JoyInfoEx();
                info.Size = JoyInfoEx.SizeInBytes;
                info.Flags = JoystickFlags.All;
                UnsafeNativeMethods.joyGetPosEx(js.Id, ref info);

                int num_axes = js.Axis.Count;
                if ((js.Details.PovType & PovType.Exists) != 0)
                    num_axes -= 2; // Because the last two axis are used for POV input.

                int axis = 0;
                if (axis < num_axes)
                { js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.XPos, axis)); axis++; }
                if (axis < num_axes)
                { js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.YPos, axis)); axis++; }
                if (axis < num_axes)
                { js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.ZPos, axis)); axis++; }
                if (axis < num_axes)
                { js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.RPos, axis)); axis++; }
                if (axis < num_axes)
                { js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.UPos, axis)); axis++; }
                if (axis < num_axes)
                { js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.VPos, axis)); axis++; }

                if ((js.Details.PovType & PovType.Exists) != 0)
                {
                    float x = 0, y = 0;

                    // A discrete POV returns specific values for left, right, etc.
                    // A continuous POV returns an integer indicating an angle in degrees * 100, e.g. 18000 == 180.00 degrees.
                    // The vast majority of joysticks have discrete POVs, so we'll treat all of them as discrete for simplicity.
                    if ((JoystickPovPosition)info.Pov != JoystickPovPosition.Centered)
                    {
                        if (info.Pov > (int)JoystickPovPosition.Left || info.Pov < (int)JoystickPovPosition.Right)
                        { y = 1; }
                        if ((info.Pov > (int)JoystickPovPosition.Forward) && (info.Pov < (int)JoystickPovPosition.Backward))
                        { x = 1; }
                        if ((info.Pov > (int)JoystickPovPosition.Right) && (info.Pov < (int)JoystickPovPosition.Left))
                        { y = -1; }
                        if (info.Pov > (int)JoystickPovPosition.Backward)
                        { x = -1; }
                    }  
                    //if ((js.Details.PovType & PovType.Discrete) != 0)
                    //{
                    //    if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Centered)
                    //    { x = 0; y = 0; }
                    //    else if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Forward)
                    //    { x = 0; y = -1; }
                    //    else if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Left)
                    //    { x = -1; y = 0; }
                    //    else if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Backward)
                    //    { x = 0; y = 1; }
                    //    else if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Right)
                    //    { x = 1; y = 0; }
                    //}
                    //else if ((js.Details.PovType & PovType.Continuous) != 0)
                    //{
                    //    if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Centered)
                    //    {
                    //        // This approach moves the hat on a circle, not a square as it should.
                    //        float angle = (float)(System.Math.PI * info.Pov / 18000.0 + System.Math.PI / 2);
                    //        x = (float)System.Math.Cos(angle);
                    //        y = (float)System.Math.Sin(angle);
                    //        if (x < 0.001)
                    //            x = 0;
                    //        if (y < 0.001)
                    //            y = 0;
                    //    }
                    //}
                    //else
                    //    throw new NotImplementedException("Please post an issue report at http://www.opentk.com/issues");

                    js.SetAxis((JoystickAxis)axis++, x);
                    js.SetAxis((JoystickAxis)axis++, y);
                }

                int button = 0;
                while (button < js.Button.Count)
                {
                    js.SetButton((JoystickButton)button, (info.Buttons & (1 << button)) != 0);
                    button++;
                }
            }
        }
示例#17
0
        public JoystickState GetState(int player_index)
        {
            lock (sync)
            {
                JoystickState state = new JoystickState();

                if (IsValid(player_index))
                {
                    int device_index = player_to_index[player_index];
                    int index = index_to_stick[device_index];
                    JoystickDevice<WinMMJoyDetails> stick =
                        sticks[index] as JoystickDevice<WinMMJoyDetails>;

                    // For joysticks with fewer than three axes or four buttons, we must
                    // use joyGetPos; otherwise, joyGetPosEx. This is not just a cosmetic
                    // difference, simple devices will return incorrect results if we use
                    // joyGetPosEx on them.
                    if (stick.Details.Capabilities.AxisCount <= 3 || stick.Details.Capabilities.ButtonCount <= 4)
                    {
                        // Use joyGetPos
                        JoyInfo info = new JoyInfo();

                        JoystickError result = UnsafeNativeMethods.joyGetPos(device_index, ref info);
                        if (result == JoystickError.NoError)
                        {
                            for (int i = 0; i < stick.Details.Capabilities.AxisCount; i++)
                            {
                                state.SetAxis(JoystickAxis.Axis0 + i, CalculateOffset(info.GetAxis(i), stick.Details.Min[i], stick.Details.Max[i]));
                            }

                            for (int i = 0; i < stick.Details.Capabilities.ButtonCount; i++)
                            {
                                state.SetButton(JoystickButton.Button0 + i, (info.Buttons & 1 << i) != 0);
                            }

                            state.SetIsConnected(true);
                        }
                        else if (result == JoystickError.Unplugged)
                        {
                            UnplugJoystick(player_index);
                        }
                    }
                    else
                    {
                        // Use joyGetPosEx
                        JoyInfoEx info = new JoyInfoEx();
                        info.Size = JoyInfoEx.SizeInBytes;
                        info.Flags = JoystickFlags.All;

                        JoystickError result = UnsafeNativeMethods.joyGetPosEx(device_index, ref info);
                        if (result == JoystickError.NoError)
                        {
                            for (int i = 0; i < stick.Details.Capabilities.AxisCount; i++)
                            {
                                state.SetAxis(JoystickAxis.Axis0 + i, CalculateOffset(info.GetAxis(i), stick.Details.Min[i], stick.Details.Max[i]));
                            }

                            for (int i = 0; i < stick.Details.Capabilities.ButtonCount; i++)
                            {
                                state.SetButton(JoystickButton.Button0 + i, (info.Buttons & 1 << i) != 0);
                            }

                            state.SetIsConnected(true);
                        }
                        else if (result == JoystickError.Unplugged)
                        {
                            UnplugJoystick(player_index);
                        }
                    }
                }

                return state;
            }
        }
示例#18
0
        public void Poll()
        {
            foreach (JoystickDevice <WinMMJoyDetails> js in sticks)
            {
                JoyInfoEx info = new JoyInfoEx();
                info.Size  = JoyInfoEx.SizeInBytes;
                info.Flags = JoystickFlags.All;
                UnsafeNativeMethods.joyGetPosEx(js.Id, ref info);

                int num_axes = js.Axis.Count;
                if ((js.Details.PovType & PovType.Exists) != 0)
                {
                    num_axes -= 2; // Because the last two axis are used for POV input.
                }
                int axis = 0;
                if (axis < num_axes)
                {
                    js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.XPos, axis)); axis++;
                }
                if (axis < num_axes)
                {
                    js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.YPos, axis)); axis++;
                }
                if (axis < num_axes)
                {
                    js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.ZPos, axis)); axis++;
                }
                if (axis < num_axes)
                {
                    js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.RPos, axis)); axis++;
                }
                if (axis < num_axes)
                {
                    js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.UPos, axis)); axis++;
                }
                if (axis < num_axes)
                {
                    js.SetAxis((JoystickAxis)axis, js.Details.CalculateOffset((float)info.VPos, axis)); axis++;
                }

                if ((js.Details.PovType & PovType.Exists) != 0)
                {
                    float x = 0, y = 0;

                    // A discrete POV returns specific values for left, right, etc.
                    // A continuous POV returns an integer indicating an angle in degrees * 100, e.g. 18000 == 180.00 degrees.
                    // The vast majority of joysticks have discrete POVs, so we'll treat all of them as discrete for simplicity.
                    if ((JoystickPovPosition)info.Pov != JoystickPovPosition.Centered)
                    {
                        if (info.Pov > (int)JoystickPovPosition.Left || info.Pov < (int)JoystickPovPosition.Right)
                        {
                            y = 1;
                        }
                        if ((info.Pov > (int)JoystickPovPosition.Forward) && (info.Pov < (int)JoystickPovPosition.Backward))
                        {
                            x = 1;
                        }
                        if ((info.Pov > (int)JoystickPovPosition.Right) && (info.Pov < (int)JoystickPovPosition.Left))
                        {
                            y = -1;
                        }
                        if (info.Pov > (int)JoystickPovPosition.Backward)
                        {
                            x = -1;
                        }
                    }
                    //if ((js.Details.PovType & PovType.Discrete) != 0)
                    //{
                    //    if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Centered)
                    //    { x = 0; y = 0; }
                    //    else if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Forward)
                    //    { x = 0; y = -1; }
                    //    else if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Left)
                    //    { x = -1; y = 0; }
                    //    else if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Backward)
                    //    { x = 0; y = 1; }
                    //    else if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Right)
                    //    { x = 1; y = 0; }
                    //}
                    //else if ((js.Details.PovType & PovType.Continuous) != 0)
                    //{
                    //    if ((JoystickPovPosition)info.Pov == JoystickPovPosition.Centered)
                    //    {
                    //        // This approach moves the hat on a circle, not a square as it should.
                    //        float angle = (float)(System.Math.PI * info.Pov / 18000.0 + System.Math.PI / 2);
                    //        x = (float)System.Math.Cos(angle);
                    //        y = (float)System.Math.Sin(angle);
                    //        if (x < 0.001)
                    //            x = 0;
                    //        if (y < 0.001)
                    //            y = 0;
                    //    }
                    //}
                    //else
                    //    throw new NotImplementedException("Please post an issue report at http://www.opentk.com/issues");

                    js.SetAxis((JoystickAxis)axis++, x);
                    js.SetAxis((JoystickAxis)axis++, y);
                }

                int button = 0;
                while (button < js.Button.Count)
                {
                    js.SetButton((JoystickButton)button, (info.Buttons & (1 << button)) != 0);
                    button++;
                }
            }
        }
示例#19
0
        public JoystickState GetState(int player_index)
        {
            lock (sync)
            {
                JoystickState state = new JoystickState();

                if (IsValid(player_index))
                {
                    int device_index = player_to_index[player_index];
                    int index        = index_to_stick[device_index];
                    JoystickDevice <WinMMJoyDetails> stick =
                        sticks[index] as JoystickDevice <WinMMJoyDetails>;

                    // For joysticks with fewer than three axes or four buttons, we must
                    // use joyGetPos; otherwise, joyGetPosEx. This is not just a cosmetic
                    // difference, simple devices will return incorrect results if we use
                    // joyGetPosEx on them.
                    if (stick.Details.Capabilities.AxisCount <= 3 || stick.Details.Capabilities.ButtonCount <= 4)
                    {
                        // Use joyGetPos
                        JoyInfo info = new JoyInfo();

                        JoystickError result = UnsafeNativeMethods.joyGetPos(device_index, ref info);
                        if (result == JoystickError.NoError)
                        {
                            for (int i = 0; i < stick.Details.Capabilities.AxisCount; i++)
                            {
                                state.SetAxis(JoystickAxis.Axis0 + i, CalculateOffset(info.GetAxis(i), stick.Details.Min[i], stick.Details.Max[i]));
                            }

                            for (int i = 0; i < stick.Details.Capabilities.ButtonCount; i++)
                            {
                                state.SetButton(JoystickButton.Button0 + i, (info.Buttons & 1 << i) != 0);
                            }

                            state.SetIsConnected(true);
                        }
                        else if (result == JoystickError.Unplugged)
                        {
                            UnplugJoystick(player_index);
                        }
                    }
                    else
                    {
                        // Use joyGetPosEx
                        JoyInfoEx info = new JoyInfoEx();
                        info.Size  = JoyInfoEx.SizeInBytes;
                        info.Flags = JoystickFlags.All;

                        JoystickError result = UnsafeNativeMethods.joyGetPosEx(device_index, ref info);
                        if (result == JoystickError.NoError)
                        {
                            for (int i = 0; i < stick.Details.Capabilities.AxisCount; i++)
                            {
                                state.SetAxis(JoystickAxis.Axis0 + i, CalculateOffset(info.GetAxis(i), stick.Details.Min[i], stick.Details.Max[i]));
                            }

                            for (int i = 0; i < stick.Details.Capabilities.ButtonCount; i++)
                            {
                                state.SetButton(JoystickButton.Button0 + i, (info.Buttons & 1 << i) != 0);
                            }

                            state.SetIsConnected(true);
                        }
                        else if (result == JoystickError.Unplugged)
                        {
                            UnplugJoystick(player_index);
                        }
                    }
                }

                return(state);
            }
        }
示例#20
0
 private static extern int joyGetPosEx(int uJoyID, ref JoyInfoEx pji);
示例#21
0
 static extern MmResult joyGetPosEx(JoystickID id, out JoyInfoEx joyInfo);