Compare commits
	
		
			1 Commits
		
	
	
		
			sdl_who
			...
			burning-pr
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 66ccd77115 | 
| @@ -111,16 +111,25 @@ void EmulatedController::ReloadFromSettings() { | |||||||
|  |  | ||||||
|     ring_params[0] = Common::ParamPackage(Settings::values.ringcon_analogs); |     ring_params[0] = Common::ParamPackage(Settings::values.ringcon_analogs); | ||||||
|  |  | ||||||
|     // Other or debug controller should always be a pro controller |     // Player 1 shares config with handheld. Disable controller when handheld is selected | ||||||
|     if (npad_id_type != NpadIdType::Other) { |     // if (npad_id_type == NpadIdType::Player1 && npad_type == NpadStyleIndex::Handheld) { | ||||||
|         SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type)); |     //    Disconnect(); | ||||||
|         original_npad_type = npad_type; |     //    ReloadInput(); | ||||||
|     } else { |     //    return; | ||||||
|         SetNpadStyleIndex(NpadStyleIndex::ProController); |     //} | ||||||
|         original_npad_type = npad_type; |  | ||||||
|  |     // Handheld shares config with player 1. Disable controller when handheld isn't selected | ||||||
|  |     if (npad_id_type == NpadIdType::Handheld && npad_type != NpadStyleIndex::Handheld) { | ||||||
|  |         Disconnect(); | ||||||
|  |         ReloadInput(); | ||||||
|  |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Disconnect(); |     Disconnect(); | ||||||
|  |  | ||||||
|  |     SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type)); | ||||||
|  |     original_npad_type = npad_type; | ||||||
|  |  | ||||||
|     if (player.connected) { |     if (player.connected) { | ||||||
|         Connect(); |         Connect(); | ||||||
|     } |     } | ||||||
| @@ -593,8 +602,14 @@ bool EmulatedController::IsConfiguring() const { | |||||||
| } | } | ||||||
|  |  | ||||||
| void EmulatedController::SaveCurrentConfig() { | void EmulatedController::SaveCurrentConfig() { | ||||||
|     const auto player_index = NpadIdTypeToIndex(npad_id_type); |     // Other and Handheld can't alter the config from here | ||||||
|  |     if (npad_id_type == NpadIdType::Other || npad_id_type == NpadIdType::Handheld) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const auto player_index = NpadIdTypeToConfigIndex(npad_id_type); | ||||||
|     auto& player = Settings::values.players.GetValue()[player_index]; |     auto& player = Settings::values.players.GetValue()[player_index]; | ||||||
|  |  | ||||||
|     player.connected = is_connected; |     player.connected = is_connected; | ||||||
|     player.controller_type = MapNPadToSettingsType(npad_type); |     player.controller_type = MapNPadToSettingsType(npad_type); | ||||||
|     for (std::size_t index = 0; index < player.buttons.size(); ++index) { |     for (std::size_t index = 0; index < player.buttons.size(); ++index) { | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -21,6 +21,13 @@ using SDL_JoystickID = s32; | |||||||
|  |  | ||||||
| namespace InputCommon { | namespace InputCommon { | ||||||
|  |  | ||||||
|  | class SDLJoystick; | ||||||
|  |  | ||||||
|  | using ButtonBindings = | ||||||
|  |     std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerButton>, 18>; | ||||||
|  | using ZButtonBindings = | ||||||
|  |     std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerAxis>, 2>; | ||||||
|  |  | ||||||
| class SDLDriver : public InputEngine { | class SDLDriver : public InputEngine { | ||||||
| public: | public: | ||||||
|     /// Initializes and registers SDL device factories |     /// Initializes and registers SDL device factories | ||||||
| @@ -34,12 +41,15 @@ public: | |||||||
|     /// Handle SDL_Events for joysticks from SDL_PollEvent |     /// Handle SDL_Events for joysticks from SDL_PollEvent | ||||||
|     void HandleGameControllerEvent(const SDL_Event& event); |     void HandleGameControllerEvent(const SDL_Event& event); | ||||||
|  |  | ||||||
|     bool IsStickInverted(const Common::ParamPackage& params) override; |     /// Get the nth joystick with the corresponding GUID | ||||||
|  |     std::shared_ptr<SDLJoystick> GetSDLJoystickBySDLID(SDL_JoystickID sdl_id); | ||||||
|  |  | ||||||
|     bool IsVibrationEnabled(const PadIdentifier& identifier) override; |     /** | ||||||
|  |      * Check how many identical joysticks (by guid) were connected before the one with sdl_id and so | ||||||
|     Common::Input::VibrationError SetVibration( |      * tie it to a SDLJoystick with the same guid and that port | ||||||
|         const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; |      */ | ||||||
|  |     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; |     std::vector<Common::ParamPackage> GetInputDevices() const override; | ||||||
|  |  | ||||||
| @@ -51,43 +61,75 @@ public: | |||||||
|     std::string GetHatButtonName(u8 direction_value) const override; |     std::string GetHatButtonName(u8 direction_value) const override; | ||||||
|     u8 GetHatButtonId(const std::string& direction_name) 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: | private: | ||||||
|     struct VibrationRequest { |     struct VibrationRequest { | ||||||
|         PadIdentifier identifier; |         PadIdentifier identifier; | ||||||
|         Common::Input::VibrationStatus vibration; |         Common::Input::VibrationStatus vibration; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     struct JoystickID { |  | ||||||
|         int sdl_index; |  | ||||||
|         bool has_rumble; |  | ||||||
|         PadIdentifier identifier; |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     std::shared_ptr<JoystickID> GetSDLJoystickBySDLID(SDL_JoystickID sdl_id); |  | ||||||
|  |  | ||||||
|     void InitJoystick(int joystick_index); |     void InitJoystick(int joystick_index); | ||||||
|     void CloseJoystick(int joystick_index); |     void CloseJoystick(SDL_Joystick* sdl_joystick); | ||||||
|  |  | ||||||
|     /// Needs to be called before SDL_QuitSubSystem. |     /// Needs to be called before SDL_QuitSubSystem. | ||||||
|     void CloseJoysticks(); |     void CloseJoysticks(); | ||||||
|  |  | ||||||
|     void UpdateControllerStatus(u32 event, int joystick_index, int index, int value); |  | ||||||
|  |  | ||||||
|     Common::Input::BatteryLevel GetBatteryLevel(int value); |  | ||||||
|  |  | ||||||
|     /// Takes all vibrations from the queue and sends the command to the controller |     /// Takes all vibrations from the queue and sends the command to the controller | ||||||
|     void SendVibrations(); |     void SendVibrations(); | ||||||
|  |  | ||||||
|     /// Map of GUID of a list of corresponding virtual Joysticks |     Common::ParamPackage BuildAnalogParamPackageForButton(int port, const Common::UUID& guid, | ||||||
|     std::unordered_map<Common::UUID, std::vector<std::shared_ptr<JoystickID>>> joystick_map; |                                                           s32 axis, float value = 0.1f) const; | ||||||
|     std::mutex joystick_map_mutex; |     Common::ParamPackage BuildButtonParamPackageForButton(int port, const Common::UUID& guid, | ||||||
|  |                                                           s32 button) const; | ||||||
|  |  | ||||||
|     std::atomic<bool> initialized = false; |     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; | ||||||
|  |  | ||||||
|  |     /// 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; | ||||||
|  |  | ||||||
|     /// Queue of vibration request to controllers |     /// Queue of vibration request to controllers | ||||||
|     Common::SPSCQueue<VibrationRequest> vibration_queue; |     Common::SPSCQueue<VibrationRequest> vibration_queue; | ||||||
|  |  | ||||||
|     /// Thread that handles request from the vibration queue |     /// Map of GUID of a list of corresponding virtual Joysticks | ||||||
|  |     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; |     std::thread vibration_thread; | ||||||
| }; | }; | ||||||
| } // namespace InputCommon | } // namespace InputCommon | ||||||
|   | |||||||
| @@ -196,6 +196,7 @@ void ConfigureInput::ApplyConfiguration() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     advanced->ApplyConfiguration(); |     advanced->ApplyConfiguration(); | ||||||
|  |     system.HIDCore().ReloadInputDevices(); | ||||||
|  |  | ||||||
|     const bool pre_docked_mode = Settings::values.use_docked_mode.GetValue(); |     const bool pre_docked_mode = Settings::values.use_docked_mode.GetValue(); | ||||||
|     Settings::values.use_docked_mode.SetValue(ui->radioDocked->isChecked()); |     Settings::values.use_docked_mode.SetValue(ui->radioDocked->isChecked()); | ||||||
|   | |||||||
| @@ -89,17 +89,12 @@ void ConfigureInputPerGame::LoadConfiguration() { | |||||||
|  |  | ||||||
|         emulated_controller->ReloadFromSettings(); |         emulated_controller->ReloadFromSettings(); | ||||||
|  |  | ||||||
|         if (player_index > 0) { |         if (player_index != HANDHELD_INDEX) { | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Handle Handheld cases |         // Handle Handheld cases | ||||||
|         auto& handheld_player = Settings::values.players.GetValue()[HANDHELD_INDEX]; |         auto handheld_controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld); | ||||||
|         auto* handheld_controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld); |  | ||||||
|         if (player.controller_type == Settings::ControllerType::Handheld) { |  | ||||||
|             handheld_player = player; |  | ||||||
|         } else { |  | ||||||
|             handheld_player = {}; |  | ||||||
|         } |  | ||||||
|         handheld_controller->ReloadFromSettings(); |         handheld_controller->ReloadFromSettings(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -296,26 +296,11 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i | |||||||
|       is_powered_on{is_powered_on_}, input_subsystem{input_subsystem_}, profiles(profiles_), |       is_powered_on{is_powered_on_}, input_subsystem{input_subsystem_}, profiles(profiles_), | ||||||
|       timeout_timer(std::make_unique<QTimer>()), |       timeout_timer(std::make_unique<QTimer>()), | ||||||
|       poll_timer(std::make_unique<QTimer>()), bottom_row{bottom_row_}, hid_core{hid_core_} { |       poll_timer(std::make_unique<QTimer>()), bottom_row{bottom_row_}, hid_core{hid_core_} { | ||||||
|     if (player_index == 0) { |  | ||||||
|         auto* emulated_controller_p1 = |     emulated_controller = hid_core.GetEmulatedControllerByIndex(player_index); | ||||||
|             hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1); |     emulated_controller->SaveCurrentConfig(); | ||||||
|         auto* emulated_controller_handheld = |     emulated_controller->EnableConfiguration(); | ||||||
|             hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld); |  | ||||||
|         emulated_controller_p1->SaveCurrentConfig(); |  | ||||||
|         emulated_controller_p1->EnableConfiguration(); |  | ||||||
|         emulated_controller_handheld->SaveCurrentConfig(); |  | ||||||
|         emulated_controller_handheld->EnableConfiguration(); |  | ||||||
|         if (emulated_controller_handheld->IsConnected(true)) { |  | ||||||
|             emulated_controller_p1->Disconnect(); |  | ||||||
|             emulated_controller = emulated_controller_handheld; |  | ||||||
|         } else { |  | ||||||
|             emulated_controller = emulated_controller_p1; |  | ||||||
|         } |  | ||||||
|     } else { |  | ||||||
|         emulated_controller = hid_core.GetEmulatedControllerByIndex(player_index); |  | ||||||
|         emulated_controller->SaveCurrentConfig(); |  | ||||||
|         emulated_controller->EnableConfiguration(); |  | ||||||
|     } |  | ||||||
|     ui->setupUi(this); |     ui->setupUi(this); | ||||||
|  |  | ||||||
|     setFocusPolicy(Qt::ClickFocus); |     setFocusPolicy(Qt::ClickFocus); | ||||||
| @@ -747,29 +732,6 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i | |||||||
|         UpdateMotionButtons(); |         UpdateMotionButtons(); | ||||||
|         const Core::HID::NpadStyleIndex type = |         const Core::HID::NpadStyleIndex type = | ||||||
|             GetControllerTypeFromIndex(ui->comboControllerType->currentIndex()); |             GetControllerTypeFromIndex(ui->comboControllerType->currentIndex()); | ||||||
|  |  | ||||||
|         if (player_index == 0) { |  | ||||||
|             auto* emulated_controller_p1 = |  | ||||||
|                 hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1); |  | ||||||
|             auto* emulated_controller_handheld = |  | ||||||
|                 hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld); |  | ||||||
|             bool is_connected = emulated_controller->IsConnected(true); |  | ||||||
|  |  | ||||||
|             emulated_controller_p1->SetNpadStyleIndex(type); |  | ||||||
|             emulated_controller_handheld->SetNpadStyleIndex(type); |  | ||||||
|             if (is_connected) { |  | ||||||
|                 if (type == Core::HID::NpadStyleIndex::Handheld) { |  | ||||||
|                     emulated_controller_p1->Disconnect(); |  | ||||||
|                     emulated_controller_handheld->Connect(true); |  | ||||||
|                     emulated_controller = emulated_controller_handheld; |  | ||||||
|                 } else { |  | ||||||
|                     emulated_controller_handheld->Disconnect(); |  | ||||||
|                     emulated_controller_p1->Connect(true); |  | ||||||
|                     emulated_controller = emulated_controller_p1; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             ui->controllerFrame->SetController(emulated_controller); |  | ||||||
|         } |  | ||||||
|         emulated_controller->SetNpadStyleIndex(type); |         emulated_controller->SetNpadStyleIndex(type); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
| @@ -805,32 +767,10 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i | |||||||
| } | } | ||||||
|  |  | ||||||
| ConfigureInputPlayer::~ConfigureInputPlayer() { | ConfigureInputPlayer::~ConfigureInputPlayer() { | ||||||
|     if (player_index == 0) { |     emulated_controller->DisableConfiguration(); | ||||||
|         auto* emulated_controller_p1 = |  | ||||||
|             hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1); |  | ||||||
|         auto* emulated_controller_handheld = |  | ||||||
|             hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld); |  | ||||||
|         emulated_controller_p1->DisableConfiguration(); |  | ||||||
|         emulated_controller_handheld->DisableConfiguration(); |  | ||||||
|     } else { |  | ||||||
|         emulated_controller->DisableConfiguration(); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void ConfigureInputPlayer::ApplyConfiguration() { | void ConfigureInputPlayer::ApplyConfiguration() { | ||||||
|     if (player_index == 0) { |  | ||||||
|         auto* emulated_controller_p1 = |  | ||||||
|             hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1); |  | ||||||
|         auto* emulated_controller_handheld = |  | ||||||
|             hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld); |  | ||||||
|         emulated_controller_p1->DisableConfiguration(); |  | ||||||
|         emulated_controller_p1->SaveCurrentConfig(); |  | ||||||
|         emulated_controller_p1->EnableConfiguration(); |  | ||||||
|         emulated_controller_handheld->DisableConfiguration(); |  | ||||||
|         emulated_controller_handheld->SaveCurrentConfig(); |  | ||||||
|         emulated_controller_handheld->EnableConfiguration(); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|     emulated_controller->DisableConfiguration(); |     emulated_controller->DisableConfiguration(); | ||||||
|     emulated_controller->SaveCurrentConfig(); |     emulated_controller->SaveCurrentConfig(); | ||||||
|     emulated_controller->EnableConfiguration(); |     emulated_controller->EnableConfiguration(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user