HID: Various improvements.

Added gyro enable/disable cmd.
Added accelerometer disable cmd.
Fixed hidInit() error handling.
hidInit() no longer enables accelerometer.
HIDUSER_GetInfo has been renamed to HIDUSER_GetSharedMem.
hid functions no longer require a NULL-ptr as arg0.
This commit is contained in:
plutoo 2014-08-21 20:06:05 +02:00
parent 7dbd7e535c
commit 89e29dbe06
2 changed files with 92 additions and 45 deletions

View File

@ -61,7 +61,10 @@ void hidCircleRead(circlePosition* pos);
#define touchRead hidTouchRead #define touchRead hidTouchRead
#define circleRead hidCircleRead #define circleRead hidCircleRead
Result HIDUSER_GetInfo(Handle* handle, Handle* outMemHandle); Result HIDUSER_GetSharedMem(Handle* outMemHandle);
Result HIDUSER_EnableAccelerometer(Handle* handle); Result HIDUSER_EnableAccelerometer();
Result HIDUSER_DisableAccelerometer();
Result HIDUSER_EnableGyroscope();
Result HIDUSER_DisableGyroscope();
#endif #endif

View File

@ -1,3 +1,6 @@
/*
_hid.c - Touch screen, buttons, gyroscope, accelerometer etc.
*/
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <3ds/types.h> #include <3ds/types.h>
@ -14,95 +17,136 @@ static u32 kOld, kHeld, kDown, kUp;
static touchPosition tPos; static touchPosition tPos;
static circlePosition cPos; static circlePosition cPos;
Result hidInit(u32* sharedMem) Result hidInit(u32* sharedMem)
{ {
if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT; if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
Result ret=0; Result ret=0;
if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret; // Request service.
if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
if((ret=HIDUSER_GetInfo(NULL, &hidMemHandle)))return ret;
hidSharedMem=sharedMem;
svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000);
if((ret=HIDUSER_EnableAccelerometer(NULL)))return ret; // Get sharedmem handle.
if((ret=HIDUSER_GetSharedMem(&hidMemHandle))) goto cleanup1;
kOld = kHeld = kDown = kUp = 0; // Map HID shared memory at addr "sharedMem".
hidSharedMem=sharedMem;
if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
return 0; // Reset internal state.
kOld = kHeld = kDown = kUp = 0;
return 0;
cleanup2:
svcCloseHandle(hidMemHandle);
cleanup1:
svcCloseHandle(hidHandle);
return ret;
} }
void hidExit() void hidExit()
{ {
svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem); // Unmap HID sharedmem and close handles.
svcCloseHandle(hidMemHandle); svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem);
svcCloseHandle(hidHandle); svcCloseHandle(hidMemHandle);
svcCloseHandle(hidHandle);
} }
void hidScanInput() void hidScanInput()
{ {
kOld = kHeld; kOld = kHeld;
int padId = hidSharedMem[4]; int padId = hidSharedMem[4];
kHeld = hidSharedMem[10 + padId*4]; kHeld = hidSharedMem[10 + padId*4];
cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3]; cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3];
int touchId = hidSharedMem[42 + 4]; int touchId = hidSharedMem[42 + 4];
tPos = *(touchPosition*)&hidSharedMem[42 + 8 + touchId*2]; tPos = *(touchPosition*)&hidSharedMem[42 + 8 + touchId*2];
if (hidSharedMem[42 + 8 + touchId*2 + 1]) if (hidSharedMem[42 + 8 + touchId*2 + 1])
kHeld |= KEY_TOUCH; kHeld |= KEY_TOUCH;
kDown = (~kOld) & kHeld; kDown = (~kOld) & kHeld;
kUp = kOld & (~kHeld); kUp = kOld & (~kHeld);
} }
u32 hidKeysHeld() u32 hidKeysHeld()
{ {
return kHeld; return kHeld;
} }
u32 hidKeysDown() u32 hidKeysDown()
{ {
return kDown; return kDown;
} }
u32 hidKeysUp() u32 hidKeysUp()
{ {
return kUp; return kUp;
} }
void hidTouchRead(touchPosition* pos) void hidTouchRead(touchPosition* pos)
{ {
if (pos) *pos = tPos; if (pos) *pos = tPos;
} }
void hidCircleRead(circlePosition* pos) void hidCircleRead(circlePosition* pos)
{ {
if (pos) *pos = cPos; if (pos) *pos = cPos;
} }
Result HIDUSER_GetInfo(Handle* handle, Handle* outMemHandle) Result HIDUSER_GetSharedMem(Handle* outMemHandle)
{ {
if(!handle)handle=&hidHandle; u32* cmdbuf=getThreadCommandBuffer();
u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0xa0000; //request header code
cmdbuf[0]=0xa0000; //request header code
Result ret=0; Result ret=0;
if((ret=svcSendSyncRequest(*handle)))return ret; if((ret=svcSendSyncRequest(hidHandle)))return ret;
if(outMemHandle)*outMemHandle=cmdbuf[3]; if(outMemHandle)*outMemHandle=cmdbuf[3];
return cmdbuf[1]; return cmdbuf[1];
} }
Result HIDUSER_EnableAccelerometer(Handle* handle) Result HIDUSER_EnableAccelerometer()
{ {
if(!handle)handle=&hidHandle; u32* cmdbuf=getThreadCommandBuffer();
u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0x110000; //request header code
cmdbuf[0]=0x110000; //request header code
Result ret=0; Result ret=0;
if((ret=svcSendSyncRequest(*handle)))return ret; if((ret=svcSendSyncRequest(hidHandle)))return ret;
return cmdbuf[1]; 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];
} }