libnx v4.9.0
Loading...
Searching...
No Matches
pad.h
Go to the documentation of this file.
1/**
2 * @file pad.h
3 * @brief Simple wrapper for the HID Npad API.
4 * @author fincs
5 * @copyright libnx Authors
6 */
7#pragma once
8#include "../types.h"
9#include "../services/hid.h"
10
11/// Mask including all existing controller IDs.
12#define PAD_ANY_ID_MASK 0x1000100FFUL
13
14/// Pad state object.
15typedef struct {
16 u8 id_mask;
17 u8 active_id_mask;
18 bool read_handheld;
19 bool active_handheld;
20 u32 style_set;
21 u32 attributes;
22 u64 buttons_cur;
23 u64 buttons_old;
24 HidAnalogStickState sticks[2];
25 u32 gc_triggers[2];
26} PadState;
27
28/// Pad button repeater state object.
29typedef struct {
30 u64 button_mask;
31 s32 counter;
32 u16 delay;
33 u16 repeat;
35
36/**
37 * @brief Configures the input layout supported by the application.
38 * @param[in] max_players The maximum supported number of players (1 to 8).
39 * @param[in] style_set Bitfield of supported controller styles (see \ref HidNpadStyleTag).
40 */
41void padConfigureInput(u32 max_players, u32 style_set);
42
43/**
44 * @brief Initializes a \ref PadState object to read input from one or more controller input sources.
45 * @param[in] _pad Pointer to \ref PadState.
46 * @remarks This is a variadic macro, pass the \ref HidNpadIdType value of each controller to add to the set.
47 */
48#define padInitialize(_pad, ...) ({ \
49 const HidNpadIdType _pad_ids[] = { __VA_ARGS__ }; \
50 u64 _pad_mask = 0; \
51 for (unsigned _pad_i = 0; _pad_i < (sizeof(_pad_ids)/sizeof(_pad_ids[0])); ++_pad_i) \
52 _pad_mask |= 1UL << (_pad_ids[_pad_i]); \
53 padInitializeWithMask((_pad), _pad_mask); \
54})
55
56/**
57 * @brief Same as \ref padInitialize, but taking a bitfield of controller IDs directly.
58 * @param[in] pad Pointer to \ref PadState.
59 * @param[in] mask Bitfield of controller IDs (each bit's position indicates a different \ref HidNpadIdType value).
60 */
62
63/**
64 * @brief Same as \ref padInitialize, but including every single controller input source.
65 * @param[in] pad Pointer to \ref PadState.
66 * @remark Use this function if you want to accept input from any controller.
67 */
71
72/**
73 * @brief Same as \ref padInitialize, but including \ref HidNpadIdType_No1 and \ref HidNpadIdType_Handheld.
74 * @param[in] pad Pointer to \ref PadState.
75 * @remark Use this function if you just want to accept input for a single-player application.
76 */
80
81/**
82 * @brief Updates pad state by reading from the controller input sources specified during initialization.
83 * @param[in] pad Pointer to \ref PadState.
84 */
86
87/**
88 * @brief Retrieves whether \ref HidNpadIdType_Handheld is an active input source (i.e. it was possible to read from it).
89 * @param[in] pad Pointer to \ref PadState.
90 * @return Boolean value.
91 * @remark \ref padUpdate must have been previously called.
92 */
94 return pad->active_handheld;
95}
96
97/**
98 * @brief Retrieves whether the specified controller is an active input source (i.e. it was possible to read from it).
99 * @param[in] pad Pointer to \ref PadState.
100 * @param[in] id ID of the controller input source (see \ref HidNpadIdType)
101 * @return Boolean value.
102 * @remark \ref padUpdate must have been previously called.
103 */
105 if (id <= HidNpadIdType_No8)
106 return pad->active_id_mask & BIT(id);
107 else if (id == HidNpadIdType_Handheld)
108 return pad->active_handheld;
109 else
110 return false;
111}
112
113/**
114 * @brief Retrieves the set of input styles supported by the selected controller input sources.
115 * @param[in] pad Pointer to \ref PadState.
116 * @return Bitfield of \ref HidNpadStyleTag.
117 * @remark \ref padUpdate must have been previously called.
118 */
120 return pad->style_set;
121}
122
123/**
124 * @brief Retrieves the set of attributes reported by the system for the selected controller input sources.
125 * @param[in] pad Pointer to \ref PadState.
126 * @return Bitfield of \ref HidNpadAttribute.
127 * @remark \ref padUpdate must have been previously called.
128 */
130 return pad->attributes;
131}
132
133/**
134 * @brief Retrieves whether any of the selected controller input sources is connected.
135 * @param[in] pad Pointer to \ref PadState.
136 * @return Boolean value.
137 * @remark \ref padUpdate must have been previously called.
138 */
140 return pad->attributes & HidNpadAttribute_IsConnected;
141}
142
143/**
144 * @brief Retrieves the current set of pressed buttons across all selected controller input sources.
145 * @param[in] pad Pointer to \ref PadState.
146 * @return Bitfield of \ref HidNpadButton.
147 * @remark \ref padUpdate must have been previously called.
148 */
150 return pad->buttons_cur;
151}
152
153/**
154 * @brief Retrieves the set of buttons that are newly pressed.
155 * @param[in] pad Pointer to \ref PadState.
156 * @return Bitfield of \ref HidNpadButton.
157 * @remark \ref padUpdate must have been previously called.
158 */
160 return ~pad->buttons_old & pad->buttons_cur;
161}
162
163/**
164 * @brief Retrieves the set of buttons that are newly released.
165 * @param[in] pad Pointer to \ref PadState.
166 * @return Bitfield of \ref HidNpadButton.
167 * @remark \ref padUpdate must have been previously called.
168 */
170 return pad->buttons_old & ~pad->buttons_cur;
171}
172
173/**
174 * @brief Retrieves the position of an analog stick in a controller.
175 * @param[in] pad Pointer to \ref PadState.
176 * @param[in] i ID of the analog stick to read (0=left, 1=right).
177 * @return \ref HidAnalogStickState.
178 * @remark \ref padUpdate must have been previously called.
179 */
181 return pad->sticks[i];
182}
183
184/**
185 * @brief Retrieves the position of an analog trigger in a GameCube controller.
186 * @param[in] pad Pointer to \ref PadState.
187 * @param[in] i ID of the analog trigger to read (0=left, 1=right).
188 * @return Analog trigger position (range is 0 to 0x7fff).
189 * @remark \ref padUpdate must have been previously called.
190 * @remark \ref HidNpadStyleTag_NpadGc must have been previously configured as a supported style in \ref padConfigureInput for GC trigger data to be readable.
191 */
193 return pad->gc_triggers[i];
194}
195
196/**
197 * @brief Initializes a \ref PadRepeater object with the specified settings.
198 * @param[in] r Pointer to \ref PadRepeater.
199 * @param[in] delay Number of input updates between button presses being first detected and them being considered for repeat.
200 * @param[in] repeat Number of input updates between autogenerated repeat button presses.
201 */
203 r->button_mask = 0;
204 r->counter = 0;
205 r->delay = delay;
206 r->repeat = repeat;
207}
208
209/**
210 * @brief Updates pad repeat state.
211 * @param[in] r Pointer to \ref PadRepeater.
212 * @param[in] button_mask Bitfield of currently pressed \ref HidNpadButton that will be considered for repeat.
213 */
214void padRepeaterUpdate(PadRepeater* r, u64 button_mask);
215
216/**
217 * @brief Retrieves the set of buttons that are being repeated according to the parameters specified in \ref padRepeaterInitialize.
218 * @param[in] r Pointer to \ref PadRepeater.
219 * @return Bitfield of \ref HidNpadButton.
220 * @remark It is suggested to bitwise-OR the return value of this function with that of \ref padGetButtonsDown.
221 */
223 return r->counter == 0 ? r->button_mask : 0;
224}
@ HidNpadAttribute_IsConnected
IsConnected.
Definition hid.h:320
HidNpadIdType
HID controller IDs.
Definition hid.h:214
@ HidNpadIdType_Handheld
Handheld mode controls.
Definition hid.h:224
@ HidNpadIdType_No8
Player 8 controller.
Definition hid.h:222
@ HidNpadIdType_No1
Player 1 controller.
Definition hid.h:215
static u64 padGetButtonsUp(const PadState *pad)
Retrieves the set of buttons that are newly released.
Definition pad.h:169
void padInitializeWithMask(PadState *pad, u64 mask)
Same as padInitialize, but taking a bitfield of controller IDs directly.
static bool padIsNpadActive(const PadState *pad, HidNpadIdType id)
Retrieves whether the specified controller is an active input source (i.e.
Definition pad.h:104
void padConfigureInput(u32 max_players, u32 style_set)
Configures the input layout supported by the application.
void padUpdate(PadState *pad)
Updates pad state by reading from the controller input sources specified during initialization.
#define PAD_ANY_ID_MASK
Mask including all existing controller IDs.
Definition pad.h:12
static u64 padGetButtons(const PadState *pad)
Retrieves the current set of pressed buttons across all selected controller input sources.
Definition pad.h:149
static u32 padGetGcTriggerPos(const PadState *pad, unsigned i)
Retrieves the position of an analog trigger in a GameCube controller.
Definition pad.h:192
static HidAnalogStickState padGetStickPos(const PadState *pad, unsigned i)
Retrieves the position of an analog stick in a controller.
Definition pad.h:180
static bool padIsConnected(const PadState *pad)
Retrieves whether any of the selected controller input sources is connected.
Definition pad.h:139
static u64 padRepeaterGetButtons(const PadRepeater *r)
Retrieves the set of buttons that are being repeated according to the parameters specified in padRepe...
Definition pad.h:222
void padRepeaterUpdate(PadRepeater *r, u64 button_mask)
Updates pad repeat state.
static u32 padGetAttributes(const PadState *pad)
Retrieves the set of attributes reported by the system for the selected controller input sources.
Definition pad.h:129
static void padRepeaterInitialize(PadRepeater *r, u16 delay, u16 repeat)
Initializes a PadRepeater object with the specified settings.
Definition pad.h:202
static void padInitializeAny(PadState *pad)
Same as padInitialize, but including every single controller input source.
Definition pad.h:68
#define padInitialize(_pad,...)
Initializes a PadState object to read input from one or more controller input sources.
Definition pad.h:48
static bool padIsHandheld(const PadState *pad)
Retrieves whether HidNpadIdType_Handheld is an active input source (i.e.
Definition pad.h:93
static u64 padGetButtonsDown(const PadState *pad)
Retrieves the set of buttons that are newly pressed.
Definition pad.h:159
static u32 padGetStyleSet(const PadState *pad)
Retrieves the set of input styles supported by the selected controller input sources.
Definition pad.h:119
static void padInitializeDefault(PadState *pad)
Same as padInitialize, but including HidNpadIdType_No1 and HidNpadIdType_Handheld.
Definition pad.h:77
HidAnalogStickState.
Definition hid.h:584
Pad button repeater state object.
Definition pad.h:29
Pad state object.
Definition pad.h:15
#define NX_INLINE
Flags a function as (always) inline.
Definition types.h:86
#define BIT(n)
Creates a bitmask from a bit number.
Definition types.h:54
uint64_t u64
64-bit unsigned integer.
Definition types.h:22
uint8_t u8
8-bit unsigned integer.
Definition types.h:19
uint16_t u16
16-bit unsigned integer.
Definition types.h:20
#define NX_CONSTEXPR
Flags a function as constexpr in C++14 and above; or as (always) inline otherwise.
Definition types.h:92
int32_t s32
32-bit signed integer.
Definition types.h:27
uint32_t u32
32-bit unsigned integer.
Definition types.h:21