mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	HID: use ButtonDevice
This commit is contained in:
		
							parent
							
								
									3974895e08
								
							
						
					
					
						commit
						1d1329af23
					
				@ -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…
	
		Reference in New Issue
	
	Block a user