From 47e51af48789b728266dcce4f86d9e85c28358f0 Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Mon, 6 Feb 2023 18:16:19 -0400 Subject: [PATCH] Add Joystick:getJoystickType. --- changes.txt | 1 + src/modules/joystick/Joystick.cpp | 15 ++++++++++ src/modules/joystick/Joystick.h | 18 ++++++++++++ src/modules/joystick/sdl/Joystick.cpp | 40 ++++++++++++++++++++++++++ src/modules/joystick/sdl/Joystick.h | 4 +++ src/modules/joystick/wrap_Joystick.cpp | 10 +++++++ 6 files changed, 88 insertions(+) diff --git a/changes.txt b/changes.txt index 6806bc258..3b725caf6 100644 --- a/changes.txt +++ b/changes.txt @@ -25,6 +25,7 @@ Released: N/A * Added love.audio.getPlaybackDevice, love.audio.getPlaybackDevices, and love.audio.setPlaybackDevice. * Added love.keyboard.isModifierActive. * Added Joystick:setPlayerIndex and Joystick:getPlayerIndex. +* Added Joystick:getJoystickType. * Added Joystick:getGamepadType. * Added Joystick:hasSensor. * Added Joystick:isSensorEnabled and Joystick:setSensorEnabled. diff --git a/src/modules/joystick/Joystick.cpp b/src/modules/joystick/Joystick.cpp index 1a7108cd3..34b2a29f3 100644 --- a/src/modules/joystick/Joystick.cpp +++ b/src/modules/joystick/Joystick.cpp @@ -56,6 +56,21 @@ STRINGMAP_CLASS_BEGIN(Joystick, Joystick::Hat, Joystick::HAT_MAX_ENUM, hat) } STRINGMAP_CLASS_END(Joystick, Joystick::Hat, Joystick::HAT_MAX_ENUM, hat) +STRINGMAP_CLASS_BEGIN(Joystick, Joystick::JoystickType, Joystick::JOYSTICK_TYPE_MAX_ENUM, joystickType) +{ + { "unknown", Joystick::JOYSTICK_TYPE_UNKNOWN }, + { "gamepad", Joystick::JOYSTICK_TYPE_GAMEPAD }, + { "wheel", Joystick::JOYSTICK_TYPE_WHEEL }, + { "arcadestick", Joystick::JOYSTICK_TYPE_ARCADE_STICK }, + { "flightstick", Joystick::JOYSTICK_TYPE_FLIGHT_STICK }, + { "dancepad", Joystick::JOYSTICK_TYPE_DANCE_PAD }, + { "guitar", Joystick::JOYSTICK_TYPE_GUITAR }, + { "drumkit", Joystick::JOYSTICK_TYPE_DRUM_KIT }, + { "arcadepad", Joystick::JOYSTICK_TYPE_ARCADE_PAD }, + { "throttle", Joystick::JOYSTICK_TYPE_THROTTLE }, +} +STRINGMAP_CLASS_END(Joystick, Joystick::JoystickType, Joystick::JOYSTICK_TYPE_MAX_ENUM, joystickType) + STRINGMAP_CLASS_BEGIN(Joystick, Joystick::GamepadType, Joystick::GAMEPAD_TYPE_MAX_ENUM, gamepadType) { { "unknown", Joystick::GAMEPAD_TYPE_UNKNOWN }, diff --git a/src/modules/joystick/Joystick.h b/src/modules/joystick/Joystick.h index ec611ea7d..4727c594a 100644 --- a/src/modules/joystick/Joystick.h +++ b/src/modules/joystick/Joystick.h @@ -59,6 +59,21 @@ public: HAT_MAX_ENUM = 16 }; + enum JoystickType + { + JOYSTICK_TYPE_UNKNOWN, + JOYSTICK_TYPE_GAMEPAD, + JOYSTICK_TYPE_WHEEL, + JOYSTICK_TYPE_ARCADE_STICK, + JOYSTICK_TYPE_FLIGHT_STICK, + JOYSTICK_TYPE_DANCE_PAD, + JOYSTICK_TYPE_GUITAR, + JOYSTICK_TYPE_DRUM_KIT, + JOYSTICK_TYPE_ARCADE_PAD, + JOYSTICK_TYPE_THROTTLE, + JOYSTICK_TYPE_MAX_ENUM + }; + enum GamepadType { GAMEPAD_TYPE_UNKNOWN, @@ -164,6 +179,8 @@ public: virtual const char *getName() const = 0; + virtual JoystickType getJoystickType() const = 0; + virtual int getAxisCount() const = 0; virtual int getButtonCount() const = 0; virtual int getHatCount() const = 0; @@ -207,6 +224,7 @@ public: virtual std::vector getSensorData(Sensor::SensorType type) const = 0; STRINGMAP_CLASS_DECLARE(Hat); + STRINGMAP_CLASS_DECLARE(JoystickType); STRINGMAP_CLASS_DECLARE(GamepadType); STRINGMAP_CLASS_DECLARE(GamepadAxis); STRINGMAP_CLASS_DECLARE(GamepadButton); diff --git a/src/modules/joystick/sdl/Joystick.cpp b/src/modules/joystick/sdl/Joystick.cpp index 2484c7405..f64c99bec 100644 --- a/src/modules/joystick/sdl/Joystick.cpp +++ b/src/modules/joystick/sdl/Joystick.cpp @@ -46,6 +46,7 @@ Joystick::Joystick(int id) : joyhandle(nullptr) , controller(nullptr) , haptic(nullptr) + , joystickType(JOYSTICK_TYPE_UNKNOWN) , instanceid(-1) , id(id) , vibration() @@ -96,6 +97,40 @@ bool Joystick::open(int deviceindex) if (joyname) name = joyname; + + switch (SDL_JoystickGetType(joyhandle)) + { + case SDL_JOYSTICK_TYPE_GAMECONTROLLER: + joystickType = JOYSTICK_TYPE_GAMEPAD; + break; + case SDL_JOYSTICK_TYPE_WHEEL: + joystickType = JOYSTICK_TYPE_WHEEL; + break; + case SDL_JOYSTICK_TYPE_ARCADE_STICK: + joystickType = JOYSTICK_TYPE_ARCADE_STICK; + break; + case SDL_JOYSTICK_TYPE_FLIGHT_STICK: + joystickType = JOYSTICK_TYPE_FLIGHT_STICK; + break; + case SDL_JOYSTICK_TYPE_DANCE_PAD: + joystickType = JOYSTICK_TYPE_DANCE_PAD; + break; + case SDL_JOYSTICK_TYPE_GUITAR: + joystickType = JOYSTICK_TYPE_GUITAR; + break; + case SDL_JOYSTICK_TYPE_DRUM_KIT: + joystickType = JOYSTICK_TYPE_DRUM_KIT; + break; + case SDL_JOYSTICK_TYPE_ARCADE_PAD: + joystickType = JOYSTICK_TYPE_ARCADE_PAD; + break; + case SDL_JOYSTICK_TYPE_THROTTLE: + joystickType = JOYSTICK_TYPE_THROTTLE; + break; + default: + joystickType = JOYSTICK_TYPE_UNKNOWN; + break; + } } return isConnected(); @@ -129,6 +164,11 @@ const char *Joystick::getName() const return name.c_str(); } +Joystick::JoystickType Joystick::getJoystickType() const +{ + return joystickType; +} + int Joystick::getAxisCount() const { return isConnected() ? SDL_JoystickNumAxes(joyhandle) : 0; diff --git a/src/modules/joystick/sdl/Joystick.h b/src/modules/joystick/sdl/Joystick.h index fe451fe40..8f4998bc9 100644 --- a/src/modules/joystick/sdl/Joystick.h +++ b/src/modules/joystick/sdl/Joystick.h @@ -51,6 +51,8 @@ public: const char *getName() const override; + JoystickType getJoystickType() const override; + int getAxisCount() const override; int getButtonCount() const override; int getHatCount() const override; @@ -113,6 +115,8 @@ private: SDL_GameController *controller; SDL_Haptic *haptic; + JoystickType joystickType; + SDL_JoystickID instanceid; std::string pguid; int id; diff --git a/src/modules/joystick/wrap_Joystick.cpp b/src/modules/joystick/wrap_Joystick.cpp index 34d4c5ea7..e2f5182b0 100644 --- a/src/modules/joystick/wrap_Joystick.cpp +++ b/src/modules/joystick/wrap_Joystick.cpp @@ -86,6 +86,15 @@ int w_Joystick_getDeviceInfo(lua_State *L) return 3; } +int w_Joystick_getJoystickType(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + const char* str = "unknown"; + Joystick::getConstant(j->getJoystickType(), str); + lua_pushstring(L, str); + return 1; +} + int w_Joystick_getAxisCount(lua_State *L) { Joystick *j = luax_checkjoystick(L, 1); @@ -448,6 +457,7 @@ static const luaL_Reg w_Joystick_functions[] = { "getID", w_Joystick_getID }, { "getGUID", w_Joystick_getGUID }, { "getDeviceInfo", w_Joystick_getDeviceInfo }, + { "getJoystickType", w_Joystick_getJoystickType }, { "getAxisCount", w_Joystick_getAxisCount }, { "getButtonCount", w_Joystick_getButtonCount }, { "getHatCount", w_Joystick_getHatCount },