Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge pull request #160 from thefiddler/pad_db_hat

[Input] Implemented JoystickHat GamePad mapping
  • Loading branch information...
commit 645baeaff3662f3f94584b70a2927c96d62b8e2b 2 parents b003de8 + e243316
@thefiddler thefiddler authored
View
3  Source/OpenTK/Input/ConfigurationType.cs
@@ -35,7 +35,8 @@ enum ConfigurationType
{
Unmapped = 0,
Axis,
- Button
+ Button,
+ Hat
}
}
View
35 Source/OpenTK/Input/GamePadConfiguration.cs
@@ -175,8 +175,11 @@ static GamePadConfigurationSource ParseSource(string item)
return new GamePadConfigurationSource(ParseButton(item));
case 'h':
- throw new NotImplementedException();
- //return new MapItem(ParseHat(item));
+ {
+ HatPosition position;
+ JoystickHat hat = ParseHat(item, out position);
+ return new GamePadConfigurationSource(hat, position);
+ }
default:
throw new InvalidOperationException("[Input] Invalid GamePad configuration value");
@@ -193,12 +196,38 @@ static JoystickAxis ParseAxis(string item)
static JoystickButton ParseButton(string item)
{
- // item is in the format "b#" where # a zero-based integer nubmer
+ // item is in the format "b#" where # a zero-based integer number
JoystickButton button = JoystickButton.Button0;
int id = Int32.Parse(item.Substring(1));
return button + 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;
+ }
+
#endregion
}
}
View
26 Source/OpenTK/Input/GamePadConfigurationSource.cs
@@ -34,8 +34,10 @@ namespace OpenTK.Input
struct GamePadConfigurationSource
{
ConfigurationType map_type;
- Nullable<JoystickButton> map_button;
- Nullable<JoystickAxis> map_axis;
+ JoystickButton? map_button;
+ JoystickAxis? map_axis;
+ JoystickHat? map_hat;
+ HatPosition? map_hat_position;
public GamePadConfigurationSource(JoystickAxis axis)
: this()
@@ -51,6 +53,14 @@ public GamePadConfigurationSource(JoystickButton button)
Button = button;
}
+ public GamePadConfigurationSource(JoystickHat hat, HatPosition pos)
+ : this()
+ {
+ Type = ConfigurationType.Hat;
+ Hat = hat;
+ map_hat_position = pos;
+ }
+
public ConfigurationType Type
{
get { return map_type; }
@@ -68,5 +78,17 @@ public JoystickButton Button
get { return map_button.Value; }
private set { map_button = value; }
}
+
+ public JoystickHat Hat
+ {
+ get { return map_hat.Value; }
+ private set { map_hat = value; }
+ }
+
+ public HatPosition HatPosition
+ {
+ get { return map_hat_position.Value; }
+ private set { map_hat_position = value; }
+ }
}
}
View
42 Source/OpenTK/Platform/MappedGamePadDriver.cs
@@ -117,6 +117,48 @@ public GamePadState GetState(int index)
}
}
break;
+
+ case ConfigurationType.Hat:
+ {
+ // JoystickHat -> Buttons/GamePadAxes mapping
+ JoystickHat source_hat = map.Source.Hat;
+ JoystickHatState state = joy.GetHat(source_hat);
+
+ bool pressed = false;
+ switch (map.Source.HatPosition)
+ {
+ case HatPosition.Down:
+ pressed = state.IsDown;
+ break;
+
+ case HatPosition.Up:
+ pressed = state.IsUp;
+ break;
+
+ case HatPosition.Left:
+ pressed = state.IsLeft;
+ break;
+
+ case HatPosition.Right:
+ pressed = state.IsRight;
+ break;
+ }
+
+ switch (map.Target.Type)
+ {
+ case ConfigurationType.Axis:
+ // Todo: if SDL2 GameController config is ever updated to
+ // distinguish between negative/positive axes, then update
+ // the following line to support both.
+ pad.SetAxis(map.Target.Axis, pressed ? short.MaxValue : (short)0);
+ break;
+
+ case ConfigurationType.Button:
+ pad.SetButton(map.Target.Button, pressed);
+ break;
+ }
+ }
+ break;
}
}
}
View
4 Source/OpenTK/Platform/SDL2/Sdl2.cs
@@ -753,8 +753,8 @@ enum HatPosition : byte
Centered = 0x00,
Up = 0x01,
Right = 0x02,
- Down = 0x03,
- Left = 0x04,
+ Down = 0x04,
+ Left = 0x08,
RightUp = Right | Up,
RightDown = Right | Down,
LeftUp = Left | Up,
View
16 Source/OpenTK/Platform/SDL2/Sdl2JoystickDriver.cs
@@ -127,28 +127,28 @@ bool IsJoystickInstanceValid(int instance_id)
OpenTK.Input.HatPosition TranslateHat(HatPosition value)
{
- if ((value & HatPosition.LeftUp) == value)
+ if ((value & HatPosition.LeftUp) == HatPosition.LeftUp)
return OpenTK.Input.HatPosition.UpLeft;
- if ((value & HatPosition.RightUp) == value)
+ if ((value & HatPosition.RightUp) == HatPosition.RightUp)
return OpenTK.Input.HatPosition.UpRight;
- if ((value & HatPosition.LeftDown) == value)
+ if ((value & HatPosition.LeftDown) == HatPosition.LeftDown)
return OpenTK.Input.HatPosition.DownLeft;
- if ((value & HatPosition.RightDown) == value)
+ if ((value & HatPosition.RightDown) == HatPosition.RightDown)
return OpenTK.Input.HatPosition.DownRight;
- if ((value & HatPosition.Up) == value)
+ if ((value & HatPosition.Up) == HatPosition.Up)
return OpenTK.Input.HatPosition.Up;
- if ((value & HatPosition.Right) == value)
+ if ((value & HatPosition.Right) == HatPosition.Right)
return OpenTK.Input.HatPosition.Right;
- if ((value & HatPosition.Down) == value)
+ if ((value & HatPosition.Down) == HatPosition.Down)
return OpenTK.Input.HatPosition.Down;
- if ((value & HatPosition.Left) == value)
+ if ((value & HatPosition.Left) == HatPosition.Left)
return OpenTK.Input.HatPosition.Left;
return OpenTK.Input.HatPosition.Centered;
Please sign in to comment.
Something went wrong with that request. Please try again.