hid_server.cpp 89 KB

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