libnx/nx/include/switch/services/hidsys.h

568 lines
21 KiB
C

/**
* @file hidsys.h
* @brief hid:sys service IPC wrapper.
* @author exelix, yellows8
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../services/hid.h"
#include "../sf/service.h"
/// ButtonConfig. Selects what button to map to.
typedef enum {
HidcfgButtonConfig_A = 0, ///< A
HidcfgButtonConfig_B = 1, ///< B
HidcfgButtonConfig_X = 2, ///< X
HidcfgButtonConfig_Y = 3, ///< Y
HidcfgButtonConfig_LStick = 4, ///< Left Stick Button
HidcfgButtonConfig_RStick = 5, ///< Right Stick Button
HidcfgButtonConfig_L = 6, ///< L
HidcfgButtonConfig_R = 7, ///< R
HidcfgButtonConfig_ZL = 8, ///< ZL
HidcfgButtonConfig_ZR = 9, ///< ZR
HidcfgButtonConfig_Minus = 10, ///< Minus
HidcfgButtonConfig_Plus = 11, ///< Plus
HidcfgButtonConfig_DLeft = 12, ///< DLeft
HidcfgButtonConfig_DUp = 13, ///< DUp
HidcfgButtonConfig_DRight = 14, ///< DRight
HidcfgButtonConfig_DDown = 15, ///< DDown
HidcfgButtonConfig_SL_Left = 16, ///< SL on Left controller.
HidcfgButtonConfig_SR_Left = 17, ///< SR on Left controller.
HidcfgButtonConfig_SL_Right = 18, ///< SL on Right controller.
HidcfgButtonConfig_SR_Right = 19, ///< SR on Right controller.
HidcfgButtonConfig_HOME = 20, ///< HOME
HidcfgButtonConfig_Capture = 21, ///< Capture
HidcfgButtonConfig_Disabled = 22, ///< Disabled
} HidcfgButtonConfig;
/// Mini Cycle struct for \ref HidsysNotificationLedPattern.
typedef struct {
u8 ledIntensity; ///< Mini Cycle X LED Intensity.
u8 transitionSteps; ///< Fading Transition Steps to Mini Cycle X (Uses PWM). Value 0x0: Instant. Each step duration is based on HidsysNotificationLedPattern::baseMiniCycleDuration.
u8 finalStepDuration; ///< Final Step Duration Multiplier of Mini Cycle X. Value 0x0: 12.5ms, 0x1 - xF: 1x - 15x. Value is a Multiplier of HidsysNotificationLedPattern::baseMiniCycleDuration.
u8 pad;
} HidsysNotificationLedPatternCycle;
/// Structure for \ref hidsysSetNotificationLedPattern.
/// See also: https://switchbrew.org/wiki/HID_services#NotificationLedPattern
/// Only the low 4bits of each used byte in this struct is used.
typedef struct {
u8 baseMiniCycleDuration; ///< Mini Cycle Base Duration. Value 0x1-0xF: 12.5ms - 187.5ms. Value 0x0 = 0ms/OFF.
u8 totalMiniCycles; ///< Number of Mini Cycles + 1. Value 0x0-0xF: 1 - 16 mini cycles.
u8 totalFullCycles; ///< Number of Full Cycles. Value 0x1-0xF: 1 - 15 full cycles. Value 0x0 is repeat forever, but if baseMiniCycleDuration is set to 0x0, it does the 1st Mini Cycle with a 12.5ms step duration and then the LED stays on with startIntensity.
u8 startIntensity; ///< LED Start Intensity. Value 0x0=0% - 0xF=100%.
HidsysNotificationLedPatternCycle miniCycles[16]; ///< Mini Cycles
u8 unk_x44[0x2]; ///< Unknown
u8 pad_x46[0x2]; ///< Padding
} HidsysNotificationLedPattern;
/// ButtonConfigEmbedded
typedef struct {
u8 unk_x0[0x2C8];
} HidsysButtonConfigEmbedded;
/// ButtonConfigFull
typedef struct {
u8 unk_x0[0x2C8];
} HidsysButtonConfigFull;
/// ButtonConfigLeft
typedef struct {
u8 unk_x0[0x1C8];
} HidsysButtonConfigLeft;
/// ButtonConfigRight
typedef struct {
u8 unk_x0[0x1A0];
} HidsysButtonConfigRight;
/// JoystickConfig
typedef struct {
u32 unk_x0; ///< Orientation. 0 = default, 1 = enabled for Left, 2 = enabled for Right.
u8 stick_change; ///< StickChange
u8 pad[3]; ///< Padding
} HidcfgJoystickConfig;
/// ButtonConfigEmbedded
typedef struct {
u32 button_config[17]; ///< \ref HidcfgButtonConfig, for the following buttons: DLeft, DUp, DRight, DDown, A, B, X, Y, LStick, RStick, L, R, ZL, ZR, Minus, Plus, Capture.
HidcfgJoystickConfig joystick_config[2]; ///< \ref HidcfgJoystickConfig, for the left and right stick.
} HidcfgButtonConfigEmbedded;
/// ButtonConfigFull
typedef struct {
u32 button_config[17]; ///< \ref HidcfgButtonConfig, for the following buttons: DLeft, DUp, DRight, DDown, A, B, X, Y, LStick, RStick, L, R, ZL, ZR, Minus, Plus, Capture.
HidcfgJoystickConfig joystick_config[2]; ///< \ref HidcfgJoystickConfig, for the left and right stick.
} HidcfgButtonConfigFull;
/// ButtonConfigLeft
typedef struct {
u32 button_config[11]; ///< \ref HidcfgButtonConfig, for the following buttons: DLeft, DUp, DRight, DDown, LStick, L, ZL, Minus, SL_Left, SR_Left, Capture.
HidcfgJoystickConfig joystick_config; ///< \ref HidcfgJoystickConfig
} HidcfgButtonConfigLeft;
/// ButtonConfigRight
typedef struct {
u32 button_config[10]; ///< \ref HidcfgButtonConfig, for the following buttons: A, B, X, Y, RStick, R, ZR, Plus, SL_Right, SR_Right.
HidcfgJoystickConfig joystick_config; ///< \ref HidcfgJoystickConfig
} HidcfgButtonConfigRight;
/// Initialize hidsys.
Result hidsysInitialize(void);
/// Exit hidsys.
void hidsysExit(void);
/// Gets the Service object for the actual hidsys service session.
Service* hidsysGetServiceSession(void);
/**
* @brief Returns an event that fires when the home button is pressed, this will prevent the home menu from opening when the button is pressed.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=false.
**/
Result hidsysAcquireHomeButtonEventHandle(Event* out_event);
/**
* @brief Returns an event that fires when the sleep button is pressed.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=false.
**/
Result hidsysAcquireSleepButtonEventHandle(Event* out_event);
/**
* @brief Returns an event that fires when the capture button is pressed.
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=false.
**/
Result hidsysAcquireCaptureButtonEventHandle(Event* out_event);
/**
* @brief ActivateHomeButton
**/
Result hidsysActivateHomeButton(void);
/**
* @brief ActivateSleepButton
**/
Result hidsysActivateSleepButton(void);
/**
* @brief ActivateCaptureButton
**/
Result hidsysActivateCaptureButton(void);
/**
* @brief Gets the SupportedNpadStyleSet for the CallerApplet. applet must be initialized in order to use this (uses \ref appletGetAppletResourceUserIdOfCallerApplet).
* @note Only available on [6.0.0+].
* @param[out] out \ref HidControllerType
*/
Result hidsysGetSupportedNpadStyleSetOfCallerApplet(HidControllerType *out);
/**
* @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, s32 count, s32 *total_entries);
/**
* @brief EnableAppletToGetInput
* @param[in] enable Input flag.
**/
Result hidsysEnableAppletToGetInput(bool enable);
/**
* @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, s32 count, s32 *total_entries);
/**
* @brief Gets the unique pad's serial number.
* @note Only available on [5.0.0+].
* @param UniquePadId UniquePadId for the controller.
* @param serial Pointer to output the serial to. (The buffer size needs to be at least 0x11 bytes)
*/
Result hidsysGetUniquePadSerialNumber(u64 UniquePadId, char *serial);
/**
* @brief Sets the HOME-button notification LED pattern, for the specified controller.
* @note Generally this should only be used if \ref hidsysSetNotificationLedPatternWithTimeout is not usable.
* @note Only available on [7.0.0+].
* @param pattern \ref HidsysNotificationLedPattern
* @param UniquePadId UniquePadId for the controller.
*/
Result hidsysSetNotificationLedPattern(const HidsysNotificationLedPattern *pattern, u64 UniquePadId);
/**
* @brief Sets the HOME-button notification LED pattern, for the specified controller. The LED will automatically be disabled once the specified timeout occurs.
* @note Only available on [9.0.0+], and with controllers which have the [9.0.0+] firmware installed.
* @param[in] pattern \ref HidsysNotificationLedPattern
* @param[in] UniquePadId UniquePadId for the controller.
* @param[in] timeout Timeout in nanoseconds.
*/
Result hidsysSetNotificationLedPatternWithTimeout(const HidsysNotificationLedPattern *pattern, u64 UniquePadId, u64 timeout);
/**
* @brief IsButtonConfigSupported
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] out Output bool flag.
*/
Result hidsysIsButtonConfigSupported(u64 unique_pad_id, bool *out);
/**
* @brief DeleteButtonConfig
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
*/
Result hidsysDeleteButtonConfig(u64 unique_pad_id);
/**
* @brief SetButtonConfigEnabled
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[in] flag Input flag.
*/
Result hidsysSetButtonConfigEnabled(u64 unique_pad_id, bool flag);
/**
* @brief IsButtonConfigEnabled
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] out Output bool flag.
*/
Result hidsysIsButtonConfigEnabled(u64 unique_pad_id, bool *out);
/**
* @brief SetButtonConfigEmbedded
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[in] config \ref HidsysButtonConfigEmbedded
*/
Result hidsysSetButtonConfigEmbedded(u64 unique_pad_id, const HidsysButtonConfigEmbedded *config);
/**
* @brief SetButtonConfigFull
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[in] config \ref HidsysButtonConfigFull
*/
Result hidsysSetButtonConfigFull(u64 unique_pad_id, const HidsysButtonConfigFull *config);
/**
* @brief SetButtonConfigLeft
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[in] config \ref HidsysButtonConfigLeft
*/
Result hidsysSetButtonConfigLeft(u64 unique_pad_id, const HidsysButtonConfigLeft *config);
/**
* @brief SetButtonConfigRight
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[in] config \ref HidsysButtonConfigRight
*/
Result hidsysSetButtonConfigRight(u64 unique_pad_id, const HidsysButtonConfigRight *config);
/**
* @brief GetButtonConfigEmbedded
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] config \ref HidsysButtonConfigEmbedded
*/
Result hidsysGetButtonConfigEmbedded(u64 unique_pad_id, HidsysButtonConfigEmbedded *config);
/**
* @brief GetButtonConfigFull
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] config \ref HidsysButtonConfigFull
*/
Result hidsysGetButtonConfigFull(u64 unique_pad_id, HidsysButtonConfigFull *config);
/**
* @brief GetButtonConfigLeft
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] config \ref HidsysButtonConfigLeft
*/
Result hidsysGetButtonConfigLeft(u64 unique_pad_id, HidsysButtonConfigLeft *config);
/**
* @brief GetButtonConfigRight
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] config \ref HidsysButtonConfigRight
*/
Result hidsysGetButtonConfigRight(u64 unique_pad_id, HidsysButtonConfigRight *config);
/**
* @brief IsCustomButtonConfigSupported
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] out Output bool flag.
*/
Result hidsysIsCustomButtonConfigSupported(u64 unique_pad_id, bool *out);
/**
* @brief IsDefaultButtonConfigEmbedded
* @note Only available on [10.0.0+].
* @param[in] config \ref HidcfgButtonConfigEmbedded
* @param[out] out Output bool flag.
*/
Result hidsysIsDefaultButtonConfigEmbedded(const HidcfgButtonConfigEmbedded *config, bool *out);
/**
* @brief IsDefaultButtonConfigFull
* @note Only available on [10.0.0+].
* @param[in] config \ref HidcfgButtonConfigFull
* @param[out] out Output bool flag.
*/
Result hidsysIsDefaultButtonConfigFull(const HidcfgButtonConfigFull *config, bool *out);
/**
* @brief IsDefaultButtonConfigLeft
* @note Only available on [10.0.0+].
* @param[in] config \ref HidcfgButtonConfigLeft
* @param[out] out Output bool flag.
*/
Result hidsysIsDefaultButtonConfigLeft(const HidcfgButtonConfigLeft *config, bool *out);
/**
* @brief IsDefaultButtonConfigRight
* @note Only available on [10.0.0+].
* @param[in] config \ref HidcfgButtonConfigRight
* @param[out] out Output bool flag.
*/
Result hidsysIsDefaultButtonConfigRight(const HidcfgButtonConfigRight *config, bool *out);
/**
* @brief IsButtonConfigStorageEmbeddedEmpty
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[out] out Output bool flag.
*/
Result hidsysIsButtonConfigStorageEmbeddedEmpty(s32 index, bool *out);
/**
* @brief IsButtonConfigStorageFullEmpty
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[out] out Output bool flag.
*/
Result hidsysIsButtonConfigStorageFullEmpty(s32 index, bool *out);
/**
* @brief IsButtonConfigStorageLeftEmpty
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[out] out Output bool flag.
*/
Result hidsysIsButtonConfigStorageLeftEmpty(s32 index, bool *out);
/**
* @brief IsButtonConfigStorageRightEmpty
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[out] out Output bool flag.
*/
Result hidsysIsButtonConfigStorageRightEmpty(s32 index, bool *out);
/**
* @brief GetButtonConfigStorageEmbedded
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[out] config \ref HidcfgButtonConfigEmbedded
*/
Result hidsysGetButtonConfigStorageEmbedded(s32 index, HidcfgButtonConfigEmbedded *config);
/**
* @brief GetButtonConfigStorageFull
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[out] config \ref HidcfgButtonConfigFull
*/
Result hidsysGetButtonConfigStorageFull(s32 index, HidcfgButtonConfigFull *config);
/**
* @brief GetButtonConfigStorageLeft
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[out] config \ref HidcfgButtonConfigLeft
*/
Result hidsysGetButtonConfigStorageLeft(s32 index, HidcfgButtonConfigLeft *config);
/**
* @brief GetButtonConfigStorageRight
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[out] config \ref HidcfgButtonConfigRight
*/
Result hidsysGetButtonConfigStorageRight(s32 index, HidcfgButtonConfigRight *config);
/**
* @brief SetButtonConfigStorageEmbedded
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[in] config \ref HidcfgButtonConfigEmbedded
*/
Result hidsysSetButtonConfigStorageEmbedded(s32 index, const HidcfgButtonConfigEmbedded *config);
/**
* @brief SetButtonConfigStorageFull
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[in] config \ref HidcfgButtonConfigFull
*/
Result hidsysSetButtonConfigStorageFull(s32 index, const HidcfgButtonConfigFull *config);
/**
* @brief SetButtonConfigStorageLeft
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[in] config \ref HidcfgButtonConfigLeft
*/
Result hidsysSetButtonConfigStorageLeft(s32 index, const HidcfgButtonConfigLeft *config);
/**
* @brief SetButtonConfigStorageRight
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
* @param[in] config \ref HidcfgButtonConfigRight
*/
Result hidsysSetButtonConfigStorageRight(s32 index, const HidcfgButtonConfigRight *config);
/**
* @brief DeleteButtonConfigStorageEmbedded
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
*/
Result hidsysDeleteButtonConfigStorageEmbedded(s32 index);
/**
* @brief DeleteButtonConfigStorageFull
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
*/
Result hidsysDeleteButtonConfigStorageFull(s32 index);
/**
* @brief DeleteButtonConfigStorageLeft
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
*/
Result hidsysDeleteButtonConfigStorageLeft(s32 index);
/**
* @brief DeleteButtonConfigStorageRight
* @note Only available on [10.0.0+].
* @param[in] index Array index for an array which contains a total of 5 entries.
*/
Result hidsysDeleteButtonConfigStorageRight(s32 index);
/**
* @brief IsUsingCustomButtonConfig
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] out Output bool flag.
*/
Result hidsysIsUsingCustomButtonConfig(u64 unique_pad_id, bool *out);
/**
* @brief IsAnyCustomButtonConfigEnabled
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] out Output bool flag.
*/
Result hidsysIsAnyCustomButtonConfigEnabled(u64 unique_pad_id, bool *out);
/**
* @brief SetAllCustomButtonConfigEnabled
* @note Only available on [10.0.0+].
* @param[in] AppletResourceUserId AppletResourceUserId
* @param[in] flag Input bool flag.
*/
Result hidsysSetAllCustomButtonConfigEnabled(u64 AppletResourceUserId, bool flag);
/**
* @brief SetAllDefaultButtonConfig
* @note Only available on [10.0.0+].
*/
Result hidsysSetAllDefaultButtonConfig(void);
/**
* @brief SetHidButtonConfigEmbedded
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[in] config \ref HidcfgButtonConfigEmbedded
*/
Result hidsysSetHidButtonConfigEmbedded(u64 unique_pad_id, const HidcfgButtonConfigEmbedded *config);
/**
* @brief SetHidButtonConfigFull
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[in] config \ref HidcfgButtonConfigFull
*/
Result hidsysSetHidButtonConfigFull(u64 unique_pad_id, const HidcfgButtonConfigFull *config);
/**
* @brief SetHidButtonConfigLeft
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[in] config \ref HidcfgButtonConfigLeft
*/
Result hidsysSetHidButtonConfigLeft(u64 unique_pad_id, const HidcfgButtonConfigLeft *config);
/**
* @brief SetHidButtonConfigRight
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[in] config \ref HidcfgButtonConfigRight
*/
Result hidsysSetHidButtonConfigRight(u64 unique_pad_id, const HidcfgButtonConfigRight *config);
/**
* @brief GetHidButtonConfigEmbedded
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] config \ref HidcfgButtonConfigEmbedded
*/
Result hidsysGetHidButtonConfigEmbedded(u64 unique_pad_id, HidcfgButtonConfigEmbedded *config);
/**
* @brief GetHidButtonConfigFull
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] config \ref HidcfgButtonConfigFull
*/
Result hidsysGetHidButtonConfigFull(u64 unique_pad_id, HidcfgButtonConfigFull *config);
/**
* @brief GetHidButtonConfigLeft
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] config \ref HidcfgButtonConfigLeft
*/
Result hidsysGetHidButtonConfigLeft(u64 unique_pad_id, HidcfgButtonConfigLeft *config);
/**
* @brief GetHidButtonConfigRight
* @note Only available on [10.0.0+].
* @param[in] unique_pad_id UniquePadId for the controller.
* @param[out] config \ref HidcfgButtonConfigRight
*/
Result hidsysGetHidButtonConfigRight(u64 unique_pad_id, HidcfgButtonConfigRight *config);