summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-11-01 22:03:17 -0400
committerGravatar Zach Hilman2018-11-18 23:22:36 -0500
commit55ded706d67a6f2dd6e01d0abf7351e69588ac3a (patch)
treeab495e8522cfcfa00ef54b46a43f12583b03466a /src
parenthid/touchscreen: Update Touchscreen to use advanced parameters (diff)
downloadyuzu-55ded706d67a6f2dd6e01d0abf7351e69588ac3a.tar.gz
yuzu-55ded706d67a6f2dd6e01d0abf7351e69588ac3a.tar.xz
yuzu-55ded706d67a6f2dd6e01d0abf7351e69588ac3a.zip
hid/npad: Update NPad to use player controller bindings and type
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp154
-rw-r--r--src/core/hle/service/hid/controllers/npad.h9
2 files changed, 108 insertions, 55 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 3eb59599f..911ba3574 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -17,11 +17,6 @@
17#include "core/settings.h" 17#include "core/settings.h"
18 18
19namespace Service::HID { 19namespace Service::HID {
20
21constexpr u32 JOYCON_BODY_NEON_RED = 0xFF3C28;
22constexpr u32 JOYCON_BUTTONS_NEON_RED = 0x1E0A0A;
23constexpr u32 JOYCON_BODY_NEON_BLUE = 0x0AB9E6;
24constexpr u32 JOYCON_BUTTONS_NEON_BLUE = 0x001E1E;
25constexpr s32 HID_JOYSTICK_MAX = 0x7fff; 20constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
26constexpr s32 HID_JOYSTICK_MIN = -0x7fff; 21constexpr s32 HID_JOYSTICK_MIN = -0x7fff;
27constexpr std::size_t NPAD_OFFSET = 0x9A00; 22constexpr std::size_t NPAD_OFFSET = 0x9A00;
@@ -40,6 +35,22 @@ enum class JoystickId : std::size_t {
40 Joystick_Right, 35 Joystick_Right,
41}; 36};
42 37
38static Controller_NPad::NPadControllerType MapSettingsTypeToNPad(Settings::ControllerType type) {
39 switch (type) {
40 case Settings::ControllerType::ProController:
41 return Controller_NPad::NPadControllerType::ProController;
42 case Settings::ControllerType::DualJoycon:
43 return Controller_NPad::NPadControllerType::JoyDual;
44 case Settings::ControllerType::LeftJoycon:
45 return Controller_NPad::NPadControllerType::JoyLeft;
46 case Settings::ControllerType::RightJoycon:
47 return Controller_NPad::NPadControllerType::JoyRight;
48 default:
49 UNREACHABLE();
50 return Controller_NPad::NPadControllerType::JoyDual;
51 }
52}
53
43static std::size_t NPadIdToIndex(u32 npad_id) { 54static std::size_t NPadIdToIndex(u32 npad_id) {
44 switch (npad_id) { 55 switch (npad_id) {
45 case 0: 56 case 0:
@@ -126,10 +137,11 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) {
126 controller.single_color.button_color = 0; 137 controller.single_color.button_color = 0;
127 138
128 controller.dual_color_error = ColorReadError::ReadOk; 139 controller.dual_color_error = ColorReadError::ReadOk;
129 controller.left_color.body_color = JOYCON_BODY_NEON_BLUE; 140 controller.left_color.body_color = Settings::values.players[controller_idx].body_color_left;
130 controller.left_color.button_color = JOYCON_BUTTONS_NEON_BLUE; 141 controller.left_color.button_color = Settings::values.players[controller_idx].button_color_left;
131 controller.right_color.body_color = JOYCON_BODY_NEON_RED; 142 controller.right_color.body_color = Settings::values.players[controller_idx].body_color_right;
132 controller.right_color.button_color = JOYCON_BUTTONS_NEON_RED; 143 controller.right_color.button_color =
144 Settings::values.players[controller_idx].button_color_right;
133 145
134 controller.battery_level[0] = BATTERY_FULL; 146 controller.battery_level[0] = BATTERY_FULL;
135 controller.battery_level[1] = BATTERY_FULL; 147 controller.battery_level[1] = BATTERY_FULL;
@@ -154,6 +166,25 @@ void Controller_NPad::OnInit() {
154 style.pro_controller.Assign(1); 166 style.pro_controller.Assign(1);
155 style.pokeball.Assign(1); 167 style.pokeball.Assign(1);
156 } 168 }
169
170 std::transform(
171 Settings::values.players.begin(), Settings::values.players.end(),
172 connected_controllers.begin(), [](const Settings::PlayerInput& player) {
173 return ControllerHolder{MapSettingsTypeToNPad(player.type), player.connected};
174 });
175
176 std::stable_partition(connected_controllers.begin(), connected_controllers.begin() + 8,
177 [](const ControllerHolder& holder) { return holder.is_connected; });
178
179 // Account for handheld
180 if (connected_controllers[8].is_connected)
181 connected_controllers[8].type = NPadControllerType::Handheld;
182
183 supported_npad_id_types.resize(npad_id_list.size());
184 std::memcpy(supported_npad_id_types.data(), npad_id_list.data(),
185 npad_id_list.size() * sizeof(u32));
186
187 // Add a default dual joycon controller if none are present.
157 if (std::none_of(connected_controllers.begin(), connected_controllers.end(), 188 if (std::none_of(connected_controllers.begin(), connected_controllers.end(),
158 [](const ControllerHolder& controller) { return controller.is_connected; })) { 189 [](const ControllerHolder& controller) { return controller.is_connected; })) {
159 supported_npad_id_types.resize(npad_id_list.size()); 190 supported_npad_id_types.resize(npad_id_list.size());
@@ -161,15 +192,25 @@ void Controller_NPad::OnInit() {
161 npad_id_list.size() * sizeof(u32)); 192 npad_id_list.size() * sizeof(u32));
162 AddNewController(PREFERRED_CONTROLLER); 193 AddNewController(PREFERRED_CONTROLLER);
163 } 194 }
195
196 for (std::size_t i = 0; i < connected_controllers.size(); ++i) {
197 const auto& controller = connected_controllers[i];
198 if (controller.is_connected) {
199 AddNewControllerAt(controller.type, IndexToNPad(i));
200 }
201 }
164} 202}
165 203
166void Controller_NPad::OnLoadInputDevices() { 204void Controller_NPad::OnLoadInputDevices() {
167 std::transform(Settings::values.buttons.begin() + Settings::NativeButton::BUTTON_HID_BEGIN, 205 const auto& players = Settings::values.players;
168 Settings::values.buttons.begin() + Settings::NativeButton::BUTTON_HID_END, 206 for (std::size_t i = 0; i < players.size(); ++i) {
169 buttons.begin(), Input::CreateDevice<Input::ButtonDevice>); 207 std::transform(players[i].buttons.begin() + Settings::NativeButton::BUTTON_HID_BEGIN,
170 std::transform(Settings::values.analogs.begin() + Settings::NativeAnalog::STICK_HID_BEGIN, 208 players[i].buttons.begin() + Settings::NativeButton::BUTTON_HID_END,
171 Settings::values.analogs.begin() + Settings::NativeAnalog::STICK_HID_END, 209 buttons[i].begin(), Input::CreateDevice<Input::ButtonDevice>);
172 sticks.begin(), Input::CreateDevice<Input::AnalogDevice>); 210 std::transform(players[i].analogs.begin() + Settings::NativeAnalog::STICK_HID_BEGIN,
211 players[i].analogs.begin() + Settings::NativeAnalog::STICK_HID_END,
212 sticks[i].begin(), Input::CreateDevice<Input::AnalogDevice>);
213 }
173} 214}
174 215
175void Controller_NPad::OnRelease() {} 216void Controller_NPad::OnRelease() {}
@@ -183,42 +224,45 @@ void Controller_NPad::RequestPadStateUpdate(u32 npad_id) {
183 auto& pad_state = npad_pad_states[controller_idx].pad_states; 224 auto& pad_state = npad_pad_states[controller_idx].pad_states;
184 auto& lstick_entry = npad_pad_states[controller_idx].l_stick; 225 auto& lstick_entry = npad_pad_states[controller_idx].l_stick;
185 auto& rstick_entry = npad_pad_states[controller_idx].r_stick; 226 auto& rstick_entry = npad_pad_states[controller_idx].r_stick;
227 const auto& button_state = buttons[controller_idx];
228 const auto& analog_state = sticks[controller_idx];
229
186 using namespace Settings::NativeButton; 230 using namespace Settings::NativeButton;
187 pad_state.a.Assign(buttons[A - BUTTON_HID_BEGIN]->GetStatus()); 231 pad_state.a.Assign(button_state[A - BUTTON_HID_BEGIN]->GetStatus());
188 pad_state.b.Assign(buttons[B - BUTTON_HID_BEGIN]->GetStatus()); 232 pad_state.b.Assign(button_state[B - BUTTON_HID_BEGIN]->GetStatus());
189 pad_state.x.Assign(buttons[X - BUTTON_HID_BEGIN]->GetStatus()); 233 pad_state.x.Assign(button_state[X - BUTTON_HID_BEGIN]->GetStatus());
190 pad_state.y.Assign(buttons[Y - BUTTON_HID_BEGIN]->GetStatus()); 234 pad_state.y.Assign(button_state[Y - BUTTON_HID_BEGIN]->GetStatus());
191 pad_state.l_stick.Assign(buttons[LStick - BUTTON_HID_BEGIN]->GetStatus()); 235 pad_state.l_stick.Assign(button_state[LStick - BUTTON_HID_BEGIN]->GetStatus());
192 pad_state.r_stick.Assign(buttons[RStick - BUTTON_HID_BEGIN]->GetStatus()); 236 pad_state.r_stick.Assign(button_state[RStick - BUTTON_HID_BEGIN]->GetStatus());
193 pad_state.l.Assign(buttons[L - BUTTON_HID_BEGIN]->GetStatus()); 237 pad_state.l.Assign(button_state[L - BUTTON_HID_BEGIN]->GetStatus());
194 pad_state.r.Assign(buttons[R - BUTTON_HID_BEGIN]->GetStatus()); 238 pad_state.r.Assign(button_state[R - BUTTON_HID_BEGIN]->GetStatus());
195 pad_state.zl.Assign(buttons[ZL - BUTTON_HID_BEGIN]->GetStatus()); 239 pad_state.zl.Assign(button_state[ZL - BUTTON_HID_BEGIN]->GetStatus());
196 pad_state.zr.Assign(buttons[ZR - BUTTON_HID_BEGIN]->GetStatus()); 240 pad_state.zr.Assign(button_state[ZR - BUTTON_HID_BEGIN]->GetStatus());
197 pad_state.plus.Assign(buttons[Plus - BUTTON_HID_BEGIN]->GetStatus()); 241 pad_state.plus.Assign(button_state[Plus - BUTTON_HID_BEGIN]->GetStatus());
198 pad_state.minus.Assign(buttons[Minus - BUTTON_HID_BEGIN]->GetStatus()); 242 pad_state.minus.Assign(button_state[Minus - BUTTON_HID_BEGIN]->GetStatus());
199 243
200 pad_state.d_left.Assign(buttons[DLeft - BUTTON_HID_BEGIN]->GetStatus()); 244 pad_state.d_left.Assign(button_state[DLeft - BUTTON_HID_BEGIN]->GetStatus());
201 pad_state.d_up.Assign(buttons[DUp - BUTTON_HID_BEGIN]->GetStatus()); 245 pad_state.d_up.Assign(button_state[DUp - BUTTON_HID_BEGIN]->GetStatus());
202 pad_state.d_right.Assign(buttons[DRight - BUTTON_HID_BEGIN]->GetStatus()); 246 pad_state.d_right.Assign(button_state[DRight - BUTTON_HID_BEGIN]->GetStatus());
203 pad_state.d_down.Assign(buttons[DDown - BUTTON_HID_BEGIN]->GetStatus()); 247 pad_state.d_down.Assign(button_state[DDown - BUTTON_HID_BEGIN]->GetStatus());
204 248
205 pad_state.l_stick_left.Assign(buttons[LStick_Left - BUTTON_HID_BEGIN]->GetStatus()); 249 pad_state.l_stick_left.Assign(button_state[LStick_Left - BUTTON_HID_BEGIN]->GetStatus());
206 pad_state.l_stick_up.Assign(buttons[LStick_Up - BUTTON_HID_BEGIN]->GetStatus()); 250 pad_state.l_stick_up.Assign(button_state[LStick_Up - BUTTON_HID_BEGIN]->GetStatus());
207 pad_state.l_stick_right.Assign(buttons[LStick_Right - BUTTON_HID_BEGIN]->GetStatus()); 251 pad_state.l_stick_right.Assign(button_state[LStick_Right - BUTTON_HID_BEGIN]->GetStatus());
208 pad_state.l_stick_down.Assign(buttons[LStick_Down - BUTTON_HID_BEGIN]->GetStatus()); 252 pad_state.l_stick_down.Assign(button_state[LStick_Down - BUTTON_HID_BEGIN]->GetStatus());
209 253
210 pad_state.r_stick_left.Assign(buttons[RStick_Left - BUTTON_HID_BEGIN]->GetStatus()); 254 pad_state.r_stick_left.Assign(button_state[RStick_Left - BUTTON_HID_BEGIN]->GetStatus());
211 pad_state.r_stick_up.Assign(buttons[RStick_Up - BUTTON_HID_BEGIN]->GetStatus()); 255 pad_state.r_stick_up.Assign(button_state[RStick_Up - BUTTON_HID_BEGIN]->GetStatus());
212 pad_state.r_stick_right.Assign(buttons[RStick_Right - BUTTON_HID_BEGIN]->GetStatus()); 256 pad_state.r_stick_right.Assign(button_state[RStick_Right - BUTTON_HID_BEGIN]->GetStatus());
213 pad_state.r_stick_down.Assign(buttons[RStick_Down - BUTTON_HID_BEGIN]->GetStatus()); 257 pad_state.r_stick_down.Assign(button_state[RStick_Down - BUTTON_HID_BEGIN]->GetStatus());
214 258
215 pad_state.left_sl.Assign(buttons[SL - BUTTON_HID_BEGIN]->GetStatus()); 259 pad_state.left_sl.Assign(button_state[SL - BUTTON_HID_BEGIN]->GetStatus());
216 pad_state.left_sr.Assign(buttons[SR - BUTTON_HID_BEGIN]->GetStatus()); 260 pad_state.left_sr.Assign(button_state[SR - BUTTON_HID_BEGIN]->GetStatus());
217 261
218 const auto [stick_l_x_f, stick_l_y_f] = 262 const auto [stick_l_x_f, stick_l_y_f] =
219 sticks[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetStatus(); 263 analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetStatus();
220 const auto [stick_r_x_f, stick_r_y_f] = 264 const auto [stick_r_x_f, stick_r_y_f] =
221 sticks[static_cast<std::size_t>(JoystickId::Joystick_Right)]->GetStatus(); 265 analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)]->GetStatus();
222 lstick_entry.x = static_cast<s32>(stick_l_x_f * HID_JOYSTICK_MAX); 266 lstick_entry.x = static_cast<s32>(stick_l_x_f * HID_JOYSTICK_MAX);
223 lstick_entry.y = static_cast<s32>(stick_l_y_f * HID_JOYSTICK_MAX); 267 lstick_entry.y = static_cast<s32>(stick_l_y_f * HID_JOYSTICK_MAX);
224 rstick_entry.x = static_cast<s32>(stick_r_x_f * HID_JOYSTICK_MAX); 268 rstick_entry.x = static_cast<s32>(stick_r_x_f * HID_JOYSTICK_MAX);
@@ -285,8 +329,10 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) {
285 state.d_left.Assign(pad_state.pad_states.d_up.Value()); 329 state.d_left.Assign(pad_state.pad_states.d_up.Value());
286 state.d_right.Assign(pad_state.pad_states.d_down.Value()); 330 state.d_right.Assign(pad_state.pad_states.d_down.Value());
287 state.d_up.Assign(pad_state.pad_states.d_right.Value()); 331 state.d_up.Assign(pad_state.pad_states.d_right.Value());
288 state.l.Assign(pad_state.pad_states.l.Value() | pad_state.pad_states.sl.Value()); 332 state.l.Assign(pad_state.pad_states.l.Value() |
289 state.r.Assign(pad_state.pad_states.r.Value() | pad_state.pad_states.sr.Value()); 333 pad_state.pad_states.left_sl.Value());
334 state.r.Assign(pad_state.pad_states.r.Value() |
335 pad_state.pad_states.left_sr.Value());
290 336
291 state.zl.Assign(pad_state.pad_states.zl.Value()); 337 state.zl.Assign(pad_state.pad_states.zl.Value());
292 state.plus.Assign(pad_state.pad_states.minus.Value()); 338 state.plus.Assign(pad_state.pad_states.minus.Value());
@@ -302,8 +348,10 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) {
302 state.b.Assign(pad_state.pad_states.y.Value()); 348 state.b.Assign(pad_state.pad_states.y.Value());
303 state.y.Assign(pad_state.pad_states.b.Value()); 349 state.y.Assign(pad_state.pad_states.b.Value());
304 350
305 state.l.Assign(pad_state.pad_states.l.Value() | pad_state.pad_states.sl.Value()); 351 state.l.Assign(pad_state.pad_states.l.Value() |
306 state.r.Assign(pad_state.pad_states.r.Value() | pad_state.pad_states.sr.Value()); 352 pad_state.pad_states.right_sl.Value());
353 state.r.Assign(pad_state.pad_states.r.Value() |
354 pad_state.pad_states.right_sr.Value());
307 state.zr.Assign(pad_state.pad_states.zr.Value()); 355 state.zr.Assign(pad_state.pad_states.zr.Value());
308 state.plus.Assign(pad_state.pad_states.plus.Value()); 356 state.plus.Assign(pad_state.pad_states.plus.Value());
309 357
@@ -570,7 +618,7 @@ Controller_NPad::NPadControllerType Controller_NPad::DecideBestController(
570 if (IsControllerSupported(priority)) { 618 if (IsControllerSupported(priority)) {
571 return priority; 619 return priority;
572 } 620 }
573 const auto is_docked = Settings::values->use_docked_mode; 621 const auto is_docked = Settings::values.use_docked_mode;
574 if (is_docked && priority == NPadControllerType::Handheld) { 622 if (is_docked && priority == NPadControllerType::Handheld) {
575 priority = NPadControllerType::JoyDual; 623 priority = NPadControllerType::JoyDual;
576 if (IsControllerSupported(priority)) { 624 if (IsControllerSupported(priority)) {
@@ -659,7 +707,7 @@ bool Controller_NPad::IsControllerSupported(NPadControllerType controller) {
659 return false; 707 return false;
660 } 708 }
661 // Handheld should not be supported in docked mode 709 // Handheld should not be supported in docked mode
662 if (Settings::values->use_docked_mode) { 710 if (Settings::values.use_docked_mode) {
663 return false; 711 return false;
664 } 712 }
665 } 713 }
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h
index 7222bca72..52f92a4f1 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -285,9 +285,14 @@ private:
285 285
286 NPadType style{}; 286 NPadType style{};
287 std::array<NPadEntry, 10> shared_memory_entries{}; 287 std::array<NPadEntry, 10> shared_memory_entries{};
288 std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID> 288 std::array<
289 std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>,
290 10>
289 buttons; 291 buttons;
290 std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID> sticks; 292 std::array<
293 std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>,
294 10>
295 sticks;
291 std::vector<u32> supported_npad_id_types{}; 296 std::vector<u32> supported_npad_id_types{};
292 NpadHoldType hold_type{NpadHoldType::Vertical}; 297 NpadHoldType hold_type{NpadHoldType::Vertical};
293 Kernel::SharedPtr<Kernel::Event> styleset_changed_event; 298 Kernel::SharedPtr<Kernel::Event> styleset_changed_event;