diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 36 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 22 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 11 |
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 | |||
| 362 | Controller_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 | ||
| 97 | private: | 115 | private: |
| 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"); |