IHidServer.cs 57 KB

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