Skip to content

Commit

Permalink
Added the HOTAS Warthog as a flight stick
Browse files Browse the repository at this point in the history
  • Loading branch information
slouken committed Jan 31, 2017
1 parent 800a72e commit a156b0d
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 10 deletions.
38 changes: 29 additions & 9 deletions src/joystick/SDL_joystick.c
Expand Up @@ -966,7 +966,7 @@ static void SDL_GetJoystickGUIDInfo(SDL_JoystickGUID guid, Uint16 *vendor, Uint1
}
}

static SDL_bool SDL_IsJoystickGUIDWheel(SDL_JoystickGUID guid)
static SDL_bool SDL_IsJoystickGUIDWheel(Uint32 vidpid)
{
static Uint32 wheel_joysticks[] = {
MAKE_VIDPID(0x046d, 0xc294), /* Logitech generic wheel */
Expand All @@ -983,16 +983,25 @@ static SDL_bool SDL_IsJoystickGUIDWheel(SDL_JoystickGUID guid)
MAKE_VIDPID(0x044f, 0xb664), /* Thrustmaster TX (initial mode) */
MAKE_VIDPID(0x044f, 0xb669), /* Thrustmaster TX (active mode) */
};
Uint16 vendor;
Uint16 product;
Uint32 id;
int i;

SDL_GetJoystickGUIDInfo(guid, &vendor, &product, NULL);
id = MAKE_VIDPID(vendor, product);

for (i = 0; i < SDL_arraysize(wheel_joysticks); ++i) {
if (id == wheel_joysticks[i]) {
if (vidpid == wheel_joysticks[i]) {
return SDL_TRUE;
}
}
return SDL_FALSE;
}

static SDL_bool SDL_IsJoystickGUIDFlightStick(Uint32 vidpid)
{
static Uint32 flightstick_joysticks[] = {
MAKE_VIDPID(0x044f, 0x0402), /* HOTAS Warthog */
};
int i;

for (i = 0; i < SDL_arraysize(flightstick_joysticks); ++i) {
if (vidpid == flightstick_joysticks[i]) {
return SDL_TRUE;
}
}
Expand All @@ -1001,6 +1010,10 @@ static SDL_bool SDL_IsJoystickGUIDWheel(SDL_JoystickGUID guid)

static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid)
{
Uint16 vendor;
Uint16 product;
Uint32 vidpid;

if (guid.data[14] == 'x') {
/* XInput GUID, get the type based on the XInput device subtype */
switch (guid.data[15]) {
Expand All @@ -1027,10 +1040,17 @@ static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid)
}
}

if (SDL_IsJoystickGUIDWheel(guid)) {
SDL_GetJoystickGUIDInfo(guid, &vendor, &product, NULL);
vidpid = MAKE_VIDPID(vendor, product);

if (SDL_IsJoystickGUIDWheel(vidpid)) {
return SDL_JOYSTICK_TYPE_WHEEL;
}

if (SDL_IsJoystickGUIDFlightStick(vidpid)) {
return SDL_JOYSTICK_TYPE_FLIGHT_STICK;
}

return SDL_JOYSTICK_TYPE_UNKNOWN;
}

Expand Down
32 changes: 31 additions & 1 deletion test/testjoystick.c
Expand Up @@ -239,7 +239,7 @@ WatchJoystick(SDL_Joystick * joystick)
int
main(int argc, char *argv[])
{
const char *name;
const char *name, *type;
int i;
SDL_Joystick *joystick;

Expand Down Expand Up @@ -268,6 +268,36 @@ main(int argc, char *argv[])
SDL_assert(SDL_JoystickFromInstanceID(SDL_JoystickInstanceID(joystick)) == joystick);
SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(joystick),
guid, sizeof (guid));
switch (SDL_JoystickGetType(joystick)) {
case SDL_JOYSTICK_TYPE_GAMECONTROLLER:
type = "Game Controller";
break;
case SDL_JOYSTICK_TYPE_WHEEL:
type = "Wheel";
break;
case SDL_JOYSTICK_TYPE_ARCADE_STICK:
type = "Arcade Stick";
break;
case SDL_JOYSTICK_TYPE_FLIGHT_STICK:
type = "Flight Stick";
break;
case SDL_JOYSTICK_TYPE_DANCE_PAD:
type = "Dance Pad";
break;
case SDL_JOYSTICK_TYPE_GUITAR:
type = "Guitar";
break;
case SDL_JOYSTICK_TYPE_DRUM_KIT:
type = "Drum Kit";
break;
case SDL_JOYSTICK_TYPE_ARCADE_PAD:
type = "Arcade Pad";
break;
default:
type = "Unknown";
break;
}
SDL_Log(" type: %s\n", type);
SDL_Log(" axes: %d\n", SDL_JoystickNumAxes(joystick));
SDL_Log(" balls: %d\n", SDL_JoystickNumBalls(joystick));
SDL_Log(" hats: %d\n", SDL_JoystickNumHats(joystick));
Expand Down

0 comments on commit a156b0d

Please sign in to comment.