/* _hid.c - Touch screen, buttons, gyroscope, accelerometer etc. */ #include #include #include <3ds.h> Handle hidHandle; 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; Result ret=0; // Request service. if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret; // Get sharedmem handle. if((ret=HIDUSER_GetSharedMem(&hidMemHandle))) goto cleanup1; // Map HID shared memory at addr "sharedMem". hidSharedMem=sharedMem; if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2; // Reset internal state. kOld = kHeld = kDown = kUp = 0; return 0; cleanup2: svcCloseHandle(hidMemHandle); cleanup1: svcCloseHandle(hidHandle); return ret; } void hidExit() { // Unmap HID sharedmem and close handles. svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem); svcCloseHandle(hidMemHandle); svcCloseHandle(hidHandle); } void hidScanInput() { kOld = kHeld; u32 padId = hidSharedMem[4]; if(padId>7)padId=7; kHeld = hidSharedMem[10 + padId*4]; cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3]; u32 touchId = hidSharedMem[42 + 4]; if(touchId>7)touchId=7; 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_GetSharedMem(Handle* outMemHandle) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0xa0000; //request header code Result ret=0; if((ret=svcSendSyncRequest(hidHandle)))return ret; if(outMemHandle)*outMemHandle=cmdbuf[3]; return cmdbuf[1]; } Result HIDUSER_EnableAccelerometer() { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0x110000; //request header code Result ret=0; if((ret=svcSendSyncRequest(hidHandle)))return ret; return cmdbuf[1]; } Result HIDUSER_DisableAccelerometer() { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0x120000; //request header code Result ret=0; if((ret=svcSendSyncRequest(hidHandle)))return ret; return cmdbuf[1]; } Result HIDUSER_EnableGyroscope() { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0x130000; //request header code Result ret=0; if((ret=svcSendSyncRequest(hidHandle)))return ret; return cmdbuf[1]; } Result HIDUSER_DisableGyroscope() { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0x140000; //request header code Result ret=0; if((ret=svcSendSyncRequest(hidHandle)))return ret; return cmdbuf[1]; }