| | |
| | |
| |
|
| | #pragma once |
| |
|
| | #include <atomic> |
| | #include <mutex> |
| | #include <thread> |
| | #include <unordered_map> |
| |
|
| | #include <SDL.h> |
| |
|
| | #include "common/common_types.h" |
| | #include "common/threadsafe_queue.h" |
| | #include "input_common/input_engine.h" |
| |
|
| | union SDL_Event; |
| | using SDL_GameController = struct _SDL_GameController; |
| | using SDL_Joystick = struct _SDL_Joystick; |
| | using SDL_JoystickID = s32; |
| |
|
| | namespace InputCommon { |
| |
|
| | class SDLJoystick; |
| |
|
| | using ButtonBindings = |
| | std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerButton>, 20>; |
| | using ZButtonBindings = |
| | std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerAxis>, 2>; |
| |
|
| | class SDLDriver : public InputEngine { |
| | public: |
| | |
| | explicit SDLDriver(std::string input_engine_); |
| |
|
| | |
| | ~SDLDriver() override; |
| |
|
| | void PumpEvents() const; |
| |
|
| | |
| | void HandleGameControllerEvent(const SDL_Event& event); |
| |
|
| | |
| | std::shared_ptr<SDLJoystick> GetSDLJoystickBySDLID(SDL_JoystickID sdl_id); |
| |
|
| | |
| | |
| | |
| | |
| | std::shared_ptr<SDLJoystick> GetSDLJoystickByGUID(const Common::UUID& guid, int port); |
| | std::shared_ptr<SDLJoystick> GetSDLJoystickByGUID(const std::string& guid, int port); |
| |
|
| | std::vector<Common::ParamPackage> GetInputDevices() const override; |
| |
|
| | ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) override; |
| | AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) override; |
| | MotionMapping GetMotionMappingForDevice(const Common::ParamPackage& params) override; |
| | Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override; |
| |
|
| | std::string GetHatButtonName(u8 direction_value) const override; |
| | u8 GetHatButtonId(const std::string& direction_name) const override; |
| |
|
| | bool IsStickInverted(const Common::ParamPackage& params) override; |
| |
|
| | Common::Input::DriverResult SetVibration( |
| | const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; |
| |
|
| | bool IsVibrationEnabled(const PadIdentifier& identifier) override; |
| |
|
| | private: |
| | void InitJoystick(int joystick_index); |
| | void CloseJoystick(SDL_Joystick* sdl_joystick); |
| |
|
| | |
| | void CloseJoysticks(); |
| |
|
| | |
| | void SendVibrations(); |
| |
|
| | Common::ParamPackage BuildAnalogParamPackageForButton(int port, const Common::UUID& guid, |
| | s32 axis, float value = 0.1f) const; |
| | Common::ParamPackage BuildButtonParamPackageForButton(int port, const Common::UUID& guid, |
| | s32 button) const; |
| |
|
| | Common::ParamPackage BuildHatParamPackageForButton(int port, const Common::UUID& guid, s32 hat, |
| | u8 value) const; |
| |
|
| | Common::ParamPackage BuildMotionParam(int port, const Common::UUID& guid) const; |
| |
|
| | Common::ParamPackage BuildParamPackageForBinding( |
| | int port, const Common::UUID& guid, const SDL_GameControllerButtonBind& binding) const; |
| |
|
| | Common::ParamPackage BuildParamPackageForAnalog(PadIdentifier identifier, int axis_x, |
| | int axis_y, float offset_x, |
| | float offset_y) const; |
| |
|
| | |
| | ButtonBindings GetDefaultButtonBinding(const std::shared_ptr<SDLJoystick>& joystick) const; |
| |
|
| | |
| | ButtonMapping GetSingleControllerMapping(const std::shared_ptr<SDLJoystick>& joystick, |
| | const ButtonBindings& switch_to_sdl_button, |
| | const ZButtonBindings& switch_to_sdl_axis) const; |
| |
|
| | |
| | ButtonMapping GetDualControllerMapping(const std::shared_ptr<SDLJoystick>& joystick, |
| | const std::shared_ptr<SDLJoystick>& joystick2, |
| | const ButtonBindings& switch_to_sdl_button, |
| | const ZButtonBindings& switch_to_sdl_axis) const; |
| |
|
| | |
| | bool IsButtonOnLeftSide(Settings::NativeButton::Values button) const; |
| |
|
| | |
| | Common::SPSCQueue<VibrationRequest> vibration_queue; |
| |
|
| | |
| | std::unordered_map<Common::UUID, std::vector<std::shared_ptr<SDLJoystick>>> joystick_map; |
| | std::mutex joystick_map_mutex; |
| |
|
| | bool start_thread = false; |
| | std::atomic<bool> initialized = false; |
| |
|
| | std::thread vibration_thread; |
| | }; |
| | } |
| |
|