HID: implement key/touch/circle pad access

This commit is contained in:
fincs 2014-08-21 16:55:21 +02:00
parent 9cef70bbd4
commit 0e850119c9
3 changed files with 98 additions and 19 deletions

View File

@ -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);

View File

@ -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

View File

@ -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;