/// <summary> /// Parses a string in the format "h#.#" where: /// - the 1st # is the zero-based hat id /// - the 2nd # is a bit-flag defining the hat position /// </summary> /// <param name="item">The string to parse</param> /// <param name="position">The hat position assigned via 'out'</param> /// <returns>The new joystick hat</returns> private static JoystickHat ParseHat(string item, out HatPosition position) { JoystickHat hat = JoystickHat.Hat0; int id = Int32.Parse(item.Substring(1, 1)); int pos = Int32.Parse(item.Substring(3)); position = HatPosition.Centered; switch (pos) { case 1: position = HatPosition.Up; break; case 2: position = HatPosition.Right; break; case 3: position = HatPosition.UpRight; break; case 4: position = HatPosition.Down; break; case 6: position = HatPosition.DownRight; break; case 8: position = HatPosition.Left; break; case 9: position = HatPosition.UpLeft; break; case 12: position = HatPosition.DownLeft; break; default: position = HatPosition.Centered; break; } return(hat + id); }
static JoystickHat ParseHat(string item, out HatPosition position) { // item is in the format "h#.#" where: // - the 1st # is the zero-based hat id // - the 2nd # is a bit-flag defining the hat position JoystickHat hat = JoystickHat.Hat0; int id = Int32.Parse(item.Substring(1, 1)); int pos = Int32.Parse(item.Substring(3)); position = HatPosition.Centered; switch (pos) { case 1: position = HatPosition.Up; break; case 2: position = HatPosition.Right; break; case 3: position = HatPosition.UpRight; break; case 4: position = HatPosition.Down; break; case 6: position = HatPosition.DownRight; break; case 8: position = HatPosition.Left; break; case 9: position = HatPosition.UpLeft; break; case 12: position = HatPosition.DownLeft; break; default: position = HatPosition.Centered; break; } return(hat + id); }
public override void ProcessNetworkData(string id, string value) { if (_id.Equals(id) && _positionByValue.ContainsKey(value)) { SwitchPosition = _positionByValue[value]; } }
static public VectorI2 GetVectorI2(this HatPosition item) { switch (item) { case HatPosition.Centered: return(VectorI2.ZERO); case HatPosition.Down: return(VectorI2.DOWN); case HatPosition.DownLeft: return(VectorI2.LEFT_DOWN); case HatPosition.DownRight: return(VectorI2.RIGHT_DOWN); case HatPosition.Left: return(VectorI2.LEFT); case HatPosition.Right: return(VectorI2.RIGHT); case HatPosition.Up: return(VectorI2.UP); case HatPosition.UpLeft: return(VectorI2.LEFT_UP); case HatPosition.UpRight: return(VectorI2.RIGHT_UP); } throw new UnaccountedBranchException("item", item); }
public GamePadConfigurationSource(JoystickHat hat, HatPosition pos) : this() { Type = ConfigurationType.Hat; Hat = hat; map_hat_position = pos; }
/// <summary> /// Creates a new gamepad configuration source from a hat /// </summary> /// <param name="hat">The hat</param> /// <param name="pos">The starting hat position</param> public GamePadConfigurationSource(JoystickHat hat, HatPosition pos) : this() { Type = ConfigurationType.Hat; Hat = hat; map_hat_position = pos; }
internal static void DoHatMotion(int id, int hat, HatPosition position) { JoystickState joy; if (lookup.TryGetValue(id, out joy)) { SetValue(ref joy.Hats, hat, position); } }
void SetPositionAction_Execute(object action, HeliosActionEventArgs e) { SourceInterface.BeginTriggerBypass(e.BypassCascadingTriggers); try { SwitchPosition = (HatPosition)Enum.Parse(typeof(HatPosition), e.Value.StringValue); SourceInterface.SendData(_sendData[SwitchPosition]); } catch { // No-op if the parse fails we won't set the position. } SourceInterface.EndTriggerBypass(e.BypassCascadingTriggers); }
private OpenTK.Input.HatPosition TranslateHat(HatPosition value) { if ((value & HatPosition.LeftUp) == HatPosition.LeftUp) { return(OpenTK.Input.HatPosition.UpLeft); } if ((value & HatPosition.RightUp) == HatPosition.RightUp) { return(OpenTK.Input.HatPosition.UpRight); } if ((value & HatPosition.LeftDown) == HatPosition.LeftDown) { return(OpenTK.Input.HatPosition.DownLeft); } if ((value & HatPosition.RightDown) == HatPosition.RightDown) { return(OpenTK.Input.HatPosition.DownRight); } if ((value & HatPosition.Up) == HatPosition.Up) { return(OpenTK.Input.HatPosition.Up); } if ((value & HatPosition.Right) == HatPosition.Right) { return(OpenTK.Input.HatPosition.Right); } if ((value & HatPosition.Down) == HatPosition.Down) { return(OpenTK.Input.HatPosition.Down); } if ((value & HatPosition.Left) == HatPosition.Left) { return(OpenTK.Input.HatPosition.Left); } return(OpenTK.Input.HatPosition.Centered); }
OpenTK.Input.HatPosition TranslateHat(HatPosition value) { if ((value & HatPosition.LeftUp) == HatPosition.LeftUp) return OpenTK.Input.HatPosition.UpLeft; if ((value & HatPosition.RightUp) == HatPosition.RightUp) return OpenTK.Input.HatPosition.UpRight; if ((value & HatPosition.LeftDown) == HatPosition.LeftDown) return OpenTK.Input.HatPosition.DownLeft; if ((value & HatPosition.RightDown) == HatPosition.RightDown) return OpenTK.Input.HatPosition.DownRight; if ((value & HatPosition.Up) == HatPosition.Up) return OpenTK.Input.HatPosition.Up; if ((value & HatPosition.Right) == HatPosition.Right) return OpenTK.Input.HatPosition.Right; if ((value & HatPosition.Down) == HatPosition.Down) return OpenTK.Input.HatPosition.Down; if ((value & HatPosition.Left) == HatPosition.Left) return OpenTK.Input.HatPosition.Left; return OpenTK.Input.HatPosition.Centered; }
internal JoystickHatState(HatPosition pos) { position = pos; }
public override void Reset() { SourceInterface.BeginTriggerBypass(true); SwitchPosition = HatPosition.Center; SourceInterface.EndTriggerBypass(true); }
// attached joysticks private void pictureboxJoysticks_Paint(object sender, PaintEventArgs e) { this.DoubleBuffered = true; int device = -1; Interface.JoystickComponent component = Interface.JoystickComponent.Invalid; int element = -1; int direction = -1; Interface.CommandType type = Interface.CommandType.Digital; if (this.Tag == null & listviewControls.SelectedIndices.Count == 1) { int j = listviewControls.SelectedIndices[0]; if (Interface.CurrentControls[j].Method == Interface.ControlMethod.Joystick) { device = Interface.CurrentControls[j].Device; component = Interface.CurrentControls[j].Component; element = Interface.CurrentControls[j].Element; direction = Interface.CurrentControls[j].Direction; type = Interface.CurrentControls[j].InheritedType; } } System.Globalization.CultureInfo Culture = System.Globalization.CultureInfo.InvariantCulture; e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; Font f = new Font(this.Font.Name, 0.875f * this.Font.Size); float x = 2.0f, y = 2.0f; float threshold = ((float)trackbarJoystickAxisThreshold.Value - (float)trackbarJoystickAxisThreshold.Minimum) / (float)(trackbarJoystickAxisThreshold.Maximum - trackbarJoystickAxisThreshold.Minimum); for (int i = 0; i < Joysticks.AttachedJoysticks.Length; i++) { //Get the current joystick state var capabilities = Joystick.GetCapabilities(Joysticks.AttachedJoysticks[i].OpenTKHandle); var state = Joystick.GetState(Joysticks.AttachedJoysticks[i].OpenTKHandle); float w, h; if (JoystickImage != null) { e.Graphics.DrawImage(JoystickImage, x, y); w = (float)JoystickImage.Width; h = (float)JoystickImage.Height; if (h < 64.0f) { h = 64.0f; } } else { w = 64.0f; h = 64.0f; e.Graphics.DrawRectangle(new Pen(labelControlsTitle.BackColor), x, y, w, h); } { // joystick number e.Graphics.FillEllipse(Brushes.Gold, x + w - 16.0f, y, 16.0f, 16.0f); e.Graphics.DrawEllipse(Pens.Black, x + w - 16.0f, y, 16.0f, 16.0f); string t = (i + 1).ToString(Culture); SizeF s = e.Graphics.MeasureString(t, f); e.Graphics.DrawString(t, f, Brushes.Black, x + w - 8.0f - 0.5f * s.Width, y + 8.0f - 0.5f * s.Height); } { // joystick name e.Graphics.DrawString(Joysticks.AttachedJoysticks[i].Name, this.Font, Brushes.Black, x + w + 8.0f, y); } if (OpenTK.Configuration.RunningOnSdl2) { //HACK: Control configuration doesn't work in-form on SDL2 string error = Interface.GetInterfaceString("errors_controls_ingame"); if (OpenTK.Configuration.RunningOnSdl2) { error = error.Replace("[platform]", "SDL2"); } e.Graphics.DrawString(error, this.Font, Brushes.Black, x + w + 8.0f, y + 30.0f); return; } float m; if (groupboxJoysticks.Enabled) { m = x; Pen p = new Pen(Color.DarkGoldenrod, 2.0f); Pen ps = new Pen(Color.Firebrick, 2.0f); { // first row float u = x + w + 8.0f; float v = y + 24.0f; float g = h - 24.0f; { // hats int n = capabilities.HatCount; for (int j = 0; j < n; j++) { if (device == i & component == Interface.JoystickComponent.Hat & element == j) { e.Graphics.DrawEllipse(ps, u, v, g, g); } else { e.Graphics.DrawEllipse(p, u, v, g, g); } string t = "H" + (j + 1).ToString(Culture); SizeF s = e.Graphics.MeasureString(t, f); e.Graphics.DrawString(t, f, Brushes.Black, u + 0.5f * (g - s.Width), v + 0.5f * (g - s.Height)); JoystickHatState aa = state.GetHat((JoystickHat)j); HatPosition a = aa.Position; if (a != HatPosition.Centered) { double rx = 0.0; double ry = 0.0; switch (a) { case HatPosition.Up: rx = 0.0; ry = -1.0; break; case HatPosition.Down: rx = 0.0; ry = 1.0; break; case HatPosition.Left: rx = -1.0; ry = 0.0; break; case HatPosition.Right: rx = 1.0; ry = 0.0; break; case HatPosition.UpLeft: rx = -1.0; ry = -1.0; break; case HatPosition.UpRight: rx = 1.0; ry = -1.0; break; case HatPosition.DownLeft: rx = -1.0; ry = 1.0; break; case HatPosition.DownRight: rx = 1.0; ry = 1.0; break; } double rt = rx * rx + ry * ry; rt = 1.0 / Math.Sqrt(rt); rx *= rt; ry *= rt; float dx = (float)(0.5 * rx * (g - 8.0)); float dy = (float)(0.5 * ry * (g - 8.0)); e.Graphics.FillEllipse(Brushes.White, u + 0.5f * g + dx - 4.0f, v + 0.5f * g + dy - 4.0f, 8.0f, 8.0f); e.Graphics.DrawEllipse(new Pen(Color.Firebrick, 2.0f), u + 0.5f * g + dx - 4.0f, v + 0.5f * g + dy - 4.0f, 8.0f, 8.0f); } if (device == i & component == Interface.JoystickComponent.Hat & element == j) { double rx = ((HatPosition)direction & HatPosition.Left) != 0 ? -1.0 : ((HatPosition)direction & HatPosition.Right) != 0 ? 1.0 : 0.0; double ry = ((HatPosition)direction & HatPosition.Up) != 0 ? -1.0 : ((HatPosition)direction & HatPosition.Down) != 0 ? 1.0 : 0.0; double rt = rx * rx + ry * ry; rt = 1.0 / Math.Sqrt(rt); rx *= rt; ry *= rt; float dx = (float)(0.5 * rx * (g - 8.0)); float dy = (float)(0.5 * ry * (g - 8.0)); e.Graphics.FillEllipse(Brushes.Firebrick, u + 0.5f * g + dx - 2.0f, v + 0.5f * g + dy - 2.0f, 4.0f, 4.0f); } u += g + 8.0f; } } if (u > m) { m = u; } } { // second row float u = x; float v = y + h + 8.0f; { // axes int n = capabilities.AxisCount; float g = (float)pictureboxJoysticks.ClientRectangle.Height - v - 2.0f; for (int j = 0; j < n; j++) { float r = state.GetAxis((JoystickAxis)j); float r0 = r < 0.0f ? r : 0.0f; float r1 = r > 0.0f ? r : 0.0f; if ((float)Math.Abs((double)r) < threshold) { e.Graphics.FillRectangle(Brushes.RosyBrown, u, v + 0.5f * g - 0.5f * r1 * g, 16.0f, 0.5f * g * (r1 - r0)); } else { e.Graphics.FillRectangle(Brushes.Firebrick, u, v + 0.5f * g - 0.5f * r1 * g, 16.0f, 0.5f * g * (r1 - r0)); } if (device == i & component == Interface.JoystickComponent.Axis & element == j) { if (direction == -1 & type != Interface.CommandType.AnalogFull) { e.Graphics.DrawRectangle(p, u, v, 16.0f, g); e.Graphics.DrawRectangle(ps, u, v + 0.5f * g, 16.0f, 0.5f * g); } else if (direction == 1 & type != Interface.CommandType.AnalogFull) { e.Graphics.DrawRectangle(p, u, v, 16.0f, g); e.Graphics.DrawRectangle(ps, u, v, 16.0f, 0.5f * g); } else { e.Graphics.DrawRectangle(ps, u, v, 16.0f, g); } } else { e.Graphics.DrawRectangle(p, u, v, 16.0f, g); } e.Graphics.DrawLine(p, u, v + (0.5f - 0.5f * threshold) * g, u + 16.0f, v + (0.5f - 0.5f * threshold) * g); e.Graphics.DrawLine(p, u, v + (0.5f + 0.5f * threshold) * g, u + 16.0f, v + (0.5f + 0.5f * threshold) * g); string t = "A" + (j + 1).ToString(Culture); SizeF s = e.Graphics.MeasureString(t, f); e.Graphics.DrawString(t, f, Brushes.Black, u + 0.5f * (16.0f - s.Width), v + g - s.Height - 2.0f); u += 24.0f; } } { // buttons int n = capabilities.ButtonCount; float g = (float)0.5f * (pictureboxJoysticks.ClientRectangle.Height - v - 10.0f); for (int j = 0; j < n; j++) { bool q = state.GetButton((JoystickButton)j) != 0; float dv = (float)(j & 1) * (g + 8.0f); if (q) { e.Graphics.FillRectangle(Brushes.Firebrick, u, v + dv, g, g); } if (device == i & component == Interface.JoystickComponent.Button & element == j) { e.Graphics.DrawRectangle(ps, u, v + dv, g, g); } else { e.Graphics.DrawRectangle(p, u, v + dv, g, g); } string t = "B" + (j + 1).ToString(Culture); SizeF s = e.Graphics.MeasureString(t, f); e.Graphics.DrawString(t, f, Brushes.Black, u + 0.5f * (g - s.Width), v + dv + 0.5f * (g - s.Height)); if ((j & 1) != 0 | j == n - 1) { u += g + 8.0f; } } } if (u > m) { m = u; } } } else { m = x + w + 64.0f; } x = m + 8.0f; } }
public void SetHat(short collection, HIDPage page, short usage, HatPosition pos) { JoystickHat hat = GetHat(collection, page, usage); State.SetHat(hat, new JoystickHatState(pos)); }
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); } }
//void _Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) void _Timer_Elapsed(object whatever) { //_Timer.Stop(); DPad[] oDirection = new DPad[4]; Button oBtn = new Button(); HatPosition[] oHatDirection = new HatPosition[4]; try { for (int i = 0; i < 4; i++) { var cap = OpenTK.Input.Joystick.GetCapabilities(i); var state = OpenTK.Input.Joystick.GetState(i); if (!state.IsConnected || (cap.ButtonCount == 16)) continue; System.Diagnostics.Debug.Print(state.ToString()); oBtn.A = state.IsButtonDown(JoystickButton.Button1); oBtn.B = state.IsButtonDown(JoystickButton.Button2); oBtn.X = state.IsButtonDown(JoystickButton.Button3); oBtn.Y = state.IsButtonDown(JoystickButton.Button0); oBtn.L = state.IsButtonDown(JoystickButton.Button6); oBtn.R = state.IsButtonDown(JoystickButton.Button7); oBtn.LB = false; oBtn.RB = false; oBtn.Select = state.IsButtonDown(JoystickButton.Button8); oBtn.Start = state.IsButtonDown(JoystickButton.Button9); JoystickHatState jhs = state.GetHat(JoystickHat.Hat0); oHatDirection[i] = jhs.Position; int nXAxis = (int)Math.Round(state.GetAxis(JoystickAxis.Axis0), 0); int nYAxis = (int)Math.Round(state.GetAxis(JoystickAxis.Axis1), 0); // 左邊磨菇頭... if ((nXAxis == 0 && nYAxis == 0)) { oDirection[i] = DPad.None; } if (nYAxis > 0) oDirection[i] = DPad.Up; if (nYAxis < 0) oDirection[i] = DPad.Down; if (oBtn.A || oBtn.B || oBtn.X || oBtn.Y || oBtn.L || oBtn.R || oBtn.LB || oBtn.RB || oBtn.Select || oBtn.Start || oDirection[i] != DPad.None || jhs.Position != HatPosition.Centered) { JoystickPressedEventHandler handler = JoystickPressed; if (handler != null) { JoystickPressedEventArgs evt = new JoystickPressedEventArgs(); evt.DPadDirection = oDirection[i]; evt.Buttons = oBtn; evt.HatDirection = oHatDirection[i]; evt.TraceMessage = "Joystick[" + i + "]: " + state.ToString(); handler(evt); } } else { JoystickTraceEventHandler hander2 = JoystickTrace; if (hander2 != null) { JoystickTraceEventArgs evt2 = new JoystickTraceEventArgs(); evt2.TraceMessage = "Joystick[" + i + "]: " + state.ToString(); hander2(evt2); } } } } catch (Exception ex){ } //_Timer.Start(); }
static JoystickHat ParseHat(string item, out HatPosition position) { // item is in the format "h#.#" where: // - the 1st # is the zero-based hat id // - the 2nd # is a bit-flag defining the hat position JoystickHat hat = JoystickHat.Hat0; int id = Int32.Parse(item.Substring(1, 1)); int pos = Int32.Parse(item.Substring(3)); position = HatPosition.Centered; switch (pos) { case 1: position = HatPosition.Up; break; case 2: position = HatPosition.Right; break; case 3: position = HatPosition.UpRight; break; case 4: position = HatPosition.Down ; break; case 6: position = HatPosition.DownRight; break; case 8: position = HatPosition.Left; break; case 9: position = HatPosition.UpLeft; break; case 12: position = HatPosition.DownLeft; break; default: position = HatPosition.Centered; break; } return hat + id; }