summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/service/hid/hid_server.cpp22
-rw-r--r--src/core/hle/service/hid/hid_system_server.cpp68
-rw-r--r--src/core/hle/service/hid/hid_system_server.h3
-rw-r--r--src/hid_core/resources/npad/npad.cpp45
-rw-r--r--src/hid_core/resources/npad/npad.h12
5 files changed, 129 insertions, 21 deletions
diff --git a/src/core/hle/service/hid/hid_server.cpp b/src/core/hle/service/hid/hid_server.cpp
index 2ff00d30d..74898888a 100644
--- a/src/core/hle/service/hid/hid_server.cpp
+++ b/src/core/hle/service/hid/hid_server.cpp
@@ -1444,8 +1444,8 @@ void IHidServer::SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx) {
1444 1444
1445 const auto parameters{rp.PopRaw<Parameters>()}; 1445 const auto parameters{rp.PopRaw<Parameters>()};
1446 1446
1447 LOG_WARNING(Service_HID, "(STUBBED) called, use_center_clamp={}, applet_resource_user_id={}", 1447 LOG_INFO(Service_HID, "called, use_center_clamp={}, applet_resource_user_id={}",
1448 parameters.use_center_clamp, parameters.applet_resource_user_id); 1448 parameters.use_center_clamp, parameters.applet_resource_user_id);
1449 1449
1450 GetResourceManager()->GetNpad()->SetNpadAnalogStickUseCenterClamp( 1450 GetResourceManager()->GetNpad()->SetNpadAnalogStickUseCenterClamp(
1451 parameters.applet_resource_user_id, parameters.use_center_clamp); 1451 parameters.applet_resource_user_id, parameters.use_center_clamp);
@@ -1466,23 +1466,27 @@ void IHidServer::SetNpadCaptureButtonAssignment(HLERequestContext& ctx) {
1466 1466
1467 const auto parameters{rp.PopRaw<Parameters>()}; 1467 const auto parameters{rp.PopRaw<Parameters>()};
1468 1468
1469 LOG_WARNING(Service_HID, 1469 LOG_INFO(Service_HID, "called, npad_styleset={}, applet_resource_user_id={}, button={}",
1470 "(STUBBED) called, npad_styleset={}, applet_resource_user_id={}, button={}", 1470 parameters.npad_styleset, parameters.applet_resource_user_id, parameters.button);
1471 parameters.npad_styleset, parameters.applet_resource_user_id, parameters.button); 1471
1472 const auto result = GetResourceManager()->GetNpad()->SetNpadCaptureButtonAssignment(
1473 parameters.applet_resource_user_id, parameters.npad_styleset, parameters.button);
1472 1474
1473 IPC::ResponseBuilder rb{ctx, 2}; 1475 IPC::ResponseBuilder rb{ctx, 2};
1474 rb.Push(ResultSuccess); 1476 rb.Push(result);
1475} 1477}
1476 1478
1477void IHidServer::ClearNpadCaptureButtonAssignment(HLERequestContext& ctx) { 1479void IHidServer::ClearNpadCaptureButtonAssignment(HLERequestContext& ctx) {
1478 IPC::RequestParser rp{ctx}; 1480 IPC::RequestParser rp{ctx};
1479 const auto applet_resource_user_id{rp.Pop<u64>()}; 1481 const auto applet_resource_user_id{rp.Pop<u64>()};
1480 1482
1481 LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}", 1483 LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
1482 applet_resource_user_id); 1484
1485 const auto result =
1486 GetResourceManager()->GetNpad()->ClearNpadCaptureButtonAssignment(applet_resource_user_id);
1483 1487
1484 IPC::ResponseBuilder rb{ctx, 2}; 1488 IPC::ResponseBuilder rb{ctx, 2};
1485 rb.Push(ResultSuccess); 1489 rb.Push(result);
1486} 1490}
1487 1491
1488void IHidServer::GetVibrationDeviceInfo(HLERequestContext& ctx) { 1492void IHidServer::GetVibrationDeviceInfo(HLERequestContext& ctx) {
diff --git a/src/core/hle/service/hid/hid_system_server.cpp b/src/core/hle/service/hid/hid_system_server.cpp
index 2a65615e8..3a0cb3cb1 100644
--- a/src/core/hle/service/hid/hid_system_server.cpp
+++ b/src/core/hle/service/hid/hid_system_server.cpp
@@ -46,7 +46,7 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<Resour
46 {310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"}, 46 {310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"},
47 {311, nullptr, "SetNpadPlayerLedBlinkingDevice"}, 47 {311, nullptr, "SetNpadPlayerLedBlinkingDevice"},
48 {312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"}, 48 {312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"},
49 {313, nullptr, "GetNpadCaptureButtonAssignment"}, 49 {313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"},
50 {314, nullptr, "GetAppletFooterUiType"}, 50 {314, nullptr, "GetAppletFooterUiType"},
51 {315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"}, 51 {315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"},
52 {316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"}, 52 {316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"},
@@ -54,8 +54,8 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<Resour
54 {318, &IHidSystemServer::HasBattery, "HasBattery"}, 54 {318, &IHidSystemServer::HasBattery, "HasBattery"},
55 {319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"}, 55 {319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"},
56 {321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"}, 56 {321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"},
57 {322, &IHidSystemServer::GetIrSensorState, "GetIrSensorState"}, 57 {322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"},
58 {323, nullptr, "GetXcdHandleForNpadWithIrSensor"}, 58 {323, nullptr, "GetLastActiveUniquePad"},
59 {324, nullptr, "GetUniquePadButtonSet"}, 59 {324, nullptr, "GetUniquePadButtonSet"},
60 {325, nullptr, "GetUniquePadColor"}, 60 {325, nullptr, "GetUniquePadColor"},
61 {326, nullptr, "GetUniquePadAppletDetailedUiType"}, 61 {326, nullptr, "GetUniquePadAppletDetailedUiType"},
@@ -251,25 +251,38 @@ void IHidSystemServer::ApplyNpadSystemCommonPolicy(HLERequestContext& ctx) {
251} 251}
252 252
253void IHidSystemServer::EnableAssigningSingleOnSlSrPress(HLERequestContext& ctx) { 253void IHidSystemServer::EnableAssigningSingleOnSlSrPress(HLERequestContext& ctx) {
254 LOG_WARNING(Service_HID, "(STUBBED) called"); 254 IPC::RequestParser rp{ctx};
255 const auto applet_resource_user_id{rp.Pop<u64>()};
256
257 LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
258
259 GetResourceManager()->GetNpad()->AssigningSingleOnSlSrPress(applet_resource_user_id, true);
255 260
256 IPC::ResponseBuilder rb{ctx, 2}; 261 IPC::ResponseBuilder rb{ctx, 2};
257 rb.Push(ResultSuccess); 262 rb.Push(ResultSuccess);
258} 263}
259 264
260void IHidSystemServer::DisableAssigningSingleOnSlSrPress(HLERequestContext& ctx) { 265void IHidSystemServer::DisableAssigningSingleOnSlSrPress(HLERequestContext& ctx) {
261 LOG_WARNING(Service_HID, "(STUBBED) called"); 266 IPC::RequestParser rp{ctx};
267 const auto applet_resource_user_id{rp.Pop<u64>()};
268
269 LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
270
271 GetResourceManager()->GetNpad()->AssigningSingleOnSlSrPress(applet_resource_user_id, false);
262 272
263 IPC::ResponseBuilder rb{ctx, 2}; 273 IPC::ResponseBuilder rb{ctx, 2};
264 rb.Push(ResultSuccess); 274 rb.Push(ResultSuccess);
265} 275}
266 276
267void IHidSystemServer::GetLastActiveNpad(HLERequestContext& ctx) { 277void IHidSystemServer::GetLastActiveNpad(HLERequestContext& ctx) {
268 LOG_DEBUG(Service_HID, "(STUBBED) called"); // Spams a lot when controller applet is running 278 Core::HID::NpadIdType npad_id{};
279 const Result result = GetResourceManager()->GetNpad()->GetLastActiveNpad(npad_id);
280
281 LOG_DEBUG(Service_HID, "called, npad_id={}", npad_id);
269 282
270 IPC::ResponseBuilder rb{ctx, 3}; 283 IPC::ResponseBuilder rb{ctx, 3};
271 rb.Push(ResultSuccess); 284 rb.Push(result);
272 rb.Push(0); // Dont forget to fix this 285 rb.PushEnum(npad_id);
273} 286}
274 287
275void IHidSystemServer::ApplyNpadSystemCommonPolicyFull(HLERequestContext& ctx) { 288void IHidSystemServer::ApplyNpadSystemCommonPolicyFull(HLERequestContext& ctx) {
@@ -331,6 +344,27 @@ void IHidSystemServer::SetSupportedNpadStyleSetAll(HLERequestContext& ctx) {
331 rb.Push(result); 344 rb.Push(result);
332} 345}
333 346
347void IHidSystemServer::GetNpadCaptureButtonAssignment(HLERequestContext& ctx) {
348 IPC::RequestParser rp{ctx};
349 const auto applet_resource_user_id{rp.Pop<u64>()};
350 const auto capture_button_list_size{ctx.GetWriteBufferNumElements<Core::HID::NpadButton>()};
351
352 LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
353
354 std::vector<Core::HID::NpadButton> capture_button_list(capture_button_list_size);
355 const auto& npad = GetResourceManager()->GetNpad();
356 const u64 list_size =
357 npad->GetNpadCaptureButtonAssignment(capture_button_list, applet_resource_user_id);
358
359 if (list_size != 0) {
360 ctx.WriteBuffer(capture_button_list);
361 }
362
363 IPC::ResponseBuilder rb{ctx, 4};
364 rb.Push(ResultSuccess);
365 rb.Push(list_size);
366}
367
334void IHidSystemServer::GetAppletDetailedUiType(HLERequestContext& ctx) { 368void IHidSystemServer::GetAppletDetailedUiType(HLERequestContext& ctx) {
335 IPC::RequestParser rp{ctx}; 369 IPC::RequestParser rp{ctx};
336 const auto npad_id_type{rp.PopEnum<Core::HID::NpadIdType>()}; 370 const auto npad_id_type{rp.PopEnum<Core::HID::NpadIdType>()};
@@ -423,13 +457,25 @@ void IHidSystemServer::GetUniquePadsFromNpad(HLERequestContext& ctx) {
423 rb.Push(static_cast<u32>(unique_pads.size())); 457 rb.Push(static_cast<u32>(unique_pads.size()));
424} 458}
425 459
426void IHidSystemServer::GetIrSensorState(HLERequestContext& ctx) { 460void IHidSystemServer::SetNpadSystemExtStateEnabled(HLERequestContext& ctx) {
427 IPC::RequestParser rp{ctx}; 461 IPC::RequestParser rp{ctx};
462 struct Parameters {
463 bool is_enabled;
464 INSERT_PADDING_BYTES_NOINIT(7);
465 u64 applet_resource_user_id;
466 };
467 static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
428 468
429 LOG_WARNING(Service_HID, "(STUBBED) called"); 469 const auto parameters{rp.PopRaw<Parameters>()};
470
471 LOG_INFO(Service_HID, "called, is_enabled={}, applet_resource_user_id={}",
472 parameters.is_enabled, parameters.applet_resource_user_id);
473
474 const auto result = GetResourceManager()->GetNpad()->SetNpadSystemExtStateEnabled(
475 parameters.applet_resource_user_id, parameters.is_enabled);
430 476
431 IPC::ResponseBuilder rb{ctx, 2}; 477 IPC::ResponseBuilder rb{ctx, 2};
432 rb.Push(ResultSuccess); 478 rb.Push(result);
433} 479}
434void IHidSystemServer::RegisterAppletResourceUserId(HLERequestContext& ctx) { 480void IHidSystemServer::RegisterAppletResourceUserId(HLERequestContext& ctx) {
435 IPC::RequestParser rp{ctx}; 481 IPC::RequestParser rp{ctx};
diff --git a/src/core/hle/service/hid/hid_system_server.h b/src/core/hle/service/hid/hid_system_server.h
index f467e2aa8..0c2634e3f 100644
--- a/src/core/hle/service/hid/hid_system_server.h
+++ b/src/core/hle/service/hid/hid_system_server.h
@@ -31,13 +31,14 @@ private:
31 void GetNpadFullKeyGripColor(HLERequestContext& ctx); 31 void GetNpadFullKeyGripColor(HLERequestContext& ctx);
32 void GetMaskedSupportedNpadStyleSet(HLERequestContext& ctx); 32 void GetMaskedSupportedNpadStyleSet(HLERequestContext& ctx);
33 void SetSupportedNpadStyleSetAll(HLERequestContext& ctx); 33 void SetSupportedNpadStyleSetAll(HLERequestContext& ctx);
34 void GetNpadCaptureButtonAssignment(HLERequestContext& ctx);
34 void GetAppletDetailedUiType(HLERequestContext& ctx); 35 void GetAppletDetailedUiType(HLERequestContext& ctx);
35 void GetNpadInterfaceType(HLERequestContext& ctx); 36 void GetNpadInterfaceType(HLERequestContext& ctx);
36 void GetNpadLeftRightInterfaceType(HLERequestContext& ctx); 37 void GetNpadLeftRightInterfaceType(HLERequestContext& ctx);
37 void HasBattery(HLERequestContext& ctx); 38 void HasBattery(HLERequestContext& ctx);
38 void HasLeftRightBattery(HLERequestContext& ctx); 39 void HasLeftRightBattery(HLERequestContext& ctx);
39 void GetUniquePadsFromNpad(HLERequestContext& ctx); 40 void GetUniquePadsFromNpad(HLERequestContext& ctx);
40 void GetIrSensorState(HLERequestContext& ctx); 41 void SetNpadSystemExtStateEnabled(HLERequestContext& ctx);
41 void RegisterAppletResourceUserId(HLERequestContext& ctx); 42 void RegisterAppletResourceUserId(HLERequestContext& ctx);
42 void UnregisterAppletResourceUserId(HLERequestContext& ctx); 43 void UnregisterAppletResourceUserId(HLERequestContext& ctx);
43 void EnableAppletToGetInput(HLERequestContext& ctx); 44 void EnableAppletToGetInput(HLERequestContext& ctx);
diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp
index 97f31d26e..1f8a0f8ab 100644
--- a/src/hid_core/resources/npad/npad.cpp
+++ b/src/hid_core/resources/npad/npad.cpp
@@ -1344,4 +1344,49 @@ AppletDetailedUiType NPad::GetAppletDetailedUiType(Core::HID::NpadIdType npad_id
1344 }; 1344 };
1345} 1345}
1346 1346
1347Result NPad::SetNpadCaptureButtonAssignment(u64 aruid, Core::HID::NpadStyleSet npad_style_set,
1348 Core::HID::NpadButton button_assignment) {
1349 std::scoped_lock lock{mutex};
1350 return npad_resource.SetNpadCaptureButtonAssignment(aruid, npad_style_set, button_assignment);
1351}
1352
1353Result NPad::ClearNpadCaptureButtonAssignment(u64 aruid) {
1354 std::scoped_lock lock{mutex};
1355 return npad_resource.ClearNpadCaptureButtonAssignment(aruid);
1356}
1357
1358std::size_t NPad::GetNpadCaptureButtonAssignment(std::span<Core::HID::NpadButton> out_list,
1359 u64 aruid) const {
1360 std::scoped_lock lock{mutex};
1361 return npad_resource.GetNpadCaptureButtonAssignment(out_list, aruid);
1362}
1363
1364Result NPad::SetNpadSystemExtStateEnabled(u64 aruid, bool is_enabled) {
1365 std::scoped_lock lock{mutex};
1366 const auto result = npad_resource.SetNpadSystemExtStateEnabled(aruid, is_enabled);
1367
1368 if (result.IsSuccess()) {
1369 std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex};
1370 // TODO: abstracted_pad->EnableAppletToGetInput(aruid);
1371 }
1372
1373 return result;
1374}
1375
1376Result NPad::AssigningSingleOnSlSrPress(u64 aruid, bool is_enabled) {
1377 std::scoped_lock lock{mutex};
1378 bool is_currently_enabled{};
1379 Result result = npad_resource.IsAssigningSingleOnSlSrPressEnabled(is_currently_enabled, aruid);
1380 if (result.IsSuccess() && is_enabled != is_currently_enabled) {
1381 result = npad_resource.SetAssigningSingleOnSlSrPress(aruid, is_enabled);
1382 }
1383 return result;
1384}
1385
1386Result NPad::GetLastActiveNpad(Core::HID::NpadIdType& out_npad_id) const {
1387 std::scoped_lock lock{mutex};
1388 out_npad_id = hid_core.GetLastActiveController();
1389 return ResultSuccess;
1390}
1391
1347} // namespace Service::HID 1392} // namespace Service::HID
diff --git a/src/hid_core/resources/npad/npad.h b/src/hid_core/resources/npad/npad.h
index 58f8c7acf..01f3dabb1 100644
--- a/src/hid_core/resources/npad/npad.h
+++ b/src/hid_core/resources/npad/npad.h
@@ -149,6 +149,18 @@ public:
149 149
150 AppletDetailedUiType GetAppletDetailedUiType(Core::HID::NpadIdType npad_id); 150 AppletDetailedUiType GetAppletDetailedUiType(Core::HID::NpadIdType npad_id);
151 151
152 Result SetNpadCaptureButtonAssignment(u64 aruid, Core::HID::NpadStyleSet npad_style_set,
153 Core::HID::NpadButton button_assignment);
154 Result ClearNpadCaptureButtonAssignment(u64 aruid);
155 std::size_t GetNpadCaptureButtonAssignment(std::span<Core::HID::NpadButton> out_list,
156 u64 aruid) const;
157
158 Result SetNpadSystemExtStateEnabled(u64 aruid, bool is_enabled);
159
160 Result AssigningSingleOnSlSrPress(u64 aruid, bool is_enabled);
161
162 Result GetLastActiveNpad(Core::HID::NpadIdType& out_npad_id) const;
163
152private: 164private:
153 struct VibrationData { 165 struct VibrationData {
154 bool device_mounted{}; 166 bool device_mounted{};