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 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
|
typedef enum
|
||||||
{
|
{
|
||||||
PAD_A = (1<<0),
|
KEY_A = BIT(0),
|
||||||
PAD_B = (1<<1),
|
KEY_B = BIT(1),
|
||||||
PAD_SELECT = (1<<2),
|
KEY_SELECT = BIT(2),
|
||||||
PAD_START = (1<<3),
|
KEY_START = BIT(3),
|
||||||
PAD_RIGHT = (1<<4),
|
KEY_DRIGHT = BIT(4),
|
||||||
PAD_LEFT = (1<<5),
|
KEY_DLEFT = BIT(5),
|
||||||
PAD_UP = (1<<6),
|
KEY_DUP = BIT(6),
|
||||||
PAD_DOWN = (1<<7),
|
KEY_DDOWN = BIT(7),
|
||||||
PAD_R = (1<<8),
|
KEY_R = BIT(8),
|
||||||
PAD_L = (1<<9),
|
KEY_L = BIT(9),
|
||||||
PAD_X = (1<<10),
|
KEY_X = BIT(10),
|
||||||
PAD_Y = (1<<11)
|
KEY_Y = BIT(11),
|
||||||
}PAD_KEY;
|
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 Handle hidMemHandle;
|
||||||
extern vu32* hidSharedMem;
|
extern vu32* hidSharedMem;
|
||||||
@ -31,6 +46,21 @@ extern vu32* hidSharedMem;
|
|||||||
Result hidInit(u32* sharedMem);
|
Result hidInit(u32* sharedMem);
|
||||||
void hidExit();
|
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_GetInfo(Handle* handle, Handle* outMemHandle);
|
||||||
Result HIDUSER_EnableAccelerometer(Handle* handle);
|
Result HIDUSER_EnableAccelerometer(Handle* handle);
|
||||||
|
|
||||||
|
@ -35,5 +35,6 @@ typedef u32 Handle;
|
|||||||
typedef s32 Result;
|
typedef s32 Result;
|
||||||
typedef void (*ThreadFunc)(u32);
|
typedef void (*ThreadFunc)(u32);
|
||||||
|
|
||||||
|
#define BIT(n) (1U<<(n))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -10,6 +10,10 @@ Handle hidMemHandle;
|
|||||||
|
|
||||||
vu32* hidSharedMem;
|
vu32* hidSharedMem;
|
||||||
|
|
||||||
|
static u32 kOld, kHeld, kDown, kUp;
|
||||||
|
static touchPosition tPos;
|
||||||
|
static circlePosition cPos;
|
||||||
|
|
||||||
Result hidInit(u32* sharedMem)
|
Result hidInit(u32* sharedMem)
|
||||||
{
|
{
|
||||||
if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
|
if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
|
||||||
@ -23,6 +27,8 @@ Result hidInit(u32* sharedMem)
|
|||||||
|
|
||||||
if((ret=HIDUSER_EnableAccelerometer(NULL)))return ret;
|
if((ret=HIDUSER_EnableAccelerometer(NULL)))return ret;
|
||||||
|
|
||||||
|
kOld = kHeld = kDown = kUp = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,6 +39,48 @@ void hidExit()
|
|||||||
svcCloseHandle(hidHandle);
|
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)
|
Result HIDUSER_GetInfo(Handle* handle, Handle* outMemHandle)
|
||||||
{
|
{
|
||||||
if(!handle)handle=&hidHandle;
|
if(!handle)handle=&hidHandle;
|
||||||
|
Loading…
Reference in New Issue
Block a user