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;
|
||||||
|
|
||||||
|
|
Reference in New Issue