From a156b0d994fbf1b672c841c58c354842bfb4ab7a Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 31 Jan 2017 10:20:09 -0800 Subject: [PATCH] Added the HOTAS Warthog as a flight stick --- src/joystick/SDL_joystick.c | 38 ++++++++++++++++++++++++++++--------- test/testjoystick.c | 32 ++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c index 448d6adcf..af019324d 100644 --- a/src/joystick/SDL_joystick.c +++ b/src/joystick/SDL_joystick.c @@ -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 */ @@ -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; } } @@ -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]) { @@ -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; } diff --git a/test/testjoystick.c b/test/testjoystick.c index 358b7290a..ce3a22214 100644 --- a/test/testjoystick.c +++ b/test/testjoystick.c @@ -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; @@ -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));