diff options
| author | 2024-01-31 18:46:06 -0600 | |
|---|---|---|
| committer | 2024-02-01 10:37:44 -0600 | |
| commit | 818721d12d04f3a9cdf98e9cc31deae171ce6f7e (patch) | |
| tree | 562a15e9da80eb96d5935d962820c0c9b116ac08 /src/hid_core/resources/npad | |
| parent | Merge pull request #12878 from zhaobot/tx-update-20240201020554 (diff) | |
| download | yuzu-818721d12d04f3a9cdf98e9cc31deae171ce6f7e.tar.gz yuzu-818721d12d04f3a9cdf98e9cc31deae171ce6f7e.tar.xz yuzu-818721d12d04f3a9cdf98e9cc31deae171ce6f7e.zip | |
service: hid: Multiple fixes
Diffstat (limited to 'src/hid_core/resources/npad')
| -rw-r--r-- | src/hid_core/resources/npad/npad.cpp | 18 | ||||
| -rw-r--r-- | src/hid_core/resources/npad/npad.h | 1 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index 1a58eff4a..fe3fdc5cd 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp | |||
| @@ -102,6 +102,8 @@ Result NPad::Activate(u64 aruid) { | |||
| 102 | for (std::size_t i = 0; i < 19; ++i) { | 102 | for (std::size_t i = 0; i < 19; ++i) { |
| 103 | WriteEmptyEntry(npad); | 103 | WriteEmptyEntry(npad); |
| 104 | } | 104 | } |
| 105 | |||
| 106 | controller.is_active = true; | ||
| 105 | } | 107 | } |
| 106 | 108 | ||
| 107 | return ResultSuccess; | 109 | return ResultSuccess; |
| @@ -467,6 +469,13 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | |||
| 467 | continue; | 469 | continue; |
| 468 | } | 470 | } |
| 469 | 471 | ||
| 472 | bool is_set{}; | ||
| 473 | npad_resource.IsSupportedNpadStyleSet(is_set, aruid); | ||
| 474 | // Wait until style is defined | ||
| 475 | if (!is_set) { | ||
| 476 | continue; | ||
| 477 | } | ||
| 478 | |||
| 470 | for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) { | 479 | for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) { |
| 471 | auto& controller = controller_data[aruid_index][i]; | 480 | auto& controller = controller_data[aruid_index][i]; |
| 472 | controller.shared_memory = | 481 | controller.shared_memory = |
| @@ -484,6 +493,10 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | |||
| 484 | continue; | 493 | continue; |
| 485 | } | 494 | } |
| 486 | 495 | ||
| 496 | if (!controller.is_active) { | ||
| 497 | continue; | ||
| 498 | } | ||
| 499 | |||
| 487 | RequestPadStateUpdate(aruid, controller.device->GetNpadIdType()); | 500 | RequestPadStateUpdate(aruid, controller.device->GetNpadIdType()); |
| 488 | auto& pad_state = controller.npad_pad_state; | 501 | auto& pad_state = controller.npad_pad_state; |
| 489 | auto& libnx_state = controller.npad_libnx_state; | 502 | auto& libnx_state = controller.npad_libnx_state; |
| @@ -592,7 +605,9 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | |||
| 592 | libnx_state.npad_buttons.raw = pad_state.npad_buttons.raw; | 605 | libnx_state.npad_buttons.raw = pad_state.npad_buttons.raw; |
| 593 | libnx_state.l_stick = pad_state.l_stick; | 606 | libnx_state.l_stick = pad_state.l_stick; |
| 594 | libnx_state.r_stick = pad_state.r_stick; | 607 | libnx_state.r_stick = pad_state.r_stick; |
| 595 | npad->system_ext_lifo.WriteNextEntry(pad_state); | 608 | libnx_state.sampling_number = |
| 609 | npad->system_ext_lifo.ReadCurrentEntry().state.sampling_number + 1; | ||
| 610 | npad->system_ext_lifo.WriteNextEntry(libnx_state); | ||
| 596 | 611 | ||
| 597 | press_state |= static_cast<u64>(pad_state.npad_buttons.raw); | 612 | press_state |= static_cast<u64>(pad_state.npad_buttons.raw); |
| 598 | } | 613 | } |
| @@ -1060,6 +1075,7 @@ void NPad::UnregisterAppletResourceUserId(u64 aruid) { | |||
| 1060 | // TODO: Remove this once abstract pad is emulated properly | 1075 | // TODO: Remove this once abstract pad is emulated properly |
| 1061 | const auto aruid_index = npad_resource.GetIndexFromAruid(aruid); | 1076 | const auto aruid_index = npad_resource.GetIndexFromAruid(aruid); |
| 1062 | for (auto& controller : controller_data[aruid_index]) { | 1077 | for (auto& controller : controller_data[aruid_index]) { |
| 1078 | controller.is_active = false; | ||
| 1063 | controller.is_connected = false; | 1079 | controller.is_connected = false; |
| 1064 | controller.shared_memory = nullptr; | 1080 | controller.shared_memory = nullptr; |
| 1065 | } | 1081 | } |
diff --git a/src/hid_core/resources/npad/npad.h b/src/hid_core/resources/npad/npad.h index 4e26ed2e8..c63488346 100644 --- a/src/hid_core/resources/npad/npad.h +++ b/src/hid_core/resources/npad/npad.h | |||
| @@ -164,6 +164,7 @@ private: | |||
| 164 | NpadInternalState* shared_memory = nullptr; | 164 | NpadInternalState* shared_memory = nullptr; |
| 165 | Core::HID::EmulatedController* device = nullptr; | 165 | Core::HID::EmulatedController* device = nullptr; |
| 166 | 166 | ||
| 167 | bool is_active{}; | ||
| 167 | bool is_connected{}; | 168 | bool is_connected{}; |
| 168 | 169 | ||
| 169 | // Dual joycons can have only one side connected | 170 | // Dual joycons can have only one side connected |