
Nit-picky update to accurately describe the `hidKeys*()` functions, and how to extract individual bits from them.
196 lines
6.0 KiB
C
196 lines
6.0 KiB
C
/**
|
|
* @file hid.h
|
|
* @brief HID service.
|
|
*/
|
|
#pragma once
|
|
|
|
//See also: http://3dbrew.org/wiki/HID_Services http://3dbrew.org/wiki/HID_Shared_Memory
|
|
|
|
/// Key values.
|
|
enum
|
|
{
|
|
KEY_A = BIT(0), ///< A
|
|
KEY_B = BIT(1), ///< B
|
|
KEY_SELECT = BIT(2), ///< Select
|
|
KEY_START = BIT(3), ///< Start
|
|
KEY_DRIGHT = BIT(4), ///< D-Pad Right
|
|
KEY_DLEFT = BIT(5), ///< D-Pad Left
|
|
KEY_DUP = BIT(6), ///< D-Pad Up
|
|
KEY_DDOWN = BIT(7), ///< D-Pad Down
|
|
KEY_R = BIT(8), ///< R
|
|
KEY_L = BIT(9), ///< L
|
|
KEY_X = BIT(10), ///< X
|
|
KEY_Y = BIT(11), ///< Y
|
|
KEY_ZL = BIT(14), ///< ZL (New 3DS only)
|
|
KEY_ZR = BIT(15), ///< ZR (New 3DS only)
|
|
KEY_TOUCH = BIT(20), ///< Touch (Not actually provided by HID)
|
|
KEY_CSTICK_RIGHT = BIT(24), ///< C-Stick Right (New 3DS only)
|
|
KEY_CSTICK_LEFT = BIT(25), ///< C-Stick Left (New 3DS only)
|
|
KEY_CSTICK_UP = BIT(26), ///< C-Stick Up (New 3DS only)
|
|
KEY_CSTICK_DOWN = BIT(27), ///< C-Stick Down (New 3DS only)
|
|
KEY_CPAD_RIGHT = BIT(28), ///< Circle Pad Right
|
|
KEY_CPAD_LEFT = BIT(29), ///< Circle Pad Left
|
|
KEY_CPAD_UP = BIT(30), ///< Circle Pad Up
|
|
KEY_CPAD_DOWN = BIT(31), ///< Circle Pad Down
|
|
|
|
// Generic catch-all directions
|
|
KEY_UP = KEY_DUP | KEY_CPAD_UP, ///< D-Pad Up or Circle Pad Up
|
|
KEY_DOWN = KEY_DDOWN | KEY_CPAD_DOWN, ///< D-Pad Down or Circle Pad Down
|
|
KEY_LEFT = KEY_DLEFT | KEY_CPAD_LEFT, ///< D-Pad Left or Circle Pad Left
|
|
KEY_RIGHT = KEY_DRIGHT | KEY_CPAD_RIGHT, ///< D-Pad Right or Circle Pad Right
|
|
};
|
|
|
|
/// Touch position.
|
|
typedef struct
|
|
{
|
|
u16 px; ///< Touch X
|
|
u16 py; ///< Touch Y
|
|
} touchPosition;
|
|
|
|
/// Circle Pad position.
|
|
typedef struct
|
|
{
|
|
s16 dx; ///< Pad X
|
|
s16 dy; ///< Pad Y
|
|
} circlePosition;
|
|
|
|
/// Accelerometer vector.
|
|
typedef struct
|
|
{
|
|
s16 x; ///< Accelerometer X
|
|
s16 y; ///< Accelerometer Y
|
|
s16 z; ///< Accelerometer Z
|
|
} accelVector;
|
|
|
|
/// Gyroscope angular rate.
|
|
typedef struct
|
|
{
|
|
s16 x; ///< Roll
|
|
s16 z; ///< Yaw
|
|
s16 y; ///< Pitch
|
|
} angularRate;
|
|
|
|
/// HID events.
|
|
typedef enum
|
|
{
|
|
HIDEVENT_PAD0 = 0, ///< Event signaled by HID-module, when the sharedmem+0(PAD/circle-pad)/+0xA8(touch-screen) region was updated.
|
|
HIDEVENT_PAD1, ///< Event signaled by HID-module, when the sharedmem+0(PAD/circle-pad)/+0xA8(touch-screen) region was updated.
|
|
HIDEVENT_Accel, ///< Event signaled by HID-module, when the sharedmem accelerometer state was updated.
|
|
HIDEVENT_Gyro, ///< Event signaled by HID-module, when the sharedmem gyroscope state was updated.
|
|
HIDEVENT_DebugPad, ///< Event signaled by HID-module, when the sharedmem DebugPad state was updated.
|
|
|
|
HIDEVENT_MAX, ///< Used to know how many events there are.
|
|
} HID_Event;
|
|
|
|
extern Handle hidMemHandle; ///< HID shared memory handle.
|
|
extern vu32* hidSharedMem; ///< HID shared memory.
|
|
|
|
/// Initializes HID.
|
|
Result hidInit(void);
|
|
|
|
/// Exits HID.
|
|
void hidExit(void);
|
|
|
|
/// Scans HID for input data.
|
|
void hidScanInput(void);
|
|
|
|
/**
|
|
* @brief Returns a bitmask of held buttons.
|
|
* Individual buttons can be extracted using binary AND.
|
|
* @return 32-bit bitmask of held buttons (1+ frames).
|
|
*/
|
|
u32 hidKeysHeld(void);
|
|
|
|
/**
|
|
* @brief Returns a bitmask of newly pressed buttons, this frame.
|
|
* Individual buttons can be extracted using binary AND.
|
|
* @return 32-bit bitmask of newly pressed buttons.
|
|
*/
|
|
u32 hidKeysDown(void);
|
|
|
|
/**
|
|
* @brief Returns a bitmask of newly released buttons, this frame.
|
|
* Individual buttons can be extracted using binary AND.
|
|
* @return 32-bit bitmask of newly released buttons.
|
|
*/
|
|
u32 hidKeysUp(void);
|
|
|
|
/**
|
|
* @brief Reads the current touch position.
|
|
* @param pos Pointer to output the touch position to.
|
|
*/
|
|
void hidTouchRead(touchPosition* pos);
|
|
|
|
/**
|
|
* @brief Reads the current circle pad position.
|
|
* @param pos Pointer to output the circle pad position to.
|
|
*/
|
|
void hidCircleRead(circlePosition* pos);
|
|
|
|
/**
|
|
* @brief Reads the current accelerometer data.
|
|
* @param vector Pointer to output the accelerometer data to.
|
|
*/
|
|
void hidAccelRead(accelVector* vector);
|
|
|
|
/**
|
|
* @brief Reads the current gyroscope data.
|
|
* @param rate Pointer to output the gyroscope data to.
|
|
*/
|
|
void hidGyroRead(angularRate* rate);
|
|
|
|
/**
|
|
* @brief Waits for an HID event.
|
|
* @param id ID of the event.
|
|
* @param nextEvent Whether to discard the current event and wait for the next event.
|
|
*/
|
|
void hidWaitForEvent(HID_Event id, bool nextEvent);
|
|
|
|
/// Compatibility macro for hidScanInput.
|
|
#define scanKeys hidScanInput
|
|
/// Compatibility macro for hidKeysHeld.
|
|
#define keysHeld hidKeysHeld
|
|
/// Compatibility macro for hidKeysDown.
|
|
#define keysDown hidKeysDown
|
|
/// Compatibility macro for hidKeysUp.
|
|
#define keysUp hidKeysUp
|
|
/// Compatibility macro for hidTouchRead.
|
|
#define touchRead hidTouchRead
|
|
/// Compatibility macro for hidCircleRead.
|
|
#define circleRead hidCircleRead
|
|
|
|
/**
|
|
* @brief Gets the handles for HID operation.
|
|
* @param outMemHandle Pointer to output the shared memory handle to.
|
|
* @param eventpad0 Pointer to output the pad 0 event handle to.
|
|
* @param eventpad1 Pointer to output the pad 1 event handle to.
|
|
* @param eventaccel Pointer to output the accelerometer event handle to.
|
|
* @param eventgyro Pointer to output the gyroscope event handle to.
|
|
* @param eventdebugpad Pointer to output the debug pad event handle to.
|
|
*/
|
|
Result HIDUSER_GetHandles(Handle* outMemHandle, Handle *eventpad0, Handle *eventpad1, Handle *eventaccel, Handle *eventgyro, Handle *eventdebugpad);
|
|
|
|
/// Enables the accelerometer.
|
|
Result HIDUSER_EnableAccelerometer(void);
|
|
|
|
/// Disables the accelerometer.
|
|
Result HIDUSER_DisableAccelerometer(void);
|
|
|
|
/// Enables the gyroscope.
|
|
Result HIDUSER_EnableGyroscope(void);
|
|
|
|
/// Disables the gyroscope.
|
|
Result HIDUSER_DisableGyroscope(void);
|
|
|
|
/**
|
|
* @brief Gets the gyroscope raw to dps coefficient.
|
|
* @param coeff Pointer to output the coefficient to.
|
|
*/
|
|
Result HIDUSER_GetGyroscopeRawToDpsCoefficient(float *coeff);
|
|
|
|
/**
|
|
* @brief Gets the current volume slider value. (0-63)
|
|
* @param volume Pointer to write the volume slider value to.
|
|
*/
|
|
Result HIDUSER_GetSoundVolume(u8 *volume);
|