hid: Added support for GcErm vibration. Minor adjustments.

This commit is contained in:
yellows8 2020-11-25 16:02:24 -05:00 committed by fincs
parent 88cae40620
commit 5c7118a003
No known key found for this signature in database
GPG Key ID: 62C7609ADA219C60
2 changed files with 59 additions and 3 deletions

View File

@ -552,10 +552,11 @@ typedef enum {
HidNpadLuciaType_U = 3, ///< U HidNpadLuciaType_U = 3, ///< U
} HidNpadLuciaType; } HidNpadLuciaType;
/// HidVibrationDeviceType /// Type values for HidVibrationDeviceInfo::type.
typedef enum { typedef enum {
HidVibrationDeviceType_Unknown = 0, ///< Unknown HidVibrationDeviceType_Unknown = 0, ///< Unknown
HidVibrationDeviceType_LinearResonantActuator = 1, ///< LinearResonantActuator HidVibrationDeviceType_LinearResonantActuator = 1, ///< LinearResonantActuator
HidVibrationDeviceType_GcErm = 2, ///< GcErm (::HidNpadStyleTag_NpadGc)
} HidVibrationDeviceType; } HidVibrationDeviceType;
/// VibrationDevicePosition /// VibrationDevicePosition
@ -1581,6 +1582,7 @@ Result hidGetVibrationDeviceInfo(HidVibrationDeviceHandle handle, HidVibrationDe
/** /**
* @brief Sends the \ref HidVibrationDeviceHandle to the specified device. * @brief Sends the \ref HidVibrationDeviceHandle to the specified device.
* @note With ::HidVibrationDeviceType_GcErm, use \ref hidSendVibrationGcErmCommand instead.
* @param[in] handle \ref HidVibrationDeviceHandle * @param[in] handle \ref HidVibrationDeviceHandle
* @param[in] value \ref HidVibrationValue * @param[in] value \ref HidVibrationValue
*/ */
@ -1588,6 +1590,7 @@ Result hidSendVibrationValue(HidVibrationDeviceHandle handle, const HidVibration
/** /**
* @brief Gets the current \ref HidVibrationValue for the specified device. * @brief Gets the current \ref HidVibrationValue for the specified device.
* @note With ::HidVibrationDeviceType_GcErm, use \ref hidGetActualVibrationGcErmCommand instead.
* @param[in] handle \ref HidVibrationDeviceHandle * @param[in] handle \ref HidVibrationDeviceHandle
* @param[out] out \ref HidVibrationValue * @param[out] out \ref HidVibrationValue
*/ */
@ -1607,12 +1610,29 @@ Result hidIsVibrationPermitted(bool *flag);
/** /**
* @brief Send vibration values[index] to handles[index]. * @brief Send vibration values[index] to handles[index].
* @note With ::HidVibrationDeviceType_GcErm, use \ref hidSendVibrationGcErmCommand instead.
* @param[in] handles Input array of \ref HidVibrationDeviceHandle. * @param[in] handles Input array of \ref HidVibrationDeviceHandle.
* @param[in] values Input array of \ref HidVibrationValue. * @param[in] values Input array of \ref HidVibrationValue.
* @param[in] count Total entries in the handles/values arrays. * @param[in] count Total entries in the handles/values arrays.
*/ */
Result hidSendVibrationValues(const HidVibrationDeviceHandle *handles, const HidVibrationValue *values, s32 count); Result hidSendVibrationValues(const HidVibrationDeviceHandle *handles, const HidVibrationValue *values, s32 count);
/**
* @brief Send \ref HidVibrationGcErmCommand to the specified device, for ::HidVibrationDeviceType_GcErm.
* @note Only available on [4.0.0+].
* @param[in] handle \ref HidVibrationDeviceHandle
* @param[in] cmd \ref HidVibrationGcErmCommand
*/
Result hidSendVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand cmd);
/**
* @brief Get \ref HidVibrationGcErmCommand for the specified device, for ::HidVibrationDeviceType_GcErm.
* @note Only available on [4.0.0+].
* @param[in] handle \ref HidVibrationDeviceHandle
* @param[out] out \ref HidVibrationGcErmCommand
*/
Result hidGetActualVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand *out);
/** /**
* @brief Gets whether vibration is available with the specified device. * @brief Gets whether vibration is available with the specified device.
* @note Only available on [7.0.0+]. * @note Only available on [7.0.0+].

View File

@ -1260,8 +1260,9 @@ Result hidSendVibrationValue(HidVibrationDeviceHandle handle, const HidVibration
Result hidGetActualVibrationValue(HidVibrationDeviceHandle handle, HidVibrationValue *out) { Result hidGetActualVibrationValue(HidVibrationDeviceHandle handle, HidVibrationValue *out) {
const struct { const struct {
HidVibrationDeviceHandle handle; HidVibrationDeviceHandle handle;
u32 pad;
u64 AppletResourceUserId; u64 AppletResourceUserId;
} in = { handle, appletGetAppletResourceUserId() }; } in = { handle, 0, appletGetAppletResourceUserId() };
return serviceDispatchInOut(&g_hidSrv, 202, in, *out, return serviceDispatchInOut(&g_hidSrv, 202, in, *out,
.in_send_pid = true, .in_send_pid = true,
@ -1291,6 +1292,40 @@ Result hidSendVibrationValues(const HidVibrationDeviceHandle *handles, const Hid
); );
} }
Result hidSendVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand cmd) {
if (hosversionBefore(4,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
const struct {
HidVibrationDeviceHandle handle;
u32 pad;
u64 AppletResourceUserId;
u64 cmd;
} in = { handle, 0, appletGetAppletResourceUserId(), cmd };
return serviceDispatchIn(&g_hidSrv, 207, in,
.in_send_pid = true,
);
}
Result hidGetActualVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand *out) {
if (hosversionBefore(4,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
const struct {
HidVibrationDeviceHandle handle;
u32 pad;
u64 AppletResourceUserId;
} in = { handle, 0, appletGetAppletResourceUserId() };
u64 tmp=0;
Result rc = serviceDispatchInOut(&g_hidSrv, 208, in, tmp,
.in_send_pid = true,
);
if (R_SUCCEEDED(rc) && out) *out = tmp;
return rc;
}
Result hidIsVibrationDeviceMounted(HidVibrationDeviceHandle handle, bool *flag) { Result hidIsVibrationDeviceMounted(HidVibrationDeviceHandle handle, bool *flag) {
if (hosversionBefore(7,0,0)) if (hosversionBefore(7,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
@ -1299,8 +1334,9 @@ Result hidIsVibrationDeviceMounted(HidVibrationDeviceHandle handle, bool *flag)
const struct { const struct {
HidVibrationDeviceHandle handle; HidVibrationDeviceHandle handle;
u32 pad;
u64 AppletResourceUserId; u64 AppletResourceUserId;
} in = { handle, appletGetAppletResourceUserId() }; } in = { handle, 0, appletGetAppletResourceUserId() };
u8 tmp=0; u8 tmp=0;
rc = serviceDispatchInOut(&g_hidSrv, 211, in, tmp, rc = serviceDispatchInOut(&g_hidSrv, 211, in, tmp,