summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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");