mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	HID: use ButtonDevice
This commit is contained in:
		
							parent
							
								
									3974895e08
								
							
						
					
					
						commit
						1d1329af23
					
				
					 5 changed files with 100 additions and 1 deletions
				
			
		|  | @ -94,4 +94,10 @@ std::unique_ptr<InputDeviceType> CreateDevice(const std::string& params) { | ||||||
|     return pair->second->Create(package); |     return pair->second->Create(package); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * A button device is an input device that returns bool as status. | ||||||
|  |  * true for pressed; false for released. | ||||||
|  |  */ | ||||||
|  | using ButtonDevice = InputDevice<bool>; | ||||||
|  | 
 | ||||||
| } // namespace Input
 | } // namespace Input
 | ||||||
|  |  | ||||||
|  | @ -2,10 +2,14 @@ | ||||||
| // Licensed under GPLv2 or any later version
 | // Licensed under GPLv2 or any later version
 | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
|  | #include <algorithm> | ||||||
|  | #include <atomic> | ||||||
| #include <cmath> | #include <cmath> | ||||||
|  | #include <memory> | ||||||
| #include "common/logging/log.h" | #include "common/logging/log.h" | ||||||
| #include "core/core_timing.h" | #include "core/core_timing.h" | ||||||
| #include "core/frontend/emu_window.h" | #include "core/frontend/emu_window.h" | ||||||
|  | #include "core/frontend/input.h" | ||||||
| #include "core/hle/kernel/event.h" | #include "core/hle/kernel/event.h" | ||||||
| #include "core/hle/kernel/shared_memory.h" | #include "core/hle/kernel/shared_memory.h" | ||||||
| #include "core/hle/service/hid/hid.h" | #include "core/hle/service/hid/hid.h" | ||||||
|  | @ -44,6 +48,10 @@ constexpr u64 pad_update_ticks = BASE_CLOCK_RATE_ARM11 / 234; | ||||||
| constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE_ARM11 / 104; | constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE_ARM11 / 104; | ||||||
| constexpr u64 gyroscope_update_ticks = BASE_CLOCK_RATE_ARM11 / 101; | constexpr u64 gyroscope_update_ticks = BASE_CLOCK_RATE_ARM11 / 101; | ||||||
| 
 | 
 | ||||||
|  | static std::atomic<bool> is_device_reload_pending; | ||||||
|  | static std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID> | ||||||
|  |     buttons; | ||||||
|  | 
 | ||||||
| static PadState GetCirclePadDirectionState(s16 circle_pad_x, s16 circle_pad_y) { | static PadState GetCirclePadDirectionState(s16 circle_pad_x, s16 circle_pad_y) { | ||||||
|     // 30 degree and 60 degree are angular thresholds for directions
 |     // 30 degree and 60 degree are angular thresholds for directions
 | ||||||
|     constexpr float TAN30 = 0.577350269f; |     constexpr float TAN30 = 0.577350269f; | ||||||
|  | @ -74,10 +82,38 @@ static PadState GetCirclePadDirectionState(s16 circle_pad_x, s16 circle_pad_y) { | ||||||
|     return state; |     return state; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void LoadInputDevices() { | ||||||
|  |     std::transform(Settings::values.buttons.begin() + Settings::NativeButton::BUTTON_HID_BEGIN, | ||||||
|  |                    Settings::values.buttons.begin() + Settings::NativeButton::BUTTON_HID_END, | ||||||
|  |                    buttons.begin(), Input::CreateDevice<Input::ButtonDevice>); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void UnloadInputDevices() { | ||||||
|  |     for (auto& button : buttons) { | ||||||
|  |         button.reset(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void UpdatePadCallback(u64 userdata, int cycles_late) { | static void UpdatePadCallback(u64 userdata, int cycles_late) { | ||||||
|     SharedMem* mem = reinterpret_cast<SharedMem*>(shared_mem->GetPointer()); |     SharedMem* mem = reinterpret_cast<SharedMem*>(shared_mem->GetPointer()); | ||||||
| 
 | 
 | ||||||
|     PadState state = VideoCore::g_emu_window->GetPadState(); |     if (is_device_reload_pending.exchange(false)) | ||||||
|  |         LoadInputDevices(); | ||||||
|  | 
 | ||||||
|  |     PadState state; | ||||||
|  |     using namespace Settings::NativeButton; | ||||||
|  |     state.a.Assign(buttons[A - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.b.Assign(buttons[B - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.x.Assign(buttons[X - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.y.Assign(buttons[Y - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.right.Assign(buttons[Right - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.left.Assign(buttons[Left - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.up.Assign(buttons[Up - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.down.Assign(buttons[Down - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.l.Assign(buttons[L - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.r.Assign(buttons[R - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.start.Assign(buttons[Start - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
|  |     state.select.Assign(buttons[Select - BUTTON_HID_BEGIN]->GetStatus()); | ||||||
| 
 | 
 | ||||||
|     // Get current circle pad position and update circle pad direction
 |     // Get current circle pad position and update circle pad direction
 | ||||||
|     s16 circle_pad_x, circle_pad_y; |     s16 circle_pad_x, circle_pad_y; | ||||||
|  | @ -313,6 +349,8 @@ void Init() { | ||||||
|     AddService(new HID_U_Interface); |     AddService(new HID_U_Interface); | ||||||
|     AddService(new HID_SPVR_Interface); |     AddService(new HID_SPVR_Interface); | ||||||
| 
 | 
 | ||||||
|  |     is_device_reload_pending.store(true); | ||||||
|  | 
 | ||||||
|     using Kernel::MemoryPermission; |     using Kernel::MemoryPermission; | ||||||
|     shared_mem = |     shared_mem = | ||||||
|         SharedMemory::Create(nullptr, 0x1000, MemoryPermission::ReadWrite, MemoryPermission::Read, |         SharedMemory::Create(nullptr, 0x1000, MemoryPermission::ReadWrite, MemoryPermission::Read, | ||||||
|  | @ -350,6 +388,11 @@ void Shutdown() { | ||||||
|     event_accelerometer = nullptr; |     event_accelerometer = nullptr; | ||||||
|     event_gyroscope = nullptr; |     event_gyroscope = nullptr; | ||||||
|     event_debug_pad = nullptr; |     event_debug_pad = nullptr; | ||||||
|  |     UnloadInputDevices(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ReloadInputDevices() { | ||||||
|  |     is_device_reload_pending.store(true); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } // namespace HID
 | } // namespace HID
 | ||||||
|  |  | ||||||
|  | @ -297,5 +297,8 @@ void Init(); | ||||||
| 
 | 
 | ||||||
| /// Shutdown HID service
 | /// Shutdown HID service
 | ||||||
| void Shutdown(); | void Shutdown(); | ||||||
|  | 
 | ||||||
|  | /// Reload input devices. Used when input configuration changed
 | ||||||
|  | void ReloadInputDevices(); | ||||||
| } | } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "audio_core/audio_core.h" | #include "audio_core/audio_core.h" | ||||||
| #include "core/gdbstub/gdbstub.h" | #include "core/gdbstub/gdbstub.h" | ||||||
|  | #include "core/hle/service/hid/hid.h" | ||||||
| #include "settings.h" | #include "settings.h" | ||||||
| #include "video_core/video_core.h" | #include "video_core/video_core.h" | ||||||
| 
 | 
 | ||||||
|  | @ -29,6 +30,8 @@ void Apply() { | ||||||
| 
 | 
 | ||||||
|     AudioCore::SelectSink(values.sink_id); |     AudioCore::SelectSink(values.sink_id); | ||||||
|     AudioCore::EnableStretching(values.enable_audio_stretching); |     AudioCore::EnableStretching(values.enable_audio_stretching); | ||||||
|  | 
 | ||||||
|  |     Service::HID::ReloadInputDevices(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } // namespace
 | } // namespace
 | ||||||
|  |  | ||||||
|  | @ -69,6 +69,48 @@ static const std::array<Values, NUM_INPUTS> All = {{ | ||||||
| }}; | }}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | namespace NativeButton { | ||||||
|  | enum Values { | ||||||
|  |     A, | ||||||
|  |     B, | ||||||
|  |     X, | ||||||
|  |     Y, | ||||||
|  |     Up, | ||||||
|  |     Down, | ||||||
|  |     Left, | ||||||
|  |     Right, | ||||||
|  |     L, | ||||||
|  |     R, | ||||||
|  |     Start, | ||||||
|  |     Select, | ||||||
|  | 
 | ||||||
|  |     ZL, | ||||||
|  |     ZR, | ||||||
|  | 
 | ||||||
|  |     Home, | ||||||
|  | 
 | ||||||
|  |     NumButtons, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | constexpr int BUTTON_HID_BEGIN = A; | ||||||
|  | constexpr int BUTTON_IR_BEGIN = ZL; | ||||||
|  | constexpr int BUTTON_NS_BEGIN = Home; | ||||||
|  | 
 | ||||||
|  | constexpr int BUTTON_HID_END = BUTTON_IR_BEGIN; | ||||||
|  | constexpr int BUTTON_IR_END = BUTTON_NS_BEGIN; | ||||||
|  | constexpr int BUTTON_NS_END = NumButtons; | ||||||
|  | 
 | ||||||
|  | constexpr int NUM_BUTTONS_HID = BUTTON_HID_END - BUTTON_HID_BEGIN; | ||||||
|  | constexpr int NUM_BUTTONS_IR = BUTTON_IR_END - BUTTON_IR_BEGIN; | ||||||
|  | constexpr int NUM_BUTTONS_NS = BUTTON_NS_END - BUTTON_NS_BEGIN; | ||||||
|  | 
 | ||||||
|  | static const std::array<const char*, NumButtons> mapping = {{ | ||||||
|  |     "button_a", "button_b", "button_x", "button_y", "button_up", "button_down", "button_left", | ||||||
|  |     "button_right", "button_l", "button_r", "button_start", "button_select", "button_zl", | ||||||
|  |     "button_zr", "button_home", | ||||||
|  | }}; | ||||||
|  | } // namespace NativeButton
 | ||||||
|  | 
 | ||||||
| struct Values { | struct Values { | ||||||
|     // CheckNew3DS
 |     // CheckNew3DS
 | ||||||
|     bool is_new_3ds; |     bool is_new_3ds; | ||||||
|  | @ -77,6 +119,8 @@ struct Values { | ||||||
|     std::array<int, NativeInput::NUM_INPUTS> input_mappings; |     std::array<int, NativeInput::NUM_INPUTS> input_mappings; | ||||||
|     float pad_circle_modifier_scale; |     float pad_circle_modifier_scale; | ||||||
| 
 | 
 | ||||||
|  |     std::array<std::string, NativeButton::NumButtons> buttons; | ||||||
|  | 
 | ||||||
|     // Core
 |     // Core
 | ||||||
|     bool use_cpu_jit; |     bool use_cpu_jit; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue