summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/hid/hid.cpp32
-rw-r--r--src/core/hle/service/hid/hid.h4
2 files changed, 30 insertions, 6 deletions
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 79375bd2f..bf28440c6 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -36,8 +36,9 @@ namespace Service::HID {
36 36
37// Updating period for each HID device. 37// Updating period for each HID device.
38// Period time is obtained by measuring the number of samples in a second on HW using a homebrew 38// Period time is obtained by measuring the number of samples in a second on HW using a homebrew
39// Correct pad_update_ns is 4ms this is overclocked to lower input lag 39// Correct npad_update_ns is 4ms this is overclocked to lower input lag
40constexpr auto pad_update_ns = std::chrono::nanoseconds{1 * 1000 * 1000}; // (1ms, 1000Hz) 40constexpr auto npad_update_ns = std::chrono::nanoseconds{1 * 1000 * 1000}; // (1ms, 1000Hz)
41constexpr auto default_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; // (4ms, 1000Hz)
41constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz) 42constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz)
42constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz) 43constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz)
43 44
@@ -75,11 +76,19 @@ IAppletResource::IAppletResource(Core::System& system_,
75 GetController<Controller_Stubbed>(HidController::UniquePad).SetCommonHeaderOffset(0x5A00); 76 GetController<Controller_Stubbed>(HidController::UniquePad).SetCommonHeaderOffset(0x5A00);
76 77
77 // Register update callbacks 78 // Register update callbacks
78 pad_update_event = Core::Timing::CreateEvent( 79 npad_update_event = Core::Timing::CreateEvent(
79 "HID::UpdatePadCallback", 80 "HID::UpdatePadCallback",
80 [this](std::uintptr_t user_data, s64 time, 81 [this](std::uintptr_t user_data, s64 time,
81 std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { 82 std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
82 const auto guard = LockService(); 83 const auto guard = LockService();
84 UpdateNpad(user_data, ns_late);
85 return std::nullopt;
86 });
87 default_update_event = Core::Timing::CreateEvent(
88 "HID::UpdateDefaultCallback",
89 [this](std::uintptr_t user_data, s64 time,
90 std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
91 const auto guard = LockService();
83 UpdateControllers(user_data, ns_late); 92 UpdateControllers(user_data, ns_late);
84 return std::nullopt; 93 return std::nullopt;
85 }); 94 });
@@ -100,7 +109,9 @@ IAppletResource::IAppletResource(Core::System& system_,
100 return std::nullopt; 109 return std::nullopt;
101 }); 110 });
102 111
103 system.CoreTiming().ScheduleLoopingEvent(pad_update_ns, pad_update_ns, pad_update_event); 112 system.CoreTiming().ScheduleLoopingEvent(npad_update_ns, npad_update_ns, npad_update_event);
113 system.CoreTiming().ScheduleLoopingEvent(default_update_ns, default_update_ns,
114 default_update_event);
104 system.CoreTiming().ScheduleLoopingEvent(mouse_keyboard_update_ns, mouse_keyboard_update_ns, 115 system.CoreTiming().ScheduleLoopingEvent(mouse_keyboard_update_ns, mouse_keyboard_update_ns,
105 mouse_keyboard_update_event); 116 mouse_keyboard_update_event);
106 system.CoreTiming().ScheduleLoopingEvent(motion_update_ns, motion_update_ns, 117 system.CoreTiming().ScheduleLoopingEvent(motion_update_ns, motion_update_ns,
@@ -118,7 +129,8 @@ void IAppletResource::DeactivateController(HidController controller) {
118} 129}
119 130
120IAppletResource::~IAppletResource() { 131IAppletResource::~IAppletResource() {
121 system.CoreTiming().UnscheduleEvent(pad_update_event, 0); 132 system.CoreTiming().UnscheduleEvent(npad_update_event, 0);
133 system.CoreTiming().UnscheduleEvent(default_update_event, 0);
122 system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event, 0); 134 system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event, 0);
123 system.CoreTiming().UnscheduleEvent(motion_update_event, 0); 135 system.CoreTiming().UnscheduleEvent(motion_update_event, 0);
124} 136}
@@ -144,10 +156,20 @@ void IAppletResource::UpdateControllers(std::uintptr_t user_data,
144 if (controller == controllers[static_cast<size_t>(HidController::Mouse)]) { 156 if (controller == controllers[static_cast<size_t>(HidController::Mouse)]) {
145 continue; 157 continue;
146 } 158 }
159 // Npad has it's own update event
160 if (controller == controllers[static_cast<size_t>(HidController::NPad)]) {
161 continue;
162 }
147 controller->OnUpdate(core_timing); 163 controller->OnUpdate(core_timing);
148 } 164 }
149} 165}
150 166
167void IAppletResource::UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late) {
168 auto& core_timing = system.CoreTiming();
169
170 controllers[static_cast<size_t>(HidController::NPad)]->OnUpdate(core_timing);
171}
172
151void IAppletResource::UpdateMouseKeyboard(std::uintptr_t user_data, 173void IAppletResource::UpdateMouseKeyboard(std::uintptr_t user_data,
152 std::chrono::nanoseconds ns_late) { 174 std::chrono::nanoseconds ns_late) {
153 auto& core_timing = system.CoreTiming(); 175 auto& core_timing = system.CoreTiming();
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 340d26fdc..b7c2a23ef 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -71,12 +71,14 @@ private:
71 71
72 void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx); 72 void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx);
73 void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); 73 void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
74 void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
74 void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); 75 void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
75 void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); 76 void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
76 77
77 KernelHelpers::ServiceContext& service_context; 78 KernelHelpers::ServiceContext& service_context;
78 79
79 std::shared_ptr<Core::Timing::EventType> pad_update_event; 80 std::shared_ptr<Core::Timing::EventType> npad_update_event;
81 std::shared_ptr<Core::Timing::EventType> default_update_event;
80 std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event; 82 std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event;
81 std::shared_ptr<Core::Timing::EventType> motion_update_event; 83 std::shared_ptr<Core::Timing::EventType> motion_update_event;
82 84