#pragma once
+//See also: http://3dbrew.org/wiki/HID_Services http://3dbrew.org/wiki/HID_Shared_Memory
+
#define HID_SHAREDMEM_DEFAULT (0x10000000)
typedef enum
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;
void hidTouchRead(touchPosition* pos);
void hidCircleRead(circlePosition* pos);
+void hidWaitForEvent(HID_Event id, bool nextEvent);
+
// libnds compatibility defines
#define scanKeys hidScanInput
#define keysHeld hidKeysHeld
#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();
void gspWaitForEvent(GSP_Event id, bool nextEvent)
{
+ if(id>=GSPEVENT_MAX)return;
+
if (nextEvent)
svcClearEvent(gspEvents[id]);
svcWaitSynchronization(gspEvents[id], U64_MAX);
Handle hidHandle;
Handle hidMemHandle;
+Handle hidEvents[5];
+
vu32* hidSharedMem;
static u32 kOld, kHeld, kDown, kUp;
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;
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;
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
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];
}