]> Chaos Git - corbenik/ctrulib.git/commitdiff
HID: implement key/touch/circle pad access
authorfincs <fincs.alt1@gmail.com>
Thu, 21 Aug 2014 14:55:21 +0000 (16:55 +0200)
committerfincs <fincs.alt1@gmail.com>
Thu, 21 Aug 2014 14:55:21 +0000 (16:55 +0200)
libctru/include/3ds/HID.h
libctru/include/3ds/types.h
libctru/source/services/hid.c

index 79a5e8a360048036a6ffe6e0bfcf2f9177405f5e..c62010263f49f686d915c9e2180ac9ead0082e48 100644 (file)
@@ -3,27 +3,42 @@
 
 #define HID_SHAREDMEM_DEFAULT (0x10000000)
 
-#define CPAD_X(v) ((s16)((v)&0xFFFF))
-#define CPAD_Y(v) ((s16)(((v>>16))&0xFFFF))
+typedef enum
+{
+       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),
 
-#define TOUCH_X(v) ((u16)((v)&0xFFFF))
-#define TOUCH_Y(v) ((u16)(((v>>16))&0xFFFF))
+       // 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 enum
+typedef struct
 {
-       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;
+       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);
 
index bf4e770ae087e5555bf26e629db00b1aef62c7df..0b24698aec3cc30d5207dfe08836f980370c0130 100644 (file)
@@ -35,5 +35,6 @@ typedef u32 Handle;
 typedef s32 Result;
 typedef void (*ThreadFunc)(u32);
 
+#define BIT(n) (1U<<(n))
 
 #endif
index bb2d43ffab23cf173657b6680e636aceef777114..5764cfe59443015cc6dfd6c951aa1273c5b8d316 100644 (file)
@@ -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;