summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-12-24 16:19:16 -0500
committerGravatar Zach Hilman2018-12-28 15:32:03 -0500
commit621b25b6be99d357c9996fcb2df77f42c7dc2001 (patch)
tree247cd25071b9e08657e1269e5f307b3c55b442ed /src
parentromfs: Add SingleDiscard extraction type (diff)
downloadyuzu-621b25b6be99d357c9996fcb2df77f42c7dc2001.tar.gz
yuzu-621b25b6be99d357c9996fcb2df77f42c7dc2001.tar.xz
yuzu-621b25b6be99d357c9996fcb2df77f42c7dc2001.zip
hid: Make Hid service accessible and add GetPressState
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp8
-rw-r--r--src/core/hle/service/hid/controllers/npad.h6
-rw-r--r--src/core/hle/service/hid/hid.cpp875
-rw-r--r--src/core/hle/service/hid/hid.h110
4 files changed, 540 insertions, 459 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 75fdb861a..2829f64e9 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -410,6 +410,8 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) {
410 libnx_entry.pad.pad_states.raw = pad_state.pad_states.raw; 410 libnx_entry.pad.pad_states.raw = pad_state.pad_states.raw;
411 libnx_entry.pad.l_stick = pad_state.l_stick; 411 libnx_entry.pad.l_stick = pad_state.l_stick;
412 libnx_entry.pad.r_stick = pad_state.r_stick; 412 libnx_entry.pad.r_stick = pad_state.r_stick;
413
414 press_state |= static_cast<u32>(pad_state.pad_states.raw);
413 } 415 }
414 std::memcpy(data + NPAD_OFFSET, shared_memory_entries.data(), 416 std::memcpy(data + NPAD_OFFSET, shared_memory_entries.data(),
415 shared_memory_entries.size() * sizeof(NPadEntry)); 417 shared_memory_entries.size() * sizeof(NPadEntry));
@@ -636,6 +638,12 @@ void Controller_NPad::ClearAllControllers() {
636 }); 638 });
637} 639}
638 640
641u32 Controller_NPad::GetPressState() {
642 const auto res = press_state;
643 press_state = 0;
644 return res;
645}
646
639bool Controller_NPad::IsControllerSupported(NPadControllerType controller) const { 647bool Controller_NPad::IsControllerSupported(NPadControllerType controller) const {
640 const bool support_handheld = 648 const bool support_handheld =
641 std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(), NPAD_HANDHELD) != 649 std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(), NPAD_HANDHELD) !=
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h
index 29851f16a..6906d9ffb 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -124,6 +124,10 @@ public:
124 void ConnectAllDisconnectedControllers(); 124 void ConnectAllDisconnectedControllers();
125 void ClearAllControllers(); 125 void ClearAllControllers();
126 126
127 // Logical OR for all buttons presses on all controllers
128 // Specifically for cheat engine and other features.
129 u32 GetPressState();
130
127 static std::size_t NPadIdToIndex(u32 npad_id); 131 static std::size_t NPadIdToIndex(u32 npad_id);
128 static u32 IndexToNPad(std::size_t index); 132 static u32 IndexToNPad(std::size_t index);
129 133
@@ -292,6 +296,8 @@ private:
292 bool is_connected; 296 bool is_connected;
293 }; 297 };
294 298
299 u32 press_state{};
300
295 NPadType style{}; 301 NPadType style{};
296 std::array<NPadEntry, 10> shared_memory_entries{}; 302 std::array<NPadEntry, 10> shared_memory_entries{};
297 std::array< 303 std::array<
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 268409257..acb4152a4 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -40,119 +40,82 @@ constexpr u64 pad_update_ticks = CoreTiming::BASE_CLOCK_RATE / 66;
40constexpr u64 accelerometer_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100; 40constexpr u64 accelerometer_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100;
41constexpr u64 gyroscope_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100; 41constexpr u64 gyroscope_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100;
42constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; 42constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
43enum class HidController : std::size_t {
44 DebugPad,
45 Touchscreen,
46 Mouse,
47 Keyboard,
48 XPad,
49 Unknown1,
50 Unknown2,
51 Unknown3,
52 SixAxisSensor,
53 NPad,
54 Gesture,
55
56 MaxControllers,
57};
58
59class IAppletResource final : public ServiceFramework<IAppletResource> {
60public:
61 IAppletResource() : ServiceFramework("IAppletResource") {
62 static const FunctionInfo functions[] = {
63 {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"},
64 };
65 RegisterHandlers(functions);
66 43
67 auto& kernel = Core::System::GetInstance().Kernel(); 44IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") {
68 shared_mem = Kernel::SharedMemory::Create( 45 static const FunctionInfo functions[] = {
69 kernel, nullptr, SHARED_MEMORY_SIZE, Kernel::MemoryPermission::ReadWrite, 46 {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"},
70 Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "HID:SharedMemory"); 47 };
71 48 RegisterHandlers(functions);
72 MakeController<Controller_DebugPad>(HidController::DebugPad); 49
73 MakeController<Controller_Touchscreen>(HidController::Touchscreen); 50 auto& kernel = Core::System::GetInstance().Kernel();
74 MakeController<Controller_Mouse>(HidController::Mouse); 51 shared_mem = Kernel::SharedMemory::Create(
75 MakeController<Controller_Keyboard>(HidController::Keyboard); 52 kernel, nullptr, SHARED_MEMORY_SIZE, Kernel::MemoryPermission::ReadWrite,
76 MakeController<Controller_XPad>(HidController::XPad); 53 Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "HID:SharedMemory");
77 MakeController<Controller_Stubbed>(HidController::Unknown1); 54
78 MakeController<Controller_Stubbed>(HidController::Unknown2); 55 MakeController<Controller_DebugPad>(HidController::DebugPad);
79 MakeController<Controller_Stubbed>(HidController::Unknown3); 56 MakeController<Controller_Touchscreen>(HidController::Touchscreen);
80 MakeController<Controller_Stubbed>(HidController::SixAxisSensor); 57 MakeController<Controller_Mouse>(HidController::Mouse);
81 MakeController<Controller_NPad>(HidController::NPad); 58 MakeController<Controller_Keyboard>(HidController::Keyboard);
82 MakeController<Controller_Gesture>(HidController::Gesture); 59 MakeController<Controller_XPad>(HidController::XPad);
83 60 MakeController<Controller_Stubbed>(HidController::Unknown1);
84 // Homebrew doesn't try to activate some controllers, so we activate them by default 61 MakeController<Controller_Stubbed>(HidController::Unknown2);
85 GetController<Controller_NPad>(HidController::NPad).ActivateController(); 62 MakeController<Controller_Stubbed>(HidController::Unknown3);
86 GetController<Controller_Touchscreen>(HidController::Touchscreen).ActivateController(); 63 MakeController<Controller_Stubbed>(HidController::SixAxisSensor);
87 64 MakeController<Controller_NPad>(HidController::NPad);
88 GetController<Controller_Stubbed>(HidController::Unknown1).SetCommonHeaderOffset(0x4c00); 65 MakeController<Controller_Gesture>(HidController::Gesture);
89 GetController<Controller_Stubbed>(HidController::Unknown2).SetCommonHeaderOffset(0x4e00); 66
90 GetController<Controller_Stubbed>(HidController::Unknown3).SetCommonHeaderOffset(0x5000); 67 // Homebrew doesn't try to activate some controllers, so we activate them by default
91 68 GetController<Controller_NPad>(HidController::NPad).ActivateController();
92 // Register update callbacks 69 GetController<Controller_Touchscreen>(HidController::Touchscreen).ActivateController();
93 pad_update_event = CoreTiming::RegisterEvent( 70
94 "HID::UpdatePadCallback", 71 GetController<Controller_Stubbed>(HidController::Unknown1).SetCommonHeaderOffset(0x4c00);
95 [this](u64 userdata, int cycles_late) { UpdateControllers(userdata, cycles_late); }); 72 GetController<Controller_Stubbed>(HidController::Unknown2).SetCommonHeaderOffset(0x4e00);
96 73 GetController<Controller_Stubbed>(HidController::Unknown3).SetCommonHeaderOffset(0x5000);
97 // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?) 74
98 75 // Register update callbacks
99 CoreTiming::ScheduleEvent(pad_update_ticks, pad_update_event); 76 pad_update_event =
100 77 CoreTiming::RegisterEvent("HID::UpdatePadCallback", [this](u64 userdata, int cycles_late) {
101 ReloadInputDevices(); 78 UpdateControllers(userdata, cycles_late);
102 } 79 });
103 80
104 void ActivateController(HidController controller) { 81 // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?)
105 controllers[static_cast<size_t>(controller)]->ActivateController(); 82
106 } 83 CoreTiming::ScheduleEvent(pad_update_ticks, pad_update_event);
107 84
108 void DeactivateController(HidController controller) { 85 ReloadInputDevices();
109 controllers[static_cast<size_t>(controller)]->DeactivateController(); 86}
110 }
111 87
112 template <typename T> 88void IAppletResource::ActivateController(HidController controller) {
113 void MakeController(HidController controller) { 89 controllers[static_cast<size_t>(controller)]->ActivateController();
114 controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>(); 90}
115 }
116 91
117 template <typename T> 92void IAppletResource::DeactivateController(HidController controller) {
118 T& GetController(HidController controller) { 93 controllers[static_cast<size_t>(controller)]->DeactivateController();
119 return static_cast<T&>(*controllers[static_cast<size_t>(controller)]); 94}
120 }
121 95
122 ~IAppletResource() { 96IAppletResource ::~IAppletResource() {
123 CoreTiming::UnscheduleEvent(pad_update_event, 0); 97 CoreTiming::UnscheduleEvent(pad_update_event, 0);
124 } 98}
125 99
126private: 100void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
127 void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) { 101 LOG_DEBUG(Service_HID, "called");
128 LOG_DEBUG(Service_HID, "called");
129 102
130 IPC::ResponseBuilder rb{ctx, 2, 1}; 103 IPC::ResponseBuilder rb{ctx, 2, 1};
131 rb.Push(RESULT_SUCCESS); 104 rb.Push(RESULT_SUCCESS);
132 rb.PushCopyObjects(shared_mem); 105 rb.PushCopyObjects(shared_mem);
133 } 106}
134 107
135 void UpdateControllers(u64 userdata, int cycles_late) { 108void IAppletResource::UpdateControllers(u64 userdata, int cycles_late) {
136 const bool should_reload = Settings::values.is_device_reload_pending.exchange(false); 109 const bool should_reload = Settings::values.is_device_reload_pending.exchange(false);
137 for (const auto& controller : controllers) { 110 for (const auto& controller : controllers) {
138 if (should_reload) { 111 if (should_reload) {
139 controller->OnLoadInputDevices(); 112 controller->OnLoadInputDevices();
140 }
141 controller->OnUpdate(shared_mem->GetPointer(), SHARED_MEMORY_SIZE);
142 } 113 }
143 114 controller->OnUpdate(shared_mem->GetPointer(), SHARED_MEMORY_SIZE);
144 CoreTiming::ScheduleEvent(pad_update_ticks - cycles_late, pad_update_event);
145 } 115 }
146 116
147 // Handle to shared memory region designated to HID service 117 CoreTiming::ScheduleEvent(pad_update_ticks - cycles_late, pad_update_event);
148 Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; 118}
149
150 // CoreTiming update events
151 CoreTiming::EventType* pad_update_event;
152
153 std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
154 controllers{};
155};
156 119
157class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> { 120class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> {
158public: 121public:
@@ -172,10 +135,12 @@ private:
172 } 135 }
173}; 136};
174 137
175class Hid final : public ServiceFramework<Hid> { 138std::shared_ptr<IAppletResource> Hid::GetAppletResource() {
176public: 139 return applet_resource;
177 Hid() : ServiceFramework("hid") { 140}
178 // clang-format off 141
142Hid::Hid() : ServiceFramework("hid") {
143 // clang-format off
179 static const FunctionInfo functions[] = { 144 static const FunctionInfo functions[] = {
180 {0, &Hid::CreateAppletResource, "CreateAppletResource"}, 145 {0, &Hid::CreateAppletResource, "CreateAppletResource"},
181 {1, &Hid::ActivateDebugPad, "ActivateDebugPad"}, 146 {1, &Hid::ActivateDebugPad, "ActivateDebugPad"},
@@ -296,475 +261,467 @@ public:
296 {1000, nullptr, "SetNpadCommunicationMode"}, 261 {1000, nullptr, "SetNpadCommunicationMode"},
297 {1001, nullptr, "GetNpadCommunicationMode"}, 262 {1001, nullptr, "GetNpadCommunicationMode"},
298 }; 263 };
299 // clang-format on 264 // clang-format on
300
301 RegisterHandlers(functions);
302 }
303 ~Hid() = default;
304 265
305private: 266 RegisterHandlers(functions);
306 std::shared_ptr<IAppletResource> applet_resource; 267}
307 268
308 void CreateAppletResource(Kernel::HLERequestContext& ctx) { 269Hid::~Hid() = default;
309 IPC::RequestParser rp{ctx};
310 const auto applet_resource_user_id{rp.Pop<u64>()};
311 270
312 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 271void Hid::CreateAppletResource(Kernel::HLERequestContext& ctx) {
272 IPC::RequestParser rp{ctx};
273 const auto applet_resource_user_id{rp.Pop<u64>()};
313 274
314 if (applet_resource == nullptr) { 275 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
315 applet_resource = std::make_shared<IAppletResource>();
316 }
317 276
318 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 277 if (applet_resource == nullptr) {
319 rb.Push(RESULT_SUCCESS); 278 applet_resource = std::make_shared<IAppletResource>();
320 rb.PushIpcInterface<IAppletResource>(applet_resource);
321 } 279 }
322 280
323 void ActivateXpad(Kernel::HLERequestContext& ctx) { 281 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
324 IPC::RequestParser rp{ctx}; 282 rb.Push(RESULT_SUCCESS);
325 const auto basic_xpad_id{rp.Pop<u32>()}; 283 rb.PushIpcInterface<IAppletResource>(applet_resource);
326 const auto applet_resource_user_id{rp.Pop<u64>()}; 284}
327 285
328 LOG_DEBUG(Service_HID, "called, basic_xpad_id={}, applet_resource_user_id={}", 286void Hid::ActivateXpad(Kernel::HLERequestContext& ctx) {
329 basic_xpad_id, applet_resource_user_id); 287 IPC::RequestParser rp{ctx};
288 const auto basic_xpad_id{rp.Pop<u32>()};
289 const auto applet_resource_user_id{rp.Pop<u64>()};
330 290
331 applet_resource->ActivateController(HidController::XPad); 291 LOG_DEBUG(Service_HID, "called, basic_xpad_id={}, applet_resource_user_id={}", basic_xpad_id,
332 IPC::ResponseBuilder rb{ctx, 2}; 292 applet_resource_user_id);
333 rb.Push(RESULT_SUCCESS);
334 }
335 293
336 void ActivateDebugPad(Kernel::HLERequestContext& ctx) { 294 applet_resource->ActivateController(HidController::XPad);
337 IPC::RequestParser rp{ctx}; 295 IPC::ResponseBuilder rb{ctx, 2};
338 const auto applet_resource_user_id{rp.Pop<u64>()}; 296 rb.Push(RESULT_SUCCESS);
297}
339 298
340 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 299void Hid::ActivateDebugPad(Kernel::HLERequestContext& ctx) {
300 IPC::RequestParser rp{ctx};
301 const auto applet_resource_user_id{rp.Pop<u64>()};
341 302
342 applet_resource->ActivateController(HidController::DebugPad); 303 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
343 IPC::ResponseBuilder rb{ctx, 2};
344 rb.Push(RESULT_SUCCESS);
345 }
346 304
347 void ActivateTouchScreen(Kernel::HLERequestContext& ctx) { 305 applet_resource->ActivateController(HidController::DebugPad);
348 IPC::RequestParser rp{ctx}; 306 IPC::ResponseBuilder rb{ctx, 2};
349 const auto applet_resource_user_id{rp.Pop<u64>()}; 307 rb.Push(RESULT_SUCCESS);
308}
350 309
351 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 310void Hid::ActivateTouchScreen(Kernel::HLERequestContext& ctx) {
311 IPC::RequestParser rp{ctx};
312 const auto applet_resource_user_id{rp.Pop<u64>()};
352 313
353 applet_resource->ActivateController(HidController::Touchscreen); 314 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
354 IPC::ResponseBuilder rb{ctx, 2};
355 rb.Push(RESULT_SUCCESS);
356 }
357 315
358 void ActivateMouse(Kernel::HLERequestContext& ctx) { 316 applet_resource->ActivateController(HidController::Touchscreen);
359 IPC::RequestParser rp{ctx}; 317 IPC::ResponseBuilder rb{ctx, 2};
360 const auto applet_resource_user_id{rp.Pop<u64>()}; 318 rb.Push(RESULT_SUCCESS);
319}
361 320
362 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 321void Hid::ActivateMouse(Kernel::HLERequestContext& ctx) {
322 IPC::RequestParser rp{ctx};
323 const auto applet_resource_user_id{rp.Pop<u64>()};
363 324
364 applet_resource->ActivateController(HidController::Mouse); 325 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
365 IPC::ResponseBuilder rb{ctx, 2};
366 rb.Push(RESULT_SUCCESS);
367 }
368 326
369 void ActivateKeyboard(Kernel::HLERequestContext& ctx) { 327 applet_resource->ActivateController(HidController::Mouse);
370 IPC::RequestParser rp{ctx}; 328 IPC::ResponseBuilder rb{ctx, 2};
371 const auto applet_resource_user_id{rp.Pop<u64>()}; 329 rb.Push(RESULT_SUCCESS);
330}
372 331
373 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 332void Hid::ActivateKeyboard(Kernel::HLERequestContext& ctx) {
333 IPC::RequestParser rp{ctx};
334 const auto applet_resource_user_id{rp.Pop<u64>()};
374 335
375 applet_resource->ActivateController(HidController::Keyboard); 336 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
376 IPC::ResponseBuilder rb{ctx, 2};
377 rb.Push(RESULT_SUCCESS);
378 }
379 337
380 void ActivateGesture(Kernel::HLERequestContext& ctx) { 338 applet_resource->ActivateController(HidController::Keyboard);
381 IPC::RequestParser rp{ctx}; 339 IPC::ResponseBuilder rb{ctx, 2};
382 const auto unknown{rp.Pop<u32>()}; 340 rb.Push(RESULT_SUCCESS);
383 const auto applet_resource_user_id{rp.Pop<u64>()}; 341}
384 342
385 LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown, 343void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) {
386 applet_resource_user_id); 344 IPC::RequestParser rp{ctx};
345 const auto unknown{rp.Pop<u32>()};
346 const auto applet_resource_user_id{rp.Pop<u64>()};
387 347
388 applet_resource->ActivateController(HidController::Gesture); 348 LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown,
389 IPC::ResponseBuilder rb{ctx, 2}; 349 applet_resource_user_id);
390 rb.Push(RESULT_SUCCESS);
391 }
392 350
393 void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx) { 351 applet_resource->ActivateController(HidController::Gesture);
394 // Should have no effect with how our npad sets up the data 352 IPC::ResponseBuilder rb{ctx, 2};
395 IPC::RequestParser rp{ctx}; 353 rb.Push(RESULT_SUCCESS);
396 const auto unknown{rp.Pop<u32>()}; 354}
397 const auto applet_resource_user_id{rp.Pop<u64>()};
398 355
399 LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown, 356void Hid::ActivateNpadWithRevision(Kernel::HLERequestContext& ctx) {
400 applet_resource_user_id); 357 // Should have no effect with how our npad sets up the data
358 IPC::RequestParser rp{ctx};
359 const auto unknown{rp.Pop<u32>()};
360 const auto applet_resource_user_id{rp.Pop<u64>()};
401 361
402 applet_resource->ActivateController(HidController::NPad); 362 LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown,
403 IPC::ResponseBuilder rb{ctx, 2}; 363 applet_resource_user_id);
404 rb.Push(RESULT_SUCCESS);
405 }
406 364
407 void StartSixAxisSensor(Kernel::HLERequestContext& ctx) { 365 applet_resource->ActivateController(HidController::NPad);
408 IPC::RequestParser rp{ctx}; 366 IPC::ResponseBuilder rb{ctx, 2};
409 const auto handle{rp.Pop<u32>()}; 367 rb.Push(RESULT_SUCCESS);
410 const auto applet_resource_user_id{rp.Pop<u64>()}; 368}
411 369
412 LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle, 370void Hid::StartSixAxisSensor(Kernel::HLERequestContext& ctx) {
413 applet_resource_user_id); 371 IPC::RequestParser rp{ctx};
372 const auto handle{rp.Pop<u32>()};
373 const auto applet_resource_user_id{rp.Pop<u64>()};
414 374
415 IPC::ResponseBuilder rb{ctx, 2}; 375 LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle,
416 rb.Push(RESULT_SUCCESS); 376 applet_resource_user_id);
417 }
418 377
419 void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { 378 IPC::ResponseBuilder rb{ctx, 2};
420 IPC::RequestParser rp{ctx}; 379 rb.Push(RESULT_SUCCESS);
421 const auto handle{rp.Pop<u32>()}; 380}
422 const auto drift_mode{rp.Pop<u32>()};
423 const auto applet_resource_user_id{rp.Pop<u64>()};
424 381
425 LOG_WARNING(Service_HID, 382void Hid::SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) {
426 "(STUBBED) called, handle={}, drift_mode={}, applet_resource_user_id={}", 383 IPC::RequestParser rp{ctx};
427 handle, drift_mode, applet_resource_user_id); 384 const auto handle{rp.Pop<u32>()};
385 const auto drift_mode{rp.Pop<u32>()};
386 const auto applet_resource_user_id{rp.Pop<u64>()};
428 387
429 IPC::ResponseBuilder rb{ctx, 2}; 388 LOG_WARNING(Service_HID,
430 rb.Push(RESULT_SUCCESS); 389 "(STUBBED) called, handle={}, drift_mode={}, applet_resource_user_id={}", handle,
431 } 390 drift_mode, applet_resource_user_id);
432 391
433 void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx) { 392 IPC::ResponseBuilder rb{ctx, 2};
434 IPC::RequestParser rp{ctx}; 393 rb.Push(RESULT_SUCCESS);
435 const auto handle{rp.Pop<u32>()}; 394}
436 const auto applet_resource_user_id{rp.Pop<u64>()};
437 395
438 LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle, 396void Hid::IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx) {
439 applet_resource_user_id); 397 IPC::RequestParser rp{ctx};
398 const auto handle{rp.Pop<u32>()};
399 const auto applet_resource_user_id{rp.Pop<u64>()};
440 400
441 IPC::ResponseBuilder rb{ctx, 3}; 401 LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle,
442 rb.Push(RESULT_SUCCESS); 402 applet_resource_user_id);
443 // TODO (Hexagon12): Properly implement reading gyroscope values from controllers.
444 rb.Push(true);
445 }
446 403
447 void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) { 404 IPC::ResponseBuilder rb{ctx, 3};
448 IPC::RequestParser rp{ctx}; 405 rb.Push(RESULT_SUCCESS);
449 const auto supported_styleset{rp.Pop<u32>()}; 406 // TODO (Hexagon12): Properly implement reading gyroscope values from controllers.
407 rb.Push(true);
408}
450 409
451 LOG_DEBUG(Service_HID, "called, supported_styleset={}", supported_styleset); 410void Hid::SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) {
411 IPC::RequestParser rp{ctx};
412 const auto supported_styleset{rp.Pop<u32>()};
452 413
453 applet_resource->GetController<Controller_NPad>(HidController::NPad) 414 LOG_DEBUG(Service_HID, "called, supported_styleset={}", supported_styleset);
454 .SetSupportedStyleSet({supported_styleset});
455 415
456 IPC::ResponseBuilder rb{ctx, 2}; 416 applet_resource->GetController<Controller_NPad>(HidController::NPad)
457 rb.Push(RESULT_SUCCESS); 417 .SetSupportedStyleSet({supported_styleset});
458 }
459 418
460 void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) { 419 IPC::ResponseBuilder rb{ctx, 2};
461 IPC::RequestParser rp{ctx}; 420 rb.Push(RESULT_SUCCESS);
462 const auto applet_resource_user_id{rp.Pop<u64>()}; 421}
463 422
464 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 423void Hid::GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) {
424 IPC::RequestParser rp{ctx};
425 const auto applet_resource_user_id{rp.Pop<u64>()};
465 426
466 auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); 427 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
467 428
468 IPC::ResponseBuilder rb{ctx, 3}; 429 auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
469 rb.Push(RESULT_SUCCESS);
470 rb.Push<u32>(controller.GetSupportedStyleSet().raw);
471 }
472 430
473 void SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) { 431 IPC::ResponseBuilder rb{ctx, 3};
474 IPC::RequestParser rp{ctx}; 432 rb.Push(RESULT_SUCCESS);
475 const auto applet_resource_user_id{rp.Pop<u64>()}; 433 rb.Push<u32>(controller.GetSupportedStyleSet().raw);
434}
476 435
477 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 436void Hid::SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) {
437 IPC::RequestParser rp{ctx};
438 const auto applet_resource_user_id{rp.Pop<u64>()};
478 439
479 applet_resource->GetController<Controller_NPad>(HidController::NPad) 440 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
480 .SetSupportedNPadIdTypes(ctx.ReadBuffer().data(), ctx.GetReadBufferSize());
481 IPC::ResponseBuilder rb{ctx, 2};
482 rb.Push(RESULT_SUCCESS);
483 }
484 441
485 void ActivateNpad(Kernel::HLERequestContext& ctx) { 442 applet_resource->GetController<Controller_NPad>(HidController::NPad)
486 IPC::RequestParser rp{ctx}; 443 .SetSupportedNPadIdTypes(ctx.ReadBuffer().data(), ctx.GetReadBufferSize());
487 const auto applet_resource_user_id{rp.Pop<u64>()}; 444 IPC::ResponseBuilder rb{ctx, 2};
445 rb.Push(RESULT_SUCCESS);
446}
488 447
489 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 448void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) {
449 IPC::RequestParser rp{ctx};
450 const auto applet_resource_user_id{rp.Pop<u64>()};
490 451
491 IPC::ResponseBuilder rb{ctx, 2}; 452 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
492 rb.Push(RESULT_SUCCESS);
493 applet_resource->ActivateController(HidController::NPad);
494 }
495 453
496 void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) { 454 IPC::ResponseBuilder rb{ctx, 2};
497 IPC::RequestParser rp{ctx}; 455 rb.Push(RESULT_SUCCESS);
498 const auto npad_id{rp.Pop<u32>()}; 456 applet_resource->ActivateController(HidController::NPad);
499 const auto applet_resource_user_id{rp.Pop<u64>()}; 457}
500 const auto unknown{rp.Pop<u64>()};
501 458
502 LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}, unknown={}", 459void Hid::AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) {
503 npad_id, applet_resource_user_id, unknown); 460 IPC::RequestParser rp{ctx};
461 const auto npad_id{rp.Pop<u32>()};
462 const auto applet_resource_user_id{rp.Pop<u64>()};
463 const auto unknown{rp.Pop<u64>()};
504 464
505 IPC::ResponseBuilder rb{ctx, 2, 1}; 465 LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}, unknown={}", npad_id,
506 rb.Push(RESULT_SUCCESS); 466 applet_resource_user_id, unknown);
507 rb.PushCopyObjects(applet_resource->GetController<Controller_NPad>(HidController::NPad)
508 .GetStyleSetChangedEvent());
509 }
510 467
511 void DisconnectNpad(Kernel::HLERequestContext& ctx) { 468 IPC::ResponseBuilder rb{ctx, 2, 1};
512 IPC::RequestParser rp{ctx}; 469 rb.Push(RESULT_SUCCESS);
513 const auto npad_id{rp.Pop<u32>()}; 470 rb.PushCopyObjects(applet_resource->GetController<Controller_NPad>(HidController::NPad)
514 const auto applet_resource_user_id{rp.Pop<u64>()}; 471 .GetStyleSetChangedEvent());
472}
515 473
516 LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id, 474void Hid::DisconnectNpad(Kernel::HLERequestContext& ctx) {
517 applet_resource_user_id); 475 IPC::RequestParser rp{ctx};
476 const auto npad_id{rp.Pop<u32>()};
477 const auto applet_resource_user_id{rp.Pop<u64>()};
518 478
519 applet_resource->GetController<Controller_NPad>(HidController::NPad) 479 LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id,
520 .DisconnectNPad(npad_id); 480 applet_resource_user_id);
521 IPC::ResponseBuilder rb{ctx, 2};
522 rb.Push(RESULT_SUCCESS);
523 }
524 481
525 void GetPlayerLedPattern(Kernel::HLERequestContext& ctx) { 482 applet_resource->GetController<Controller_NPad>(HidController::NPad).DisconnectNPad(npad_id);
526 IPC::RequestParser rp{ctx}; 483 IPC::ResponseBuilder rb{ctx, 2};
527 const auto npad_id{rp.Pop<u32>()}; 484 rb.Push(RESULT_SUCCESS);
485}
528 486
529 LOG_DEBUG(Service_HID, "called, npad_id={}", npad_id); 487void Hid::GetPlayerLedPattern(Kernel::HLERequestContext& ctx) {
488 IPC::RequestParser rp{ctx};
489 const auto npad_id{rp.Pop<u32>()};
530 490
531 IPC::ResponseBuilder rb{ctx, 4}; 491 LOG_DEBUG(Service_HID, "called, npad_id={}", npad_id);
532 rb.Push(RESULT_SUCCESS);
533 rb.PushRaw<u64>(applet_resource->GetController<Controller_NPad>(HidController::NPad)
534 .GetLedPattern(npad_id)
535 .raw);
536 }
537 492
538 void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) { 493 IPC::ResponseBuilder rb{ctx, 4};
539 IPC::RequestParser rp{ctx}; 494 rb.Push(RESULT_SUCCESS);
540 const auto applet_resource_user_id{rp.Pop<u64>()}; 495 rb.PushRaw<u64>(applet_resource->GetController<Controller_NPad>(HidController::NPad)
541 const auto hold_type{rp.Pop<u64>()}; 496 .GetLedPattern(npad_id)
497 .raw);
498}
542 499
543 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, hold_type={}", 500void Hid::SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
544 applet_resource_user_id, hold_type); 501 IPC::RequestParser rp{ctx};
502 const auto applet_resource_user_id{rp.Pop<u64>()};
503 const auto hold_type{rp.Pop<u64>()};
545 504
546 auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); 505 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, hold_type={}",
547 controller.SetHoldType(Controller_NPad::NpadHoldType{hold_type}); 506 applet_resource_user_id, hold_type);
548 507
549 IPC::ResponseBuilder rb{ctx, 2}; 508 auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
550 rb.Push(RESULT_SUCCESS); 509 controller.SetHoldType(Controller_NPad::NpadHoldType{hold_type});
551 }
552 510
553 void GetNpadJoyHoldType(Kernel::HLERequestContext& ctx) { 511 IPC::ResponseBuilder rb{ctx, 2};
554 IPC::RequestParser rp{ctx}; 512 rb.Push(RESULT_SUCCESS);
555 const auto applet_resource_user_id{rp.Pop<u64>()}; 513}
556 514
557 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 515void Hid::GetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
516 IPC::RequestParser rp{ctx};
517 const auto applet_resource_user_id{rp.Pop<u64>()};
558 518
559 const auto& controller = 519 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
560 applet_resource->GetController<Controller_NPad>(HidController::NPad);
561 IPC::ResponseBuilder rb{ctx, 4};
562 rb.Push(RESULT_SUCCESS);
563 rb.Push<u64>(static_cast<u64>(controller.GetHoldType()));
564 }
565 520
566 void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx) { 521 const auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
567 IPC::RequestParser rp{ctx}; 522 IPC::ResponseBuilder rb{ctx, 4};
568 const auto npad_id{rp.Pop<u32>()}; 523 rb.Push(RESULT_SUCCESS);
569 const auto applet_resource_user_id{rp.Pop<u64>()}; 524 rb.Push<u64>(static_cast<u64>(controller.GetHoldType()));
525}
570 526
571 LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}", 527void Hid::SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx) {
572 npad_id, applet_resource_user_id); 528 IPC::RequestParser rp{ctx};
529 const auto npad_id{rp.Pop<u32>()};
530 const auto applet_resource_user_id{rp.Pop<u64>()};
573 531
574 IPC::ResponseBuilder rb{ctx, 2}; 532 LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}", npad_id,
575 rb.Push(RESULT_SUCCESS); 533 applet_resource_user_id);
576 }
577 534
578 void BeginPermitVibrationSession(Kernel::HLERequestContext& ctx) { 535 IPC::ResponseBuilder rb{ctx, 2};
579 IPC::RequestParser rp{ctx}; 536 rb.Push(RESULT_SUCCESS);
580 const auto applet_resource_user_id{rp.Pop<u64>()}; 537}
581 538
582 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 539void Hid::BeginPermitVibrationSession(Kernel::HLERequestContext& ctx) {
540 IPC::RequestParser rp{ctx};
541 const auto applet_resource_user_id{rp.Pop<u64>()};
583 542
584 applet_resource->GetController<Controller_NPad>(HidController::NPad) 543 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
585 .SetVibrationEnabled(true);
586 IPC::ResponseBuilder rb{ctx, 2};
587 rb.Push(RESULT_SUCCESS);
588 }
589 544
590 void EndPermitVibrationSession(Kernel::HLERequestContext& ctx) { 545 applet_resource->GetController<Controller_NPad>(HidController::NPad).SetVibrationEnabled(true);
591 LOG_DEBUG(Service_HID, "called"); 546 IPC::ResponseBuilder rb{ctx, 2};
547 rb.Push(RESULT_SUCCESS);
548}
592 549
593 applet_resource->GetController<Controller_NPad>(HidController::NPad) 550void Hid::EndPermitVibrationSession(Kernel::HLERequestContext& ctx) {
594 .SetVibrationEnabled(false); 551 LOG_DEBUG(Service_HID, "called");
595 IPC::ResponseBuilder rb{ctx, 2};
596 rb.Push(RESULT_SUCCESS);
597 }
598 552
599 void SendVibrationValue(Kernel::HLERequestContext& ctx) { 553 applet_resource->GetController<Controller_NPad>(HidController::NPad).SetVibrationEnabled(false);
600 IPC::RequestParser rp{ctx}; 554 IPC::ResponseBuilder rb{ctx, 2};
601 const auto controller_id{rp.Pop<u32>()}; 555 rb.Push(RESULT_SUCCESS);
602 const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()}; 556}
603 const auto applet_resource_user_id{rp.Pop<u64>()};
604 557
605 LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}", 558void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) {
606 controller_id, applet_resource_user_id); 559 IPC::RequestParser rp{ctx};
560 const auto controller_id{rp.Pop<u32>()};
561 const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()};
562 const auto applet_resource_user_id{rp.Pop<u64>()};
607 563
608 IPC::ResponseBuilder rb{ctx, 2}; 564 LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}", controller_id,
609 rb.Push(RESULT_SUCCESS); 565 applet_resource_user_id);
610 566
611 applet_resource->GetController<Controller_NPad>(HidController::NPad) 567 IPC::ResponseBuilder rb{ctx, 2};
612 .VibrateController({controller_id}, {vibration_values}); 568 rb.Push(RESULT_SUCCESS);
613 }
614 569
615 void SendVibrationValues(Kernel::HLERequestContext& ctx) { 570 applet_resource->GetController<Controller_NPad>(HidController::NPad)
616 IPC::RequestParser rp{ctx}; 571 .VibrateController({controller_id}, {vibration_values});
617 const auto applet_resource_user_id{rp.Pop<u64>()}; 572}
618 573
619 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); 574void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) {
575 IPC::RequestParser rp{ctx};
576 const auto applet_resource_user_id{rp.Pop<u64>()};
620 577
621 const auto controllers = ctx.ReadBuffer(0); 578 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
622 const auto vibrations = ctx.ReadBuffer(1);
623 579
624 std::vector<u32> controller_list(controllers.size() / sizeof(u32)); 580 const auto controllers = ctx.ReadBuffer(0);
625 std::vector<Controller_NPad::Vibration> vibration_list(vibrations.size() / 581 const auto vibrations = ctx.ReadBuffer(1);
626 sizeof(Controller_NPad::Vibration));
627 582
628 std::memcpy(controller_list.data(), controllers.data(), controllers.size()); 583 std::vector<u32> controller_list(controllers.size() / sizeof(u32));
629 std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size()); 584 std::vector<Controller_NPad::Vibration> vibration_list(vibrations.size() /
630 std::transform(controller_list.begin(), controller_list.end(), controller_list.begin(), 585 sizeof(Controller_NPad::Vibration));
631 [](u32 controller_id) { return controller_id - 3; });
632 586
633 applet_resource->GetController<Controller_NPad>(HidController::NPad) 587 std::memcpy(controller_list.data(), controllers.data(), controllers.size());
634 .VibrateController(controller_list, vibration_list); 588 std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size());
589 std::transform(controller_list.begin(), controller_list.end(), controller_list.begin(),
590 [](u32 controller_id) { return controller_id - 3; });
635 591
636 IPC::ResponseBuilder rb{ctx, 2}; 592 applet_resource->GetController<Controller_NPad>(HidController::NPad)
637 rb.Push(RESULT_SUCCESS); 593 .VibrateController(controller_list, vibration_list);
638 }
639 594
640 void GetActualVibrationValue(Kernel::HLERequestContext& ctx) { 595 IPC::ResponseBuilder rb{ctx, 2};
641 IPC::RequestParser rp{ctx}; 596 rb.Push(RESULT_SUCCESS);
642 const auto controller_id{rp.Pop<u32>()}; 597}
643 const auto applet_resource_user_id{rp.Pop<u64>()};
644 598
645 LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}", 599void Hid::GetActualVibrationValue(Kernel::HLERequestContext& ctx) {
646 controller_id, applet_resource_user_id); 600 IPC::RequestParser rp{ctx};
601 const auto controller_id{rp.Pop<u32>()};
602 const auto applet_resource_user_id{rp.Pop<u64>()};
647 603
648 IPC::ResponseBuilder rb{ctx, 6}; 604 LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}", controller_id,
649 rb.Push(RESULT_SUCCESS); 605 applet_resource_user_id);
650 rb.PushRaw<Controller_NPad::Vibration>(
651 applet_resource->GetController<Controller_NPad>(HidController::NPad)
652 .GetLastVibration());
653 }
654 606
655 void SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) { 607 IPC::ResponseBuilder rb{ctx, 6};
656 IPC::RequestParser rp{ctx}; 608 rb.Push(RESULT_SUCCESS);
657 const auto npad_id{rp.Pop<u32>()}; 609 rb.PushRaw<Controller_NPad::Vibration>(
658 const auto applet_resource_user_id{rp.Pop<u64>()}; 610 applet_resource->GetController<Controller_NPad>(HidController::NPad).GetLastVibration());
611}
659 612
660 LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id, 613void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) {
661 applet_resource_user_id); 614 IPC::RequestParser rp{ctx};
615 const auto npad_id{rp.Pop<u32>()};
616 const auto applet_resource_user_id{rp.Pop<u64>()};
662 617
663 auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); 618 LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id,
664 controller.SetNpadMode(npad_id, Controller_NPad::NPadAssignments::Dual); 619 applet_resource_user_id);
665 620
666 IPC::ResponseBuilder rb{ctx, 2}; 621 auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
667 rb.Push(RESULT_SUCCESS); 622 controller.SetNpadMode(npad_id, Controller_NPad::NPadAssignments::Dual);
668 }
669 623
670 void MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) { 624 IPC::ResponseBuilder rb{ctx, 2};
671 IPC::RequestParser rp{ctx}; 625 rb.Push(RESULT_SUCCESS);
672 const auto unknown_1{rp.Pop<u32>()}; 626}
673 const auto unknown_2{rp.Pop<u32>()};
674 const auto applet_resource_user_id{rp.Pop<u64>()};
675 627
676 LOG_WARNING(Service_HID, 628void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) {
677 "(STUBBED) called, unknown_1={}, unknown_2={}, applet_resource_user_id={}", 629 IPC::RequestParser rp{ctx};
678 unknown_1, unknown_2, applet_resource_user_id); 630 const auto unknown_1{rp.Pop<u32>()};
631 const auto unknown_2{rp.Pop<u32>()};
632 const auto applet_resource_user_id{rp.Pop<u64>()};
679 633
680 IPC::ResponseBuilder rb{ctx, 2}; 634 LOG_WARNING(Service_HID,
681 rb.Push(RESULT_SUCCESS); 635 "(STUBBED) called, unknown_1={}, unknown_2={}, applet_resource_user_id={}",
682 } 636 unknown_1, unknown_2, applet_resource_user_id);
683 637
684 void SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx) { 638 IPC::ResponseBuilder rb{ctx, 2};
685 IPC::RequestParser rp{ctx}; 639 rb.Push(RESULT_SUCCESS);
686 const auto applet_resource_user_id{rp.Pop<u64>()}; 640}
687 const auto mode{rp.Pop<u64>()};
688 641
689 LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}, mode={}", 642void Hid::SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx) {
690 applet_resource_user_id, mode); 643 IPC::RequestParser rp{ctx};
644 const auto applet_resource_user_id{rp.Pop<u64>()};
645 const auto mode{rp.Pop<u64>()};
691 646
692 IPC::ResponseBuilder rb{ctx, 2}; 647 LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}, mode={}",
693 rb.Push(RESULT_SUCCESS); 648 applet_resource_user_id, mode);
694 }
695 649
696 void GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx) { 650 IPC::ResponseBuilder rb{ctx, 2};
697 LOG_DEBUG(Service_HID, "called"); 651 rb.Push(RESULT_SUCCESS);
652}
698 653
699 IPC::ResponseBuilder rb{ctx, 4}; 654void Hid::GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx) {
700 rb.Push(RESULT_SUCCESS); 655 LOG_DEBUG(Service_HID, "called");
701 rb.Push<u32>(1);
702 rb.Push<u32>(0);
703 }
704 656
705 void CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx) { 657 IPC::ResponseBuilder rb{ctx, 4};
706 LOG_DEBUG(Service_HID, "called"); 658 rb.Push(RESULT_SUCCESS);
659 rb.Push<u32>(1);
660 rb.Push<u32>(0);
661}
707 662
708 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 663void Hid::CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx) {
709 rb.Push(RESULT_SUCCESS); 664 LOG_DEBUG(Service_HID, "called");
710 rb.PushIpcInterface<IActiveVibrationDeviceList>();
711 }
712 665
713 void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) { 666 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
714 IPC::RequestParser rp{ctx}; 667 rb.Push(RESULT_SUCCESS);
715 const auto applet_resource_user_id{rp.Pop<u64>()}; 668 rb.PushIpcInterface<IActiveVibrationDeviceList>();
669}
716 670
717 LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}", 671void Hid::ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
718 applet_resource_user_id); 672 IPC::RequestParser rp{ctx};
673 const auto applet_resource_user_id{rp.Pop<u64>()};
719 674
720 IPC::ResponseBuilder rb{ctx, 2}; 675 LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}",
721 rb.Push(RESULT_SUCCESS); 676 applet_resource_user_id);
722 }
723 677
724 void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) { 678 IPC::ResponseBuilder rb{ctx, 2};
725 IPC::RequestParser rp{ctx}; 679 rb.Push(RESULT_SUCCESS);
726 const auto handle{rp.Pop<u32>()}; 680}
727 const auto applet_resource_user_id{rp.Pop<u64>()};
728 681
729 LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle, 682void Hid::StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
730 applet_resource_user_id); 683 IPC::RequestParser rp{ctx};
684 const auto handle{rp.Pop<u32>()};
685 const auto applet_resource_user_id{rp.Pop<u64>()};
731 686
732 IPC::ResponseBuilder rb{ctx, 2}; 687 LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle,
733 rb.Push(RESULT_SUCCESS); 688 applet_resource_user_id);
734 }
735 689
736 void StopSixAxisSensor(Kernel::HLERequestContext& ctx) { 690 IPC::ResponseBuilder rb{ctx, 2};
737 IPC::RequestParser rp{ctx}; 691 rb.Push(RESULT_SUCCESS);
738 const auto handle{rp.Pop<u32>()}; 692}
739 693
740 LOG_WARNING(Service_HID, "(STUBBED) called, handle={}", handle); 694void Hid::StopSixAxisSensor(Kernel::HLERequestContext& ctx) {
695 IPC::RequestParser rp{ctx};
696 const auto handle{rp.Pop<u32>()};
741 697
742 IPC::ResponseBuilder rb{ctx, 2}; 698 LOG_WARNING(Service_HID, "(STUBBED) called, handle={}", handle);
743 rb.Push(RESULT_SUCCESS);
744 }
745 699
746 void SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx) { 700 IPC::ResponseBuilder rb{ctx, 2};
747 IPC::RequestParser rp{ctx}; 701 rb.Push(RESULT_SUCCESS);
748 const auto applet_resource_user_id{rp.Pop<u64>()}; 702}
749 const auto unknown{rp.Pop<u32>()};
750 703
751 LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}, unknown={}", 704void Hid::SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx) {
752 applet_resource_user_id, unknown); 705 IPC::RequestParser rp{ctx};
706 const auto applet_resource_user_id{rp.Pop<u64>()};
707 const auto unknown{rp.Pop<u32>()};
753 708
754 IPC::ResponseBuilder rb{ctx, 2}; 709 LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}, unknown={}",
755 rb.Push(RESULT_SUCCESS); 710 applet_resource_user_id, unknown);
756 }
757 711
758 void SetPalmaBoostMode(Kernel::HLERequestContext& ctx) { 712 IPC::ResponseBuilder rb{ctx, 2};
759 IPC::RequestParser rp{ctx}; 713 rb.Push(RESULT_SUCCESS);
760 const auto unknown{rp.Pop<u32>()}; 714}
761 715
762 LOG_WARNING(Service_HID, "(STUBBED) called, unknown={}", unknown); 716void Hid::SetPalmaBoostMode(Kernel::HLERequestContext& ctx) {
717 IPC::RequestParser rp{ctx};
718 const auto unknown{rp.Pop<u32>()};
763 719
764 IPC::ResponseBuilder rb{ctx, 2}; 720 LOG_WARNING(Service_HID, "(STUBBED) called, unknown={}", unknown);
765 rb.Push(RESULT_SUCCESS); 721
766 } 722 IPC::ResponseBuilder rb{ctx, 2};
767}; 723 rb.Push(RESULT_SUCCESS);
724}
768 725
769class HidDbg final : public ServiceFramework<HidDbg> { 726class HidDbg final : public ServiceFramework<HidDbg> {
770public: 727public:
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 773035460..615d4e6d8 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -3,6 +3,15 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#pragma once 5#pragma once
6#include "core/hle/service/service.h"
7
8namespace CoreTiming {
9struct EventType;
10}
11
12namespace Kernel {
13class SharedMemory;
14}
6 15
7namespace SM { 16namespace SM {
8class ServiceManager; 17class ServiceManager;
@@ -10,6 +19,107 @@ class ServiceManager;
10 19
11namespace Service::HID { 20namespace Service::HID {
12 21
22class ControllerBase;
23
24enum class HidController : std::size_t {
25 DebugPad,
26 Touchscreen,
27 Mouse,
28 Keyboard,
29 XPad,
30 Unknown1,
31 Unknown2,
32 Unknown3,
33 SixAxisSensor,
34 NPad,
35 Gesture,
36
37 MaxControllers,
38};
39
40class IAppletResource final : public ServiceFramework<IAppletResource> {
41public:
42 IAppletResource();
43 ~IAppletResource() override;
44
45 void ActivateController(HidController controller);
46 void DeactivateController(HidController controller);
47
48 template <typename T>
49 T& GetController(HidController controller) {
50 return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
51 }
52
53 template <typename T>
54 const T& GetController(HidController controller) const {
55 return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
56 }
57
58private:
59 template <typename T>
60 void MakeController(HidController controller) {
61 controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>();
62 }
63
64 void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx);
65 void UpdateControllers(u64 userdata, int cycles_late);
66
67 Kernel::SharedPtr<Kernel::SharedMemory> shared_mem;
68
69 CoreTiming::EventType* pad_update_event;
70
71 std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
72 controllers{};
73};
74
75class Hid final : public ServiceFramework<Hid> {
76public:
77 Hid();
78 ~Hid() override;
79
80 std::shared_ptr<IAppletResource> GetAppletResource();
81
82private:
83 void CreateAppletResource(Kernel::HLERequestContext& ctx);
84 void ActivateXpad(Kernel::HLERequestContext& ctx);
85 void ActivateDebugPad(Kernel::HLERequestContext& ctx);
86 void ActivateTouchScreen(Kernel::HLERequestContext& ctx);
87 void ActivateMouse(Kernel::HLERequestContext& ctx);
88 void ActivateKeyboard(Kernel::HLERequestContext& ctx);
89 void ActivateGesture(Kernel::HLERequestContext& ctx);
90 void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx);
91 void StartSixAxisSensor(Kernel::HLERequestContext& ctx);
92 void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx);
93 void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx);
94 void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
95 void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
96 void SetSupportedNpadIdType(Kernel::HLERequestContext& ctx);
97 void ActivateNpad(Kernel::HLERequestContext& ctx);
98 void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx);
99 void DisconnectNpad(Kernel::HLERequestContext& ctx);
100 void GetPlayerLedPattern(Kernel::HLERequestContext& ctx);
101 void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx);
102 void GetNpadJoyHoldType(Kernel::HLERequestContext& ctx);
103 void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx);
104 void BeginPermitVibrationSession(Kernel::HLERequestContext& ctx);
105 void EndPermitVibrationSession(Kernel::HLERequestContext& ctx);
106 void SendVibrationValue(Kernel::HLERequestContext& ctx);
107 void SendVibrationValues(Kernel::HLERequestContext& ctx);
108 void GetActualVibrationValue(Kernel::HLERequestContext& ctx);
109 void SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx);
110 void MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx);
111 void SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx);
112 void GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx);
113 void CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx);
114 void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx);
115 void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx);
116 void StopSixAxisSensor(Kernel::HLERequestContext& ctx);
117 void SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx);
118 void SetPalmaBoostMode(Kernel::HLERequestContext& ctx);
119
120 std::shared_ptr<IAppletResource> applet_resource;
121};
122
13/// Reload input devices. Used when input configuration changed 123/// Reload input devices. Used when input configuration changed
14void ReloadInputDevices(); 124void ReloadInputDevices();
15 125