diff --git a/libctru/include/3ds/HID.h b/libctru/include/3ds/HID.h index 79a5e8a..c620102 100644 --- a/libctru/include/3ds/HID.h +++ b/libctru/include/3ds/HID.h @@ -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); diff --git a/libctru/include/3ds/types.h b/libctru/include/3ds/types.h index bf4e770..0b24698 100644 --- a/libctru/include/3ds/types.h +++ b/libctru/include/3ds/types.h @@ -35,5 +35,6 @@ typedef u32 Handle; typedef s32 Result; typedef void (*ThreadFunc)(u32); +#define BIT(n) (1U<<(n)) #endif diff --git a/libctru/source/services/hid.c b/libctru/source/services/hid.c index bb2d43f..5764cfe 100644 --- a/libctru/source/services/hid.c +++ b/libctru/source/services/hid.c @@ -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;