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; }
public static extern int joyGetPosEx(int uJoyID, ref JoyInfoEx joyInfo);
public static extern JoystickError joyGetPosEx(int uJoyID, ref JoyInfoEx pji);
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; }
private static extern unsafe uint joyGetPosEx(uint id, JoyInfoEx* info);
public static extern uint joyGetPosEx(int uJoyID, ref JoyInfoEx pji);
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); } }
internal JoystickStatus(JoystickInfo deviceInfo, JoyInfoEx statusInfo) { _info = deviceInfo; _status = statusInfo; }
public static extern JoyResult JoyGetPosEx(int uJoyID, ref JoyInfoEx pji);
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; } }
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++; } } }
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; } }
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++; } } }
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); } }
private static extern int joyGetPosEx(int uJoyID, ref JoyInfoEx pji);
static extern MmResult joyGetPosEx(JoystickID id, out JoyInfoEx joyInfo);