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); | ||||
|  | ||||
|     // Other or debug controller should always be a pro controller | ||||
|     if (npad_id_type != NpadIdType::Other) { | ||||
|         SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type)); | ||||
|         original_npad_type = npad_type; | ||||
|     } else { | ||||
|         SetNpadStyleIndex(NpadStyleIndex::ProController); | ||||
|         original_npad_type = npad_type; | ||||
|     // Player 1 shares config with handheld. Disable controller when handheld is selected | ||||
|     // if (npad_id_type == NpadIdType::Player1 && npad_type == NpadStyleIndex::Handheld) { | ||||
|     //    Disconnect(); | ||||
|     //    ReloadInput(); | ||||
|     //    return; | ||||
|     //} | ||||
|  | ||||
|     // 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(); | ||||
|  | ||||
|     SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type)); | ||||
|     original_npad_type = npad_type; | ||||
|  | ||||
|     if (player.connected) { | ||||
|         Connect(); | ||||
|     } | ||||
| @@ -593,8 +602,14 @@ bool EmulatedController::IsConfiguring() const { | ||||
| } | ||||
|  | ||||
| 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]; | ||||
|  | ||||
|     player.connected = is_connected; | ||||
|     player.controller_type = MapNPadToSettingsType(npad_type); | ||||
|     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 { | ||||
|  | ||||
| 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 { | ||||
| public: | ||||
|     /// Initializes and registers SDL device factories | ||||
| @@ -34,12 +41,15 @@ public: | ||||
|     /// Handle SDL_Events for joysticks from SDL_PollEvent | ||||
|     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; | ||||
|  | ||||
|     Common::Input::VibrationError SetVibration( | ||||
|         const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; | ||||
|     /** | ||||
|      * 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 | ||||
|      */ | ||||
|     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; | ||||
|  | ||||
| @@ -51,43 +61,75 @@ public: | ||||
|     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: | ||||
|     struct VibrationRequest { | ||||
|         PadIdentifier identifier; | ||||
|         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 CloseJoystick(int joystick_index); | ||||
|     void CloseJoystick(SDL_Joystick* sdl_joystick); | ||||
|  | ||||
|     /// Needs to be called before SDL_QuitSubSystem. | ||||
|     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 | ||||
|     void SendVibrations(); | ||||
|  | ||||
|     /// Map of GUID of a list of corresponding virtual Joysticks | ||||
|     std::unordered_map<Common::UUID, std::vector<std::shared_ptr<JoystickID>>> joystick_map; | ||||
|     std::mutex joystick_map_mutex; | ||||
|     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; | ||||
|  | ||||
|     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 | ||||
|     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; | ||||
| }; | ||||
| } // namespace InputCommon | ||||
|   | ||||
| @@ -196,6 +196,7 @@ void ConfigureInput::ApplyConfiguration() { | ||||
|     } | ||||
|  | ||||
|     advanced->ApplyConfiguration(); | ||||
|     system.HIDCore().ReloadInputDevices(); | ||||
|  | ||||
|     const bool pre_docked_mode = Settings::values.use_docked_mode.GetValue(); | ||||
|     Settings::values.use_docked_mode.SetValue(ui->radioDocked->isChecked()); | ||||
|   | ||||
| @@ -89,17 +89,12 @@ void ConfigureInputPerGame::LoadConfiguration() { | ||||
|  | ||||
|         emulated_controller->ReloadFromSettings(); | ||||
|  | ||||
|         if (player_index > 0) { | ||||
|         if (player_index != HANDHELD_INDEX) { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         // Handle Handheld cases | ||||
|         auto& handheld_player = Settings::values.players.GetValue()[HANDHELD_INDEX]; | ||||
|         auto* handheld_controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld); | ||||
|         if (player.controller_type == Settings::ControllerType::Handheld) { | ||||
|             handheld_player = player; | ||||
|         } else { | ||||
|             handheld_player = {}; | ||||
|         } | ||||
|         auto handheld_controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld); | ||||
|         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_), | ||||
|       timeout_timer(std::make_unique<QTimer>()), | ||||
|       poll_timer(std::make_unique<QTimer>()), bottom_row{bottom_row_}, hid_core{hid_core_} { | ||||
|     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->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(); | ||||
|     } | ||||
|  | ||||
|     emulated_controller = hid_core.GetEmulatedControllerByIndex(player_index); | ||||
|     emulated_controller->SaveCurrentConfig(); | ||||
|     emulated_controller->EnableConfiguration(); | ||||
|  | ||||
|     ui->setupUi(this); | ||||
|  | ||||
|     setFocusPolicy(Qt::ClickFocus); | ||||
| @@ -747,29 +732,6 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i | ||||
|         UpdateMotionButtons(); | ||||
|         const Core::HID::NpadStyleIndex type = | ||||
|             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); | ||||
|     }); | ||||
|  | ||||
| @@ -805,32 +767,10 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i | ||||
| } | ||||
|  | ||||
| ConfigureInputPlayer::~ConfigureInputPlayer() { | ||||
|     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_handheld->DisableConfiguration(); | ||||
|     } else { | ||||
|         emulated_controller->DisableConfiguration(); | ||||
|     } | ||||
|     emulated_controller->DisableConfiguration(); | ||||
| } | ||||
|  | ||||
| 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->SaveCurrentConfig(); | ||||
|     emulated_controller->EnableConfiguration(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user