HID: implement key/touch/circle pad access
This commit is contained in:
parent
9cef70bbd4
commit
0e850119c9
@ -3,27 +3,42 @@
|
||||
|
||||
#define HID_SHAREDMEM_DEFAULT (0x10000000)
|
||||
|
||||
#define CPAD_X(v) ((s16)((v)&0xFFFF))
|
||||
#define CPAD_Y(v) ((s16)(((v>>16))&0xFFFF))
|
||||
|
||||
#define TOUCH_X(v) ((u16)((v)&0xFFFF))
|
||||
#define TOUCH_Y(v) ((u16)(((v>>16))&0xFFFF))
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PAD_A = (1<<0),
|
||||
PAD_B = (1<<1),
|
||||
PAD_SELECT = (1<<2),
|
||||
PAD_START = (1<<3),
|
||||
PAD_RIGHT = (1<<4),
|
||||
PAD_LEFT = (1<<5),
|
||||
PAD_UP = (1<<6),
|
||||
PAD_DOWN = (1<<7),
|
||||
PAD_R = (1<<8),
|
||||
PAD_L = (1<<9),
|
||||
PAD_X = (1<<10),
|
||||
PAD_Y = (1<<11)
|
||||
}PAD_KEY;
|
||||
KEY_A = BIT(0),
|
||||
KEY_B = BIT(1),
|
||||
KEY_SELECT = BIT(2),
|
||||
KEY_START = BIT(3),
|
||||
KEY_DRIGHT = BIT(4),
|
||||
KEY_DLEFT = BIT(5),
|
||||
KEY_DUP = BIT(6),
|
||||
KEY_DDOWN = BIT(7),
|
||||
KEY_R = BIT(8),
|
||||
KEY_L = BIT(9),
|
||||
KEY_X = BIT(10),
|
||||
KEY_Y = BIT(11),
|
||||
KEY_TOUCH = BIT(20), // Not actually provided by HID
|
||||
KEY_CLEFT = BIT(28),
|
||||
KEY_CRIGHT = BIT(29),
|
||||
KEY_CUP = BIT(30),
|
||||
KEY_CDOWN = BIT(31),
|
||||
|
||||
// Generic catch-all directions
|
||||
KEY_UP = KEY_DUP | KEY_CUP,
|
||||
KEY_DOWN = KEY_DDOWN | KEY_CDOWN,
|
||||
KEY_LEFT = KEY_DLEFT | KEY_CLEFT,
|
||||
KEY_RIGHT = KEY_DRIGHT | KEY_CRIGHT,
|
||||
} PAD_KEY;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 px, py;
|
||||
} touchPosition;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
s16 dx, dy;
|
||||
} circlePosition;
|
||||
|
||||
extern Handle hidMemHandle;
|
||||
extern vu32* hidSharedMem;
|
||||
@ -31,6 +46,21 @@ extern vu32* hidSharedMem;
|
||||
Result hidInit(u32* sharedMem);
|
||||
void hidExit();
|
||||
|
||||
void hidScanInput();
|
||||
u32 hidKeysHeld();
|
||||
u32 hidKeysDown();
|
||||
u32 hidKeysUp();
|
||||
void hidTouchRead(touchPosition* pos);
|
||||
void hidCircleRead(circlePosition* pos);
|
||||
|
||||
// libnds compatibility defines
|
||||
#define scanKeys hidScanInput
|
||||
#define keysHeld hidKeysHeld
|
||||
#define keysDown hidKeysDown
|
||||
#define keysUp hidKeysUp
|
||||
#define touchRead hidTouchRead
|
||||
#define circleRead hidCircleRead
|
||||
|
||||
Result HIDUSER_GetInfo(Handle* handle, Handle* outMemHandle);
|
||||
Result HIDUSER_EnableAccelerometer(Handle* handle);
|
||||
|
||||
|
@ -35,5 +35,6 @@ typedef u32 Handle;
|
||||
typedef s32 Result;
|
||||
typedef void (*ThreadFunc)(u32);
|
||||
|
||||
#define BIT(n) (1U<<(n))
|
||||
|
||||
#endif
|
||||
|
@ -10,6 +10,10 @@ Handle hidMemHandle;
|
||||
|
||||
vu32* hidSharedMem;
|
||||
|
||||
static u32 kOld, kHeld, kDown, kUp;
|
||||
static touchPosition tPos;
|
||||
static circlePosition cPos;
|
||||
|
||||
Result hidInit(u32* sharedMem)
|
||||
{
|
||||
if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
|
||||
@ -23,6 +27,8 @@ Result hidInit(u32* sharedMem)
|
||||
|
||||
if((ret=HIDUSER_EnableAccelerometer(NULL)))return ret;
|
||||
|
||||
kOld = kHeld = kDown = kUp = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -33,6 +39,48 @@ void hidExit()
|
||||
svcCloseHandle(hidHandle);
|
||||
}
|
||||
|
||||
void hidScanInput()
|
||||
{
|
||||
kOld = kHeld;
|
||||
|
||||
int padId = hidSharedMem[4];
|
||||
kHeld = hidSharedMem[10 + padId*4];
|
||||
cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3];
|
||||
|
||||
int touchId = hidSharedMem[42 + 4];
|
||||
tPos = *(touchPosition*)&hidSharedMem[42 + 8 + touchId*2];
|
||||
if (hidSharedMem[42 + 8 + touchId*2 + 1])
|
||||
kHeld |= KEY_TOUCH;
|
||||
|
||||
kDown = (~kOld) & kHeld;
|
||||
kUp = kOld & (~kHeld);
|
||||
}
|
||||
|
||||
u32 hidKeysHeld()
|
||||
{
|
||||
return kHeld;
|
||||
}
|
||||
|
||||
u32 hidKeysDown()
|
||||
{
|
||||
return kDown;
|
||||
}
|
||||
|
||||
u32 hidKeysUp()
|
||||
{
|
||||
return kUp;
|
||||
}
|
||||
|
||||
void hidTouchRead(touchPosition* pos)
|
||||
{
|
||||
if (pos) *pos = tPos;
|
||||
}
|
||||
|
||||
void hidCircleRead(circlePosition* pos)
|
||||
{
|
||||
if (pos) *pos = cPos;
|
||||
}
|
||||
|
||||
Result HIDUSER_GetInfo(Handle* handle, Handle* outMemHandle)
|
||||
{
|
||||
if(!handle)handle=&hidHandle;
|
||||
|
Loading…
Reference in New Issue
Block a user