From d4789c37c906d43e1e0ecfd6fea75d9dd668caf2 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Thu, 25 Apr 2019 14:31:00 -0400 Subject: [PATCH] Added hidsysGetUniquePadsFromNpad and hidsysGetUniquePadIds. --- nx/include/switch/services/hidsys.h | 22 +++++++- nx/source/services/hidsys.c | 82 +++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) diff --git a/nx/include/switch/services/hidsys.h b/nx/include/switch/services/hidsys.h index 761c2ec5..ea92d997 100644 --- a/nx/include/switch/services/hidsys.h +++ b/nx/include/switch/services/hidsys.h @@ -1,11 +1,12 @@ /** * @file hidsys.h * @brief hid:sys service IPC wrapper. - * @author exelix + * @author exelix, yellows8 */ #pragma once #include "../types.h" #include "../kernel/event.h" +#include "../services/hid.h" #include "../services/sm.h" Result hidsysInitialize(void); @@ -21,3 +22,22 @@ Result hidsysAcquireHomeButtonEventHandle(Event* event_out); Result hidsysActivateHomeButton(void); Result hidsysActivateSleepButton(void); Result hidsysActivateCaptureButton(void); + +/** + * @brief Gets the UniquePadIds for the specified controller. + * @note Only available on [3.0.0+]. + * @param id Controller ID. Must not be CONTROLLER_P1_AUTO. + * @param UniquePadIds Output array of UniquePadIds. + * @param Max number of entries for the UniquePadIds array. + * @param total_entries Total output array entries. Optional, can be NULL. + */ +Result hidsysGetUniquePadsFromNpad(HidControllerID id, u64 *UniquePadIds, size_t count, size_t *total_entries); + +/** + * @brief Gets a list of all UniquePadIds. + * @param UniquePadIds Output array of UniquePadIds. + * @param Max number of entries for the UniquePadIds array. + * @param total_entries Total output array entries. Optional, can be NULL. + */ +Result hidsysGetUniquePadIds(u64 *UniquePadIds, size_t count, size_t *total_entries); + diff --git a/nx/source/services/hidsys.c b/nx/source/services/hidsys.c index 76e4dab9..7ff208a5 100644 --- a/nx/source/services/hidsys.c +++ b/nx/source/services/hidsys.c @@ -6,7 +6,9 @@ #include "kernel/event.h" #include "services/applet.h" #include "services/hidsys.h" +#include "services/hid.h" #include "services/sm.h" +#include "runtime/hosversion.h" static Service g_hidsysSrv; static u64 g_hidsysRefCnt; @@ -179,3 +181,83 @@ Result hidsysActivateSleepButton(void) { Result hidsysActivateCaptureButton(void) { return _hidsysCmdWithResIdAndPid(151); } + +Result hidsysGetUniquePadsFromNpad(HidControllerID id, u64 *UniquePadIds, size_t count, size_t *total_entries) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + Result rc; + + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u32 id; + } PACKED *raw; + + ipcAddRecvStatic(&c, UniquePadIds, sizeof(u64)*count, 0); + + raw = serviceIpcPrepareHeader(&g_hidsysSrv, &c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 321; + raw->id = hidControllerIDToOfficial(id); + + rc = serviceIpcDispatch(&g_hidsysSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + u64 total_entries; + } *resp; + + serviceIpcParse(&g_hidsysSrv, &r, sizeof(*resp)); + resp = r.Raw; + + if (R_SUCCEEDED(rc) && total_entries) *total_entries = resp->total_entries; + } + + return rc; +} + +Result hidsysGetUniquePadIds(u64 *UniquePadIds, size_t count, size_t *total_entries) { + Result rc; + + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + ipcAddRecvStatic(&c, UniquePadIds, sizeof(u64)*count, 0); + + raw = serviceIpcPrepareHeader(&g_hidsysSrv, &c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 703; + + rc = serviceIpcDispatch(&g_hidsysSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + u64 total_entries; + } *resp; + + serviceIpcParse(&g_hidsysSrv, &r, sizeof(*resp)); + resp = r.Raw; + + if (R_SUCCEEDED(rc) && total_entries) *total_entries = resp->total_entries; + } + + return rc; +} +