Merge pull request #160 from thefiddler/pad_db_hat

[Input] Implemented JoystickHat GamePad mapping
This commit is contained in:
thefiddler 2014-07-29 23:37:06 +02:00
commit 645baeaff3
6 changed files with 110 additions and 16 deletions

View file

@ -35,7 +35,8 @@ namespace OpenTK.Input
{ {
Unmapped = 0, Unmapped = 0,
Axis, Axis,
Button Button,
Hat
} }
} }

View file

@ -175,8 +175,11 @@ namespace OpenTK.Input
return new GamePadConfigurationSource(ParseButton(item)); return new GamePadConfigurationSource(ParseButton(item));
case 'h': case 'h':
throw new NotImplementedException(); {
//return new MapItem(ParseHat(item)); HatPosition position;
JoystickHat hat = ParseHat(item, out position);
return new GamePadConfigurationSource(hat, position);
}
default: default:
throw new InvalidOperationException("[Input] Invalid GamePad configuration value"); throw new InvalidOperationException("[Input] Invalid GamePad configuration value");
@ -193,12 +196,38 @@ namespace OpenTK.Input
static JoystickButton ParseButton(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; JoystickButton button = JoystickButton.Button0;
int id = Int32.Parse(item.Substring(1)); int id = Int32.Parse(item.Substring(1));
return button + id; 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 #endregion
} }
} }

View file

@ -34,8 +34,10 @@ namespace OpenTK.Input
struct GamePadConfigurationSource struct GamePadConfigurationSource
{ {
ConfigurationType map_type; ConfigurationType map_type;
Nullable<JoystickButton> map_button; JoystickButton? map_button;
Nullable<JoystickAxis> map_axis; JoystickAxis? map_axis;
JoystickHat? map_hat;
HatPosition? map_hat_position;
public GamePadConfigurationSource(JoystickAxis axis) public GamePadConfigurationSource(JoystickAxis axis)
: this() : this()
@ -51,6 +53,14 @@ namespace OpenTK.Input
Button = button; Button = button;
} }
public GamePadConfigurationSource(JoystickHat hat, HatPosition pos)
: this()
{
Type = ConfigurationType.Hat;
Hat = hat;
map_hat_position = pos;
}
public ConfigurationType Type public ConfigurationType Type
{ {
get { return map_type; } get { return map_type; }
@ -68,5 +78,17 @@ namespace OpenTK.Input
get { return map_button.Value; } get { return map_button.Value; }
private set { 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 file

@ -117,6 +117,48 @@ namespace OpenTK.Platform
} }
} }
break; 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 file

@ -753,8 +753,8 @@ namespace OpenTK.Platform.SDL2
Centered = 0x00, Centered = 0x00,
Up = 0x01, Up = 0x01,
Right = 0x02, Right = 0x02,
Down = 0x03, Down = 0x04,
Left = 0x04, Left = 0x08,
RightUp = Right | Up, RightUp = Right | Up,
RightDown = Right | Down, RightDown = Right | Down,
LeftUp = Left | Up, LeftUp = Left | Up,

View file

@ -127,28 +127,28 @@ namespace OpenTK.Platform.SDL2
OpenTK.Input.HatPosition TranslateHat(HatPosition value) OpenTK.Input.HatPosition TranslateHat(HatPosition value)
{ {
if ((value & HatPosition.LeftUp) == value) if ((value & HatPosition.LeftUp) == HatPosition.LeftUp)
return OpenTK.Input.HatPosition.UpLeft; return OpenTK.Input.HatPosition.UpLeft;
if ((value & HatPosition.RightUp) == value) if ((value & HatPosition.RightUp) == HatPosition.RightUp)
return OpenTK.Input.HatPosition.UpRight; return OpenTK.Input.HatPosition.UpRight;
if ((value & HatPosition.LeftDown) == value) if ((value & HatPosition.LeftDown) == HatPosition.LeftDown)
return OpenTK.Input.HatPosition.DownLeft; return OpenTK.Input.HatPosition.DownLeft;
if ((value & HatPosition.RightDown) == value) if ((value & HatPosition.RightDown) == HatPosition.RightDown)
return OpenTK.Input.HatPosition.DownRight; return OpenTK.Input.HatPosition.DownRight;
if ((value & HatPosition.Up) == value) if ((value & HatPosition.Up) == HatPosition.Up)
return OpenTK.Input.HatPosition.Up; return OpenTK.Input.HatPosition.Up;
if ((value & HatPosition.Right) == value) if ((value & HatPosition.Right) == HatPosition.Right)
return OpenTK.Input.HatPosition.Right; return OpenTK.Input.HatPosition.Right;
if ((value & HatPosition.Down) == value) if ((value & HatPosition.Down) == HatPosition.Down)
return OpenTK.Input.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.Left;
return OpenTK.Input.HatPosition.Centered; return OpenTK.Input.HatPosition.Centered;