summaryrefslogtreecommitdiff
path: root/src/hid_core/resources/npad
diff options
context:
space:
mode:
authorGravatar Narr the Reg2024-01-31 18:46:06 -0600
committerGravatar Narr the Reg2024-02-01 10:37:44 -0600
commit818721d12d04f3a9cdf98e9cc31deae171ce6f7e (patch)
tree562a15e9da80eb96d5935d962820c0c9b116ac08 /src/hid_core/resources/npad
parentMerge pull request #12878 from zhaobot/tx-update-20240201020554 (diff)
downloadyuzu-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.cpp18
-rw-r--r--src/hid_core/resources/npad/npad.h1
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