| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  | // Copyright 2018 Citra Emulator Project
 | 
					
						
							| 
									
										
										
										
											2018-09-22 14:11:15 -06:00
										 |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  | #include <atomic>
 | 
					
						
							| 
									
										
										
										
											2019-06-03 15:50:04 -04:00
										 |  |  | #include <mutex>
 | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  | #include <thread>
 | 
					
						
							| 
									
										
										
										
											2019-06-03 15:50:04 -04:00
										 |  |  | #include <unordered_map>
 | 
					
						
							| 
									
										
										
										
											2021-05-15 22:48:37 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <SDL.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-03 15:50:04 -04:00
										 |  |  | #include "common/common_types.h"
 | 
					
						
							| 
									
										
										
										
											2021-09-20 17:36:23 -05:00
										 |  |  | #include "input_common/input_engine.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-22 14:11:15 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | union SDL_Event; | 
					
						
							| 
									
										
										
										
											2021-03-27 19:07:59 -05:00
										 |  |  | using SDL_GameController = struct _SDL_GameController; | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  | using SDL_Joystick = struct _SDL_Joystick; | 
					
						
							|  |  |  | using SDL_JoystickID = s32; | 
					
						
							| 
									
										
										
										
											2018-09-22 14:11:15 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-13 09:05:23 -05:00
										 |  |  | namespace InputCommon { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SDLJoystick; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-15 22:48:37 -05:00
										 |  |  | using ButtonBindings = | 
					
						
							| 
									
										
										
										
											2021-11-15 17:57:41 -06:00
										 |  |  |     std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerButton>, 18>; | 
					
						
							| 
									
										
										
										
											2021-05-15 22:48:37 -05:00
										 |  |  | using ZButtonBindings = | 
					
						
							|  |  |  |     std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerAxis>, 2>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-13 09:05:23 -05:00
										 |  |  | class SDLDriver : public InputEngine { | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  | public: | 
					
						
							|  |  |  |     /// Initializes and registers SDL device factories
 | 
					
						
							| 
									
										
										
										
											2021-12-13 09:05:23 -05:00
										 |  |  |     explicit SDLDriver(std::string input_engine_); | 
					
						
							| 
									
										
										
										
											2018-09-22 14:11:15 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-18 11:26:13 -04:00
										 |  |  |     /// Unregisters SDL device factories and shut them down.
 | 
					
						
							| 
									
										
										
										
											2021-09-20 17:36:23 -05:00
										 |  |  |     ~SDLDriver() override; | 
					
						
							| 
									
										
										
										
											2018-09-22 14:11:15 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  |     /// Handle SDL_Events for joysticks from SDL_PollEvent
 | 
					
						
							|  |  |  |     void HandleGameControllerEvent(const SDL_Event& event); | 
					
						
							| 
									
										
										
										
											2018-09-22 14:11:15 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-03 16:42:17 -04:00
										 |  |  |     /// Get the nth joystick with the corresponding GUID
 | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  |     std::shared_ptr<SDLJoystick> GetSDLJoystickBySDLID(SDL_JoystickID sdl_id); | 
					
						
							| 
									
										
										
										
											2019-06-03 16:42:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Check how many identical joysticks (by guid) were connected before the one with sdl_id and so | 
					
						
							|  |  |  |      * tie it to a SDLJoystick with the same guid and that port | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  |     std::shared_ptr<SDLJoystick> GetSDLJoystickByGUID(const std::string& guid, int port); | 
					
						
							| 
									
										
										
										
											2018-09-22 14:11:15 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-20 17:36:23 -05:00
										 |  |  |     std::vector<Common::ParamPackage> GetInputDevices() const override; | 
					
						
							| 
									
										
										
										
											2020-07-22 10:39:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) override; | 
					
						
							|  |  |  |     AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) override; | 
					
						
							| 
									
										
										
										
											2021-04-25 18:03:57 -05:00
										 |  |  |     MotionMapping GetMotionMappingForDevice(const Common::ParamPackage& params) override; | 
					
						
							| 
									
										
										
										
											2021-11-21 14:12:01 -06:00
										 |  |  |     Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override; | 
					
						
							| 
									
										
										
										
											2021-09-20 17:36:23 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     std::string GetHatButtonName(u8 direction_value) const override; | 
					
						
							| 
									
										
										
										
											2021-11-14 21:56:54 -06:00
										 |  |  |     u8 GetHatButtonId(const std::string& direction_name) const override; | 
					
						
							| 
									
										
										
										
											2021-09-20 17:36:23 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-04 11:47:13 -06:00
										 |  |  |     bool IsStickInverted(const Common::ParamPackage& params) override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-30 22:23:10 -05:00
										 |  |  |     Common::Input::VibrationError SetRumble( | 
					
						
							| 
									
										
										
										
											2021-12-13 09:09:03 -05:00
										 |  |  |         const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; | 
					
						
							| 
									
										
										
										
											2020-07-22 10:39:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  | private: | 
					
						
							|  |  |  |     void InitJoystick(int joystick_index); | 
					
						
							|  |  |  |     void CloseJoystick(SDL_Joystick* sdl_joystick); | 
					
						
							| 
									
										
										
										
											2018-09-22 14:11:15 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  |     /// Needs to be called before SDL_QuitSubSystem.
 | 
					
						
							|  |  |  |     void CloseJoysticks(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-20 17:36:23 -05:00
										 |  |  |     Common::ParamPackage BuildAnalogParamPackageForButton(int port, std::string guid, s32 axis, | 
					
						
							|  |  |  |                                                           float value = 0.1f) const; | 
					
						
							|  |  |  |     Common::ParamPackage BuildButtonParamPackageForButton(int port, std::string guid, | 
					
						
							|  |  |  |                                                           s32 button) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Common::ParamPackage BuildHatParamPackageForButton(int port, std::string guid, s32 hat, | 
					
						
							|  |  |  |                                                        u8 value) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Common::ParamPackage BuildMotionParam(int port, std::string guid) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Common::ParamPackage BuildParamPackageForBinding( | 
					
						
							|  |  |  |         int port, const std::string& guid, const SDL_GameControllerButtonBind& binding) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Common::ParamPackage BuildParamPackageForAnalog(PadIdentifier identifier, int axis_x, | 
					
						
							|  |  |  |                                                     int axis_y, float offset_x, | 
					
						
							|  |  |  |                                                     float offset_y) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-15 22:48:37 -05:00
										 |  |  |     /// Returns the default button bindings list for generic controllers
 | 
					
						
							|  |  |  |     ButtonBindings GetDefaultButtonBinding() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /// Returns the default button bindings list for nintendo controllers
 | 
					
						
							|  |  |  |     ButtonBindings GetNintendoButtonBinding(const std::shared_ptr<SDLJoystick>& joystick) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /// Returns the button mappings from a single controller
 | 
					
						
							|  |  |  |     ButtonMapping GetSingleControllerMapping(const std::shared_ptr<SDLJoystick>& joystick, | 
					
						
							|  |  |  |                                              const ButtonBindings& switch_to_sdl_button, | 
					
						
							|  |  |  |                                              const ZButtonBindings& switch_to_sdl_axis) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /// Returns the button mappings from two different controllers
 | 
					
						
							|  |  |  |     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; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /// Returns true if the button is on the left joycon
 | 
					
						
							|  |  |  |     bool IsButtonOnLeftSide(Settings::NativeButton::Values button) const; | 
					
						
							| 
									
										
										
										
											2021-03-27 19:07:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 00:28:05 -06:00
										 |  |  |     /// Map of GUID of a list of corresponding virtual Joysticks
 | 
					
						
							|  |  |  |     std::unordered_map<std::string, std::vector<std::shared_ptr<SDLJoystick>>> joystick_map; | 
					
						
							|  |  |  |     std::mutex joystick_map_mutex; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool start_thread = false; | 
					
						
							|  |  |  |     std::atomic<bool> initialized = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::thread poll_thread; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2021-09-20 17:36:23 -05:00
										 |  |  | } // namespace InputCommon
 |