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:
parent
7dbd7e535c
commit
89e29dbe06
@ -61,7 +61,10 @@ void hidCircleRead(circlePosition* pos);
|
||||
#define touchRead hidTouchRead
|
||||
#define circleRead hidCircleRead
|
||||
|
||||
Result HIDUSER_GetInfo(Handle* handle, Handle* outMemHandle);
|
||||
Result HIDUSER_EnableAccelerometer(Handle* handle);
|
||||
Result HIDUSER_GetSharedMem(Handle* outMemHandle);
|
||||
Result HIDUSER_EnableAccelerometer();
|
||||
Result HIDUSER_DisableAccelerometer();
|
||||
Result HIDUSER_EnableGyroscope();
|
||||
Result HIDUSER_DisableGyroscope();
|
||||
|
||||
#endif
|
||||
|
@ -1,3 +1,6 @@
|
||||
/*
|
||||
_hid.c - Touch screen, buttons, gyroscope, accelerometer etc.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <3ds/types.h>
|
||||
@ -14,26 +17,36 @@ 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;
|
||||
|
||||
if((ret=HIDUSER_GetInfo(NULL, &hidMemHandle)))return ret;
|
||||
// Get sharedmem handle.
|
||||
if((ret=HIDUSER_GetSharedMem(&hidMemHandle))) goto cleanup1;
|
||||
|
||||
// Map HID shared memory at addr "sharedMem".
|
||||
hidSharedMem=sharedMem;
|
||||
svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000);
|
||||
|
||||
if((ret=HIDUSER_EnableAccelerometer(NULL)))return ret;
|
||||
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);
|
||||
@ -81,28 +94,59 @@ void hidCircleRead(circlePosition* pos)
|
||||
if (pos) *pos = cPos;
|
||||
}
|
||||
|
||||
Result HIDUSER_GetInfo(Handle* handle, Handle* outMemHandle)
|
||||
Result HIDUSER_GetSharedMem(Handle* outMemHandle)
|
||||
{
|
||||
if(!handle)handle=&hidHandle;
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0xa0000; //request header code
|
||||
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(*handle)))return ret;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
|
||||
if(outMemHandle)*outMemHandle=cmdbuf[3];
|
||||
|
||||
return cmdbuf[1];
|
||||
}
|
||||
|
||||
Result HIDUSER_EnableAccelerometer(Handle* handle)
|
||||
Result HIDUSER_EnableAccelerometer()
|
||||
{
|
||||
if(!handle)handle=&hidHandle;
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0x110000; //request header code
|
||||
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(*handle)))return ret;
|
||||
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];
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user