hid_server.cpp 94 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-3.0-or-later
  3. #include <array>
  4. #include "common/common_types.h"
  5. #include "common/logging/log.h"
  6. #include "common/settings.h"
  7. #include "core/hle/kernel/k_shared_memory.h"
  8. #include "core/hle/kernel/k_transfer_memory.h"
  9. #include "core/hle/kernel/kernel.h"
  10. #include "core/hle/service/hid/hid_server.h"
  11. #include "core/hle/service/ipc_helpers.h"
  12. #include "core/memory.h"
  13. #include "hid_core/hid_result.h"
  14. #include "hid_core/hid_util.h"
  15. #include "hid_core/resource_manager.h"
  16. #include "hid_core/resources/hid_firmware_settings.h"
  17. #include "hid_core/resources/controller_base.h"
  18. #include "hid_core/resources/debug_pad/debug_pad.h"
  19. #include "hid_core/resources/keyboard/keyboard.h"
  20. #include "hid_core/resources/mouse/mouse.h"
  21. #include "hid_core/resources/npad/npad.h"
  22. #include "hid_core/resources/npad/npad_types.h"
  23. #include "hid_core/resources/npad/npad_vibration.h"
  24. #include "hid_core/resources/palma/palma.h"
  25. #include "hid_core/resources/six_axis/console_six_axis.h"
  26. #include "hid_core/resources/six_axis/seven_six_axis.h"
  27. #include "hid_core/resources/six_axis/six_axis.h"
  28. #include "hid_core/resources/touch_screen/gesture.h"
  29. #include "hid_core/resources/touch_screen/touch_screen.h"
  30. #include "hid_core/resources/vibration/gc_vibration_device.h"
  31. #include "hid_core/resources/vibration/n64_vibration_device.h"
  32. #include "hid_core/resources/vibration/vibration_device.h"
  33. namespace Service::HID {
  34. class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> {
  35. public:
  36. explicit IActiveVibrationDeviceList(Core::System& system_,
  37. std::shared_ptr<ResourceManager> resource)
  38. : ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) {
  39. // clang-format off
  40. static const FunctionInfo functions[] = {
  41. {0, &IActiveVibrationDeviceList::ActivateVibrationDevice, "ActivateVibrationDevice"},
  42. };
  43. // clang-format on
  44. RegisterHandlers(functions);
  45. }
  46. private:
  47. void ActivateVibrationDevice(HLERequestContext& ctx) {
  48. IPC::RequestParser rp{ctx};
  49. const auto vibration_device_handle{rp.PopRaw<Core::HID::VibrationDeviceHandle>()};
  50. LOG_DEBUG(Service_HID, "called, npad_type={}, npad_id={}, device_index={}",
  51. vibration_device_handle.npad_type, vibration_device_handle.npad_id,
  52. vibration_device_handle.device_index);
  53. const auto result = ActivateVibrationDeviceImpl(vibration_device_handle);
  54. IPC::ResponseBuilder rb{ctx, 2};
  55. rb.Push(result);
  56. }
  57. Result ActivateVibrationDeviceImpl(const Core::HID::VibrationDeviceHandle& handle) {
  58. std::scoped_lock lock{mutex};
  59. const Result is_valid = IsVibrationHandleValid(handle);
  60. if (is_valid.IsError()) {
  61. return is_valid;
  62. }
  63. for (std::size_t i = 0; i < list_size; i++) {
  64. if (handle.device_index == vibration_device_list[i].device_index &&
  65. handle.npad_id == vibration_device_list[i].npad_id &&
  66. handle.npad_type == vibration_device_list[i].npad_type) {
  67. return ResultSuccess;
  68. }
  69. }
  70. if (list_size == vibration_device_list.size()) {
  71. return ResultVibrationDeviceIndexOutOfRange;
  72. }
  73. const Result result = resource_manager->GetVibrationDevice(handle)->Activate();
  74. if (result.IsError()) {
  75. return result;
  76. }
  77. vibration_device_list[list_size++] = handle;
  78. return ResultSuccess;
  79. }
  80. mutable std::mutex mutex;
  81. std::size_t list_size{};
  82. std::array<Core::HID::VibrationDeviceHandle, 0x100> vibration_device_list{};
  83. std::shared_ptr<ResourceManager> resource_manager;
  84. };
  85. IHidServer::IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
  86. std::shared_ptr<HidFirmwareSettings> settings)
  87. : ServiceFramework{system_, "hid"}, resource_manager{resource}, firmware_settings{settings} {
  88. // clang-format off
  89. static const FunctionInfo functions[] = {
  90. {0, &IHidServer::CreateAppletResource, "CreateAppletResource"},
  91. {1, &IHidServer::ActivateDebugPad, "ActivateDebugPad"},
  92. {11, &IHidServer::ActivateTouchScreen, "ActivateTouchScreen"},
  93. {21, &IHidServer::ActivateMouse, "ActivateMouse"},
  94. {26, nullptr, "ActivateDebugMouse"},
  95. {31, &IHidServer::ActivateKeyboard, "ActivateKeyboard"},
  96. {32, &IHidServer::SendKeyboardLockKeyEvent, "SendKeyboardLockKeyEvent"},
  97. {40, &IHidServer::AcquireXpadIdEventHandle, "AcquireXpadIdEventHandle"},
  98. {41, &IHidServer::ReleaseXpadIdEventHandle, "ReleaseXpadIdEventHandle"},
  99. {51, &IHidServer::ActivateXpad, "ActivateXpad"},
  100. {55, &IHidServer::GetXpadIds, "GetXpadIds"},
  101. {56, &IHidServer::ActivateJoyXpad, "ActivateJoyXpad"},
  102. {58, &IHidServer::GetJoyXpadLifoHandle, "GetJoyXpadLifoHandle"},
  103. {59, &IHidServer::GetJoyXpadIds, "GetJoyXpadIds"},
  104. {60, &IHidServer::ActivateSixAxisSensor, "ActivateSixAxisSensor"},
  105. {61, &IHidServer::DeactivateSixAxisSensor, "DeactivateSixAxisSensor"},
  106. {62, &IHidServer::GetSixAxisSensorLifoHandle, "GetSixAxisSensorLifoHandle"},
  107. {63, &IHidServer::ActivateJoySixAxisSensor, "ActivateJoySixAxisSensor"},
  108. {64, &IHidServer::DeactivateJoySixAxisSensor, "DeactivateJoySixAxisSensor"},
  109. {65, &IHidServer::GetJoySixAxisSensorLifoHandle, "GetJoySixAxisSensorLifoHandle"},
  110. {66, &IHidServer::StartSixAxisSensor, "StartSixAxisSensor"},
  111. {67, &IHidServer::StopSixAxisSensor, "StopSixAxisSensor"},
  112. {68, &IHidServer::IsSixAxisSensorFusionEnabled, "IsSixAxisSensorFusionEnabled"},
  113. {69, &IHidServer::EnableSixAxisSensorFusion, "EnableSixAxisSensorFusion"},
  114. {70, &IHidServer::SetSixAxisSensorFusionParameters, "SetSixAxisSensorFusionParameters"},
  115. {71, &IHidServer::GetSixAxisSensorFusionParameters, "GetSixAxisSensorFusionParameters"},
  116. {72, &IHidServer::ResetSixAxisSensorFusionParameters, "ResetSixAxisSensorFusionParameters"},
  117. {73, nullptr, "SetAccelerometerParameters"},
  118. {74, nullptr, "GetAccelerometerParameters"},
  119. {75, nullptr, "ResetAccelerometerParameters"},
  120. {76, nullptr, "SetAccelerometerPlayMode"},
  121. {77, nullptr, "GetAccelerometerPlayMode"},
  122. {78, nullptr, "ResetAccelerometerPlayMode"},
  123. {79, &IHidServer::SetGyroscopeZeroDriftMode, "SetGyroscopeZeroDriftMode"},
  124. {80, &IHidServer::GetGyroscopeZeroDriftMode, "GetGyroscopeZeroDriftMode"},
  125. {81, &IHidServer::ResetGyroscopeZeroDriftMode, "ResetGyroscopeZeroDriftMode"},
  126. {82, &IHidServer::IsSixAxisSensorAtRest, "IsSixAxisSensorAtRest"},
  127. {83, &IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor, "IsFirmwareUpdateAvailableForSixAxisSensor"},
  128. {84, &IHidServer::EnableSixAxisSensorUnalteredPassthrough, "EnableSixAxisSensorUnalteredPassthrough"},
  129. {85, &IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled, "IsSixAxisSensorUnalteredPassthroughEnabled"},
  130. {86, nullptr, "StoreSixAxisSensorCalibrationParameter"},
  131. {87, &IHidServer::LoadSixAxisSensorCalibrationParameter, "LoadSixAxisSensorCalibrationParameter"},
  132. {88, &IHidServer::GetSixAxisSensorIcInformation, "GetSixAxisSensorIcInformation"},
  133. {89, &IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned, "ResetIsSixAxisSensorDeviceNewlyAssigned"},
  134. {91, &IHidServer::ActivateGesture, "ActivateGesture"},
  135. {100, &IHidServer::SetSupportedNpadStyleSet, "SetSupportedNpadStyleSet"},
  136. {101, &IHidServer::GetSupportedNpadStyleSet, "GetSupportedNpadStyleSet"},
  137. {102, &IHidServer::SetSupportedNpadIdType, "SetSupportedNpadIdType"},
  138. {103, &IHidServer::ActivateNpad, "ActivateNpad"},
  139. {104, &IHidServer::DeactivateNpad, "DeactivateNpad"},
  140. {106, &IHidServer::AcquireNpadStyleSetUpdateEventHandle, "AcquireNpadStyleSetUpdateEventHandle"},
  141. {107, &IHidServer::DisconnectNpad, "DisconnectNpad"},
  142. {108, &IHidServer::GetPlayerLedPattern, "GetPlayerLedPattern"},
  143. {109, &IHidServer::ActivateNpadWithRevision, "ActivateNpadWithRevision"},
  144. {120, &IHidServer::SetNpadJoyHoldType, "SetNpadJoyHoldType"},
  145. {121, &IHidServer::GetNpadJoyHoldType, "GetNpadJoyHoldType"},
  146. {122, &IHidServer::SetNpadJoyAssignmentModeSingleByDefault, "SetNpadJoyAssignmentModeSingleByDefault"},
  147. {123, &IHidServer::SetNpadJoyAssignmentModeSingle, "SetNpadJoyAssignmentModeSingle"},
  148. {124, &IHidServer::SetNpadJoyAssignmentModeDual, "SetNpadJoyAssignmentModeDual"},
  149. {125, &IHidServer::MergeSingleJoyAsDualJoy, "MergeSingleJoyAsDualJoy"},
  150. {126, &IHidServer::StartLrAssignmentMode, "StartLrAssignmentMode"},
  151. {127, &IHidServer::StopLrAssignmentMode, "StopLrAssignmentMode"},
  152. {128, &IHidServer::SetNpadHandheldActivationMode, "SetNpadHandheldActivationMode"},
  153. {129, &IHidServer::GetNpadHandheldActivationMode, "GetNpadHandheldActivationMode"},
  154. {130, &IHidServer::SwapNpadAssignment, "SwapNpadAssignment"},
  155. {131, &IHidServer::IsUnintendedHomeButtonInputProtectionEnabled, "IsUnintendedHomeButtonInputProtectionEnabled"},
  156. {132, &IHidServer::EnableUnintendedHomeButtonInputProtection, "EnableUnintendedHomeButtonInputProtection"},
  157. {133, &IHidServer::SetNpadJoyAssignmentModeSingleWithDestination, "SetNpadJoyAssignmentModeSingleWithDestination"},
  158. {134, &IHidServer::SetNpadAnalogStickUseCenterClamp, "SetNpadAnalogStickUseCenterClamp"},
  159. {135, &IHidServer::SetNpadCaptureButtonAssignment, "SetNpadCaptureButtonAssignment"},
  160. {136, &IHidServer::ClearNpadCaptureButtonAssignment, "ClearNpadCaptureButtonAssignment"},
  161. {200, &IHidServer::GetVibrationDeviceInfo, "GetVibrationDeviceInfo"},
  162. {201, &IHidServer::SendVibrationValue, "SendVibrationValue"},
  163. {202, &IHidServer::GetActualVibrationValue, "GetActualVibrationValue"},
  164. {203, &IHidServer::CreateActiveVibrationDeviceList, "CreateActiveVibrationDeviceList"},
  165. {204, &IHidServer::PermitVibration, "PermitVibration"},
  166. {205, &IHidServer::IsVibrationPermitted, "IsVibrationPermitted"},
  167. {206, &IHidServer::SendVibrationValues, "SendVibrationValues"},
  168. {207, &IHidServer::SendVibrationGcErmCommand, "SendVibrationGcErmCommand"},
  169. {208, &IHidServer::GetActualVibrationGcErmCommand, "GetActualVibrationGcErmCommand"},
  170. {209, &IHidServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"},
  171. {210, &IHidServer::EndPermitVibrationSession, "EndPermitVibrationSession"},
  172. {211, &IHidServer::IsVibrationDeviceMounted, "IsVibrationDeviceMounted"},
  173. {212, &IHidServer::SendVibrationValueInBool, "SendVibrationValueInBool"},
  174. {300, &IHidServer::ActivateConsoleSixAxisSensor, "ActivateConsoleSixAxisSensor"},
  175. {301, &IHidServer::StartConsoleSixAxisSensor, "StartConsoleSixAxisSensor"},
  176. {302, &IHidServer::StopConsoleSixAxisSensor, "StopConsoleSixAxisSensor"},
  177. {303, &IHidServer::ActivateSevenSixAxisSensor, "ActivateSevenSixAxisSensor"},
  178. {304, &IHidServer::StartSevenSixAxisSensor, "StartSevenSixAxisSensor"},
  179. {305, &IHidServer::StopSevenSixAxisSensor, "StopSevenSixAxisSensor"},
  180. {306, &IHidServer::InitializeSevenSixAxisSensor, "InitializeSevenSixAxisSensor"},
  181. {307, &IHidServer::FinalizeSevenSixAxisSensor, "FinalizeSevenSixAxisSensor"},
  182. {308, nullptr, "SetSevenSixAxisSensorFusionStrength"},
  183. {309, nullptr, "GetSevenSixAxisSensorFusionStrength"},
  184. {310, &IHidServer::ResetSevenSixAxisSensorTimestamp, "ResetSevenSixAxisSensorTimestamp"},
  185. {400, &IHidServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"},
  186. {401, nullptr, "EnableUsbFullKeyController"},
  187. {402, nullptr, "IsUsbFullKeyControllerConnected"},
  188. {403, nullptr, "HasBattery"},
  189. {404, nullptr, "HasLeftRightBattery"},
  190. {405, nullptr, "GetNpadInterfaceType"},
  191. {406, nullptr, "GetNpadLeftRightInterfaceType"},
  192. {407, nullptr, "GetNpadOfHighestBatteryLevel"},
  193. {408, nullptr, "GetNpadOfHighestBatteryLevelForJoyRight"},
  194. {500, &IHidServer::GetPalmaConnectionHandle, "GetPalmaConnectionHandle"},
  195. {501, &IHidServer::InitializePalma, "InitializePalma"},
  196. {502, &IHidServer::AcquirePalmaOperationCompleteEvent, "AcquirePalmaOperationCompleteEvent"},
  197. {503, &IHidServer::GetPalmaOperationInfo, "GetPalmaOperationInfo"},
  198. {504, &IHidServer::PlayPalmaActivity, "PlayPalmaActivity"},
  199. {505, &IHidServer::SetPalmaFrModeType, "SetPalmaFrModeType"},
  200. {506, &IHidServer::ReadPalmaStep, "ReadPalmaStep"},
  201. {507, &IHidServer::EnablePalmaStep, "EnablePalmaStep"},
  202. {508, &IHidServer::ResetPalmaStep, "ResetPalmaStep"},
  203. {509, &IHidServer::ReadPalmaApplicationSection, "ReadPalmaApplicationSection"},
  204. {510, &IHidServer::WritePalmaApplicationSection, "WritePalmaApplicationSection"},
  205. {511, &IHidServer::ReadPalmaUniqueCode, "ReadPalmaUniqueCode"},
  206. {512, &IHidServer::SetPalmaUniqueCodeInvalid, "SetPalmaUniqueCodeInvalid"},
  207. {513, &IHidServer::WritePalmaActivityEntry, "WritePalmaActivityEntry"},
  208. {514, &IHidServer::WritePalmaRgbLedPatternEntry, "WritePalmaRgbLedPatternEntry"},
  209. {515, &IHidServer::WritePalmaWaveEntry, "WritePalmaWaveEntry"},
  210. {516, &IHidServer::SetPalmaDataBaseIdentificationVersion, "SetPalmaDataBaseIdentificationVersion"},
  211. {517, &IHidServer::GetPalmaDataBaseIdentificationVersion, "GetPalmaDataBaseIdentificationVersion"},
  212. {518, &IHidServer::SuspendPalmaFeature, "SuspendPalmaFeature"},
  213. {519, &IHidServer::GetPalmaOperationResult, "GetPalmaOperationResult"},
  214. {520, &IHidServer::ReadPalmaPlayLog, "ReadPalmaPlayLog"},
  215. {521, &IHidServer::ResetPalmaPlayLog, "ResetPalmaPlayLog"},
  216. {522, &IHidServer::SetIsPalmaAllConnectable, "SetIsPalmaAllConnectable"},
  217. {523, &IHidServer::SetIsPalmaPairedConnectable, "SetIsPalmaPairedConnectable"},
  218. {524, &IHidServer::PairPalma, "PairPalma"},
  219. {525, &IHidServer::SetPalmaBoostMode, "SetPalmaBoostMode"},
  220. {526, &IHidServer::CancelWritePalmaWaveEntry, "CancelWritePalmaWaveEntry"},
  221. {527, &IHidServer::EnablePalmaBoostMode, "EnablePalmaBoostMode"},
  222. {528, &IHidServer::GetPalmaBluetoothAddress, "GetPalmaBluetoothAddress"},
  223. {529, &IHidServer::SetDisallowedPalmaConnection, "SetDisallowedPalmaConnection"},
  224. {1000, &IHidServer::SetNpadCommunicationMode, "SetNpadCommunicationMode"},
  225. {1001, &IHidServer::GetNpadCommunicationMode, "GetNpadCommunicationMode"},
  226. {1002, &IHidServer::SetTouchScreenConfiguration, "SetTouchScreenConfiguration"},
  227. {1003, &IHidServer::IsFirmwareUpdateNeededForNotification, "IsFirmwareUpdateNeededForNotification"},
  228. {1004, &IHidServer::SetTouchScreenResolution, "SetTouchScreenResolution"},
  229. {2000, nullptr, "ActivateDigitizer"},
  230. };
  231. // clang-format on
  232. RegisterHandlers(functions);
  233. }
  234. IHidServer::~IHidServer() = default;
  235. void IHidServer::CreateAppletResource(HLERequestContext& ctx) {
  236. IPC::RequestParser rp{ctx};
  237. const auto applet_resource_user_id{rp.Pop<u64>()};
  238. Result result = GetResourceManager()->CreateAppletResource(applet_resource_user_id);
  239. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, result=0x{:X}",
  240. applet_resource_user_id, result.raw);
  241. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  242. rb.Push(result);
  243. rb.PushIpcInterface<IAppletResource>(system, resource_manager, applet_resource_user_id);
  244. }
  245. void IHidServer::ActivateDebugPad(HLERequestContext& ctx) {
  246. IPC::RequestParser rp{ctx};
  247. const auto applet_resource_user_id{rp.Pop<u64>()};
  248. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  249. Result result = ResultSuccess;
  250. auto debug_pad = GetResourceManager()->GetDebugPad();
  251. if (!firmware_settings->IsDeviceManaged()) {
  252. result = debug_pad->Activate();
  253. }
  254. if (result.IsSuccess()) {
  255. result = debug_pad->Activate(applet_resource_user_id);
  256. }
  257. IPC::ResponseBuilder rb{ctx, 2};
  258. rb.Push(result);
  259. }
  260. void IHidServer::ActivateTouchScreen(HLERequestContext& ctx) {
  261. IPC::RequestParser rp{ctx};
  262. const auto applet_resource_user_id{rp.Pop<u64>()};
  263. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  264. Result result = ResultSuccess;
  265. auto touch_screen = GetResourceManager()->GetTouchScreen();
  266. if (!firmware_settings->IsDeviceManaged()) {
  267. result = touch_screen->Activate();
  268. }
  269. if (result.IsSuccess()) {
  270. result = touch_screen->Activate(applet_resource_user_id);
  271. }
  272. IPC::ResponseBuilder rb{ctx, 2};
  273. rb.Push(result);
  274. }
  275. void IHidServer::ActivateMouse(HLERequestContext& ctx) {
  276. IPC::RequestParser rp{ctx};
  277. const auto applet_resource_user_id{rp.Pop<u64>()};
  278. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  279. Result result = ResultSuccess;
  280. auto mouse = GetResourceManager()->GetMouse();
  281. if (!firmware_settings->IsDeviceManaged()) {
  282. result = mouse->Activate();
  283. }
  284. if (result.IsSuccess()) {
  285. result = mouse->Activate(applet_resource_user_id);
  286. }
  287. IPC::ResponseBuilder rb{ctx, 2};
  288. rb.Push(result);
  289. }
  290. void IHidServer::ActivateKeyboard(HLERequestContext& ctx) {
  291. IPC::RequestParser rp{ctx};
  292. const auto applet_resource_user_id{rp.Pop<u64>()};
  293. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  294. Result result = ResultSuccess;
  295. auto keyboard = GetResourceManager()->GetKeyboard();
  296. if (!firmware_settings->IsDeviceManaged()) {
  297. result = keyboard->Activate();
  298. }
  299. if (result.IsSuccess()) {
  300. result = keyboard->Activate(applet_resource_user_id);
  301. }
  302. IPC::ResponseBuilder rb{ctx, 2};
  303. rb.Push(result);
  304. }
  305. void IHidServer::SendKeyboardLockKeyEvent(HLERequestContext& ctx) {
  306. IPC::RequestParser rp{ctx};
  307. const auto flags{rp.Pop<u32>()};
  308. LOG_WARNING(Service_HID, "(STUBBED) called. flags={}", flags);
  309. IPC::ResponseBuilder rb{ctx, 2};
  310. rb.Push(ResultSuccess);
  311. }
  312. void IHidServer::AcquireXpadIdEventHandle(HLERequestContext& ctx) {
  313. IPC::RequestParser rp{ctx};
  314. const auto applet_resource_user_id{rp.Pop<u64>()};
  315. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  316. // This function has been stubbed since 10.0.0+
  317. IPC::ResponseBuilder rb{ctx, 2, 1};
  318. rb.Push(ResultSuccess);
  319. // Handle returned is null here
  320. }
  321. void IHidServer::ReleaseXpadIdEventHandle(HLERequestContext& ctx) {
  322. IPC::RequestParser rp{ctx};
  323. const auto applet_resource_user_id{rp.Pop<u64>()};
  324. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  325. // This function has been stubbed since 10.0.0+
  326. IPC::ResponseBuilder rb{ctx, 2};
  327. rb.Push(ResultSuccess);
  328. }
  329. void IHidServer::ActivateXpad(HLERequestContext& ctx) {
  330. IPC::RequestParser rp{ctx};
  331. struct Parameters {
  332. u32 basic_xpad_id;
  333. INSERT_PADDING_WORDS_NOINIT(1);
  334. u64 applet_resource_user_id;
  335. };
  336. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  337. const auto parameters{rp.PopRaw<Parameters>()};
  338. LOG_DEBUG(Service_HID, "called, basic_xpad_id={}, applet_resource_user_id={}",
  339. parameters.basic_xpad_id, parameters.applet_resource_user_id);
  340. // This function has been stubbed since 10.0.0+
  341. IPC::ResponseBuilder rb{ctx, 2};
  342. rb.Push(ResultSuccess);
  343. }
  344. void IHidServer::GetXpadIds(HLERequestContext& ctx) {
  345. LOG_DEBUG(Service_HID, "called");
  346. // This function has been hardcoded since 10.0.0+
  347. const std::array<u32, 4> basic_xpad_id{0, 1, 2, 3};
  348. ctx.WriteBuffer(basic_xpad_id);
  349. IPC::ResponseBuilder rb{ctx, 4};
  350. rb.Push(ResultSuccess);
  351. rb.Push<s64>(basic_xpad_id.size());
  352. }
  353. void IHidServer::ActivateJoyXpad(HLERequestContext& ctx) {
  354. IPC::RequestParser rp{ctx};
  355. const auto joy_xpad_id{rp.Pop<u32>()};
  356. LOG_DEBUG(Service_HID, "called, joy_xpad_id={}", joy_xpad_id);
  357. // This function has been stubbed since 10.0.0+
  358. IPC::ResponseBuilder rb{ctx, 2};
  359. rb.Push(ResultSuccess);
  360. }
  361. void IHidServer::GetJoyXpadLifoHandle(HLERequestContext& ctx) {
  362. IPC::RequestParser rp{ctx};
  363. const auto joy_xpad_id{rp.Pop<u32>()};
  364. LOG_DEBUG(Service_HID, "called, joy_xpad_id={}", joy_xpad_id);
  365. // This function has been stubbed since 10.0.0+
  366. IPC::ResponseBuilder rb{ctx, 2, 1};
  367. rb.Push(ResultSuccess);
  368. // Handle returned is null here
  369. }
  370. void IHidServer::GetJoyXpadIds(HLERequestContext& ctx) {
  371. LOG_DEBUG(Service_HID, "called");
  372. // This function has been hardcoded since 10.0.0+
  373. const s64 basic_xpad_id_count{};
  374. IPC::ResponseBuilder rb{ctx, 4};
  375. rb.Push(ResultSuccess);
  376. rb.Push(basic_xpad_id_count);
  377. }
  378. void IHidServer::ActivateSixAxisSensor(HLERequestContext& ctx) {
  379. IPC::RequestParser rp{ctx};
  380. const auto joy_xpad_id{rp.Pop<u32>()};
  381. LOG_DEBUG(Service_HID, "called, joy_xpad_id={}", joy_xpad_id);
  382. // This function has been stubbed since 10.0.0+
  383. IPC::ResponseBuilder rb{ctx, 2};
  384. rb.Push(ResultSuccess);
  385. }
  386. void IHidServer::DeactivateSixAxisSensor(HLERequestContext& ctx) {
  387. IPC::RequestParser rp{ctx};
  388. const auto joy_xpad_id{rp.Pop<u32>()};
  389. LOG_DEBUG(Service_HID, "called, joy_xpad_id={}", joy_xpad_id);
  390. // This function has been stubbed since 10.0.0+
  391. IPC::ResponseBuilder rb{ctx, 2, 1};
  392. rb.Push(ResultSuccess);
  393. }
  394. void IHidServer::GetSixAxisSensorLifoHandle(HLERequestContext& ctx) {
  395. IPC::RequestParser rp{ctx};
  396. const auto joy_xpad_id{rp.Pop<u32>()};
  397. LOG_DEBUG(Service_HID, "called, joy_xpad_id={}", joy_xpad_id);
  398. // This function has been stubbed since 10.0.0+
  399. IPC::ResponseBuilder rb{ctx, 2};
  400. rb.Push(ResultSuccess);
  401. }
  402. void IHidServer::ActivateJoySixAxisSensor(HLERequestContext& ctx) {
  403. IPC::RequestParser rp{ctx};
  404. const auto joy_xpad_id{rp.Pop<u32>()};
  405. LOG_DEBUG(Service_HID, "called, joy_xpad_id={}", joy_xpad_id);
  406. // This function has been stubbed since 10.0.0+
  407. IPC::ResponseBuilder rb{ctx, 2};
  408. rb.Push(ResultSuccess);
  409. }
  410. void IHidServer::DeactivateJoySixAxisSensor(HLERequestContext& ctx) {
  411. IPC::RequestParser rp{ctx};
  412. const auto joy_xpad_id{rp.Pop<u32>()};
  413. LOG_DEBUG(Service_HID, "called, joy_xpad_id={}", joy_xpad_id);
  414. // This function has been stubbed since 10.0.0+
  415. IPC::ResponseBuilder rb{ctx, 2};
  416. rb.Push(ResultSuccess);
  417. }
  418. void IHidServer::GetJoySixAxisSensorLifoHandle(HLERequestContext& ctx) {
  419. IPC::RequestParser rp{ctx};
  420. const auto joy_xpad_id{rp.Pop<u32>()};
  421. LOG_DEBUG(Service_HID, "called, joy_xpad_id={}", joy_xpad_id);
  422. // This function has been stubbed since 10.0.0+
  423. IPC::ResponseBuilder rb{ctx, 2, 1};
  424. rb.Push(ResultSuccess);
  425. // Handle returned is null here
  426. }
  427. void IHidServer::StartSixAxisSensor(HLERequestContext& ctx) {
  428. IPC::RequestParser rp{ctx};
  429. struct Parameters {
  430. Core::HID::SixAxisSensorHandle sixaxis_handle;
  431. INSERT_PADDING_WORDS_NOINIT(1);
  432. u64 applet_resource_user_id;
  433. };
  434. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  435. const auto parameters{rp.PopRaw<Parameters>()};
  436. auto six_axis = GetResourceManager()->GetSixAxis();
  437. const auto result = six_axis->SetSixAxisEnabled(parameters.sixaxis_handle, true);
  438. LOG_DEBUG(Service_HID,
  439. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  440. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  441. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  442. IPC::ResponseBuilder rb{ctx, 2};
  443. rb.Push(result);
  444. }
  445. void IHidServer::StopSixAxisSensor(HLERequestContext& ctx) {
  446. IPC::RequestParser rp{ctx};
  447. struct Parameters {
  448. Core::HID::SixAxisSensorHandle sixaxis_handle;
  449. INSERT_PADDING_WORDS_NOINIT(1);
  450. u64 applet_resource_user_id;
  451. };
  452. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  453. const auto parameters{rp.PopRaw<Parameters>()};
  454. auto six_axis = GetResourceManager()->GetSixAxis();
  455. const auto result = six_axis->SetSixAxisEnabled(parameters.sixaxis_handle, false);
  456. LOG_DEBUG(Service_HID,
  457. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  458. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  459. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  460. IPC::ResponseBuilder rb{ctx, 2};
  461. rb.Push(result);
  462. }
  463. void IHidServer::IsSixAxisSensorFusionEnabled(HLERequestContext& ctx) {
  464. IPC::RequestParser rp{ctx};
  465. struct Parameters {
  466. Core::HID::SixAxisSensorHandle sixaxis_handle;
  467. INSERT_PADDING_WORDS_NOINIT(1);
  468. u64 applet_resource_user_id;
  469. };
  470. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  471. const auto parameters{rp.PopRaw<Parameters>()};
  472. bool is_enabled{};
  473. auto six_axis = GetResourceManager()->GetSixAxis();
  474. const auto result =
  475. six_axis->IsSixAxisSensorFusionEnabled(parameters.sixaxis_handle, is_enabled);
  476. LOG_DEBUG(Service_HID,
  477. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  478. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  479. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  480. IPC::ResponseBuilder rb{ctx, 3};
  481. rb.Push(result);
  482. rb.Push(is_enabled);
  483. }
  484. void IHidServer::EnableSixAxisSensorFusion(HLERequestContext& ctx) {
  485. IPC::RequestParser rp{ctx};
  486. struct Parameters {
  487. bool enable_sixaxis_sensor_fusion;
  488. INSERT_PADDING_BYTES_NOINIT(3);
  489. Core::HID::SixAxisSensorHandle sixaxis_handle;
  490. u64 applet_resource_user_id;
  491. };
  492. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  493. const auto parameters{rp.PopRaw<Parameters>()};
  494. auto six_axis = GetResourceManager()->GetSixAxis();
  495. const auto result = six_axis->SetSixAxisFusionEnabled(parameters.sixaxis_handle,
  496. parameters.enable_sixaxis_sensor_fusion);
  497. LOG_DEBUG(Service_HID,
  498. "called, enable_sixaxis_sensor_fusion={}, npad_type={}, npad_id={}, "
  499. "device_index={}, applet_resource_user_id={}",
  500. parameters.enable_sixaxis_sensor_fusion, parameters.sixaxis_handle.npad_type,
  501. parameters.sixaxis_handle.npad_id, parameters.sixaxis_handle.device_index,
  502. parameters.applet_resource_user_id);
  503. IPC::ResponseBuilder rb{ctx, 2};
  504. rb.Push(result);
  505. }
  506. void IHidServer::SetSixAxisSensorFusionParameters(HLERequestContext& ctx) {
  507. IPC::RequestParser rp{ctx};
  508. struct Parameters {
  509. Core::HID::SixAxisSensorHandle sixaxis_handle;
  510. Core::HID::SixAxisSensorFusionParameters sixaxis_fusion;
  511. INSERT_PADDING_WORDS_NOINIT(1);
  512. u64 applet_resource_user_id;
  513. };
  514. static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
  515. const auto parameters{rp.PopRaw<Parameters>()};
  516. auto six_axis = GetResourceManager()->GetSixAxis();
  517. const auto result =
  518. six_axis->SetSixAxisFusionParameters(parameters.sixaxis_handle, parameters.sixaxis_fusion);
  519. LOG_DEBUG(Service_HID,
  520. "called, npad_type={}, npad_id={}, device_index={}, parameter1={}, "
  521. "parameter2={}, applet_resource_user_id={}",
  522. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  523. parameters.sixaxis_handle.device_index, parameters.sixaxis_fusion.parameter1,
  524. parameters.sixaxis_fusion.parameter2, parameters.applet_resource_user_id);
  525. IPC::ResponseBuilder rb{ctx, 2};
  526. rb.Push(result);
  527. }
  528. void IHidServer::GetSixAxisSensorFusionParameters(HLERequestContext& ctx) {
  529. IPC::RequestParser rp{ctx};
  530. struct Parameters {
  531. Core::HID::SixAxisSensorHandle sixaxis_handle;
  532. INSERT_PADDING_WORDS_NOINIT(1);
  533. u64 applet_resource_user_id;
  534. };
  535. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  536. const auto parameters{rp.PopRaw<Parameters>()};
  537. Core::HID::SixAxisSensorFusionParameters fusion_parameters{};
  538. auto six_axis = GetResourceManager()->GetSixAxis();
  539. const auto result =
  540. six_axis->GetSixAxisFusionParameters(parameters.sixaxis_handle, fusion_parameters);
  541. LOG_DEBUG(Service_HID,
  542. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  543. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  544. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  545. IPC::ResponseBuilder rb{ctx, 4};
  546. rb.Push(result);
  547. rb.PushRaw(fusion_parameters);
  548. }
  549. void IHidServer::ResetSixAxisSensorFusionParameters(HLERequestContext& ctx) {
  550. IPC::RequestParser rp{ctx};
  551. struct Parameters {
  552. Core::HID::SixAxisSensorHandle sixaxis_handle;
  553. INSERT_PADDING_WORDS_NOINIT(1);
  554. u64 applet_resource_user_id;
  555. };
  556. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  557. const auto parameters{rp.PopRaw<Parameters>()};
  558. // Since these parameters are unknown just use what HW outputs
  559. const Core::HID::SixAxisSensorFusionParameters fusion_parameters{
  560. .parameter1 = 0.03f,
  561. .parameter2 = 0.4f,
  562. };
  563. auto six_axis = GetResourceManager()->GetSixAxis();
  564. const auto result1 =
  565. six_axis->SetSixAxisFusionParameters(parameters.sixaxis_handle, fusion_parameters);
  566. const auto result2 = six_axis->SetSixAxisFusionEnabled(parameters.sixaxis_handle, true);
  567. LOG_DEBUG(Service_HID,
  568. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  569. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  570. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  571. IPC::ResponseBuilder rb{ctx, 2};
  572. if (result1.IsError()) {
  573. rb.Push(result1);
  574. return;
  575. }
  576. rb.Push(result2);
  577. }
  578. void IHidServer::SetGyroscopeZeroDriftMode(HLERequestContext& ctx) {
  579. IPC::RequestParser rp{ctx};
  580. const auto sixaxis_handle{rp.PopRaw<Core::HID::SixAxisSensorHandle>()};
  581. const auto drift_mode{rp.PopEnum<Core::HID::GyroscopeZeroDriftMode>()};
  582. const auto applet_resource_user_id{rp.Pop<u64>()};
  583. auto six_axis = GetResourceManager()->GetSixAxis();
  584. const auto result = six_axis->SetGyroscopeZeroDriftMode(sixaxis_handle, drift_mode);
  585. LOG_DEBUG(Service_HID,
  586. "called, npad_type={}, npad_id={}, device_index={}, drift_mode={}, "
  587. "applet_resource_user_id={}",
  588. sixaxis_handle.npad_type, sixaxis_handle.npad_id, sixaxis_handle.device_index,
  589. drift_mode, applet_resource_user_id);
  590. IPC::ResponseBuilder rb{ctx, 2};
  591. rb.Push(result);
  592. }
  593. void IHidServer::GetGyroscopeZeroDriftMode(HLERequestContext& ctx) {
  594. IPC::RequestParser rp{ctx};
  595. struct Parameters {
  596. Core::HID::SixAxisSensorHandle sixaxis_handle;
  597. INSERT_PADDING_WORDS_NOINIT(1);
  598. u64 applet_resource_user_id;
  599. };
  600. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  601. const auto parameters{rp.PopRaw<Parameters>()};
  602. auto drift_mode{Core::HID::GyroscopeZeroDriftMode::Standard};
  603. auto six_axis = GetResourceManager()->GetSixAxis();
  604. const auto result = six_axis->GetGyroscopeZeroDriftMode(parameters.sixaxis_handle, drift_mode);
  605. LOG_DEBUG(Service_HID,
  606. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  607. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  608. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  609. IPC::ResponseBuilder rb{ctx, 3};
  610. rb.Push(result);
  611. rb.PushEnum(drift_mode);
  612. }
  613. void IHidServer::ResetGyroscopeZeroDriftMode(HLERequestContext& ctx) {
  614. IPC::RequestParser rp{ctx};
  615. struct Parameters {
  616. Core::HID::SixAxisSensorHandle sixaxis_handle;
  617. INSERT_PADDING_WORDS_NOINIT(1);
  618. u64 applet_resource_user_id;
  619. };
  620. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  621. const auto parameters{rp.PopRaw<Parameters>()};
  622. const auto drift_mode{Core::HID::GyroscopeZeroDriftMode::Standard};
  623. auto six_axis = GetResourceManager()->GetSixAxis();
  624. const auto result = six_axis->SetGyroscopeZeroDriftMode(parameters.sixaxis_handle, drift_mode);
  625. LOG_DEBUG(Service_HID,
  626. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  627. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  628. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  629. IPC::ResponseBuilder rb{ctx, 2};
  630. rb.Push(result);
  631. }
  632. void IHidServer::IsSixAxisSensorAtRest(HLERequestContext& ctx) {
  633. IPC::RequestParser rp{ctx};
  634. struct Parameters {
  635. Core::HID::SixAxisSensorHandle sixaxis_handle;
  636. INSERT_PADDING_WORDS_NOINIT(1);
  637. u64 applet_resource_user_id;
  638. };
  639. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  640. const auto parameters{rp.PopRaw<Parameters>()};
  641. bool is_at_rest{};
  642. auto six_axis = GetResourceManager()->GetSixAxis();
  643. six_axis->IsSixAxisSensorAtRest(parameters.sixaxis_handle, is_at_rest);
  644. LOG_DEBUG(Service_HID,
  645. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  646. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  647. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  648. IPC::ResponseBuilder rb{ctx, 3};
  649. rb.Push(ResultSuccess);
  650. rb.Push(is_at_rest);
  651. }
  652. void IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor(HLERequestContext& ctx) {
  653. IPC::RequestParser rp{ctx};
  654. struct Parameters {
  655. Core::HID::SixAxisSensorHandle sixaxis_handle;
  656. INSERT_PADDING_WORDS_NOINIT(1);
  657. u64 applet_resource_user_id;
  658. };
  659. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  660. const auto parameters{rp.PopRaw<Parameters>()};
  661. bool is_firmware_available{};
  662. auto controller = GetResourceManager()->GetNpad();
  663. controller->IsFirmwareUpdateAvailableForSixAxisSensor(
  664. parameters.applet_resource_user_id, parameters.sixaxis_handle, is_firmware_available);
  665. LOG_WARNING(
  666. Service_HID,
  667. "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  668. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  669. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  670. IPC::ResponseBuilder rb{ctx, 3};
  671. rb.Push(ResultSuccess);
  672. rb.Push(is_firmware_available);
  673. }
  674. void IHidServer::EnableSixAxisSensorUnalteredPassthrough(HLERequestContext& ctx) {
  675. IPC::RequestParser rp{ctx};
  676. struct Parameters {
  677. bool enabled;
  678. Core::HID::SixAxisSensorHandle sixaxis_handle;
  679. u64 applet_resource_user_id;
  680. };
  681. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  682. const auto parameters{rp.PopRaw<Parameters>()};
  683. auto six_axis = GetResourceManager()->GetSixAxis();
  684. const auto result = six_axis->EnableSixAxisSensorUnalteredPassthrough(parameters.sixaxis_handle,
  685. parameters.enabled);
  686. LOG_DEBUG(Service_HID,
  687. "(STUBBED) called, enabled={}, npad_type={}, npad_id={}, device_index={}, "
  688. "applet_resource_user_id={}",
  689. parameters.enabled, parameters.sixaxis_handle.npad_type,
  690. parameters.sixaxis_handle.npad_id, parameters.sixaxis_handle.device_index,
  691. parameters.applet_resource_user_id);
  692. IPC::ResponseBuilder rb{ctx, 2};
  693. rb.Push(result);
  694. }
  695. void IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled(HLERequestContext& ctx) {
  696. IPC::RequestParser rp{ctx};
  697. struct Parameters {
  698. Core::HID::SixAxisSensorHandle sixaxis_handle;
  699. INSERT_PADDING_WORDS_NOINIT(1);
  700. u64 applet_resource_user_id;
  701. };
  702. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  703. const auto parameters{rp.PopRaw<Parameters>()};
  704. bool is_unaltered_sisxaxis_enabled{};
  705. auto six_axis = GetResourceManager()->GetSixAxis();
  706. const auto result = six_axis->IsSixAxisSensorUnalteredPassthroughEnabled(
  707. parameters.sixaxis_handle, is_unaltered_sisxaxis_enabled);
  708. LOG_DEBUG(
  709. Service_HID,
  710. "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  711. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  712. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  713. IPC::ResponseBuilder rb{ctx, 3};
  714. rb.Push(result);
  715. rb.Push(is_unaltered_sisxaxis_enabled);
  716. }
  717. void IHidServer::LoadSixAxisSensorCalibrationParameter(HLERequestContext& ctx) {
  718. IPC::RequestParser rp{ctx};
  719. struct Parameters {
  720. Core::HID::SixAxisSensorHandle sixaxis_handle;
  721. INSERT_PADDING_WORDS_NOINIT(1);
  722. u64 applet_resource_user_id;
  723. };
  724. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  725. const auto parameters{rp.PopRaw<Parameters>()};
  726. Core::HID::SixAxisSensorCalibrationParameter calibration{};
  727. auto six_axis = GetResourceManager()->GetSixAxis();
  728. const auto result =
  729. six_axis->LoadSixAxisSensorCalibrationParameter(parameters.sixaxis_handle, calibration);
  730. LOG_WARNING(
  731. Service_HID,
  732. "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  733. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  734. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  735. if (result.IsSuccess()) {
  736. ctx.WriteBuffer(calibration);
  737. }
  738. IPC::ResponseBuilder rb{ctx, 2};
  739. rb.Push(result);
  740. }
  741. void IHidServer::GetSixAxisSensorIcInformation(HLERequestContext& ctx) {
  742. IPC::RequestParser rp{ctx};
  743. struct Parameters {
  744. Core::HID::SixAxisSensorHandle sixaxis_handle;
  745. INSERT_PADDING_WORDS_NOINIT(1);
  746. u64 applet_resource_user_id;
  747. };
  748. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  749. const auto parameters{rp.PopRaw<Parameters>()};
  750. Core::HID::SixAxisSensorIcInformation ic_information{};
  751. auto six_axis = GetResourceManager()->GetSixAxis();
  752. const auto result =
  753. six_axis->GetSixAxisSensorIcInformation(parameters.sixaxis_handle, ic_information);
  754. LOG_WARNING(
  755. Service_HID,
  756. "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  757. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  758. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  759. if (result.IsSuccess()) {
  760. ctx.WriteBuffer(ic_information);
  761. }
  762. IPC::ResponseBuilder rb{ctx, 2};
  763. rb.Push(result);
  764. }
  765. void IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned(HLERequestContext& ctx) {
  766. IPC::RequestParser rp{ctx};
  767. struct Parameters {
  768. Core::HID::SixAxisSensorHandle sixaxis_handle;
  769. INSERT_PADDING_WORDS_NOINIT(1);
  770. u64 applet_resource_user_id;
  771. };
  772. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  773. const auto parameters{rp.PopRaw<Parameters>()};
  774. auto controller = GetResourceManager()->GetNpad();
  775. const auto result = controller->ResetIsSixAxisSensorDeviceNewlyAssigned(
  776. parameters.applet_resource_user_id, parameters.sixaxis_handle);
  777. LOG_WARNING(
  778. Service_HID,
  779. "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  780. parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
  781. parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
  782. IPC::ResponseBuilder rb{ctx, 2};
  783. rb.Push(result);
  784. }
  785. void IHidServer::ActivateGesture(HLERequestContext& ctx) {
  786. IPC::RequestParser rp{ctx};
  787. struct Parameters {
  788. u32 basic_gesture_id;
  789. INSERT_PADDING_WORDS_NOINIT(1);
  790. u64 applet_resource_user_id;
  791. };
  792. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  793. const auto parameters{rp.PopRaw<Parameters>()};
  794. LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}",
  795. parameters.basic_gesture_id, parameters.applet_resource_user_id);
  796. Result result = ResultSuccess;
  797. auto gesture = GetResourceManager()->GetGesture();
  798. if (!firmware_settings->IsDeviceManaged()) {
  799. result = gesture->Activate();
  800. }
  801. if (result.IsSuccess()) {
  802. result = gesture->Activate(parameters.applet_resource_user_id, parameters.basic_gesture_id);
  803. }
  804. IPC::ResponseBuilder rb{ctx, 2};
  805. rb.Push(result);
  806. }
  807. void IHidServer::SetSupportedNpadStyleSet(HLERequestContext& ctx) {
  808. IPC::RequestParser rp{ctx};
  809. struct Parameters {
  810. Core::HID::NpadStyleSet supported_style_set;
  811. INSERT_PADDING_WORDS_NOINIT(1);
  812. u64 applet_resource_user_id;
  813. };
  814. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  815. const auto parameters{rp.PopRaw<Parameters>()};
  816. LOG_DEBUG(Service_HID, "called, supported_style_set={}, applet_resource_user_id={}",
  817. parameters.supported_style_set, parameters.applet_resource_user_id);
  818. const auto npad = GetResourceManager()->GetNpad();
  819. const Result result = npad->SetSupportedNpadStyleSet(parameters.applet_resource_user_id,
  820. parameters.supported_style_set);
  821. if (result.IsSuccess()) {
  822. Core::HID::NpadStyleTag style_tag{parameters.supported_style_set};
  823. const auto revision = npad->GetRevision(parameters.applet_resource_user_id);
  824. if (style_tag.palma != 0 && revision < NpadRevision::Revision3) {
  825. // GetResourceManager()->GetPalma()->EnableBoostMode(parameters.applet_resource_user_id,
  826. // true);
  827. }
  828. }
  829. IPC::ResponseBuilder rb{ctx, 2};
  830. rb.Push(result);
  831. }
  832. void IHidServer::GetSupportedNpadStyleSet(HLERequestContext& ctx) {
  833. IPC::RequestParser rp{ctx};
  834. const auto applet_resource_user_id{rp.Pop<u64>()};
  835. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  836. Core::HID::NpadStyleSet supported_style_set{};
  837. const auto npad = GetResourceManager()->GetNpad();
  838. const auto result =
  839. npad->GetSupportedNpadStyleSet(applet_resource_user_id, supported_style_set);
  840. IPC::ResponseBuilder rb{ctx, 3};
  841. rb.Push(result);
  842. rb.PushEnum(supported_style_set);
  843. }
  844. void IHidServer::SetSupportedNpadIdType(HLERequestContext& ctx) {
  845. IPC::RequestParser rp{ctx};
  846. const auto applet_resource_user_id{rp.Pop<u64>()};
  847. const auto buffer = ctx.ReadBuffer();
  848. const std::size_t elements = ctx.GetReadBufferNumElements<Core::HID::NpadIdType>();
  849. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  850. std::vector<Core::HID::NpadIdType> supported_npad_list(elements);
  851. memcpy(supported_npad_list.data(), buffer.data(), buffer.size());
  852. const auto npad = GetResourceManager()->GetNpad();
  853. const Result result =
  854. npad->SetSupportedNpadIdType(applet_resource_user_id, supported_npad_list);
  855. IPC::ResponseBuilder rb{ctx, 2};
  856. rb.Push(result);
  857. }
  858. void IHidServer::ActivateNpad(HLERequestContext& ctx) {
  859. IPC::RequestParser rp{ctx};
  860. const auto applet_resource_user_id{rp.Pop<u64>()};
  861. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  862. auto npad = GetResourceManager()->GetNpad();
  863. npad->SetRevision(applet_resource_user_id, NpadRevision::Revision0);
  864. const Result result = npad->Activate(applet_resource_user_id);
  865. IPC::ResponseBuilder rb{ctx, 2};
  866. rb.Push(result);
  867. }
  868. void IHidServer::DeactivateNpad(HLERequestContext& ctx) {
  869. IPC::RequestParser rp{ctx};
  870. const auto applet_resource_user_id{rp.Pop<u64>()};
  871. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  872. // This function does nothing since 10.0.0+
  873. IPC::ResponseBuilder rb{ctx, 2};
  874. rb.Push(ResultSuccess);
  875. }
  876. void IHidServer::AcquireNpadStyleSetUpdateEventHandle(HLERequestContext& ctx) {
  877. IPC::RequestParser rp{ctx};
  878. struct Parameters {
  879. Core::HID::NpadIdType npad_id;
  880. INSERT_PADDING_WORDS_NOINIT(1);
  881. u64 applet_resource_user_id;
  882. u64 unknown;
  883. };
  884. static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
  885. const auto parameters{rp.PopRaw<Parameters>()};
  886. LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}, unknown={}",
  887. parameters.npad_id, parameters.applet_resource_user_id, parameters.unknown);
  888. Kernel::KReadableEvent* style_set_update_event;
  889. const auto result = GetResourceManager()->GetNpad()->AcquireNpadStyleSetUpdateEventHandle(
  890. parameters.applet_resource_user_id, &style_set_update_event, parameters.npad_id);
  891. IPC::ResponseBuilder rb{ctx, 2, 1};
  892. rb.Push(result);
  893. rb.PushCopyObjects(style_set_update_event);
  894. }
  895. void IHidServer::DisconnectNpad(HLERequestContext& ctx) {
  896. IPC::RequestParser rp{ctx};
  897. struct Parameters {
  898. Core::HID::NpadIdType npad_id;
  899. INSERT_PADDING_WORDS_NOINIT(1);
  900. u64 applet_resource_user_id;
  901. };
  902. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  903. const auto parameters{rp.PopRaw<Parameters>()};
  904. auto controller = GetResourceManager()->GetNpad();
  905. controller->DisconnectNpad(parameters.applet_resource_user_id, parameters.npad_id);
  906. LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id,
  907. parameters.applet_resource_user_id);
  908. IPC::ResponseBuilder rb{ctx, 2};
  909. rb.Push(ResultSuccess);
  910. }
  911. void IHidServer::GetPlayerLedPattern(HLERequestContext& ctx) {
  912. IPC::RequestParser rp{ctx};
  913. const auto npad_id{rp.PopEnum<Core::HID::NpadIdType>()};
  914. Core::HID::LedPattern pattern{0, 0, 0, 0};
  915. auto controller = GetResourceManager()->GetNpad();
  916. const auto result = controller->GetLedPattern(npad_id, pattern);
  917. LOG_DEBUG(Service_HID, "called, npad_id={}", npad_id);
  918. IPC::ResponseBuilder rb{ctx, 4};
  919. rb.Push(result);
  920. rb.Push(pattern.raw);
  921. }
  922. void IHidServer::ActivateNpadWithRevision(HLERequestContext& ctx) {
  923. IPC::RequestParser rp{ctx};
  924. struct Parameters {
  925. NpadRevision revision;
  926. INSERT_PADDING_WORDS_NOINIT(1);
  927. u64 applet_resource_user_id;
  928. };
  929. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  930. const auto parameters{rp.PopRaw<Parameters>()};
  931. LOG_DEBUG(Service_HID, "called, revision={}, applet_resource_user_id={}", parameters.revision,
  932. parameters.applet_resource_user_id);
  933. auto npad = GetResourceManager()->GetNpad();
  934. npad->SetRevision(parameters.applet_resource_user_id, parameters.revision);
  935. const auto result = npad->Activate(parameters.applet_resource_user_id);
  936. IPC::ResponseBuilder rb{ctx, 2};
  937. rb.Push(result);
  938. }
  939. void IHidServer::SetNpadJoyHoldType(HLERequestContext& ctx) {
  940. IPC::RequestParser rp{ctx};
  941. const auto applet_resource_user_id{rp.Pop<u64>()};
  942. const auto hold_type{rp.PopEnum<NpadJoyHoldType>()};
  943. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, hold_type={}",
  944. applet_resource_user_id, hold_type);
  945. if (hold_type != NpadJoyHoldType::Horizontal && hold_type != NpadJoyHoldType::Vertical) {
  946. // This should crash console
  947. ASSERT_MSG(false, "Invalid npad joy hold type");
  948. }
  949. const auto npad = GetResourceManager()->GetNpad();
  950. const auto result = npad->SetNpadJoyHoldType(applet_resource_user_id, hold_type);
  951. IPC::ResponseBuilder rb{ctx, 2};
  952. rb.Push(result);
  953. }
  954. void IHidServer::GetNpadJoyHoldType(HLERequestContext& ctx) {
  955. IPC::RequestParser rp{ctx};
  956. const auto applet_resource_user_id{rp.Pop<u64>()};
  957. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  958. NpadJoyHoldType hold_type{};
  959. const auto npad = GetResourceManager()->GetNpad();
  960. const auto result = npad->GetNpadJoyHoldType(applet_resource_user_id, hold_type);
  961. IPC::ResponseBuilder rb{ctx, 4};
  962. rb.Push(result);
  963. rb.PushEnum(hold_type);
  964. }
  965. void IHidServer::SetNpadJoyAssignmentModeSingleByDefault(HLERequestContext& ctx) {
  966. IPC::RequestParser rp{ctx};
  967. struct Parameters {
  968. Core::HID::NpadIdType npad_id;
  969. INSERT_PADDING_WORDS_NOINIT(1);
  970. u64 applet_resource_user_id;
  971. };
  972. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  973. const auto parameters{rp.PopRaw<Parameters>()};
  974. Core::HID::NpadIdType new_npad_id{};
  975. auto controller = GetResourceManager()->GetNpad();
  976. controller->SetNpadMode(parameters.applet_resource_user_id, new_npad_id, parameters.npad_id,
  977. NpadJoyDeviceType::Left, NpadJoyAssignmentMode::Single);
  978. LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id,
  979. parameters.applet_resource_user_id);
  980. IPC::ResponseBuilder rb{ctx, 2};
  981. rb.Push(ResultSuccess);
  982. }
  983. void IHidServer::SetNpadJoyAssignmentModeSingle(HLERequestContext& ctx) {
  984. IPC::RequestParser rp{ctx};
  985. struct Parameters {
  986. Core::HID::NpadIdType npad_id;
  987. INSERT_PADDING_WORDS_NOINIT(1);
  988. u64 applet_resource_user_id;
  989. NpadJoyDeviceType npad_joy_device_type;
  990. };
  991. static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
  992. const auto parameters{rp.PopRaw<Parameters>()};
  993. Core::HID::NpadIdType new_npad_id{};
  994. auto controller = GetResourceManager()->GetNpad();
  995. controller->SetNpadMode(parameters.applet_resource_user_id, new_npad_id, parameters.npad_id,
  996. parameters.npad_joy_device_type, NpadJoyAssignmentMode::Single);
  997. LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}",
  998. parameters.npad_id, parameters.applet_resource_user_id,
  999. parameters.npad_joy_device_type);
  1000. IPC::ResponseBuilder rb{ctx, 2};
  1001. rb.Push(ResultSuccess);
  1002. }
  1003. void IHidServer::SetNpadJoyAssignmentModeDual(HLERequestContext& ctx) {
  1004. IPC::RequestParser rp{ctx};
  1005. struct Parameters {
  1006. Core::HID::NpadIdType npad_id;
  1007. INSERT_PADDING_WORDS_NOINIT(1);
  1008. u64 applet_resource_user_id;
  1009. };
  1010. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1011. const auto parameters{rp.PopRaw<Parameters>()};
  1012. Core::HID::NpadIdType new_npad_id{};
  1013. auto controller = GetResourceManager()->GetNpad();
  1014. controller->SetNpadMode(parameters.applet_resource_user_id, new_npad_id, parameters.npad_id, {},
  1015. NpadJoyAssignmentMode::Dual);
  1016. LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id,
  1017. parameters.applet_resource_user_id); // Spams a lot when controller applet is open
  1018. IPC::ResponseBuilder rb{ctx, 2};
  1019. rb.Push(ResultSuccess);
  1020. }
  1021. void IHidServer::MergeSingleJoyAsDualJoy(HLERequestContext& ctx) {
  1022. IPC::RequestParser rp{ctx};
  1023. const auto npad_id_1{rp.PopEnum<Core::HID::NpadIdType>()};
  1024. const auto npad_id_2{rp.PopEnum<Core::HID::NpadIdType>()};
  1025. const auto applet_resource_user_id{rp.Pop<u64>()};
  1026. auto controller = GetResourceManager()->GetNpad();
  1027. const auto result =
  1028. controller->MergeSingleJoyAsDualJoy(applet_resource_user_id, npad_id_1, npad_id_2);
  1029. LOG_DEBUG(Service_HID, "called, npad_id_1={}, npad_id_2={}, applet_resource_user_id={}",
  1030. npad_id_1, npad_id_2, applet_resource_user_id);
  1031. IPC::ResponseBuilder rb{ctx, 2};
  1032. rb.Push(result);
  1033. }
  1034. void IHidServer::StartLrAssignmentMode(HLERequestContext& ctx) {
  1035. IPC::RequestParser rp{ctx};
  1036. const auto applet_resource_user_id{rp.Pop<u64>()};
  1037. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1038. GetResourceManager()->GetNpad()->StartLrAssignmentMode(applet_resource_user_id);
  1039. IPC::ResponseBuilder rb{ctx, 2};
  1040. rb.Push(ResultSuccess);
  1041. }
  1042. void IHidServer::StopLrAssignmentMode(HLERequestContext& ctx) {
  1043. IPC::RequestParser rp{ctx};
  1044. const auto applet_resource_user_id{rp.Pop<u64>()};
  1045. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1046. GetResourceManager()->GetNpad()->StopLrAssignmentMode(applet_resource_user_id);
  1047. IPC::ResponseBuilder rb{ctx, 2};
  1048. rb.Push(ResultSuccess);
  1049. }
  1050. void IHidServer::SetNpadHandheldActivationMode(HLERequestContext& ctx) {
  1051. IPC::RequestParser rp{ctx};
  1052. const auto applet_resource_user_id{rp.Pop<u64>()};
  1053. const auto activation_mode{rp.PopEnum<NpadHandheldActivationMode>()};
  1054. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, activation_mode={}",
  1055. applet_resource_user_id, activation_mode);
  1056. if (activation_mode >= NpadHandheldActivationMode::MaxActivationMode) {
  1057. // Console should crash here
  1058. ASSERT_MSG(false, "Activation mode should be always None, Single or Dual");
  1059. IPC::ResponseBuilder rb{ctx, 2};
  1060. rb.Push(ResultSuccess);
  1061. return;
  1062. }
  1063. const auto npad = GetResourceManager()->GetNpad();
  1064. const auto result =
  1065. npad->SetNpadHandheldActivationMode(applet_resource_user_id, activation_mode);
  1066. IPC::ResponseBuilder rb{ctx, 2};
  1067. rb.Push(result);
  1068. }
  1069. void IHidServer::GetNpadHandheldActivationMode(HLERequestContext& ctx) {
  1070. IPC::RequestParser rp{ctx};
  1071. const auto applet_resource_user_id{rp.Pop<u64>()};
  1072. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1073. NpadHandheldActivationMode activation_mode{};
  1074. const auto npad = GetResourceManager()->GetNpad();
  1075. const auto result =
  1076. npad->GetNpadHandheldActivationMode(applet_resource_user_id, activation_mode);
  1077. IPC::ResponseBuilder rb{ctx, 4};
  1078. rb.Push(result);
  1079. rb.PushEnum(activation_mode);
  1080. }
  1081. void IHidServer::SwapNpadAssignment(HLERequestContext& ctx) {
  1082. IPC::RequestParser rp{ctx};
  1083. const auto npad_id_1{rp.PopEnum<Core::HID::NpadIdType>()};
  1084. const auto npad_id_2{rp.PopEnum<Core::HID::NpadIdType>()};
  1085. const auto applet_resource_user_id{rp.Pop<u64>()};
  1086. LOG_DEBUG(Service_HID, "called, npad_id_1={}, npad_id_2={}, applet_resource_user_id={}",
  1087. npad_id_1, npad_id_2, applet_resource_user_id);
  1088. const auto npad = GetResourceManager()->GetNpad();
  1089. const auto result = npad->SwapNpadAssignment(applet_resource_user_id, npad_id_1, npad_id_2);
  1090. IPC::ResponseBuilder rb{ctx, 2};
  1091. rb.Push(result);
  1092. }
  1093. void IHidServer::IsUnintendedHomeButtonInputProtectionEnabled(HLERequestContext& ctx) {
  1094. IPC::RequestParser rp{ctx};
  1095. struct Parameters {
  1096. Core::HID::NpadIdType npad_id;
  1097. INSERT_PADDING_WORDS_NOINIT(1);
  1098. u64 applet_resource_user_id;
  1099. };
  1100. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1101. const auto parameters{rp.PopRaw<Parameters>()};
  1102. LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id,
  1103. parameters.applet_resource_user_id);
  1104. if (!IsNpadIdValid(parameters.npad_id)) {
  1105. IPC::ResponseBuilder rb{ctx, 3};
  1106. rb.Push(ResultInvalidNpadId);
  1107. return;
  1108. }
  1109. bool is_enabled{};
  1110. const auto npad = GetResourceManager()->GetNpad();
  1111. const auto result = npad->IsUnintendedHomeButtonInputProtectionEnabled(
  1112. is_enabled, parameters.applet_resource_user_id, parameters.npad_id);
  1113. IPC::ResponseBuilder rb{ctx, 3};
  1114. rb.Push(result);
  1115. rb.Push(is_enabled);
  1116. }
  1117. void IHidServer::EnableUnintendedHomeButtonInputProtection(HLERequestContext& ctx) {
  1118. IPC::RequestParser rp{ctx};
  1119. struct Parameters {
  1120. bool is_enabled;
  1121. INSERT_PADDING_BYTES_NOINIT(3);
  1122. Core::HID::NpadIdType npad_id;
  1123. u64 applet_resource_user_id;
  1124. };
  1125. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1126. const auto parameters{rp.PopRaw<Parameters>()};
  1127. LOG_DEBUG(Service_HID, "called, is_enabled={}, npad_id={}, applet_resource_user_id={}",
  1128. parameters.is_enabled, parameters.npad_id, parameters.applet_resource_user_id);
  1129. if (!IsNpadIdValid(parameters.npad_id)) {
  1130. IPC::ResponseBuilder rb{ctx, 3};
  1131. rb.Push(ResultInvalidNpadId);
  1132. return;
  1133. }
  1134. const auto npad = GetResourceManager()->GetNpad();
  1135. const auto result = npad->EnableUnintendedHomeButtonInputProtection(
  1136. parameters.applet_resource_user_id, parameters.npad_id, parameters.is_enabled);
  1137. IPC::ResponseBuilder rb{ctx, 2};
  1138. rb.Push(result);
  1139. }
  1140. void IHidServer::SetNpadJoyAssignmentModeSingleWithDestination(HLERequestContext& ctx) {
  1141. IPC::RequestParser rp{ctx};
  1142. struct Parameters {
  1143. Core::HID::NpadIdType npad_id;
  1144. INSERT_PADDING_WORDS_NOINIT(1);
  1145. u64 applet_resource_user_id;
  1146. NpadJoyDeviceType npad_joy_device_type;
  1147. };
  1148. static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
  1149. const auto parameters{rp.PopRaw<Parameters>()};
  1150. Core::HID::NpadIdType new_npad_id{};
  1151. auto controller = GetResourceManager()->GetNpad();
  1152. const auto is_reassigned =
  1153. controller->SetNpadMode(parameters.applet_resource_user_id, new_npad_id, parameters.npad_id,
  1154. parameters.npad_joy_device_type, NpadJoyAssignmentMode::Single);
  1155. LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}",
  1156. parameters.npad_id, parameters.applet_resource_user_id,
  1157. parameters.npad_joy_device_type);
  1158. IPC::ResponseBuilder rb{ctx, 4};
  1159. rb.Push(ResultSuccess);
  1160. rb.Push(is_reassigned);
  1161. rb.PushEnum(new_npad_id);
  1162. }
  1163. void IHidServer::SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx) {
  1164. IPC::RequestParser rp{ctx};
  1165. struct Parameters {
  1166. bool use_center_clamp;
  1167. INSERT_PADDING_BYTES_NOINIT(7);
  1168. u64 applet_resource_user_id;
  1169. };
  1170. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1171. const auto parameters{rp.PopRaw<Parameters>()};
  1172. LOG_INFO(Service_HID, "called, use_center_clamp={}, applet_resource_user_id={}",
  1173. parameters.use_center_clamp, parameters.applet_resource_user_id);
  1174. GetResourceManager()->GetNpad()->SetNpadAnalogStickUseCenterClamp(
  1175. parameters.applet_resource_user_id, parameters.use_center_clamp);
  1176. IPC::ResponseBuilder rb{ctx, 2};
  1177. rb.Push(ResultSuccess);
  1178. }
  1179. void IHidServer::SetNpadCaptureButtonAssignment(HLERequestContext& ctx) {
  1180. IPC::RequestParser rp{ctx};
  1181. struct Parameters {
  1182. Core::HID::NpadStyleSet npad_styleset;
  1183. INSERT_PADDING_WORDS_NOINIT(1);
  1184. u64 applet_resource_user_id;
  1185. Core::HID::NpadButton button;
  1186. };
  1187. static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
  1188. const auto parameters{rp.PopRaw<Parameters>()};
  1189. LOG_INFO(Service_HID, "called, npad_styleset={}, applet_resource_user_id={}, button={}",
  1190. parameters.npad_styleset, parameters.applet_resource_user_id, parameters.button);
  1191. const auto result = GetResourceManager()->GetNpad()->SetNpadCaptureButtonAssignment(
  1192. parameters.applet_resource_user_id, parameters.npad_styleset, parameters.button);
  1193. IPC::ResponseBuilder rb{ctx, 2};
  1194. rb.Push(result);
  1195. }
  1196. void IHidServer::ClearNpadCaptureButtonAssignment(HLERequestContext& ctx) {
  1197. IPC::RequestParser rp{ctx};
  1198. const auto applet_resource_user_id{rp.Pop<u64>()};
  1199. LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1200. const auto result =
  1201. GetResourceManager()->GetNpad()->ClearNpadCaptureButtonAssignment(applet_resource_user_id);
  1202. IPC::ResponseBuilder rb{ctx, 2};
  1203. rb.Push(result);
  1204. }
  1205. void IHidServer::GetVibrationDeviceInfo(HLERequestContext& ctx) {
  1206. IPC::RequestParser rp{ctx};
  1207. const auto vibration_device_handle{rp.PopRaw<Core::HID::VibrationDeviceHandle>()};
  1208. Core::HID::VibrationDeviceInfo vibration_device_info{};
  1209. const auto result = GetResourceManager()->GetVibrationDeviceInfo(vibration_device_info,
  1210. vibration_device_handle);
  1211. IPC::ResponseBuilder rb{ctx, 4};
  1212. rb.Push(result);
  1213. rb.PushRaw(vibration_device_info);
  1214. }
  1215. void IHidServer::SendVibrationValue(HLERequestContext& ctx) {
  1216. IPC::RequestParser rp{ctx};
  1217. struct Parameters {
  1218. Core::HID::VibrationDeviceHandle vibration_device_handle;
  1219. Core::HID::VibrationValue vibration_value;
  1220. INSERT_PADDING_WORDS_NOINIT(1);
  1221. u64 applet_resource_user_id;
  1222. };
  1223. static_assert(sizeof(Parameters) == 0x20, "Parameters has incorrect size.");
  1224. const auto parameters{rp.PopRaw<Parameters>()};
  1225. LOG_DEBUG(Service_HID,
  1226. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  1227. parameters.vibration_device_handle.npad_type,
  1228. parameters.vibration_device_handle.npad_id,
  1229. parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id);
  1230. GetResourceManager()->SendVibrationValue(parameters.applet_resource_user_id,
  1231. parameters.vibration_device_handle,
  1232. parameters.vibration_value);
  1233. IPC::ResponseBuilder rb{ctx, 2};
  1234. rb.Push(ResultSuccess);
  1235. }
  1236. void IHidServer::GetActualVibrationValue(HLERequestContext& ctx) {
  1237. IPC::RequestParser rp{ctx};
  1238. struct Parameters {
  1239. Core::HID::VibrationDeviceHandle vibration_device_handle;
  1240. INSERT_PADDING_WORDS_NOINIT(1);
  1241. u64 applet_resource_user_id;
  1242. };
  1243. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1244. const auto parameters{rp.PopRaw<Parameters>()};
  1245. LOG_DEBUG(Service_HID,
  1246. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  1247. parameters.vibration_device_handle.npad_type,
  1248. parameters.vibration_device_handle.npad_id,
  1249. parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id);
  1250. bool has_active_aruid{};
  1251. NpadVibrationDevice* device{nullptr};
  1252. Core::HID::VibrationValue vibration_value{};
  1253. Result result = GetResourceManager()->IsVibrationAruidActive(parameters.applet_resource_user_id,
  1254. has_active_aruid);
  1255. if (result.IsSuccess() && has_active_aruid) {
  1256. result = IsVibrationHandleValid(parameters.vibration_device_handle);
  1257. }
  1258. if (result.IsSuccess() && has_active_aruid) {
  1259. device = GetResourceManager()->GetNSVibrationDevice(parameters.vibration_device_handle);
  1260. }
  1261. if (device != nullptr) {
  1262. result = device->GetActualVibrationValue(vibration_value);
  1263. }
  1264. if (result.IsError()) {
  1265. vibration_value = Core::HID::DEFAULT_VIBRATION_VALUE;
  1266. }
  1267. IPC::ResponseBuilder rb{ctx, 6};
  1268. rb.Push(ResultSuccess);
  1269. rb.PushRaw(vibration_value);
  1270. }
  1271. void IHidServer::CreateActiveVibrationDeviceList(HLERequestContext& ctx) {
  1272. LOG_DEBUG(Service_HID, "called");
  1273. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  1274. rb.Push(ResultSuccess);
  1275. rb.PushIpcInterface<IActiveVibrationDeviceList>(system, GetResourceManager());
  1276. }
  1277. void IHidServer::PermitVibration(HLERequestContext& ctx) {
  1278. IPC::RequestParser rp{ctx};
  1279. const auto can_vibrate{rp.Pop<bool>()};
  1280. LOG_DEBUG(Service_HID, "called, can_vibrate={}", can_vibrate);
  1281. const auto result =
  1282. GetResourceManager()->GetNpad()->GetVibrationHandler()->SetVibrationMasterVolume(
  1283. can_vibrate ? 1.0f : 0.0f);
  1284. IPC::ResponseBuilder rb{ctx, 2};
  1285. rb.Push(result);
  1286. }
  1287. void IHidServer::IsVibrationPermitted(HLERequestContext& ctx) {
  1288. LOG_DEBUG(Service_HID, "called");
  1289. f32 master_volume{};
  1290. const auto result =
  1291. GetResourceManager()->GetNpad()->GetVibrationHandler()->GetVibrationMasterVolume(
  1292. master_volume);
  1293. IPC::ResponseBuilder rb{ctx, 3};
  1294. rb.Push(result);
  1295. rb.Push(master_volume > 0.0f);
  1296. }
  1297. void IHidServer::SendVibrationValues(HLERequestContext& ctx) {
  1298. IPC::RequestParser rp{ctx};
  1299. const auto applet_resource_user_id{rp.Pop<u64>()};
  1300. const auto handle_data = ctx.ReadBuffer(0);
  1301. const auto handle_count = ctx.GetReadBufferNumElements<Core::HID::VibrationDeviceHandle>(0);
  1302. const auto vibration_data = ctx.ReadBuffer(1);
  1303. const auto vibration_count = ctx.GetReadBufferNumElements<Core::HID::VibrationValue>(1);
  1304. auto vibration_device_handles =
  1305. std::span(reinterpret_cast<const Core::HID::VibrationDeviceHandle*>(handle_data.data()),
  1306. handle_count);
  1307. auto vibration_values = std::span(
  1308. reinterpret_cast<const Core::HID::VibrationValue*>(vibration_data.data()), vibration_count);
  1309. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1310. Result result = ResultSuccess;
  1311. if (handle_count != vibration_count) {
  1312. result = ResultVibrationArraySizeMismatch;
  1313. }
  1314. for (std::size_t i = 0; i < handle_count; i++) {
  1315. if (result.IsSuccess()) {
  1316. result = GetResourceManager()->SendVibrationValue(
  1317. applet_resource_user_id, vibration_device_handles[i], vibration_values[i]);
  1318. }
  1319. }
  1320. IPC::ResponseBuilder rb{ctx, 2};
  1321. rb.Push(result);
  1322. }
  1323. void IHidServer::SendVibrationGcErmCommand(HLERequestContext& ctx) {
  1324. IPC::RequestParser rp{ctx};
  1325. struct Parameters {
  1326. Core::HID::VibrationDeviceHandle vibration_device_handle;
  1327. INSERT_PADDING_WORDS_NOINIT(1);
  1328. u64 applet_resource_user_id;
  1329. Core::HID::VibrationGcErmCommand gc_erm_command;
  1330. };
  1331. static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
  1332. const auto parameters{rp.PopRaw<Parameters>()};
  1333. LOG_DEBUG(Service_HID,
  1334. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}, "
  1335. "gc_erm_command={}",
  1336. parameters.vibration_device_handle.npad_type,
  1337. parameters.vibration_device_handle.npad_id,
  1338. parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id,
  1339. parameters.gc_erm_command);
  1340. bool has_active_aruid{};
  1341. NpadGcVibrationDevice* gc_device{nullptr};
  1342. Result result = GetResourceManager()->IsVibrationAruidActive(parameters.applet_resource_user_id,
  1343. has_active_aruid);
  1344. if (result.IsSuccess() && has_active_aruid) {
  1345. result = IsVibrationHandleValid(parameters.vibration_device_handle);
  1346. }
  1347. if (result.IsSuccess() && has_active_aruid) {
  1348. gc_device = GetResourceManager()->GetGcVibrationDevice(parameters.vibration_device_handle);
  1349. }
  1350. if (gc_device != nullptr) {
  1351. result = gc_device->SendVibrationGcErmCommand(parameters.gc_erm_command);
  1352. }
  1353. IPC::ResponseBuilder rb{ctx, 2};
  1354. rb.Push(result);
  1355. }
  1356. void IHidServer::GetActualVibrationGcErmCommand(HLERequestContext& ctx) {
  1357. IPC::RequestParser rp{ctx};
  1358. struct Parameters {
  1359. Core::HID::VibrationDeviceHandle vibration_device_handle;
  1360. INSERT_PADDING_WORDS_NOINIT(1);
  1361. u64 applet_resource_user_id;
  1362. };
  1363. const auto parameters{rp.PopRaw<Parameters>()};
  1364. LOG_DEBUG(Service_HID,
  1365. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  1366. parameters.vibration_device_handle.npad_type,
  1367. parameters.vibration_device_handle.npad_id,
  1368. parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id);
  1369. bool has_active_aruid{};
  1370. NpadGcVibrationDevice* gc_device{nullptr};
  1371. Core::HID::VibrationGcErmCommand gc_erm_command{};
  1372. Result result = GetResourceManager()->IsVibrationAruidActive(parameters.applet_resource_user_id,
  1373. has_active_aruid);
  1374. if (result.IsSuccess() && has_active_aruid) {
  1375. result = IsVibrationHandleValid(parameters.vibration_device_handle);
  1376. }
  1377. if (result.IsSuccess() && has_active_aruid) {
  1378. gc_device = GetResourceManager()->GetGcVibrationDevice(parameters.vibration_device_handle);
  1379. }
  1380. if (gc_device != nullptr) {
  1381. result = gc_device->GetActualVibrationGcErmCommand(gc_erm_command);
  1382. }
  1383. if (result.IsError()) {
  1384. gc_erm_command = Core::HID::VibrationGcErmCommand::Stop;
  1385. }
  1386. IPC::ResponseBuilder rb{ctx, 4};
  1387. rb.Push(ResultSuccess);
  1388. rb.PushEnum(gc_erm_command);
  1389. }
  1390. void IHidServer::BeginPermitVibrationSession(HLERequestContext& ctx) {
  1391. IPC::RequestParser rp{ctx};
  1392. const auto applet_resource_user_id{rp.Pop<u64>()};
  1393. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1394. const auto result =
  1395. GetResourceManager()->GetNpad()->GetVibrationHandler()->BeginPermitVibrationSession(
  1396. applet_resource_user_id);
  1397. IPC::ResponseBuilder rb{ctx, 2};
  1398. rb.Push(result);
  1399. }
  1400. void IHidServer::EndPermitVibrationSession(HLERequestContext& ctx) {
  1401. LOG_DEBUG(Service_HID, "called");
  1402. const auto result =
  1403. GetResourceManager()->GetNpad()->GetVibrationHandler()->EndPermitVibrationSession();
  1404. IPC::ResponseBuilder rb{ctx, 2};
  1405. rb.Push(result);
  1406. }
  1407. void IHidServer::IsVibrationDeviceMounted(HLERequestContext& ctx) {
  1408. IPC::RequestParser rp{ctx};
  1409. struct Parameters {
  1410. Core::HID::VibrationDeviceHandle vibration_device_handle;
  1411. INSERT_PADDING_WORDS_NOINIT(1);
  1412. u64 applet_resource_user_id;
  1413. };
  1414. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1415. const auto parameters{rp.PopRaw<Parameters>()};
  1416. LOG_DEBUG(Service_HID,
  1417. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
  1418. parameters.vibration_device_handle.npad_type,
  1419. parameters.vibration_device_handle.npad_id,
  1420. parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id);
  1421. bool is_mounted{};
  1422. NpadVibrationBase* device{nullptr};
  1423. Result result = IsVibrationHandleValid(parameters.vibration_device_handle);
  1424. if (result.IsSuccess()) {
  1425. device = GetResourceManager()->GetVibrationDevice(parameters.vibration_device_handle);
  1426. }
  1427. if (device != nullptr) {
  1428. is_mounted = device->IsVibrationMounted();
  1429. }
  1430. IPC::ResponseBuilder rb{ctx, 3};
  1431. rb.Push(result);
  1432. rb.Push(is_mounted);
  1433. }
  1434. void IHidServer::SendVibrationValueInBool(HLERequestContext& ctx) {
  1435. IPC::RequestParser rp{ctx};
  1436. struct Parameters {
  1437. Core::HID::VibrationDeviceHandle vibration_device_handle;
  1438. INSERT_PADDING_WORDS_NOINIT(1);
  1439. u64 applet_resource_user_id;
  1440. bool is_vibrating;
  1441. };
  1442. static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
  1443. const auto parameters{rp.PopRaw<Parameters>()};
  1444. LOG_DEBUG(Service_HID,
  1445. "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}, "
  1446. "is_vibrating={}",
  1447. parameters.vibration_device_handle.npad_type,
  1448. parameters.vibration_device_handle.npad_id,
  1449. parameters.vibration_device_handle.device_index, parameters.applet_resource_user_id,
  1450. parameters.is_vibrating);
  1451. bool has_active_aruid{};
  1452. NpadN64VibrationDevice* n64_device{nullptr};
  1453. Result result = GetResourceManager()->IsVibrationAruidActive(parameters.applet_resource_user_id,
  1454. has_active_aruid);
  1455. if (result.IsSuccess() && has_active_aruid) {
  1456. result = IsVibrationHandleValid(parameters.vibration_device_handle);
  1457. }
  1458. if (result.IsSuccess() && has_active_aruid) {
  1459. n64_device =
  1460. GetResourceManager()->GetN64VibrationDevice(parameters.vibration_device_handle);
  1461. }
  1462. if (n64_device != nullptr) {
  1463. result = n64_device->SendValueInBool(parameters.is_vibrating);
  1464. }
  1465. IPC::ResponseBuilder rb{ctx, 2};
  1466. rb.Push(result);
  1467. }
  1468. void IHidServer::ActivateConsoleSixAxisSensor(HLERequestContext& ctx) {
  1469. IPC::RequestParser rp{ctx};
  1470. const auto applet_resource_user_id{rp.Pop<u64>()};
  1471. LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1472. Result result = ResultSuccess;
  1473. auto console_sixaxis = GetResourceManager()->GetConsoleSixAxis();
  1474. if (!firmware_settings->IsDeviceManaged()) {
  1475. result = console_sixaxis->Activate();
  1476. }
  1477. if (result.IsSuccess()) {
  1478. result = console_sixaxis->Activate(applet_resource_user_id);
  1479. }
  1480. IPC::ResponseBuilder rb{ctx, 2};
  1481. rb.Push(result);
  1482. }
  1483. void IHidServer::StartConsoleSixAxisSensor(HLERequestContext& ctx) {
  1484. IPC::RequestParser rp{ctx};
  1485. struct Parameters {
  1486. Core::HID::ConsoleSixAxisSensorHandle console_sixaxis_handle;
  1487. INSERT_PADDING_WORDS_NOINIT(1);
  1488. u64 applet_resource_user_id;
  1489. };
  1490. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1491. const auto parameters{rp.PopRaw<Parameters>()};
  1492. LOG_WARNING(Service_HID,
  1493. "(STUBBED) called, unknown_1={}, unknown_2={}, applet_resource_user_id={}",
  1494. parameters.console_sixaxis_handle.unknown_1,
  1495. parameters.console_sixaxis_handle.unknown_2, parameters.applet_resource_user_id);
  1496. IPC::ResponseBuilder rb{ctx, 2};
  1497. rb.Push(ResultSuccess);
  1498. }
  1499. void IHidServer::StopConsoleSixAxisSensor(HLERequestContext& ctx) {
  1500. IPC::RequestParser rp{ctx};
  1501. struct Parameters {
  1502. Core::HID::ConsoleSixAxisSensorHandle console_sixaxis_handle;
  1503. INSERT_PADDING_WORDS_NOINIT(1);
  1504. u64 applet_resource_user_id;
  1505. };
  1506. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1507. const auto parameters{rp.PopRaw<Parameters>()};
  1508. LOG_WARNING(Service_HID,
  1509. "(STUBBED) called, unknown_1={}, unknown_2={}, applet_resource_user_id={}",
  1510. parameters.console_sixaxis_handle.unknown_1,
  1511. parameters.console_sixaxis_handle.unknown_2, parameters.applet_resource_user_id);
  1512. IPC::ResponseBuilder rb{ctx, 2};
  1513. rb.Push(ResultSuccess);
  1514. }
  1515. void IHidServer::ActivateSevenSixAxisSensor(HLERequestContext& ctx) {
  1516. IPC::RequestParser rp{ctx};
  1517. const auto applet_resource_user_id{rp.Pop<u64>()};
  1518. LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1519. Result result = ResultSuccess;
  1520. auto seven_sixaxis = GetResourceManager()->GetSevenSixAxis();
  1521. if (!firmware_settings->IsDeviceManaged()) {
  1522. result = seven_sixaxis->Activate();
  1523. }
  1524. if (result.IsSuccess()) {
  1525. seven_sixaxis->Activate(applet_resource_user_id);
  1526. }
  1527. IPC::ResponseBuilder rb{ctx, 2};
  1528. rb.Push(ResultSuccess);
  1529. }
  1530. void IHidServer::StartSevenSixAxisSensor(HLERequestContext& ctx) {
  1531. IPC::RequestParser rp{ctx};
  1532. const auto applet_resource_user_id{rp.Pop<u64>()};
  1533. LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}",
  1534. applet_resource_user_id);
  1535. IPC::ResponseBuilder rb{ctx, 2};
  1536. rb.Push(ResultSuccess);
  1537. }
  1538. void IHidServer::StopSevenSixAxisSensor(HLERequestContext& ctx) {
  1539. IPC::RequestParser rp{ctx};
  1540. const auto applet_resource_user_id{rp.Pop<u64>()};
  1541. LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}",
  1542. applet_resource_user_id);
  1543. IPC::ResponseBuilder rb{ctx, 2};
  1544. rb.Push(ResultSuccess);
  1545. }
  1546. void IHidServer::InitializeSevenSixAxisSensor(HLERequestContext& ctx) {
  1547. IPC::RequestParser rp{ctx};
  1548. const auto applet_resource_user_id{rp.Pop<u64>()};
  1549. const auto t_mem_1_size{rp.Pop<u64>()};
  1550. const auto t_mem_2_size{rp.Pop<u64>()};
  1551. const auto t_mem_1_handle{ctx.GetCopyHandle(0)};
  1552. const auto t_mem_2_handle{ctx.GetCopyHandle(1)};
  1553. ASSERT_MSG(t_mem_1_size == 0x1000, "t_mem_1_size is not 0x1000 bytes");
  1554. ASSERT_MSG(t_mem_2_size == 0x7F000, "t_mem_2_size is not 0x7F000 bytes");
  1555. auto t_mem_1 = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_1_handle);
  1556. if (t_mem_1.IsNull()) {
  1557. LOG_ERROR(Service_HID, "t_mem_1 is a nullptr for handle=0x{:08X}", t_mem_1_handle);
  1558. IPC::ResponseBuilder rb{ctx, 2};
  1559. rb.Push(ResultUnknown);
  1560. return;
  1561. }
  1562. auto t_mem_2 = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_2_handle);
  1563. if (t_mem_2.IsNull()) {
  1564. LOG_ERROR(Service_HID, "t_mem_2 is a nullptr for handle=0x{:08X}", t_mem_2_handle);
  1565. IPC::ResponseBuilder rb{ctx, 2};
  1566. rb.Push(ResultUnknown);
  1567. return;
  1568. }
  1569. ASSERT_MSG(t_mem_1->GetSize() == 0x1000, "t_mem_1 has incorrect size");
  1570. ASSERT_MSG(t_mem_2->GetSize() == 0x7F000, "t_mem_2 has incorrect size");
  1571. // Activate console six axis controller
  1572. GetResourceManager()->GetConsoleSixAxis()->Activate();
  1573. GetResourceManager()->GetSevenSixAxis()->Activate();
  1574. GetResourceManager()->GetSevenSixAxis()->SetTransferMemoryAddress(t_mem_1->GetSourceAddress());
  1575. LOG_WARNING(Service_HID,
  1576. "called, t_mem_1_handle=0x{:08X}, t_mem_2_handle=0x{:08X}, "
  1577. "applet_resource_user_id={}",
  1578. t_mem_1_handle, t_mem_2_handle, applet_resource_user_id);
  1579. IPC::ResponseBuilder rb{ctx, 2};
  1580. rb.Push(ResultSuccess);
  1581. }
  1582. void IHidServer::FinalizeSevenSixAxisSensor(HLERequestContext& ctx) {
  1583. IPC::RequestParser rp{ctx};
  1584. const auto applet_resource_user_id{rp.Pop<u64>()};
  1585. LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}",
  1586. applet_resource_user_id);
  1587. IPC::ResponseBuilder rb{ctx, 2};
  1588. rb.Push(ResultSuccess);
  1589. }
  1590. void IHidServer::ResetSevenSixAxisSensorTimestamp(HLERequestContext& ctx) {
  1591. IPC::RequestParser rp{ctx};
  1592. const auto applet_resource_user_id{rp.Pop<u64>()};
  1593. GetResourceManager()->GetSevenSixAxis()->ResetTimestamp();
  1594. LOG_WARNING(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1595. IPC::ResponseBuilder rb{ctx, 2};
  1596. rb.Push(ResultSuccess);
  1597. }
  1598. void IHidServer::IsUsbFullKeyControllerEnabled(HLERequestContext& ctx) {
  1599. IPC::RequestParser rp{ctx};
  1600. LOG_WARNING(Service_HID, "(STUBBED) called");
  1601. IPC::ResponseBuilder rb{ctx, 3};
  1602. rb.Push(ResultSuccess);
  1603. rb.Push(false);
  1604. }
  1605. void IHidServer::GetPalmaConnectionHandle(HLERequestContext& ctx) {
  1606. IPC::RequestParser rp{ctx};
  1607. struct Parameters {
  1608. Core::HID::NpadIdType npad_id;
  1609. INSERT_PADDING_WORDS_NOINIT(1);
  1610. u64 applet_resource_user_id;
  1611. };
  1612. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1613. const auto parameters{rp.PopRaw<Parameters>()};
  1614. LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}",
  1615. parameters.npad_id, parameters.applet_resource_user_id);
  1616. Palma::PalmaConnectionHandle handle;
  1617. auto controller = GetResourceManager()->GetPalma();
  1618. const auto result = controller->GetPalmaConnectionHandle(parameters.npad_id, handle);
  1619. IPC::ResponseBuilder rb{ctx, 4};
  1620. rb.Push(result);
  1621. rb.PushRaw(handle);
  1622. }
  1623. void IHidServer::InitializePalma(HLERequestContext& ctx) {
  1624. IPC::RequestParser rp{ctx};
  1625. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1626. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1627. auto controller = GetResourceManager()->GetPalma();
  1628. const auto result = controller->InitializePalma(connection_handle);
  1629. IPC::ResponseBuilder rb{ctx, 2};
  1630. rb.Push(result);
  1631. }
  1632. void IHidServer::AcquirePalmaOperationCompleteEvent(HLERequestContext& ctx) {
  1633. IPC::RequestParser rp{ctx};
  1634. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1635. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1636. auto controller = GetResourceManager()->GetPalma();
  1637. IPC::ResponseBuilder rb{ctx, 2, 1};
  1638. rb.Push(ResultSuccess);
  1639. rb.PushCopyObjects(controller->AcquirePalmaOperationCompleteEvent(connection_handle));
  1640. }
  1641. void IHidServer::GetPalmaOperationInfo(HLERequestContext& ctx) {
  1642. IPC::RequestParser rp{ctx};
  1643. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1644. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1645. Palma::PalmaOperationType operation_type;
  1646. Palma::PalmaOperationData data;
  1647. auto controller = GetResourceManager()->GetPalma();
  1648. const auto result = controller->GetPalmaOperationInfo(connection_handle, operation_type, data);
  1649. if (result.IsError()) {
  1650. IPC::ResponseBuilder rb{ctx, 2};
  1651. rb.Push(result);
  1652. }
  1653. ctx.WriteBuffer(data);
  1654. IPC::ResponseBuilder rb{ctx, 4};
  1655. rb.Push(result);
  1656. rb.Push(static_cast<u64>(operation_type));
  1657. }
  1658. void IHidServer::PlayPalmaActivity(HLERequestContext& ctx) {
  1659. IPC::RequestParser rp{ctx};
  1660. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1661. const auto palma_activity{rp.Pop<u64>()};
  1662. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}, palma_activity={}",
  1663. connection_handle.npad_id, palma_activity);
  1664. auto controller = GetResourceManager()->GetPalma();
  1665. const auto result = controller->PlayPalmaActivity(connection_handle, palma_activity);
  1666. IPC::ResponseBuilder rb{ctx, 2};
  1667. rb.Push(result);
  1668. }
  1669. void IHidServer::SetPalmaFrModeType(HLERequestContext& ctx) {
  1670. IPC::RequestParser rp{ctx};
  1671. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1672. const auto fr_mode{rp.PopEnum<Palma::PalmaFrModeType>()};
  1673. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}, fr_mode={}",
  1674. connection_handle.npad_id, fr_mode);
  1675. auto controller = GetResourceManager()->GetPalma();
  1676. const auto result = controller->SetPalmaFrModeType(connection_handle, fr_mode);
  1677. IPC::ResponseBuilder rb{ctx, 2};
  1678. rb.Push(result);
  1679. }
  1680. void IHidServer::ReadPalmaStep(HLERequestContext& ctx) {
  1681. IPC::RequestParser rp{ctx};
  1682. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1683. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1684. auto controller = GetResourceManager()->GetPalma();
  1685. const auto result = controller->ReadPalmaStep(connection_handle);
  1686. IPC::ResponseBuilder rb{ctx, 2};
  1687. rb.Push(result);
  1688. }
  1689. void IHidServer::EnablePalmaStep(HLERequestContext& ctx) {
  1690. IPC::RequestParser rp{ctx};
  1691. struct Parameters {
  1692. bool is_enabled;
  1693. INSERT_PADDING_WORDS_NOINIT(1);
  1694. Palma::PalmaConnectionHandle connection_handle;
  1695. };
  1696. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1697. const auto parameters{rp.PopRaw<Parameters>()};
  1698. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}, is_enabled={}",
  1699. parameters.connection_handle.npad_id, parameters.is_enabled);
  1700. auto controller = GetResourceManager()->GetPalma();
  1701. const auto result =
  1702. controller->EnablePalmaStep(parameters.connection_handle, parameters.is_enabled);
  1703. IPC::ResponseBuilder rb{ctx, 2};
  1704. rb.Push(result);
  1705. }
  1706. void IHidServer::ResetPalmaStep(HLERequestContext& ctx) {
  1707. IPC::RequestParser rp{ctx};
  1708. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1709. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1710. auto controller = GetResourceManager()->GetPalma();
  1711. const auto result = controller->ResetPalmaStep(connection_handle);
  1712. IPC::ResponseBuilder rb{ctx, 2};
  1713. rb.Push(result);
  1714. }
  1715. void IHidServer::ReadPalmaApplicationSection(HLERequestContext& ctx) {
  1716. LOG_WARNING(Service_HID, "(STUBBED) called");
  1717. IPC::ResponseBuilder rb{ctx, 2};
  1718. rb.Push(ResultSuccess);
  1719. }
  1720. void IHidServer::WritePalmaApplicationSection(HLERequestContext& ctx) {
  1721. LOG_WARNING(Service_HID, "(STUBBED) called");
  1722. IPC::ResponseBuilder rb{ctx, 2};
  1723. rb.Push(ResultSuccess);
  1724. }
  1725. void IHidServer::ReadPalmaUniqueCode(HLERequestContext& ctx) {
  1726. IPC::RequestParser rp{ctx};
  1727. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1728. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1729. GetResourceManager()->GetPalma()->ReadPalmaUniqueCode(connection_handle);
  1730. IPC::ResponseBuilder rb{ctx, 2};
  1731. rb.Push(ResultSuccess);
  1732. }
  1733. void IHidServer::SetPalmaUniqueCodeInvalid(HLERequestContext& ctx) {
  1734. IPC::RequestParser rp{ctx};
  1735. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1736. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1737. GetResourceManager()->GetPalma()->SetPalmaUniqueCodeInvalid(connection_handle);
  1738. IPC::ResponseBuilder rb{ctx, 2};
  1739. rb.Push(ResultSuccess);
  1740. }
  1741. void IHidServer::WritePalmaActivityEntry(HLERequestContext& ctx) {
  1742. LOG_CRITICAL(Service_HID, "(STUBBED) called");
  1743. IPC::ResponseBuilder rb{ctx, 2};
  1744. rb.Push(ResultSuccess);
  1745. }
  1746. void IHidServer::WritePalmaRgbLedPatternEntry(HLERequestContext& ctx) {
  1747. IPC::RequestParser rp{ctx};
  1748. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1749. const auto unknown{rp.Pop<u64>()};
  1750. [[maybe_unused]] const auto buffer = ctx.ReadBuffer();
  1751. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}, unknown={}",
  1752. connection_handle.npad_id, unknown);
  1753. GetResourceManager()->GetPalma()->WritePalmaRgbLedPatternEntry(connection_handle, unknown);
  1754. IPC::ResponseBuilder rb{ctx, 2};
  1755. rb.Push(ResultSuccess);
  1756. }
  1757. void IHidServer::WritePalmaWaveEntry(HLERequestContext& ctx) {
  1758. IPC::RequestParser rp{ctx};
  1759. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1760. const auto wave_set{rp.PopEnum<Palma::PalmaWaveSet>()};
  1761. const auto unknown{rp.Pop<u64>()};
  1762. const auto t_mem_size{rp.Pop<u64>()};
  1763. const auto t_mem_handle{ctx.GetCopyHandle(0)};
  1764. const auto size{rp.Pop<u64>()};
  1765. ASSERT_MSG(t_mem_size == 0x3000, "t_mem_size is not 0x3000 bytes");
  1766. auto t_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_handle);
  1767. if (t_mem.IsNull()) {
  1768. LOG_ERROR(Service_HID, "t_mem is a nullptr for handle=0x{:08X}", t_mem_handle);
  1769. IPC::ResponseBuilder rb{ctx, 2};
  1770. rb.Push(ResultUnknown);
  1771. return;
  1772. }
  1773. ASSERT_MSG(t_mem->GetSize() == 0x3000, "t_mem has incorrect size");
  1774. LOG_WARNING(Service_HID,
  1775. "(STUBBED) called, connection_handle={}, wave_set={}, unknown={}, "
  1776. "t_mem_handle=0x{:08X}, t_mem_size={}, size={}",
  1777. connection_handle.npad_id, wave_set, unknown, t_mem_handle, t_mem_size, size);
  1778. GetResourceManager()->GetPalma()->WritePalmaWaveEntry(connection_handle, wave_set,
  1779. t_mem->GetSourceAddress(), t_mem_size);
  1780. IPC::ResponseBuilder rb{ctx, 2};
  1781. rb.Push(ResultSuccess);
  1782. }
  1783. void IHidServer::SetPalmaDataBaseIdentificationVersion(HLERequestContext& ctx) {
  1784. IPC::RequestParser rp{ctx};
  1785. struct Parameters {
  1786. s32 database_id_version;
  1787. INSERT_PADDING_WORDS_NOINIT(1);
  1788. Palma::PalmaConnectionHandle connection_handle;
  1789. };
  1790. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1791. const auto parameters{rp.PopRaw<Parameters>()};
  1792. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}, database_id_version={}",
  1793. parameters.connection_handle.npad_id, parameters.database_id_version);
  1794. GetResourceManager()->GetPalma()->SetPalmaDataBaseIdentificationVersion(
  1795. parameters.connection_handle, parameters.database_id_version);
  1796. IPC::ResponseBuilder rb{ctx, 2};
  1797. rb.Push(ResultSuccess);
  1798. }
  1799. void IHidServer::GetPalmaDataBaseIdentificationVersion(HLERequestContext& ctx) {
  1800. IPC::RequestParser rp{ctx};
  1801. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1802. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1803. GetResourceManager()->GetPalma()->GetPalmaDataBaseIdentificationVersion(connection_handle);
  1804. IPC::ResponseBuilder rb{ctx, 2};
  1805. rb.Push(ResultSuccess);
  1806. }
  1807. void IHidServer::SuspendPalmaFeature(HLERequestContext& ctx) {
  1808. LOG_WARNING(Service_HID, "(STUBBED) called");
  1809. IPC::ResponseBuilder rb{ctx, 2};
  1810. rb.Push(ResultSuccess);
  1811. }
  1812. void IHidServer::GetPalmaOperationResult(HLERequestContext& ctx) {
  1813. IPC::RequestParser rp{ctx};
  1814. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1815. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1816. const auto result =
  1817. GetResourceManager()->GetPalma()->GetPalmaOperationResult(connection_handle);
  1818. IPC::ResponseBuilder rb{ctx, 2};
  1819. rb.Push(result);
  1820. }
  1821. void IHidServer::ReadPalmaPlayLog(HLERequestContext& ctx) {
  1822. LOG_WARNING(Service_HID, "(STUBBED) called");
  1823. IPC::ResponseBuilder rb{ctx, 2};
  1824. rb.Push(ResultSuccess);
  1825. }
  1826. void IHidServer::ResetPalmaPlayLog(HLERequestContext& ctx) {
  1827. LOG_WARNING(Service_HID, "(STUBBED) called");
  1828. IPC::ResponseBuilder rb{ctx, 2};
  1829. rb.Push(ResultSuccess);
  1830. }
  1831. void IHidServer::SetIsPalmaAllConnectable(HLERequestContext& ctx) {
  1832. IPC::RequestParser rp{ctx};
  1833. struct Parameters {
  1834. bool is_palma_all_connectable;
  1835. INSERT_PADDING_BYTES_NOINIT(7);
  1836. u64 applet_resource_user_id;
  1837. };
  1838. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1839. const auto parameters{rp.PopRaw<Parameters>()};
  1840. LOG_WARNING(Service_HID,
  1841. "(STUBBED) called, is_palma_all_connectable={},applet_resource_user_id={}",
  1842. parameters.is_palma_all_connectable, parameters.applet_resource_user_id);
  1843. GetResourceManager()->GetPalma()->SetIsPalmaAllConnectable(parameters.is_palma_all_connectable);
  1844. IPC::ResponseBuilder rb{ctx, 2};
  1845. rb.Push(ResultSuccess);
  1846. }
  1847. void IHidServer::SetIsPalmaPairedConnectable(HLERequestContext& ctx) {
  1848. LOG_WARNING(Service_HID, "(STUBBED) called");
  1849. IPC::ResponseBuilder rb{ctx, 2};
  1850. rb.Push(ResultSuccess);
  1851. }
  1852. void IHidServer::PairPalma(HLERequestContext& ctx) {
  1853. IPC::RequestParser rp{ctx};
  1854. const auto connection_handle{rp.PopRaw<Palma::PalmaConnectionHandle>()};
  1855. LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}", connection_handle.npad_id);
  1856. GetResourceManager()->GetPalma()->PairPalma(connection_handle);
  1857. IPC::ResponseBuilder rb{ctx, 2};
  1858. rb.Push(ResultSuccess);
  1859. }
  1860. void IHidServer::SetPalmaBoostMode(HLERequestContext& ctx) {
  1861. IPC::RequestParser rp{ctx};
  1862. const auto palma_boost_mode{rp.Pop<bool>()};
  1863. LOG_WARNING(Service_HID, "(STUBBED) called, palma_boost_mode={}", palma_boost_mode);
  1864. GetResourceManager()->GetPalma()->SetPalmaBoostMode(palma_boost_mode);
  1865. IPC::ResponseBuilder rb{ctx, 2};
  1866. rb.Push(ResultSuccess);
  1867. }
  1868. void IHidServer::CancelWritePalmaWaveEntry(HLERequestContext& ctx) {
  1869. LOG_WARNING(Service_HID, "(STUBBED) called");
  1870. IPC::ResponseBuilder rb{ctx, 2};
  1871. rb.Push(ResultSuccess);
  1872. }
  1873. void IHidServer::EnablePalmaBoostMode(HLERequestContext& ctx) {
  1874. LOG_WARNING(Service_HID, "(STUBBED) called");
  1875. IPC::ResponseBuilder rb{ctx, 2};
  1876. rb.Push(ResultSuccess);
  1877. }
  1878. void IHidServer::GetPalmaBluetoothAddress(HLERequestContext& ctx) {
  1879. LOG_WARNING(Service_HID, "(STUBBED) called");
  1880. IPC::ResponseBuilder rb{ctx, 2};
  1881. rb.Push(ResultSuccess);
  1882. }
  1883. void IHidServer::SetDisallowedPalmaConnection(HLERequestContext& ctx) {
  1884. LOG_WARNING(Service_HID, "(STUBBED) called");
  1885. IPC::ResponseBuilder rb{ctx, 2};
  1886. rb.Push(ResultSuccess);
  1887. }
  1888. void IHidServer::SetNpadCommunicationMode(HLERequestContext& ctx) {
  1889. IPC::RequestParser rp{ctx};
  1890. const auto applet_resource_user_id{rp.Pop<u64>()};
  1891. const auto communication_mode{rp.PopEnum<NpadCommunicationMode>()};
  1892. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, communication_mode={}",
  1893. applet_resource_user_id, communication_mode);
  1894. // This function has been stubbed since 2.0.0+
  1895. IPC::ResponseBuilder rb{ctx, 2};
  1896. rb.Push(ResultSuccess);
  1897. }
  1898. void IHidServer::GetNpadCommunicationMode(HLERequestContext& ctx) {
  1899. IPC::RequestParser rp{ctx};
  1900. const auto applet_resource_user_id{rp.Pop<u64>()};
  1901. LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
  1902. // This function has been stubbed since 2.0.0+
  1903. IPC::ResponseBuilder rb{ctx, 4};
  1904. rb.Push(ResultSuccess);
  1905. rb.PushEnum(NpadCommunicationMode::Default);
  1906. }
  1907. void IHidServer::SetTouchScreenConfiguration(HLERequestContext& ctx) {
  1908. IPC::RequestParser rp{ctx};
  1909. auto touchscreen_config{rp.PopRaw<Core::HID::TouchScreenConfigurationForNx>()};
  1910. const auto applet_resource_user_id{rp.Pop<u64>()};
  1911. LOG_INFO(Service_HID, "called, touchscreen_config={}, applet_resource_user_id={}",
  1912. touchscreen_config.mode, applet_resource_user_id);
  1913. if (touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Heat2 &&
  1914. touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Finger) {
  1915. touchscreen_config.mode = Core::HID::TouchScreenModeForNx::UseSystemSetting;
  1916. }
  1917. const Result result = GetResourceManager()->GetTouchScreen()->SetTouchScreenConfiguration(
  1918. touchscreen_config, applet_resource_user_id);
  1919. IPC::ResponseBuilder rb{ctx, 2};
  1920. rb.Push(result);
  1921. }
  1922. void IHidServer::IsFirmwareUpdateNeededForNotification(HLERequestContext& ctx) {
  1923. IPC::RequestParser rp{ctx};
  1924. struct Parameters {
  1925. s32 unknown;
  1926. INSERT_PADDING_WORDS_NOINIT(1);
  1927. u64 applet_resource_user_id;
  1928. };
  1929. static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
  1930. const auto parameters{rp.PopRaw<Parameters>()};
  1931. LOG_WARNING(Service_HID, "(STUBBED) called, unknown={}, applet_resource_user_id={}",
  1932. parameters.unknown, parameters.applet_resource_user_id);
  1933. IPC::ResponseBuilder rb{ctx, 3};
  1934. rb.Push(ResultSuccess);
  1935. rb.Push(false);
  1936. }
  1937. void IHidServer::SetTouchScreenResolution(HLERequestContext& ctx) {
  1938. IPC::RequestParser rp{ctx};
  1939. const auto width{rp.Pop<u32>()};
  1940. const auto height{rp.Pop<u32>()};
  1941. const auto applet_resource_user_id{rp.Pop<u64>()};
  1942. LOG_INFO(Service_HID, "called, width={}, height={}, applet_resource_user_id={}", width, height,
  1943. applet_resource_user_id);
  1944. GetResourceManager()->GetTouchScreen()->SetTouchScreenResolution(width, height,
  1945. applet_resource_user_id);
  1946. IPC::ResponseBuilder rb{ctx, 2};
  1947. rb.Push(ResultSuccess);
  1948. }
  1949. std::shared_ptr<ResourceManager> IHidServer::GetResourceManager() {
  1950. resource_manager->Initialize();
  1951. return resource_manager;
  1952. }
  1953. } // namespace Service::HID