summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar David Marcec2018-10-10 21:38:43 +1100
committerGravatar David Marcec2018-10-10 21:38:43 +1100
commit3d75c9cd7a75f7ef97e2e14fc2eb15e4bba92934 (patch)
treea4fd0d5c6ed5e11fa5eb0229b9dd9ab4e06885de /src
parentKirby expects handheld controllers to be at position 8 (diff)
downloadyuzu-3d75c9cd7a75f7ef97e2e14fc2eb15e4bba92934.tar.gz
yuzu-3d75c9cd7a75f7ef97e2e14fc2eb15e4bba92934.tar.xz
yuzu-3d75c9cd7a75f7ef97e2e14fc2eb15e4bba92934.zip
Added GetLedPattern and HandheldVariant
HandheldVariant is for specific games which expect handheld controllers to be at position 8(kirby), however this doesn't fix all games as some games require handhelds to be at position 0(snipperclips)
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp36
-rw-r--r--src/core/hle/service/hid/controllers/npad.h22
-rw-r--r--src/core/hle/service/hid/hid.cpp11
3 files changed, 63 insertions, 6 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 282953bab..069e0d5de 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -41,6 +41,7 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) {
41 controller.joy_styles.raw = 0; // Zero out 41 controller.joy_styles.raw = 0; // Zero out
42 controller.device_type.raw = 0; 42 controller.device_type.raw = 0;
43 switch (controller_type) { 43 switch (controller_type) {
44 case NPadControllerType::HandheldVariant:
44 case NPadControllerType::Handheld: 45 case NPadControllerType::Handheld:
45 controller.joy_styles.handheld.Assign(1); 46 controller.joy_styles.handheld.Assign(1);
46 controller.device_type.handheld.Assign(1); 47 controller.device_type.handheld.Assign(1);
@@ -220,9 +221,12 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) {
220 } 221 }
221 222
222 switch (controller_type) { 223 switch (controller_type) {
224 case NPadControllerType::HandheldVariant:
223 case NPadControllerType::Handheld: 225 case NPadControllerType::Handheld:
224 handheld_entry.connection_status.IsConnected.Assign(1); 226 handheld_entry.connection_status.IsConnected.Assign(1);
225 handheld_entry.connection_status.IsWired.Assign(1); 227 if (!Settings::values.use_docked_mode) {
228 handheld_entry.connection_status.IsWired.Assign(1);
229 }
226 handheld_entry.pad_states.raw = pad_state.raw; 230 handheld_entry.pad_states.raw = pad_state.raw;
227 handheld_entry.l_stick = lstick_entry; 231 handheld_entry.l_stick = lstick_entry;
228 handheld_entry.r_stick = rstick_entry; 232 handheld_entry.r_stick = rstick_entry;
@@ -334,7 +338,7 @@ void Controller_NPad::AddNewController(NPadControllerType controller) {
334 LOG_ERROR(Service_HID, "Cannot connect any more controllers!"); 338 LOG_ERROR(Service_HID, "Cannot connect any more controllers!");
335 return; 339 return;
336 } 340 }
337 if (controller == NPadControllerType::Handheld) { 341 if (controller == NPadControllerType::HandheldVariant) {
338 connected_controllers[8] = {controller, true}; 342 connected_controllers[8] = {controller, true};
339 InitNewlyAddedControler(8); 343 InitNewlyAddedControler(8);
340 return; 344 return;
@@ -354,4 +358,32 @@ void Controller_NPad::DisconnectNPad(u32 npad_id) {
354 return; 358 return;
355 connected_controllers[npad_id].is_connected = false; 359 connected_controllers[npad_id].is_connected = false;
356} 360}
361
362Controller_NPad::LedPattern Controller_NPad::GetLedPattern(u32 npad_id) {
363 if (npad_id == npad_id_list.back() || npad_id == npad_id_list[npad_id_list.size() - 2]) {
364 // These are controllers without led patterns
365 return LedPattern{0, 0, 0, 0};
366 }
367 switch (npad_id) {
368 case 0:
369 return LedPattern{1, 0, 0, 0};
370 case 1:
371 return LedPattern{0, 1, 0, 0};
372 case 2:
373 return LedPattern{0, 0, 1, 0};
374 case 3:
375 return LedPattern{0, 0, 0, 1};
376 case 4:
377 return LedPattern{1, 0, 0, 1};
378 case 5:
379 return LedPattern{1, 0, 1, 0};
380 case 6:
381 return LedPattern{1, 0, 1, 1};
382 case 7:
383 return LedPattern{0, 1, 1, 0};
384 default:
385 UNIMPLEMENTED_MSG("Unhandled npad_id {}", npad_id);
386 return LedPattern{0, 0, 0, 0};
387 };
388}
357} // namespace Service::HID 389} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h
index 86ab0e429..28c89768c 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -65,12 +65,29 @@ public:
65 None, 65 None,
66 ProController, 66 ProController,
67 Handheld, 67 Handheld,
68 HandheldVariant, // Games which require the handheld controller to be at index 8
68 JoyLeft, 69 JoyLeft,
69 JoyRight, 70 JoyRight,
70 Tabletop, 71 Tabletop,
71 Pokeball, 72 Pokeball,
72 }; 73 };
73 74
75 struct LedPattern {
76 explicit LedPattern(u64 light1, u64 light2, u64 light3, u64 light4) {
77 position1.Assign(light1);
78 position1.Assign(light2);
79 position1.Assign(light3);
80 position1.Assign(light4);
81 };
82 union {
83 u64 raw{};
84 BitField<0, 1, u64> position1;
85 BitField<1, 1, u64> position2;
86 BitField<2, 1, u64> position3;
87 BitField<3, 1, u64> position4;
88 };
89 };
90
74 void SetSupportedStyleSet(NPadType style_set); 91 void SetSupportedStyleSet(NPadType style_set);
75 NPadType GetSupportedStyleSet() const; 92 NPadType GetSupportedStyleSet() const;
76 93
@@ -93,6 +110,7 @@ public:
93 110
94 void ConnectNPad(u32 npad_id); 111 void ConnectNPad(u32 npad_id);
95 void DisconnectNPad(u32 npad_id); 112 void DisconnectNPad(u32 npad_id);
113 LedPattern GetLedPattern(u32 npad_id);
96 114
97private: 115private:
98 struct CommonHeader { 116 struct CommonHeader {
@@ -255,8 +273,8 @@ private:
255 std::size_t dump_idx{}; 273 std::size_t dump_idx{};
256 Vibration last_processed_vibration{}; 274 Vibration last_processed_vibration{};
257 std::size_t controller_count{}; 275 std::size_t controller_count{};
258 static constexpr std::array<u32, 9> npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32}; 276 static constexpr std::array<u32, 10> npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32, 16};
259 std::array<ControllerHolder, 9> connected_controllers{}; 277 std::array<ControllerHolder, 10> connected_controllers{};
260 278
261 void InitNewlyAddedControler(std::size_t controller_idx); 279 void InitNewlyAddedControler(std::size_t controller_idx);
262}; 280};
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index dfee289d2..4c0d96cc2 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -421,9 +421,14 @@ private:
421 } 421 }
422 422
423 void GetPlayerLedPattern(Kernel::HLERequestContext& ctx) { 423 void GetPlayerLedPattern(Kernel::HLERequestContext& ctx) {
424 IPC::ResponseBuilder rb{ctx, 2}; 424 IPC::RequestParser rp{ctx};
425 auto npad_id = rp.PopRaw<u32>();
426 IPC::ResponseBuilder rb{ctx, 4};
425 rb.Push(RESULT_SUCCESS); 427 rb.Push(RESULT_SUCCESS);
426 LOG_WARNING(Service_HID, "(STUBBED) called"); 428 rb.PushRaw<u64>(applet_resource->GetController<Controller_NPad>(HidController::NPad)
429 .GetLedPattern(npad_id)
430 .raw);
431 LOG_DEBUG(Service_HID, "called");
427 } 432 }
428 433
429 void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) { 434 void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
@@ -513,6 +518,8 @@ private:
513 } 518 }
514 519
515 void SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx) { 520 void SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx) {
521 IPC::RequestParser rp{ctx};
522 auto mode = rp.PopRaw<u32>();
516 IPC::ResponseBuilder rb{ctx, 2}; 523 IPC::ResponseBuilder rb{ctx, 2};
517 rb.Push(RESULT_SUCCESS); 524 rb.Push(RESULT_SUCCESS);
518 LOG_WARNING(Service_HID, "(STUBBED) called"); 525 LOG_WARNING(Service_HID, "(STUBBED) called");