]> Chaos Git - corbenik/ctrulib.git/commitdiff
Added HID event code, based on the GSP event code. Added event id check in gspWaitFor...
authoryellows8 <yellows8@users.noreply.github.com>
Fri, 29 Aug 2014 20:19:58 +0000 (16:19 -0400)
committeryellows8 <yellows8@users.noreply.github.com>
Fri, 29 Aug 2014 20:19:58 +0000 (16:19 -0400)
libctru/include/3ds/services/hid.h
libctru/source/services/gsp.c
libctru/source/services/hid.c

index 17e13ab77e058192d6727712d9956251b95fc520..b39898f2035698906c2701c637b03a374366b367 100644 (file)
@@ -1,5 +1,7 @@
 #pragma once
 
+//See also: http://3dbrew.org/wiki/HID_Services http://3dbrew.org/wiki/HID_Shared_Memory
+
 #define HID_SHAREDMEM_DEFAULT (0x10000000)
 
 typedef enum
@@ -39,6 +41,17 @@ typedef struct
        s16 dx, dy;
 } circlePosition;
 
+typedef enum
+{
+       HIDEVENT_PAD0 = 0, //"Event signaled by HID-module, when the sharedmem+0(PAD/circle-pad)/+0xA8(touch-screen) region was updated."
+       HIDEVENT_PAD1, //"Event signaled by HID-module, when the sharedmem+0(PAD/circle-pad)/+0xA8(touch-screen) region was updated."
+       HIDEVENT_Accel, //"Event signaled by HID-module, when the sharedmem accelerometer state was updated."
+       HIDEVENT_Gyro, //"Event signaled by HID-module, when the sharedmem gyroscope state was updated."
+       HIDEVENT_DebugPad, //"Event signaled by HID-module, when the sharedmem DebugPad state was updated."
+
+       HIDEVENT_MAX, // used to know how many events there are
+} HID_Event;
+
 extern Handle hidMemHandle;
 extern vu32* hidSharedMem;
 
@@ -52,6 +65,8 @@ u32 hidKeysUp();
 void hidTouchRead(touchPosition* pos);
 void hidCircleRead(circlePosition* pos);
 
+void hidWaitForEvent(HID_Event id, bool nextEvent);
+
 // libnds compatibility defines
 #define scanKeys   hidScanInput
 #define keysHeld   hidKeysHeld
@@ -60,7 +75,7 @@ void hidCircleRead(circlePosition* pos);
 #define touchRead  hidTouchRead
 #define circleRead hidCircleRead
 
-Result HIDUSER_GetSharedMem(Handle* outMemHandle);
+Result HIDUSER_GetHandles(Handle* outMemHandle, Handle *eventpad0, Handle *eventpad1, Handle *eventaccel, Handle *eventgyro, Handle *eventdebugpad);
 Result HIDUSER_EnableAccelerometer();
 Result HIDUSER_DisableAccelerometer();
 Result HIDUSER_EnableGyroscope();
index bd76035f27e984b9a392cacc2b4bb98e74613349..7c640190eafdbf4c9ca9545f5dff2ea30c82d229 100644 (file)
@@ -68,6 +68,8 @@ void gspExitEventHandler()
 
 void gspWaitForEvent(GSP_Event id, bool nextEvent)
 {
+       if(id>=GSPEVENT_MAX)return;
+
        if (nextEvent)
                svcClearEvent(gspEvents[id]);
        svcWaitSynchronization(gspEvents[id], U64_MAX);
index 1265ec9dc088e8319d8e2f5abc0c7c79a7194655..aaff8e1391ac5d7aa4023862987a7c865b9c341e 100644 (file)
@@ -8,6 +8,8 @@
 Handle hidHandle;
 Handle hidMemHandle;
 
+Handle hidEvents[5];
+
 vu32* hidSharedMem;
 
 static u32 kOld, kHeld, kDown, kUp;
@@ -24,7 +26,7 @@ Result hidInit(u32* sharedMem)
        if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
 
        // Get sharedmem handle.
-       if((ret=HIDUSER_GetSharedMem(&hidMemHandle))) goto cleanup1;
+       if((ret=HIDUSER_GetHandles(&hidMemHandle, &hidEvents[HIDEVENT_PAD0], &hidEvents[HIDEVENT_PAD1], &hidEvents[HIDEVENT_Accel], &hidEvents[HIDEVENT_Gyro], &hidEvents[HIDEVENT_DebugPad]))) goto cleanup1;
 
        // Map HID shared memory at addr "sharedMem".
        hidSharedMem=sharedMem;
@@ -49,6 +51,17 @@ void hidExit()
        svcCloseHandle(hidHandle);
 }
 
+void hidWaitForEvent(HID_Event id, bool nextEvent)
+{
+       if(id>=HIDEVENT_MAX)return;
+
+       if (nextEvent)
+               svcClearEvent(hidEvents[id]);
+       svcWaitSynchronization(hidEvents[id], U64_MAX);
+       if (!nextEvent)
+               svcClearEvent(hidEvents[id]);
+}
+
 void hidScanInput()
 {
        kOld = kHeld;
@@ -93,7 +106,7 @@ void hidCircleRead(circlePosition* pos)
        if (pos) *pos = cPos;
 }
 
-Result HIDUSER_GetSharedMem(Handle* outMemHandle)
+Result HIDUSER_GetHandles(Handle* outMemHandle, Handle *eventpad0, Handle *eventpad1, Handle *eventaccel, Handle *eventgyro, Handle *eventdebugpad)
 {
        u32* cmdbuf=getThreadCommandBuffer();
        cmdbuf[0]=0xa0000; //request header code
@@ -103,6 +116,12 @@ Result HIDUSER_GetSharedMem(Handle* outMemHandle)
 
        if(outMemHandle)*outMemHandle=cmdbuf[3];
 
+       if(eventpad0)*eventpad0=cmdbuf[4];
+       if(eventpad1)*eventpad1=cmdbuf[5];
+       if(eventaccel)*eventaccel=cmdbuf[6];
+       if(eventgyro)*eventgyro=cmdbuf[7];
+       if(eventdebugpad)*eventdebugpad=cmdbuf[8];
+
        return cmdbuf[1];
 }