hid_server.cpp 89 KB

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