mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 02:34:11 +01:00 
			
		
		
		
	Merge pull request #12702 from german77/android-input
input_common: Add android input engine
This commit is contained in:
		
						commit
						3092855d5a
					
				| @ -2,6 +2,8 @@ | ||||
| # SPDX-License-Identifier: GPL-2.0-or-later | ||||
| 
 | ||||
| add_library(input_common STATIC | ||||
|     drivers/android.cpp | ||||
|     drivers/android.h | ||||
|     drivers/camera.cpp | ||||
|     drivers/camera.h | ||||
|     drivers/keyboard.cpp | ||||
|  | ||||
							
								
								
									
										48
									
								
								src/input_common/drivers/android.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/input_common/drivers/android.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
 | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later
 | ||||
| 
 | ||||
| #include "input_common/drivers/android.h" | ||||
| 
 | ||||
| namespace InputCommon { | ||||
| 
 | ||||
| Android::Android(std::string input_engine_) : InputEngine(std::move(input_engine_)) {} | ||||
| 
 | ||||
| void Android::RegisterController(std::size_t controller_number) { | ||||
|     PreSetController(GetIdentifier(controller_number)); | ||||
| } | ||||
| 
 | ||||
| void Android::SetButtonState(std::size_t controller_number, int button_id, bool value) { | ||||
|     const auto identifier = GetIdentifier(controller_number); | ||||
|     SetButton(identifier, button_id, value); | ||||
| } | ||||
| 
 | ||||
| void Android::SetAxisState(std::size_t controller_number, int axis_id, float value) { | ||||
|     const auto identifier = GetIdentifier(controller_number); | ||||
|     SetAxis(identifier, axis_id, value); | ||||
| } | ||||
| 
 | ||||
| void Android::SetMotionState(std::size_t controller_number, u64 delta_timestamp, float gyro_x, | ||||
|                              float gyro_y, float gyro_z, float accel_x, float accel_y, | ||||
|                              float accel_z) { | ||||
|     const auto identifier = GetIdentifier(controller_number); | ||||
|     const BasicMotion motion_data{ | ||||
|         .gyro_x = gyro_x, | ||||
|         .gyro_y = gyro_y, | ||||
|         .gyro_z = gyro_z, | ||||
|         .accel_x = accel_x, | ||||
|         .accel_y = accel_y, | ||||
|         .accel_z = accel_z, | ||||
|         .delta_timestamp = delta_timestamp, | ||||
|     }; | ||||
|     SetMotion(identifier, 0, motion_data); | ||||
| } | ||||
| 
 | ||||
| PadIdentifier Android::GetIdentifier(std::size_t controller_number) const { | ||||
|     return { | ||||
|         .guid = Common::UUID{}, | ||||
|         .port = controller_number, | ||||
|         .pad = 0, | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| } // namespace InputCommon
 | ||||
							
								
								
									
										54
									
								
								src/input_common/drivers/android.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/input_common/drivers/android.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
 | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "input_common/input_engine.h" | ||||
| 
 | ||||
| namespace InputCommon { | ||||
| 
 | ||||
| /**
 | ||||
|  * A virtual controller that is always assigned to the game input | ||||
|  */ | ||||
| class Android final : public InputEngine { | ||||
| public: | ||||
|     explicit Android(std::string input_engine_); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Registers controller number to accept new inputs | ||||
|      * @param controller_number the controller number that will take this action | ||||
|      */ | ||||
|     void RegisterController(std::size_t controller_number); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Sets the status of all buttons bound with the key to pressed | ||||
|      * @param controller_number the controller number that will take this action | ||||
|      * @param button_id the id of the button | ||||
|      * @param value indicates if the button is pressed or not | ||||
|      */ | ||||
|     void SetButtonState(std::size_t controller_number, int button_id, bool value); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Sets the status of a analog input to a specific player index | ||||
|      * @param controller_number the controller number that will take this action | ||||
|      * @param axis_id the id of the axis to move | ||||
|      * @param value the analog position of the axis | ||||
|      */ | ||||
|     void SetAxisState(std::size_t controller_number, int axis_id, float value); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Sets the status of the motion sensor to a specific player index | ||||
|      * @param controller_number the controller number that will take this action | ||||
|      * @param delta_timestamp time passed since last reading | ||||
|      * @param gyro_x,gyro_y,gyro_z the gyro sensor readings | ||||
|      * @param accel_x,accel_y,accel_z the accelerometer reading | ||||
|      */ | ||||
|     void SetMotionState(std::size_t controller_number, u64 delta_timestamp, float gyro_x, | ||||
|                         float gyro_y, float gyro_z, float accel_x, float accel_y, float accel_z); | ||||
| 
 | ||||
| private: | ||||
|     /// Returns the correct identifier corresponding to the player index
 | ||||
|     PadIdentifier GetIdentifier(std::size_t controller_number) const; | ||||
| }; | ||||
| 
 | ||||
| } // namespace InputCommon
 | ||||
| @ -210,6 +210,9 @@ bool MappingFactory::IsDriverValid(const MappingData& data) const { | ||||
|     if (data.engine == "analog_from_button") { | ||||
|         return false; | ||||
|     } | ||||
|     if (data.engine == "virtual_gamepad") { | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -4,6 +4,7 @@ | ||||
| #include <memory> | ||||
| #include "common/input.h" | ||||
| #include "common/param_package.h" | ||||
| #include "input_common/drivers/android.h" | ||||
| #include "input_common/drivers/camera.h" | ||||
| #include "input_common/drivers/keyboard.h" | ||||
| #include "input_common/drivers/mouse.h" | ||||
| @ -78,6 +79,7 @@ struct InputSubsystem::Impl { | ||||
|         RegisterEngine("cemuhookudp", udp_client); | ||||
|         RegisterEngine("tas", tas_input); | ||||
|         RegisterEngine("camera", camera); | ||||
|         RegisterEngine("android", android); | ||||
|         RegisterEngine("virtual_amiibo", virtual_amiibo); | ||||
|         RegisterEngine("virtual_gamepad", virtual_gamepad); | ||||
| #ifdef HAVE_SDL2 | ||||
| @ -109,6 +111,7 @@ struct InputSubsystem::Impl { | ||||
|         UnregisterEngine(udp_client); | ||||
|         UnregisterEngine(tas_input); | ||||
|         UnregisterEngine(camera); | ||||
|         UnregisterEngine(android); | ||||
|         UnregisterEngine(virtual_amiibo); | ||||
|         UnregisterEngine(virtual_gamepad); | ||||
| #ifdef HAVE_SDL2 | ||||
| @ -129,6 +132,8 @@ struct InputSubsystem::Impl { | ||||
|         devices.insert(devices.end(), keyboard_devices.begin(), keyboard_devices.end()); | ||||
|         auto mouse_devices = mouse->GetInputDevices(); | ||||
|         devices.insert(devices.end(), mouse_devices.begin(), mouse_devices.end()); | ||||
|         auto android_devices = android->GetInputDevices(); | ||||
|         devices.insert(devices.end(), android_devices.begin(), android_devices.end()); | ||||
| #ifdef HAVE_LIBUSB | ||||
|         auto gcadapter_devices = gcadapter->GetInputDevices(); | ||||
|         devices.insert(devices.end(), gcadapter_devices.begin(), gcadapter_devices.end()); | ||||
| @ -157,6 +162,9 @@ struct InputSubsystem::Impl { | ||||
|         if (engine == mouse->GetEngineName()) { | ||||
|             return mouse; | ||||
|         } | ||||
|         if (engine == android->GetEngineName()) { | ||||
|             return android; | ||||
|         } | ||||
| #ifdef HAVE_LIBUSB | ||||
|         if (engine == gcadapter->GetEngineName()) { | ||||
|             return gcadapter; | ||||
| @ -237,6 +245,9 @@ struct InputSubsystem::Impl { | ||||
|         if (engine == mouse->GetEngineName()) { | ||||
|             return true; | ||||
|         } | ||||
|         if (engine == android->GetEngineName()) { | ||||
|             return true; | ||||
|         } | ||||
| #ifdef HAVE_LIBUSB | ||||
|         if (engine == gcadapter->GetEngineName()) { | ||||
|             return true; | ||||
| @ -265,6 +276,7 @@ struct InputSubsystem::Impl { | ||||
|     void BeginConfiguration() { | ||||
|         keyboard->BeginConfiguration(); | ||||
|         mouse->BeginConfiguration(); | ||||
|         android->BeginConfiguration(); | ||||
| #ifdef HAVE_LIBUSB | ||||
|         gcadapter->BeginConfiguration(); | ||||
| #endif | ||||
| @ -278,6 +290,7 @@ struct InputSubsystem::Impl { | ||||
|     void EndConfiguration() { | ||||
|         keyboard->EndConfiguration(); | ||||
|         mouse->EndConfiguration(); | ||||
|         android->EndConfiguration(); | ||||
| #ifdef HAVE_LIBUSB | ||||
|         gcadapter->EndConfiguration(); | ||||
| #endif | ||||
| @ -308,6 +321,7 @@ struct InputSubsystem::Impl { | ||||
|     std::shared_ptr<TasInput::Tas> tas_input; | ||||
|     std::shared_ptr<CemuhookUDP::UDPClient> udp_client; | ||||
|     std::shared_ptr<Camera> camera; | ||||
|     std::shared_ptr<Android> android; | ||||
|     std::shared_ptr<VirtualAmiibo> virtual_amiibo; | ||||
|     std::shared_ptr<VirtualGamepad> virtual_gamepad; | ||||
| 
 | ||||
| @ -373,6 +387,14 @@ const Camera* InputSubsystem::GetCamera() const { | ||||
|     return impl->camera.get(); | ||||
| } | ||||
| 
 | ||||
| Android* InputSubsystem::GetAndroid() { | ||||
|     return impl->android.get(); | ||||
| } | ||||
| 
 | ||||
| const Android* InputSubsystem::GetAndroid() const { | ||||
|     return impl->android.get(); | ||||
| } | ||||
| 
 | ||||
| VirtualAmiibo* InputSubsystem::GetVirtualAmiibo() { | ||||
|     return impl->virtual_amiibo.get(); | ||||
| } | ||||
|  | ||||
| @ -29,6 +29,7 @@ enum Values : int; | ||||
| } | ||||
| 
 | ||||
| namespace InputCommon { | ||||
| class Android; | ||||
| class Camera; | ||||
| class Keyboard; | ||||
| class Mouse; | ||||
| @ -103,6 +104,12 @@ public: | ||||
|     /// Retrieves the underlying camera input device.
 | ||||
|     [[nodiscard]] const Camera* GetCamera() const; | ||||
| 
 | ||||
|     /// Retrieves the underlying android input device.
 | ||||
|     [[nodiscard]] Android* GetAndroid(); | ||||
| 
 | ||||
|     /// Retrieves the underlying android input device.
 | ||||
|     [[nodiscard]] const Android* GetAndroid() const; | ||||
| 
 | ||||
|     /// Retrieves the underlying virtual amiibo input device.
 | ||||
|     [[nodiscard]] VirtualAmiibo* GetVirtualAmiibo(); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user