summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar bunnei2016-06-10 22:28:58 -0400
committerGravatar GitHub2016-06-10 22:28:58 -0400
commitf99961581ee129c44625dbd8890fab349253271a (patch)
tree9a2610d391d795b533054a91c22763e869bdd62b /src/core
parentMerge pull request #1896 from citra-emu/revert-1893-interpreter-split (diff)
parentfixup! fixup! Refactor input system (diff)
downloadyuzu-f99961581ee129c44625dbd8890fab349253271a.tar.gz
yuzu-f99961581ee129c44625dbd8890fab349253271a.tar.xz
yuzu-f99961581ee129c44625dbd8890fab349253271a.zip
Merge pull request #1789 from wwylele/input-refactor
Refactor input mapping & implement circle pad modifier
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/service/hid/hid.cpp68
-rw-r--r--src/core/hle/service/hid/hid.h3
-rw-r--r--src/core/settings.h22
3 files changed, 53 insertions, 40 deletions
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index d216cecb4..c975433f4 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -19,8 +19,6 @@
19namespace Service { 19namespace Service {
20namespace HID { 20namespace HID {
21 21
22static const int MAX_CIRCLEPAD_POS = 0x9C; ///< Max value for a circle pad position
23
24// Handle to shared memory region designated to HID_User service 22// Handle to shared memory region designated to HID_User service
25static Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; 23static Kernel::SharedPtr<Kernel::SharedMemory> shared_mem;
26 24
@@ -39,38 +37,48 @@ static u32 next_gyroscope_index;
39static int enable_accelerometer_count = 0; // positive means enabled 37static int enable_accelerometer_count = 0; // positive means enabled
40static int enable_gyroscope_count = 0; // positive means enabled 38static int enable_gyroscope_count = 0; // positive means enabled
41 39
42const std::array<Service::HID::PadState, Settings::NativeInput::NUM_INPUTS> pad_mapping = {{ 40static PadState GetCirclePadDirectionState(s16 circle_pad_x, s16 circle_pad_y) {
43 Service::HID::PAD_A, Service::HID::PAD_B, Service::HID::PAD_X, Service::HID::PAD_Y, 41 constexpr float TAN30 = 0.577350269, TAN60 = 1 / TAN30; // 30 degree and 60 degree are angular thresholds for directions
44 Service::HID::PAD_L, Service::HID::PAD_R, Service::HID::PAD_ZL, Service::HID::PAD_ZR, 42 constexpr int CIRCLE_PAD_THRESHOLD_SQUARE = 40 * 40; // a circle pad radius greater than 40 will trigger circle pad direction
45 Service::HID::PAD_START, Service::HID::PAD_SELECT, Service::HID::PAD_NONE, 43 PadState state;
46 Service::HID::PAD_UP, Service::HID::PAD_DOWN, Service::HID::PAD_LEFT, Service::HID::PAD_RIGHT, 44 state.hex = 0;
47 Service::HID::PAD_CIRCLE_UP, Service::HID::PAD_CIRCLE_DOWN, Service::HID::PAD_CIRCLE_LEFT, Service::HID::PAD_CIRCLE_RIGHT, 45
48 Service::HID::PAD_C_UP, Service::HID::PAD_C_DOWN, Service::HID::PAD_C_LEFT, Service::HID::PAD_C_RIGHT 46 if (circle_pad_x * circle_pad_x + circle_pad_y * circle_pad_y > CIRCLE_PAD_THRESHOLD_SQUARE) {
49}}; 47 float t = std::abs(static_cast<float>(circle_pad_y) / circle_pad_x);
50 48
51 49 if (circle_pad_x != 0 && t < TAN60) {
52// TODO(peachum): 50 if (circle_pad_x > 0)
53// Add a method for setting analog input from joystick device for the circle Pad. 51 state.circle_right.Assign(1);
54// 52 else
55// This method should: 53 state.circle_left.Assign(1);
56// * Be called after both PadButton<Press, Release>(). 54 }
57// * Be called before PadUpdateComplete() 55
58// * Set current PadEntry.circle_pad_<axis> using analog data 56 if (circle_pad_x == 0 || t > TAN30) {
59// * Set PadData.raw_circle_pad_data 57 if (circle_pad_y > 0)
60// * Set PadData.current_state.circle_right = 1 if current PadEntry.circle_pad_x >= 41 58 state.circle_up.Assign(1);
61// * Set PadData.current_state.circle_up = 1 if current PadEntry.circle_pad_y >= 41 59 else
62// * Set PadData.current_state.circle_left = 1 if current PadEntry.circle_pad_x <= -41 60 state.circle_down.Assign(1);
63// * Set PadData.current_state.circle_right = 1 if current PadEntry.circle_pad_y <= -41 61 }
62 }
63
64 return state;
65}
64 66
65void Update() { 67void Update() {
66 SharedMem* mem = reinterpret_cast<SharedMem*>(shared_mem->GetPointer()); 68 SharedMem* mem = reinterpret_cast<SharedMem*>(shared_mem->GetPointer());
67 const PadState state = VideoCore::g_emu_window->GetPadState();
68 69
69 if (mem == nullptr) { 70 if (mem == nullptr) {
70 LOG_DEBUG(Service_HID, "Cannot update HID prior to mapping shared memory!"); 71 LOG_DEBUG(Service_HID, "Cannot update HID prior to mapping shared memory!");
71 return; 72 return;
72 } 73 }
73 74
75 PadState state = VideoCore::g_emu_window->GetPadState();
76
77 // Get current circle pad position and update circle pad direction
78 s16 circle_pad_x, circle_pad_y;
79 std::tie(circle_pad_x, circle_pad_y) = VideoCore::g_emu_window->GetCirclePadState();
80 state.hex |= GetCirclePadDirectionState(circle_pad_x, circle_pad_y).hex;
81
74 mem->pad.current_state.hex = state.hex; 82 mem->pad.current_state.hex = state.hex;
75 mem->pad.index = next_pad_index; 83 mem->pad.index = next_pad_index;
76 next_pad_index = (next_pad_index + 1) % mem->pad.entries.size(); 84 next_pad_index = (next_pad_index + 1) % mem->pad.entries.size();
@@ -88,13 +96,9 @@ void Update() {
88 // Update entry properties 96 // Update entry properties
89 pad_entry.current_state.hex = state.hex; 97 pad_entry.current_state.hex = state.hex;
90 pad_entry.delta_additions.hex = changed.hex & state.hex; 98 pad_entry.delta_additions.hex = changed.hex & state.hex;
91 pad_entry.delta_removals.hex = changed.hex & old_state.hex;; 99 pad_entry.delta_removals.hex = changed.hex & old_state.hex;
92 100 pad_entry.circle_pad_x = circle_pad_x;
93 // Set circle Pad 101 pad_entry.circle_pad_y = circle_pad_y;
94 pad_entry.circle_pad_x = state.circle_left ? -MAX_CIRCLEPAD_POS :
95 state.circle_right ? MAX_CIRCLEPAD_POS : 0x0;
96 pad_entry.circle_pad_y = state.circle_down ? -MAX_CIRCLEPAD_POS :
97 state.circle_up ? MAX_CIRCLEPAD_POS : 0x0;
98 102
99 // If we just updated index 0, provide a new timestamp 103 // If we just updated index 0, provide a new timestamp
100 if (mem->pad.index == 0) { 104 if (mem->pad.index == 0) {
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 170d19ea8..669b1f723 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -215,9 +215,6 @@ const PadState PAD_CIRCLE_LEFT = {{1u << 29}};
215const PadState PAD_CIRCLE_UP = {{1u << 30}}; 215const PadState PAD_CIRCLE_UP = {{1u << 30}};
216const PadState PAD_CIRCLE_DOWN = {{1u << 31}}; 216const PadState PAD_CIRCLE_DOWN = {{1u << 31}};
217 217
218
219extern const std::array<Service::HID::PadState, Settings::NativeInput::NUM_INPUTS> pad_mapping;
220
221/** 218/**
222 * HID::GetIPCHandles service function 219 * HID::GetIPCHandles service function
223 * Inputs: 220 * Inputs:
diff --git a/src/core/settings.h b/src/core/settings.h
index ea72f4d9c..f95e62390 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -13,29 +13,40 @@ namespace Settings {
13 13
14namespace NativeInput { 14namespace NativeInput {
15enum Values { 15enum Values {
16 // directly mapped keys
16 A, B, X, Y, 17 A, B, X, Y,
17 L, R, ZL, ZR, 18 L, R, ZL, ZR,
18 START, SELECT, HOME, 19 START, SELECT, HOME,
19 DUP, DDOWN, DLEFT, DRIGHT, 20 DUP, DDOWN, DLEFT, DRIGHT,
20 SUP, SDOWN, SLEFT, SRIGHT,
21 CUP, CDOWN, CLEFT, CRIGHT, 21 CUP, CDOWN, CLEFT, CRIGHT,
22
23 // indirectly mapped keys
24 CIRCLE_UP, CIRCLE_DOWN, CIRCLE_LEFT, CIRCLE_RIGHT,
25 CIRCLE_MODIFIER,
26
22 NUM_INPUTS 27 NUM_INPUTS
23}; 28};
29
24static const std::array<const char*, NUM_INPUTS> Mapping = {{ 30static const std::array<const char*, NUM_INPUTS> Mapping = {{
31 // directly mapped keys
25 "pad_a", "pad_b", "pad_x", "pad_y", 32 "pad_a", "pad_b", "pad_x", "pad_y",
26 "pad_l", "pad_r", "pad_zl", "pad_zr", 33 "pad_l", "pad_r", "pad_zl", "pad_zr",
27 "pad_start", "pad_select", "pad_home", 34 "pad_start", "pad_select", "pad_home",
28 "pad_dup", "pad_ddown", "pad_dleft", "pad_dright", 35 "pad_dup", "pad_ddown", "pad_dleft", "pad_dright",
29 "pad_sup", "pad_sdown", "pad_sleft", "pad_sright", 36 "pad_cup", "pad_cdown", "pad_cleft", "pad_cright",
30 "pad_cup", "pad_cdown", "pad_cleft", "pad_cright" 37
38 // indirectly mapped keys
39 "pad_circle_up", "pad_circle_down", "pad_circle_left", "pad_circle_right",
40 "pad_circle_modifier",
31}}; 41}};
32static const std::array<Values, NUM_INPUTS> All = {{ 42static const std::array<Values, NUM_INPUTS> All = {{
33 A, B, X, Y, 43 A, B, X, Y,
34 L, R, ZL, ZR, 44 L, R, ZL, ZR,
35 START, SELECT, HOME, 45 START, SELECT, HOME,
36 DUP, DDOWN, DLEFT, DRIGHT, 46 DUP, DDOWN, DLEFT, DRIGHT,
37 SUP, SDOWN, SLEFT, SRIGHT, 47 CUP, CDOWN, CLEFT, CRIGHT,
38 CUP, CDOWN, CLEFT, CRIGHT 48 CIRCLE_UP, CIRCLE_DOWN, CIRCLE_LEFT, CIRCLE_RIGHT,
49 CIRCLE_MODIFIER,
39}}; 50}};
40} 51}
41 52
@@ -46,6 +57,7 @@ struct Values {
46 57
47 // Controls 58 // Controls
48 std::array<int, NativeInput::NUM_INPUTS> input_mappings; 59 std::array<int, NativeInput::NUM_INPUTS> input_mappings;
60 float pad_circle_modifier_scale;
49 61
50 // Core 62 // Core
51 int frame_skip; 63 int frame_skip;