IHidServer.cs 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543
  1. using Ryujinx.Common.Logging;
  2. using Ryujinx.HLE.HOS.Ipc;
  3. using Ryujinx.HLE.HOS.Kernel.Common;
  4. using Ryujinx.HLE.HOS.Kernel.Threading;
  5. using Ryujinx.HLE.Input;
  6. using System;
  7. using System.Collections.Generic;
  8. namespace Ryujinx.HLE.HOS.Services.Hid
  9. {
  10. class IHidServer : IpcService
  11. {
  12. private Dictionary<int, ServiceProcessRequest> _commands;
  13. private KEvent _npadStyleSetUpdateEvent;
  14. private KEvent _xpadIdEvent;
  15. private KEvent _palmaOperationCompleteEvent;
  16. private int _xpadIdEventHandle;
  17. private bool _sixAxisSensorFusionEnabled;
  18. private bool _unintendedHomeButtonInputProtectionEnabled;
  19. private bool _vibrationPermitted;
  20. private bool _usbFullKeyControllerEnabled;
  21. private HidNpadJoyHoldType _npadJoyHoldType;
  22. private HidNpadStyle _npadStyleSet;
  23. private HidNpadJoyAssignmentMode _npadJoyAssignmentMode;
  24. private HidNpadHandheldActivationMode _npadHandheldActivationMode;
  25. private HidGyroscopeZeroDriftMode _gyroscopeZeroDriftMode;
  26. private long _npadCommunicationMode;
  27. private uint _accelerometerPlayMode;
  28. private long _vibrationGcErmCommand;
  29. private float _sevenSixAxisSensorFusionStrength;
  30. private HidSensorFusionParameters _sensorFusionParams;
  31. private HidAccelerometerParameters _accelerometerParams;
  32. private HidVibrationValue _vibrationValue;
  33. public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
  34. public IHidServer(Horizon system)
  35. {
  36. _commands = new Dictionary<int, ServiceProcessRequest>
  37. {
  38. { 0, CreateAppletResource },
  39. { 1, ActivateDebugPad },
  40. { 11, ActivateTouchScreen },
  41. { 21, ActivateMouse },
  42. { 31, ActivateKeyboard },
  43. { 40, AcquireXpadIdEventHandle },
  44. { 41, ReleaseXpadIdEventHandle },
  45. { 51, ActivateXpad },
  46. { 55, GetXpadIds },
  47. { 56, ActivateJoyXpad },
  48. { 58, GetJoyXpadLifoHandle },
  49. { 59, GetJoyXpadIds },
  50. { 60, ActivateSixAxisSensor },
  51. { 61, DeactivateSixAxisSensor },
  52. { 62, GetSixAxisSensorLifoHandle },
  53. { 63, ActivateJoySixAxisSensor },
  54. { 64, DeactivateJoySixAxisSensor },
  55. { 65, GetJoySixAxisSensorLifoHandle },
  56. { 66, StartSixAxisSensor },
  57. { 67, StopSixAxisSensor },
  58. { 68, IsSixAxisSensorFusionEnabled },
  59. { 69, EnableSixAxisSensorFusion },
  60. { 70, SetSixAxisSensorFusionParameters },
  61. { 71, GetSixAxisSensorFusionParameters },
  62. { 72, ResetSixAxisSensorFusionParameters },
  63. { 73, SetAccelerometerParameters },
  64. { 74, GetAccelerometerParameters },
  65. { 75, ResetAccelerometerParameters },
  66. { 76, SetAccelerometerPlayMode },
  67. { 77, GetAccelerometerPlayMode },
  68. { 78, ResetAccelerometerPlayMode },
  69. { 79, SetGyroscopeZeroDriftMode },
  70. { 80, GetGyroscopeZeroDriftMode },
  71. { 81, ResetGyroscopeZeroDriftMode },
  72. { 82, IsSixAxisSensorAtRest },
  73. { 91, ActivateGesture },
  74. { 100, SetSupportedNpadStyleSet },
  75. { 101, GetSupportedNpadStyleSet },
  76. { 102, SetSupportedNpadIdType },
  77. { 103, ActivateNpad },
  78. { 104, DeactivateNpad },
  79. { 106, AcquireNpadStyleSetUpdateEventHandle },
  80. { 107, DisconnectNpad },
  81. { 108, GetPlayerLedPattern },
  82. { 109, ActivateNpadWithRevision },
  83. { 120, SetNpadJoyHoldType },
  84. { 121, GetNpadJoyHoldType },
  85. { 122, SetNpadJoyAssignmentModeSingleByDefault },
  86. { 123, SetNpadJoyAssignmentModeSingle },
  87. { 124, SetNpadJoyAssignmentModeDual },
  88. { 125, MergeSingleJoyAsDualJoy },
  89. { 126, StartLrAssignmentMode },
  90. { 127, StopLrAssignmentMode },
  91. { 128, SetNpadHandheldActivationMode },
  92. { 129, GetNpadHandheldActivationMode },
  93. { 130, SwapNpadAssignment },
  94. { 131, IsUnintendedHomeButtonInputProtectionEnabled },
  95. { 132, EnableUnintendedHomeButtonInputProtection },
  96. { 133, SetNpadJoyAssignmentModeSingleWithDestination },
  97. { 200, GetVibrationDeviceInfo },
  98. { 201, SendVibrationValue },
  99. { 202, GetActualVibrationValue },
  100. { 203, CreateActiveVibrationDeviceList },
  101. { 204, PermitVibration },
  102. { 205, IsVibrationPermitted },
  103. { 206, SendVibrationValues },
  104. { 207, SendVibrationGcErmCommand },
  105. { 208, GetActualVibrationGcErmCommand },
  106. { 209, BeginPermitVibrationSession },
  107. { 210, EndPermitVibrationSession },
  108. { 300, ActivateConsoleSixAxisSensor },
  109. { 301, StartConsoleSixAxisSensor },
  110. { 302, StopConsoleSixAxisSensor },
  111. { 303, ActivateSevenSixAxisSensor },
  112. { 304, StartSevenSixAxisSensor },
  113. { 305, StopSevenSixAxisSensor },
  114. { 306, InitializeSevenSixAxisSensor },
  115. { 307, FinalizeSevenSixAxisSensor },
  116. { 308, SetSevenSixAxisSensorFusionStrength },
  117. { 309, GetSevenSixAxisSensorFusionStrength },
  118. { 400, IsUsbFullKeyControllerEnabled },
  119. { 401, EnableUsbFullKeyController },
  120. { 402, IsUsbFullKeyControllerConnected },
  121. { 403, HasBattery },
  122. { 404, HasLeftRightBattery },
  123. { 405, GetNpadInterfaceType },
  124. { 406, GetNpadLeftRightInterfaceType },
  125. { 500, GetPalmaConnectionHandle },
  126. { 501, InitializePalma },
  127. { 502, AcquirePalmaOperationCompleteEvent },
  128. { 503, GetPalmaOperationInfo },
  129. { 504, PlayPalmaActivity },
  130. { 505, SetPalmaFrModeType },
  131. { 506, ReadPalmaStep },
  132. { 507, EnablePalmaStep },
  133. { 508, SuspendPalmaStep },
  134. { 509, ResetPalmaStep },
  135. { 510, ReadPalmaApplicationSection },
  136. { 511, WritePalmaApplicationSection },
  137. { 512, ReadPalmaUniqueCode },
  138. { 513, SetPalmaUniqueCodeInvalid },
  139. { 1000, SetNpadCommunicationMode },
  140. { 1001, GetNpadCommunicationMode }
  141. };
  142. _npadStyleSetUpdateEvent = new KEvent(system);
  143. _xpadIdEvent = new KEvent(system);
  144. _palmaOperationCompleteEvent = new KEvent(system);
  145. _npadJoyHoldType = HidNpadJoyHoldType.Vertical;
  146. _npadStyleSet = HidNpadStyle.FullKey | HidNpadStyle.Dual | HidNpadStyle.Left | HidNpadStyle.Right | HidNpadStyle.Handheld;
  147. _npadJoyAssignmentMode = HidNpadJoyAssignmentMode.Dual;
  148. _npadHandheldActivationMode = HidNpadHandheldActivationMode.Dual;
  149. _gyroscopeZeroDriftMode = HidGyroscopeZeroDriftMode.Standard;
  150. _sensorFusionParams = new HidSensorFusionParameters();
  151. _accelerometerParams = new HidAccelerometerParameters();
  152. _vibrationValue = new HidVibrationValue();
  153. // TODO: signal event at right place
  154. _xpadIdEvent.ReadableEvent.Signal();
  155. }
  156. // CreateAppletResource(nn::applet::AppletResourceUserId) -> object<nn::hid::IAppletResource>
  157. public long CreateAppletResource(ServiceCtx context)
  158. {
  159. long appletResourceUserId = context.RequestData.ReadInt64();
  160. MakeObject(context, new IAppletResource(context.Device.System.HidSharedMem));
  161. return 0;
  162. }
  163. // ActivateDebugPad(nn::applet::AppletResourceUserId)
  164. public long ActivateDebugPad(ServiceCtx context)
  165. {
  166. long appletResourceUserId = context.RequestData.ReadInt64();
  167. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  168. return 0;
  169. }
  170. // ActivateTouchScreen(nn::applet::AppletResourceUserId)
  171. public long ActivateTouchScreen(ServiceCtx context)
  172. {
  173. long appletResourceUserId = context.RequestData.ReadInt64();
  174. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  175. return 0;
  176. }
  177. // ActivateMouse(nn::applet::AppletResourceUserId)
  178. public long ActivateMouse(ServiceCtx context)
  179. {
  180. long appletResourceUserId = context.RequestData.ReadInt64();
  181. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  182. return 0;
  183. }
  184. // ActivateKeyboard(nn::applet::AppletResourceUserId)
  185. public long ActivateKeyboard(ServiceCtx context)
  186. {
  187. long appletResourceUserId = context.RequestData.ReadInt64();
  188. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  189. return 0;
  190. }
  191. // AcquireXpadIdEventHandle(ulong XpadId) -> nn::sf::NativeHandle
  192. public long AcquireXpadIdEventHandle(ServiceCtx context)
  193. {
  194. long xpadId = context.RequestData.ReadInt64();
  195. if (context.Process.HandleTable.GenerateHandle(_xpadIdEvent.ReadableEvent, out _xpadIdEventHandle) != KernelResult.Success)
  196. {
  197. throw new InvalidOperationException("Out of handles!");
  198. }
  199. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_xpadIdEventHandle);
  200. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. XpadId: {xpadId}");
  201. return 0;
  202. }
  203. // ReleaseXpadIdEventHandle(ulong XpadId)
  204. public long ReleaseXpadIdEventHandle(ServiceCtx context)
  205. {
  206. long xpadId = context.RequestData.ReadInt64();
  207. context.Process.HandleTable.CloseHandle(_xpadIdEventHandle);
  208. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. XpadId: {xpadId}");
  209. return 0;
  210. }
  211. // ActivateXpad(nn::hid::BasicXpadId, nn::applet::AppletResourceUserId)
  212. public long ActivateXpad(ServiceCtx context)
  213. {
  214. int basicXpadId = context.RequestData.ReadInt32();
  215. long appletResourceUserId = context.RequestData.ReadInt64();
  216. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  217. $"BasicXpadId: {basicXpadId}");
  218. return 0;
  219. }
  220. // GetXpadIds() -> long IdsCount, buffer<array<nn::hid::BasicXpadId>, type: 0xa>
  221. public long GetXpadIds(ServiceCtx context)
  222. {
  223. // There is any Xpad, so we return 0 and write nothing inside the type-0xa buffer.
  224. context.ResponseData.Write(0L);
  225. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed.");
  226. return 0;
  227. }
  228. // ActivateJoyXpad(nn::hid::JoyXpadId)
  229. public long ActivateJoyXpad(ServiceCtx context)
  230. {
  231. int joyXpadId = context.RequestData.ReadInt32();
  232. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. JoyXpadId: {joyXpadId}");
  233. return 0;
  234. }
  235. // GetJoyXpadLifoHandle(nn::hid::JoyXpadId) -> nn::sf::NativeHandle
  236. public long GetJoyXpadLifoHandle(ServiceCtx context)
  237. {
  238. int joyXpadId = context.RequestData.ReadInt32();
  239. int handle = 0;
  240. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
  241. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. JoyXpadId: {joyXpadId}");
  242. return 0;
  243. }
  244. // GetJoyXpadIds() -> long IdsCount, buffer<array<nn::hid::JoyXpadId>, type: 0xa>
  245. public long GetJoyXpadIds(ServiceCtx context)
  246. {
  247. // There is any JoyXpad, so we return 0 and write nothing inside the type-0xa buffer.
  248. context.ResponseData.Write(0L);
  249. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed.");
  250. return 0;
  251. }
  252. // ActivateSixAxisSensor(nn::hid::BasicXpadId)
  253. public long ActivateSixAxisSensor(ServiceCtx context)
  254. {
  255. int basicXpadId = context.RequestData.ReadInt32();
  256. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. BasicXpadId: {basicXpadId}");
  257. return 0;
  258. }
  259. // DeactivateSixAxisSensor(nn::hid::BasicXpadId)
  260. public long DeactivateSixAxisSensor(ServiceCtx context)
  261. {
  262. int basicXpadId = context.RequestData.ReadInt32();
  263. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. BasicXpadId: {basicXpadId}");
  264. return 0;
  265. }
  266. // GetSixAxisSensorLifoHandle(nn::hid::BasicXpadId) -> nn::sf::NativeHandle
  267. public long GetSixAxisSensorLifoHandle(ServiceCtx context)
  268. {
  269. int basicXpadId = context.RequestData.ReadInt32();
  270. int handle = 0;
  271. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
  272. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. BasicXpadId: {basicXpadId}");
  273. return 0;
  274. }
  275. // ActivateJoySixAxisSensor(nn::hid::JoyXpadId)
  276. public long ActivateJoySixAxisSensor(ServiceCtx context)
  277. {
  278. int joyXpadId = context.RequestData.ReadInt32();
  279. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. JoyXpadId: {joyXpadId}");
  280. return 0;
  281. }
  282. // DeactivateJoySixAxisSensor(nn::hid::JoyXpadId)
  283. public long DeactivateJoySixAxisSensor(ServiceCtx context)
  284. {
  285. int joyXpadId = context.RequestData.ReadInt32();
  286. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. JoyXpadId: {joyXpadId}");
  287. return 0;
  288. }
  289. // GetJoySixAxisSensorLifoHandle(nn::hid::JoyXpadId) -> nn::sf::NativeHandle
  290. public long GetJoySixAxisSensorLifoHandle(ServiceCtx context)
  291. {
  292. int joyXpadId = context.RequestData.ReadInt32();
  293. int handle = 0;
  294. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
  295. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. JoyXpadId: {joyXpadId}");
  296. return 0;
  297. }
  298. // StartSixAxisSensor(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId)
  299. public long StartSixAxisSensor(ServiceCtx context)
  300. {
  301. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  302. long appletResourceUserId = context.RequestData.ReadInt64();
  303. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  304. $"SixAxisSensorHandle: {sixAxisSensorHandle}");
  305. return 0;
  306. }
  307. // StopSixAxisSensor(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId)
  308. public long StopSixAxisSensor(ServiceCtx context)
  309. {
  310. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  311. long appletResourceUserId = context.RequestData.ReadInt64();
  312. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  313. $"SixAxisSensorHandle: {sixAxisSensorHandle}");
  314. return 0;
  315. }
  316. // IsSixAxisSensorFusionEnabled(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> bool IsEnabled
  317. public long IsSixAxisSensorFusionEnabled(ServiceCtx context)
  318. {
  319. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  320. long appletResourceUserId = context.RequestData.ReadInt64();
  321. context.ResponseData.Write(_sixAxisSensorFusionEnabled);
  322. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  323. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  324. $"SixAxisSensorFusionEnabled: {_sixAxisSensorFusionEnabled}");
  325. return 0;
  326. }
  327. // EnableSixAxisSensorFusion(bool Enabled, nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId)
  328. public long EnableSixAxisSensorFusion(ServiceCtx context)
  329. {
  330. _sixAxisSensorFusionEnabled = context.RequestData.ReadBoolean();
  331. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  332. long appletResourceUserId = context.RequestData.ReadInt64();
  333. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  334. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  335. $"SixAxisSensorFusionEnabled: {_sixAxisSensorFusionEnabled}");
  336. return 0;
  337. }
  338. // SetSixAxisSensorFusionParameters(nn::hid::SixAxisSensorHandle, float RevisePower, float ReviseRange, nn::applet::AppletResourceUserId)
  339. public long SetSixAxisSensorFusionParameters(ServiceCtx context)
  340. {
  341. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  342. _sensorFusionParams = new HidSensorFusionParameters
  343. {
  344. RevisePower = context.RequestData.ReadInt32(),
  345. ReviseRange = context.RequestData.ReadInt32()
  346. };
  347. long appletResourceUserId = context.RequestData.ReadInt64();
  348. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  349. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  350. $"RevisePower: {_sensorFusionParams.RevisePower} - " +
  351. $"ReviseRange: {_sensorFusionParams.ReviseRange}");
  352. return 0;
  353. }
  354. // GetSixAxisSensorFusionParameters(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> float RevisePower, float ReviseRange)
  355. public long GetSixAxisSensorFusionParameters(ServiceCtx context)
  356. {
  357. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  358. long appletResourceUserId = context.RequestData.ReadInt64();
  359. context.ResponseData.Write(_sensorFusionParams.RevisePower);
  360. context.ResponseData.Write(_sensorFusionParams.ReviseRange);
  361. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  362. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  363. $"RevisePower: {_sensorFusionParams.RevisePower} - " +
  364. $"ReviseRange: {_sensorFusionParams.ReviseRange}");
  365. return 0;
  366. }
  367. // ResetSixAxisSensorFusionParameters(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId)
  368. public long ResetSixAxisSensorFusionParameters(ServiceCtx context)
  369. {
  370. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  371. long appletResourceUserId = context.RequestData.ReadInt64();
  372. _sensorFusionParams.RevisePower = 0;
  373. _sensorFusionParams.ReviseRange = 0;
  374. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  375. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  376. $"RevisePower: {_sensorFusionParams.RevisePower} - " +
  377. $"ReviseRange: {_sensorFusionParams.ReviseRange}");
  378. return 0;
  379. }
  380. // SetAccelerometerParameters(nn::hid::SixAxisSensorHandle, float X, float Y, nn::applet::AppletResourceUserId)
  381. public long SetAccelerometerParameters(ServiceCtx context)
  382. {
  383. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  384. _accelerometerParams = new HidAccelerometerParameters
  385. {
  386. X = context.RequestData.ReadInt32(),
  387. Y = context.RequestData.ReadInt32()
  388. };
  389. long appletResourceUserId = context.RequestData.ReadInt64();
  390. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  391. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  392. $"X: {_accelerometerParams.X} - " +
  393. $"Y: {_accelerometerParams.Y}");
  394. return 0;
  395. }
  396. // GetAccelerometerParameters(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> float X, float Y
  397. public long GetAccelerometerParameters(ServiceCtx context)
  398. {
  399. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  400. long appletResourceUserId = context.RequestData.ReadInt64();
  401. context.ResponseData.Write(_accelerometerParams.X);
  402. context.ResponseData.Write(_accelerometerParams.Y);
  403. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  404. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  405. $"X: {_accelerometerParams.X} - " +
  406. $"Y: {_accelerometerParams.Y}");
  407. return 0;
  408. }
  409. // ResetAccelerometerParameters(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId)
  410. public long ResetAccelerometerParameters(ServiceCtx context)
  411. {
  412. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  413. long appletResourceUserId = context.RequestData.ReadInt64();
  414. _accelerometerParams.X = 0;
  415. _accelerometerParams.Y = 0;
  416. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  417. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  418. $"X: {_accelerometerParams.X} - " +
  419. $"Y: {_accelerometerParams.Y}");
  420. return 0;
  421. }
  422. // SetAccelerometerPlayMode(nn::hid::SixAxisSensorHandle, uint PlayMode, nn::applet::AppletResourceUserId)
  423. public long SetAccelerometerPlayMode(ServiceCtx context)
  424. {
  425. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  426. _accelerometerPlayMode = context.RequestData.ReadUInt32();
  427. long appletResourceUserId = context.RequestData.ReadInt64();
  428. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  429. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  430. $"PlayMode: {_accelerometerPlayMode}");
  431. return 0;
  432. }
  433. // GetAccelerometerPlayMode(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> uint PlayMode
  434. public long GetAccelerometerPlayMode(ServiceCtx context)
  435. {
  436. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  437. long appletResourceUserId = context.RequestData.ReadInt64();
  438. context.ResponseData.Write(_accelerometerPlayMode);
  439. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  440. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  441. $"PlayMode: {_accelerometerPlayMode}");
  442. return 0;
  443. }
  444. // ResetAccelerometerPlayMode(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId)
  445. public long ResetAccelerometerPlayMode(ServiceCtx context)
  446. {
  447. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  448. long appletResourceUserId = context.RequestData.ReadInt64();
  449. _accelerometerPlayMode = 0;
  450. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  451. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  452. $"PlayMode: {_accelerometerPlayMode}");
  453. return 0;
  454. }
  455. // SetGyroscopeZeroDriftMode(nn::hid::SixAxisSensorHandle, uint GyroscopeZeroDriftMode, nn::applet::AppletResourceUserId)
  456. public long SetGyroscopeZeroDriftMode(ServiceCtx context)
  457. {
  458. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  459. _gyroscopeZeroDriftMode = (HidGyroscopeZeroDriftMode)context.RequestData.ReadInt32();
  460. long appletResourceUserId = context.RequestData.ReadInt64();
  461. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  462. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  463. $"GyroscopeZeroDriftMode: {_gyroscopeZeroDriftMode}");
  464. return 0;
  465. }
  466. // GetGyroscopeZeroDriftMode(nn::applet::AppletResourceUserId, nn::hid::SixAxisSensorHandle) -> int GyroscopeZeroDriftMode
  467. public long GetGyroscopeZeroDriftMode(ServiceCtx context)
  468. {
  469. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  470. long appletResourceUserId = context.RequestData.ReadInt64();
  471. context.ResponseData.Write((int)_gyroscopeZeroDriftMode);
  472. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  473. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  474. $"GyroscopeZeroDriftMode: {_gyroscopeZeroDriftMode}");
  475. return 0;
  476. }
  477. // ResetGyroscopeZeroDriftMode(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId)
  478. public long ResetGyroscopeZeroDriftMode(ServiceCtx context)
  479. {
  480. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  481. long appletResourceUserId = context.RequestData.ReadInt64();
  482. _gyroscopeZeroDriftMode = HidGyroscopeZeroDriftMode.Standard;
  483. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  484. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  485. $"GyroscopeZeroDriftMode: {_gyroscopeZeroDriftMode}");
  486. return 0;
  487. }
  488. // IsSixAxisSensorAtRest(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> bool IsAsRest
  489. public long IsSixAxisSensorAtRest(ServiceCtx context)
  490. {
  491. int sixAxisSensorHandle = context.RequestData.ReadInt32();
  492. long appletResourceUserId = context.RequestData.ReadInt64();
  493. bool isAtRest = true;
  494. context.ResponseData.Write(isAtRest);
  495. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  496. $"SixAxisSensorHandle: {sixAxisSensorHandle} - " +
  497. $"IsAtRest: {isAtRest}");
  498. return 0;
  499. }
  500. // ActivateGesture(nn::applet::AppletResourceUserId, int Unknown0)
  501. public long ActivateGesture(ServiceCtx context)
  502. {
  503. long appletResourceUserId = context.RequestData.ReadInt64();
  504. int unknown0 = context.RequestData.ReadInt32();
  505. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  506. $"Unknown0: {unknown0}");
  507. return 0;
  508. }
  509. // SetSupportedNpadStyleSet(nn::applet::AppletResourceUserId, nn::hid::NpadStyleTag)
  510. public long SetSupportedNpadStyleSet(ServiceCtx context)
  511. {
  512. _npadStyleSet = (HidNpadStyle)context.RequestData.ReadInt32();
  513. long appletResourceUserId = context.RequestData.ReadInt64();
  514. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  515. $"NpadStyleSet: {_npadStyleSet}");
  516. _npadStyleSetUpdateEvent.ReadableEvent.Signal();
  517. return 0;
  518. }
  519. // GetSupportedNpadStyleSet(nn::applet::AppletResourceUserId) -> uint nn::hid::NpadStyleTag
  520. public long GetSupportedNpadStyleSet(ServiceCtx context)
  521. {
  522. long appletResourceUserId = context.RequestData.ReadInt64();
  523. context.ResponseData.Write((int)_npadStyleSet);
  524. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  525. $"NpadStyleSet: {_npadStyleSet}");
  526. return 0;
  527. }
  528. // SetSupportedNpadIdType(nn::applet::AppletResourceUserId, array<NpadIdType, 9>)
  529. public long SetSupportedNpadIdType(ServiceCtx context)
  530. {
  531. long appletResourceUserId = context.RequestData.ReadInt64();
  532. HidControllerId npadIdType = (HidControllerId)context.RequestData.ReadInt64();
  533. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  534. $"NpadIdType: {npadIdType}");
  535. return 0;
  536. }
  537. // ActivateNpad(nn::applet::AppletResourceUserId)
  538. public long ActivateNpad(ServiceCtx context)
  539. {
  540. long appletResourceUserId = context.RequestData.ReadInt64();
  541. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  542. return 0;
  543. }
  544. // DeactivateNpad(nn::applet::AppletResourceUserId)
  545. public long DeactivateNpad(ServiceCtx context)
  546. {
  547. long appletResourceUserId = context.RequestData.ReadInt64();
  548. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  549. return 0;
  550. }
  551. // AcquireNpadStyleSetUpdateEventHandle(nn::applet::AppletResourceUserId, uint, ulong) -> nn::sf::NativeHandle
  552. public long AcquireNpadStyleSetUpdateEventHandle(ServiceCtx context)
  553. {
  554. long appletResourceUserId = context.RequestData.ReadInt64();
  555. int npadId = context.RequestData.ReadInt32();
  556. long npadStyleSet = context.RequestData.ReadInt64();
  557. if (context.Process.HandleTable.GenerateHandle(_npadStyleSetUpdateEvent.ReadableEvent, out int handle) != KernelResult.Success)
  558. {
  559. throw new InvalidOperationException("Out of handles!");
  560. }
  561. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
  562. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  563. $"NpadId: {npadId} - " +
  564. $"NpadStyleSet: {npadStyleSet}");
  565. return 0;
  566. }
  567. // DisconnectNpad(nn::applet::AppletResourceUserId, uint NpadIdType)
  568. public long DisconnectNpad(ServiceCtx context)
  569. {
  570. long appletResourceUserId = context.RequestData.ReadInt64();
  571. int npadIdType = context.RequestData.ReadInt32();
  572. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  573. $"NpadIdType: {npadIdType}");
  574. return 0;
  575. }
  576. // GetPlayerLedPattern(uint NpadId) -> ulong LedPattern
  577. public long GetPlayerLedPattern(ServiceCtx context)
  578. {
  579. int npadId = context.RequestData.ReadInt32();
  580. long ledPattern = 0;
  581. context.ResponseData.Write(ledPattern);
  582. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. NpadId: {npadId} - Pattern: {ledPattern}");
  583. return 0;
  584. }
  585. // ActivateNpadWithRevision(nn::applet::AppletResourceUserId, int Unknown)
  586. public long ActivateNpadWithRevision(ServiceCtx context)
  587. {
  588. long appletResourceUserId = context.RequestData.ReadInt64();
  589. int unknown = context.RequestData.ReadInt32();
  590. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - Unknown: {unknown}");
  591. return 0;
  592. }
  593. // SetNpadJoyHoldType(nn::applet::AppletResourceUserId, long NpadJoyHoldType)
  594. public long SetNpadJoyHoldType(ServiceCtx context)
  595. {
  596. long appletResourceUserId = context.RequestData.ReadInt64();
  597. _npadJoyHoldType = (HidNpadJoyHoldType)context.RequestData.ReadInt64();
  598. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  599. $"NpadJoyHoldType: {_npadJoyHoldType}");
  600. return 0;
  601. }
  602. // GetNpadJoyHoldType(nn::applet::AppletResourceUserId) -> long NpadJoyHoldType
  603. public long GetNpadJoyHoldType(ServiceCtx context)
  604. {
  605. long appletResourceUserId = context.RequestData.ReadInt64();
  606. context.ResponseData.Write((long)_npadJoyHoldType);
  607. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  608. $"NpadJoyHoldTypeValue: {_npadJoyHoldType}");
  609. return 0;
  610. }
  611. // SetNpadJoyAssignmentModeSingleByDefault(uint HidControllerId, nn::applet::AppletResourceUserId)
  612. public long SetNpadJoyAssignmentModeSingleByDefault(ServiceCtx context)
  613. {
  614. HidControllerId hidControllerId = (HidControllerId)context.RequestData.ReadInt32();
  615. long appletResourceUserId = context.RequestData.ReadInt64();
  616. _npadJoyAssignmentMode = HidNpadJoyAssignmentMode.Single;
  617. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  618. $"HidControllerId: {hidControllerId} - " +
  619. $"NpadJoyAssignmentModeValue: {_npadJoyAssignmentMode}");
  620. return 0;
  621. }
  622. // SetNpadJoyAssignmentModeSingle(uint HidControllerId, nn::applet::AppletResourceUserId, long HidNpadJoyDeviceType)
  623. public long SetNpadJoyAssignmentModeSingle(ServiceCtx context)
  624. {
  625. HidControllerId hidControllerId = (HidControllerId)context.RequestData.ReadInt32();
  626. long appletResourceUserId = context.RequestData.ReadInt64();
  627. HidNpadJoyDeviceType hidNpadJoyDeviceType = (HidNpadJoyDeviceType)context.RequestData.ReadInt64();
  628. _npadJoyAssignmentMode = HidNpadJoyAssignmentMode.Single;
  629. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  630. $"HidControllerId: {hidControllerId} - " +
  631. $"HidNpadJoyDeviceType: {hidNpadJoyDeviceType} - " +
  632. $"NpadJoyAssignmentModeValue: {_npadJoyAssignmentMode}");
  633. return 0;
  634. }
  635. // SetNpadJoyAssignmentModeDual(uint HidControllerId, nn::applet::AppletResourceUserId)
  636. public long SetNpadJoyAssignmentModeDual(ServiceCtx context)
  637. {
  638. HidControllerId hidControllerId = (HidControllerId)context.RequestData.ReadInt32();
  639. long appletResourceUserId = context.RequestData.ReadInt64();
  640. _npadJoyAssignmentMode = HidNpadJoyAssignmentMode.Dual;
  641. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  642. $"HidControllerId: {hidControllerId} - " +
  643. $"NpadJoyAssignmentModeValue: {_npadJoyAssignmentMode}");
  644. return 0;
  645. }
  646. // MergeSingleJoyAsDualJoy(uint SingleJoyId0, uint SingleJoyId1, nn::applet::AppletResourceUserId)
  647. public long MergeSingleJoyAsDualJoy(ServiceCtx context)
  648. {
  649. long singleJoyId0 = context.RequestData.ReadInt32();
  650. long singleJoyId1 = context.RequestData.ReadInt32();
  651. long appletResourceUserId = context.RequestData.ReadInt64();
  652. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  653. $"SingleJoyId0: {singleJoyId0} - " +
  654. $"SingleJoyId1: {singleJoyId1}");
  655. return 0;
  656. }
  657. // StartLrAssignmentMode(nn::applet::AppletResourceUserId)
  658. public long StartLrAssignmentMode(ServiceCtx context)
  659. {
  660. long appletResourceUserId = context.RequestData.ReadInt64();
  661. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  662. return 0;
  663. }
  664. // StopLrAssignmentMode(nn::applet::AppletResourceUserId)
  665. public long StopLrAssignmentMode(ServiceCtx context)
  666. {
  667. long appletResourceUserId = context.RequestData.ReadInt64();
  668. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  669. return 0;
  670. }
  671. // SetNpadHandheldActivationMode(nn::applet::AppletResourceUserId, long HidNpadHandheldActivationMode)
  672. public long SetNpadHandheldActivationMode(ServiceCtx context)
  673. {
  674. long appletResourceUserId = context.RequestData.ReadInt64();
  675. _npadHandheldActivationMode = (HidNpadHandheldActivationMode)context.RequestData.ReadInt64();
  676. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  677. $"NpadHandheldActivationMode: {_npadHandheldActivationMode}");
  678. return 0;
  679. }
  680. // GetNpadHandheldActivationMode(nn::applet::AppletResourceUserId) -> long HidNpadHandheldActivationMode
  681. public long GetNpadHandheldActivationMode(ServiceCtx context)
  682. {
  683. long appletResourceUserId = context.RequestData.ReadInt64();
  684. context.ResponseData.Write((long)_npadHandheldActivationMode);
  685. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  686. $"NpadHandheldActivationMode: {_npadHandheldActivationMode}");
  687. return 0;
  688. }
  689. // SwapNpadAssignment(uint OldNpadAssignment, uint NewNpadAssignment, nn::applet::AppletResourceUserId)
  690. public long SwapNpadAssignment(ServiceCtx context)
  691. {
  692. int oldNpadAssignment = context.RequestData.ReadInt32();
  693. int newNpadAssignment = context.RequestData.ReadInt32();
  694. long appletResourceUserId = context.RequestData.ReadInt64();
  695. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  696. $"OldNpadAssignment: {oldNpadAssignment} - " +
  697. $"NewNpadAssignment: {newNpadAssignment}");
  698. return 0;
  699. }
  700. // IsUnintendedHomeButtonInputProtectionEnabled(uint Unknown0, nn::applet::AppletResourceUserId) -> bool IsEnabled
  701. public long IsUnintendedHomeButtonInputProtectionEnabled(ServiceCtx context)
  702. {
  703. uint unknown0 = context.RequestData.ReadUInt32();
  704. long appletResourceUserId = context.RequestData.ReadInt64();
  705. context.ResponseData.Write(_unintendedHomeButtonInputProtectionEnabled);
  706. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  707. $"Unknown0: {unknown0} - " +
  708. $"UnintendedHomeButtonInputProtectionEnabled: {_unintendedHomeButtonInputProtectionEnabled}");
  709. return 0;
  710. }
  711. // EnableUnintendedHomeButtonInputProtection(bool Enable, uint Unknown0, nn::applet::AppletResourceUserId)
  712. public long EnableUnintendedHomeButtonInputProtection(ServiceCtx context)
  713. {
  714. _unintendedHomeButtonInputProtectionEnabled = context.RequestData.ReadBoolean();
  715. uint unknown0 = context.RequestData.ReadUInt32();
  716. long appletResourceUserId = context.RequestData.ReadInt64();
  717. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  718. $"Unknown0: {unknown0} - " +
  719. $"UnintendedHomeButtonInputProtectionEnable: {_unintendedHomeButtonInputProtectionEnabled}");
  720. return 0;
  721. }
  722. // SetNpadJoyAssignmentModeSingleWithDestination(uint HidControllerId, long HidNpadJoyDeviceType, nn::applet::AppletResourceUserId) -> bool Unknown0, uint Unknown1
  723. public long SetNpadJoyAssignmentModeSingleWithDestination(ServiceCtx context)
  724. {
  725. HidControllerId hidControllerId = (HidControllerId)context.RequestData.ReadInt32();
  726. HidNpadJoyDeviceType hidNpadJoyDeviceType = (HidNpadJoyDeviceType)context.RequestData.ReadInt64();
  727. long appletResourceUserId = context.RequestData.ReadInt64();
  728. _npadJoyAssignmentMode = HidNpadJoyAssignmentMode.Single;
  729. context.ResponseData.Write(0); //Unknown0
  730. context.ResponseData.Write(0); //Unknown1
  731. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  732. $"HidControllerId: {hidControllerId} - " +
  733. $"HidNpadJoyDeviceType: {hidNpadJoyDeviceType} - " +
  734. $"NpadJoyAssignmentModeValue: {_npadJoyAssignmentMode} - " +
  735. $"Unknown0: 0 - " +
  736. $"Unknown1: 0");
  737. return 0;
  738. }
  739. // GetVibrationDeviceInfo(nn::hid::VibrationDeviceHandle) -> nn::hid::VibrationDeviceInfo
  740. public long GetVibrationDeviceInfo(ServiceCtx context)
  741. {
  742. int vibrationDeviceHandle = context.RequestData.ReadInt32();
  743. HidVibrationDeviceValue deviceInfo = new HidVibrationDeviceValue
  744. {
  745. DeviceType = HidVibrationDeviceType.None,
  746. Position = HidVibrationDevicePosition.None
  747. };
  748. context.ResponseData.Write((int)deviceInfo.DeviceType);
  749. context.ResponseData.Write((int)deviceInfo.Position);
  750. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. VibrationDeviceHandle: {vibrationDeviceHandle} - " +
  751. $"DeviceType: {deviceInfo.DeviceType} - " +
  752. $"Position: {deviceInfo.Position}");
  753. return 0;
  754. }
  755. // SendVibrationValue(nn::hid::VibrationDeviceHandle, nn::hid::VibrationValue, nn::applet::AppletResourceUserId)
  756. public long SendVibrationValue(ServiceCtx context)
  757. {
  758. int vibrationDeviceHandle = context.RequestData.ReadInt32();
  759. _vibrationValue = new HidVibrationValue
  760. {
  761. AmplitudeLow = context.RequestData.ReadSingle(),
  762. FrequencyLow = context.RequestData.ReadSingle(),
  763. AmplitudeHigh = context.RequestData.ReadSingle(),
  764. FrequencyHigh = context.RequestData.ReadSingle()
  765. };
  766. long appletResourceUserId = context.RequestData.ReadInt64();
  767. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  768. $"VibrationDeviceHandle: {vibrationDeviceHandle} - " +
  769. $"AmplitudeLow: {_vibrationValue.AmplitudeLow} - " +
  770. $"FrequencyLow: {_vibrationValue.FrequencyLow} - " +
  771. $"AmplitudeHigh: {_vibrationValue.AmplitudeHigh} - " +
  772. $"FrequencyHigh: {_vibrationValue.FrequencyHigh}");
  773. return 0;
  774. }
  775. // GetActualVibrationValue(nn::hid::VibrationDeviceHandle, nn::applet::AppletResourceUserId) -> nn::hid::VibrationValue
  776. public long GetActualVibrationValue(ServiceCtx context)
  777. {
  778. int vibrationDeviceHandle = context.RequestData.ReadInt32();
  779. long appletResourceUserId = context.RequestData.ReadInt64();
  780. context.ResponseData.Write(_vibrationValue.AmplitudeLow);
  781. context.ResponseData.Write(_vibrationValue.FrequencyLow);
  782. context.ResponseData.Write(_vibrationValue.AmplitudeHigh);
  783. context.ResponseData.Write(_vibrationValue.FrequencyHigh);
  784. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  785. $"VibrationDeviceHandle: {vibrationDeviceHandle} - " +
  786. $"AmplitudeLow: {_vibrationValue.AmplitudeLow} - " +
  787. $"FrequencyLow: {_vibrationValue.FrequencyLow} - " +
  788. $"AmplitudeHigh: {_vibrationValue.AmplitudeHigh} - " +
  789. $"FrequencyHigh: {_vibrationValue.FrequencyHigh}");
  790. return 0;
  791. }
  792. // CreateActiveVibrationDeviceList() -> object<nn::hid::IActiveVibrationDeviceList>
  793. public long CreateActiveVibrationDeviceList(ServiceCtx context)
  794. {
  795. MakeObject(context, new IActiveApplicationDeviceList());
  796. return 0;
  797. }
  798. // PermitVibration(bool Enable)
  799. public long PermitVibration(ServiceCtx context)
  800. {
  801. _vibrationPermitted = context.RequestData.ReadBoolean();
  802. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. VibrationPermitted: {_vibrationPermitted}");
  803. return 0;
  804. }
  805. // IsVibrationPermitted() -> bool IsEnabled
  806. public long IsVibrationPermitted(ServiceCtx context)
  807. {
  808. context.ResponseData.Write(_vibrationPermitted);
  809. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. VibrationPermitted: {_vibrationPermitted}");
  810. return 0;
  811. }
  812. // SendVibrationValues(nn::applet::AppletResourceUserId, buffer<array<nn::hid::VibrationDeviceHandle>, type: 9>, buffer<array<nn::hid::VibrationValue>, type: 9>)
  813. public long SendVibrationValues(ServiceCtx context)
  814. {
  815. long appletResourceUserId = context.RequestData.ReadInt64();
  816. byte[] vibrationDeviceHandleBuffer = context.Memory.ReadBytes(
  817. context.Request.PtrBuff[0].Position,
  818. context.Request.PtrBuff[0].Size);
  819. byte[] vibrationValueBuffer = context.Memory.ReadBytes(
  820. context.Request.PtrBuff[1].Position,
  821. context.Request.PtrBuff[1].Size);
  822. //Todo: Read all handles and values from buffer.
  823. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  824. $"VibrationDeviceHandleBufferLength: {vibrationDeviceHandleBuffer.Length} - " +
  825. $"VibrationValueBufferLength: {vibrationValueBuffer.Length}");
  826. return 0;
  827. }
  828. // SendVibrationGcErmCommand(nn::hid::VibrationDeviceHandle, nn::hid::VibrationGcErmCommand, nn::applet::AppletResourceUserId)
  829. public long SendVibrationGcErmCommand(ServiceCtx context)
  830. {
  831. int vibrationDeviceHandle = context.RequestData.ReadInt32();
  832. long vibrationGcErmCommand = context.RequestData.ReadInt64();
  833. long appletResourceUserId = context.RequestData.ReadInt64();
  834. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  835. $"VibrationDeviceHandle: {vibrationDeviceHandle} - " +
  836. $"VibrationGcErmCommand: {vibrationGcErmCommand}");
  837. return 0;
  838. }
  839. // GetActualVibrationGcErmCommand(nn::hid::VibrationDeviceHandle, nn::applet::AppletResourceUserId) -> nn::hid::VibrationGcErmCommand
  840. public long GetActualVibrationGcErmCommand(ServiceCtx context)
  841. {
  842. int vibrationDeviceHandle = context.RequestData.ReadInt32();
  843. long appletResourceUserId = context.RequestData.ReadInt64();
  844. context.ResponseData.Write(_vibrationGcErmCommand);
  845. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  846. $"VibrationDeviceHandle: {vibrationDeviceHandle} - " +
  847. $"VibrationGcErmCommand: {_vibrationGcErmCommand}");
  848. return 0;
  849. }
  850. // BeginPermitVibrationSession(nn::applet::AppletResourceUserId)
  851. public long BeginPermitVibrationSession(ServiceCtx context)
  852. {
  853. long appletResourceUserId = context.RequestData.ReadInt64();
  854. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  855. return 0;
  856. }
  857. // EndPermitVibrationSession()
  858. public long EndPermitVibrationSession(ServiceCtx context)
  859. {
  860. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed.");
  861. return 0;
  862. }
  863. // ActivateConsoleSixAxisSensor(nn::applet::AppletResourceUserId)
  864. public long ActivateConsoleSixAxisSensor(ServiceCtx context)
  865. {
  866. long appletResourceUserId = context.RequestData.ReadInt64();
  867. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  868. return 0;
  869. }
  870. // StartConsoleSixAxisSensor(nn::hid::ConsoleSixAxisSensorHandle, nn::applet::AppletResourceUserId)
  871. public long StartConsoleSixAxisSensor(ServiceCtx context)
  872. {
  873. int consoleSixAxisSensorHandle = context.RequestData.ReadInt32();
  874. long appletResourceUserId = context.RequestData.ReadInt64();
  875. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  876. $"ConsoleSixAxisSensorHandle: {consoleSixAxisSensorHandle}");
  877. return 0;
  878. }
  879. // StopConsoleSixAxisSensor(nn::hid::ConsoleSixAxisSensorHandle, nn::applet::AppletResourceUserId)
  880. public long StopConsoleSixAxisSensor(ServiceCtx context)
  881. {
  882. int consoleSixAxisSensorHandle = context.RequestData.ReadInt32();
  883. long appletResourceUserId = context.RequestData.ReadInt64();
  884. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  885. $"ConsoleSixAxisSensorHandle: {consoleSixAxisSensorHandle}");
  886. return 0;
  887. }
  888. // ActivateSevenSixAxisSensor(nn::applet::AppletResourceUserId)
  889. public long ActivateSevenSixAxisSensor(ServiceCtx context)
  890. {
  891. long appletResourceUserId = context.RequestData.ReadInt64();
  892. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  893. return 0;
  894. }
  895. // StartSevenSixAxisSensor(nn::applet::AppletResourceUserId)
  896. public long StartSevenSixAxisSensor(ServiceCtx context)
  897. {
  898. long appletResourceUserId = context.RequestData.ReadInt64();
  899. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  900. return 0;
  901. }
  902. // StopSevenSixAxisSensor(nn::applet::AppletResourceUserId)
  903. public long StopSevenSixAxisSensor(ServiceCtx context)
  904. {
  905. long appletResourceUserId = context.RequestData.ReadInt64();
  906. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  907. return 0;
  908. }
  909. // InitializeSevenSixAxisSensor(array<nn::sf::NativeHandle>, ulong Counter0, array<nn::sf::NativeHandle>, ulong Counter1, nn::applet::AppletResourceUserId)
  910. public long InitializeSevenSixAxisSensor(ServiceCtx context)
  911. {
  912. long appletResourceUserId = context.RequestData.ReadInt64();
  913. long counter0 = context.RequestData.ReadInt64();
  914. long counter1 = context.RequestData.ReadInt64();
  915. // Todo: Determine if array<nn::sf::NativeHandle> is a buffer or not...
  916. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  917. $"Counter0: {counter0} - " +
  918. $"Counter1: {counter1}");
  919. return 0;
  920. }
  921. // FinalizeSevenSixAxisSensor(nn::applet::AppletResourceUserId)
  922. public long FinalizeSevenSixAxisSensor(ServiceCtx context)
  923. {
  924. long appletResourceUserId = context.RequestData.ReadInt64();
  925. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId}");
  926. return 0;
  927. }
  928. // SetSevenSixAxisSensorFusionStrength(float Strength, nn::applet::AppletResourceUserId)
  929. public long SetSevenSixAxisSensorFusionStrength(ServiceCtx context)
  930. {
  931. _sevenSixAxisSensorFusionStrength = context.RequestData.ReadSingle();
  932. long appletResourceUserId = context.RequestData.ReadInt64();
  933. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  934. $"SevenSixAxisSensorFusionStrength: {_sevenSixAxisSensorFusionStrength}");
  935. return 0;
  936. }
  937. // GetSevenSixAxisSensorFusionStrength(nn::applet::AppletResourceUserId) -> float Strength
  938. public long GetSevenSixAxisSensorFusionStrength(ServiceCtx context)
  939. {
  940. long appletResourceUserId = context.RequestData.ReadInt64();
  941. context.ResponseData.Write(_sevenSixAxisSensorFusionStrength);
  942. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  943. $"SevenSixAxisSensorFusionStrength: {_sevenSixAxisSensorFusionStrength}");
  944. return 0;
  945. }
  946. // IsUsbFullKeyControllerEnabled() -> bool IsEnabled
  947. public long IsUsbFullKeyControllerEnabled(ServiceCtx context)
  948. {
  949. context.ResponseData.Write(_usbFullKeyControllerEnabled);
  950. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. UsbFullKeyControllerEnabled: {_usbFullKeyControllerEnabled}");
  951. return 0;
  952. }
  953. // EnableUsbFullKeyController(bool Enable)
  954. public long EnableUsbFullKeyController(ServiceCtx context)
  955. {
  956. _usbFullKeyControllerEnabled = context.RequestData.ReadBoolean();
  957. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. UsbFullKeyControllerEnabled: {_usbFullKeyControllerEnabled}");
  958. return 0;
  959. }
  960. // IsUsbFullKeyControllerConnected(uint Unknown0) -> bool Connected
  961. public long IsUsbFullKeyControllerConnected(ServiceCtx context)
  962. {
  963. int unknown0 = context.RequestData.ReadInt32();
  964. context.ResponseData.Write(true); //FullKeyController is always connected ?
  965. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. Unknown0: {unknown0} - Connected: true");
  966. return 0;
  967. }
  968. // HasBattery(uint NpadId) -> bool HasBattery
  969. public long HasBattery(ServiceCtx context)
  970. {
  971. int npadId = context.RequestData.ReadInt32();
  972. context.ResponseData.Write(true); //Npad always got a battery ?
  973. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. NpadId: {npadId} - HasBattery: true");
  974. return 0;
  975. }
  976. // HasLeftRightBattery(uint NpadId) -> bool HasLeftBattery, bool HasRightBattery
  977. public long HasLeftRightBattery(ServiceCtx context)
  978. {
  979. int npadId = context.RequestData.ReadInt32();
  980. context.ResponseData.Write(true); //Npad always got a left battery ?
  981. context.ResponseData.Write(true); //Npad always got a right battery ?
  982. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. NpadId: {npadId} - HasLeftBattery: true - HasRightBattery: true");
  983. return 0;
  984. }
  985. // GetNpadInterfaceType(uint NpadId) -> uchar InterfaceType
  986. public long GetNpadInterfaceType(ServiceCtx context)
  987. {
  988. int npadId = context.RequestData.ReadInt32();
  989. context.ResponseData.Write((byte)0);
  990. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. NpadId: {npadId} - NpadInterfaceType: 0");
  991. return 0;
  992. }
  993. // GetNpadLeftRightInterfaceType(uint NpadId) -> uchar LeftInterfaceType, uchar RightInterfaceType
  994. public long GetNpadLeftRightInterfaceType(ServiceCtx context)
  995. {
  996. int npadId = context.RequestData.ReadInt32();
  997. context.ResponseData.Write((byte)0);
  998. context.ResponseData.Write((byte)0);
  999. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. NpadId: {npadId} - " +
  1000. $"LeftInterfaceType: 0 - " +
  1001. $"RightInterfaceType: 0");
  1002. return 0;
  1003. }
  1004. // GetPalmaConnectionHandle(uint Unknown0, nn::applet::AppletResourceUserId) -> nn::hid::PalmaConnectionHandle
  1005. public long GetPalmaConnectionHandle(ServiceCtx context)
  1006. {
  1007. int unknown0 = context.RequestData.ReadInt32();
  1008. long appletResourceUserId = context.RequestData.ReadInt64();
  1009. int palmaConnectionHandle = 0;
  1010. context.ResponseData.Write(palmaConnectionHandle);
  1011. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  1012. $"Unknown0: {unknown0} - " +
  1013. $"PalmaConnectionHandle: {palmaConnectionHandle}");
  1014. return 0;
  1015. }
  1016. // InitializePalma(nn::hid::PalmaConnectionHandle)
  1017. public long InitializePalma(ServiceCtx context)
  1018. {
  1019. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1020. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle}");
  1021. _palmaOperationCompleteEvent.ReadableEvent.Signal();
  1022. return 0;
  1023. }
  1024. // AcquirePalmaOperationCompleteEvent(nn::hid::PalmaConnectionHandle) -> nn::sf::NativeHandle
  1025. public long AcquirePalmaOperationCompleteEvent(ServiceCtx context)
  1026. {
  1027. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1028. if (context.Process.HandleTable.GenerateHandle(_palmaOperationCompleteEvent.ReadableEvent, out int handle) != KernelResult.Success)
  1029. {
  1030. throw new InvalidOperationException("Out of handles!");
  1031. }
  1032. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
  1033. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle}");
  1034. return 0;
  1035. }
  1036. // GetPalmaOperationInfo(nn::hid::PalmaConnectionHandle) -> long Unknown0, buffer<Unknown>
  1037. public long GetPalmaOperationInfo(ServiceCtx context)
  1038. {
  1039. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1040. long unknown0 = 0; //Counter?
  1041. context.ResponseData.Write(unknown0);
  1042. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle} - " +
  1043. $"Unknown0: {unknown0}");
  1044. return 0;
  1045. }
  1046. // PlayPalmaActivity(nn::hid::PalmaConnectionHandle, ulong Unknown0)
  1047. public long PlayPalmaActivity(ServiceCtx context)
  1048. {
  1049. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1050. long unknown0 = context.RequestData.ReadInt64();
  1051. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle} - " +
  1052. $"Unknown0: {unknown0}");
  1053. _palmaOperationCompleteEvent.ReadableEvent.Signal();
  1054. return 0;
  1055. }
  1056. // SetPalmaFrModeType(nn::hid::PalmaConnectionHandle, ulong FrModeType)
  1057. public long SetPalmaFrModeType(ServiceCtx context)
  1058. {
  1059. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1060. long frModeType = context.RequestData.ReadInt64();
  1061. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle} - " +
  1062. $"FrModeType: {frModeType}");
  1063. _palmaOperationCompleteEvent.ReadableEvent.Signal();
  1064. return 0;
  1065. }
  1066. // ReadPalmaStep(nn::hid::PalmaConnectionHandle)
  1067. public long ReadPalmaStep(ServiceCtx context)
  1068. {
  1069. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1070. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle}");
  1071. return 0;
  1072. }
  1073. // EnablePalmaStep(nn::hid::PalmaConnectionHandle, bool Enable)
  1074. public long EnablePalmaStep(ServiceCtx context)
  1075. {
  1076. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1077. bool enabledPalmaStep = context.RequestData.ReadBoolean();
  1078. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle} - " +
  1079. $"EnabledPalmaStep: {enabledPalmaStep}");
  1080. _palmaOperationCompleteEvent.ReadableEvent.Signal();
  1081. return 0;
  1082. }
  1083. // SuspendPalmaStep(nn::hid::PalmaConnectionHandle)
  1084. public long SuspendPalmaStep(ServiceCtx context)
  1085. {
  1086. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1087. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle}");
  1088. _palmaOperationCompleteEvent.ReadableEvent.Signal();
  1089. return 0;
  1090. }
  1091. // ResetPalmaStep(nn::hid::PalmaConnectionHandle)
  1092. public long ResetPalmaStep(ServiceCtx context)
  1093. {
  1094. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1095. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle}");
  1096. _palmaOperationCompleteEvent.ReadableEvent.Signal();
  1097. return 0;
  1098. }
  1099. // ReadPalmaApplicationSection(nn::hid::PalmaConnectionHandle, ulong Unknown0, ulong Unknown1)
  1100. public long ReadPalmaApplicationSection(ServiceCtx context)
  1101. {
  1102. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1103. long unknown0 = context.RequestData.ReadInt64();
  1104. long unknown1 = context.RequestData.ReadInt64();
  1105. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle} - " +
  1106. $"Unknown0: {unknown0} - " +
  1107. $"Unknown1: {unknown1}");
  1108. return 0;
  1109. }
  1110. // WritePalmaApplicationSection(nn::hid::PalmaConnectionHandle, ulong Unknown0, ulong Unknown1, nn::hid::PalmaApplicationSectionAccessBuffer)
  1111. public long WritePalmaApplicationSection(ServiceCtx context)
  1112. {
  1113. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1114. long unknown0 = context.RequestData.ReadInt64();
  1115. long unknown1 = context.RequestData.ReadInt64();
  1116. // nn::hid::PalmaApplicationSectionAccessBuffer cast is unknown
  1117. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle} - " +
  1118. $"Unknown0: {unknown0} - " +
  1119. $"Unknown1: {unknown1}");
  1120. _palmaOperationCompleteEvent.ReadableEvent.Signal();
  1121. return 0;
  1122. }
  1123. // ReadPalmaUniqueCode(nn::hid::PalmaConnectionHandle)
  1124. public long ReadPalmaUniqueCode(ServiceCtx context)
  1125. {
  1126. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1127. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle}");
  1128. return 0;
  1129. }
  1130. // SetPalmaUniqueCodeInvalid(nn::hid::PalmaConnectionHandle)
  1131. public long SetPalmaUniqueCodeInvalid(ServiceCtx context)
  1132. {
  1133. int palmaConnectionHandle = context.RequestData.ReadInt32();
  1134. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. PalmaConnectionHandle: {palmaConnectionHandle}");
  1135. return 0;
  1136. }
  1137. // SetNpadCommunicationMode(long CommunicationMode, nn::applet::AppletResourceUserId)
  1138. public long SetNpadCommunicationMode(ServiceCtx context)
  1139. {
  1140. _npadCommunicationMode = context.RequestData.ReadInt64();
  1141. long appletResourceUserId = context.RequestData.ReadInt64();
  1142. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. AppletResourceUserId: {appletResourceUserId} - " +
  1143. $"NpadCommunicationMode: {_npadCommunicationMode}");
  1144. return 0;
  1145. }
  1146. // GetNpadCommunicationMode() -> long CommunicationMode
  1147. public long GetNpadCommunicationMode(ServiceCtx context)
  1148. {
  1149. context.ResponseData.Write(_npadCommunicationMode);
  1150. Logger.PrintStub(LogClass.ServiceHid, $"Stubbed. CommunicationMode: {_npadCommunicationMode}");
  1151. return 0;
  1152. }
  1153. }
  1154. }