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 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
|
||||||
|
@ -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,26 +17,36 @@ 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;
|
||||||
|
|
||||||
|
// Request service.
|
||||||
if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
|
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;
|
hidSharedMem=sharedMem;
|
||||||
svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000);
|
if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
|
||||||
|
|
||||||
if((ret=HIDUSER_EnableAccelerometer(NULL)))return ret;
|
|
||||||
|
|
||||||
|
// Reset internal state.
|
||||||
kOld = kHeld = kDown = kUp = 0;
|
kOld = kHeld = kDown = kUp = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
cleanup2:
|
||||||
|
svcCloseHandle(hidMemHandle);
|
||||||
|
cleanup1:
|
||||||
|
svcCloseHandle(hidHandle);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hidExit()
|
void hidExit()
|
||||||
{
|
{
|
||||||
|
// Unmap HID sharedmem and close handles.
|
||||||
svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem);
|
svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem);
|
||||||
svcCloseHandle(hidMemHandle);
|
svcCloseHandle(hidMemHandle);
|
||||||
svcCloseHandle(hidHandle);
|
svcCloseHandle(hidHandle);
|
||||||
@ -81,28 +94,59 @@ 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];
|
||||||
|
}
|
||||||
|
|
||||||
|
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];
|
return cmdbuf[1];
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user