Improved HID code, and added Accelerometer/Gyroscope support.

This commit is contained in:
yellows8 2014-08-30 20:41:09 -04:00
parent 9425edc406
commit 62f26e8760
2 changed files with 82 additions and 9 deletions

View File

@ -41,6 +41,20 @@ typedef struct
s16 dx, dy; s16 dx, dy;
} circlePosition; } circlePosition;
typedef struct
{
s16 x;
s16 y;
s16 z;
} accelVector;
typedef struct
{
s16 x;//roll
s16 z;//yaw
s16 y;//pitch
} angularRate;
typedef enum typedef enum
{ {
HIDEVENT_PAD0 = 0, //"Event signaled by HID-module, when the sharedmem+0(PAD/circle-pad)/+0xA8(touch-screen) region was updated." HIDEVENT_PAD0 = 0, //"Event signaled by HID-module, when the sharedmem+0(PAD/circle-pad)/+0xA8(touch-screen) region was updated."
@ -64,6 +78,8 @@ u32 hidKeysDown();
u32 hidKeysUp(); u32 hidKeysUp();
void hidTouchRead(touchPosition* pos); void hidTouchRead(touchPosition* pos);
void hidCircleRead(circlePosition* pos); void hidCircleRead(circlePosition* pos);
void hidAccelRead(accelVector* vector);
void hidGyroRead(angularRate* rate);
void hidWaitForEvent(HID_Event id, bool nextEvent); void hidWaitForEvent(HID_Event id, bool nextEvent);
@ -80,3 +96,4 @@ Result HIDUSER_EnableAccelerometer();
Result HIDUSER_DisableAccelerometer(); Result HIDUSER_DisableAccelerometer();
Result HIDUSER_EnableGyroscope(); Result HIDUSER_EnableGyroscope();
Result HIDUSER_DisableGyroscope(); Result HIDUSER_DisableGyroscope();

View File

@ -15,6 +15,8 @@ vu32* hidSharedMem;
static u32 kOld, kHeld, kDown, kUp; static u32 kOld, kHeld, kDown, kUp;
static touchPosition tPos; static touchPosition tPos;
static circlePosition cPos; static circlePosition cPos;
static accelVector aVec;
static angularRate gRate;
Result hidInit(u32* sharedMem) Result hidInit(u32* sharedMem)
@ -62,23 +64,66 @@ void hidWaitForEvent(HID_Event id, bool nextEvent)
svcClearEvent(hidEvents[id]); svcClearEvent(hidEvents[id]);
} }
u32 hidCheckSectionUpdateTime(vu32 *sharedmem_section, u32 id)
{
s64 tick0=0, tick1=0;
if(id==0)
{
tick0 = *((u64*)&sharedmem_section[0]);
tick1 = *((u64*)&sharedmem_section[2]);
if(tick0==tick1 || tick0<0 || tick1<0)return 1;
}
return 0;
}
void hidScanInput() void hidScanInput()
{ {
u32 Id=0;
kOld = kHeld; kOld = kHeld;
u32 padId = hidSharedMem[4]; kHeld = 0;
if(padId>7)padId=7; memset(&cPos, 0, sizeof(circlePosition));
kHeld = hidSharedMem[10 + padId*4]; memset(&tPos, 0, sizeof(touchPosition));
cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3]; memset(&aVec, 0, sizeof(accelVector));
memset(&gRate, 0, sizeof(angularRate));
u32 touchId = hidSharedMem[42 + 4]; Id = hidSharedMem[4];//PAD / circle-pad
if(touchId>7)touchId=7; if(Id>7)Id=7;
tPos = *(touchPosition*)&hidSharedMem[42 + 8 + touchId*2]; if(hidCheckSectionUpdateTime(hidSharedMem, Id)==0)
if (hidSharedMem[42 + 8 + touchId*2 + 1]) {
kHeld |= KEY_TOUCH; kHeld = hidSharedMem[10 + Id*4];
cPos = *(circlePosition*)&hidSharedMem[10 + Id*4 + 3];
}
Id = hidSharedMem[42 + 4];//Touch-screen
if(Id>7)Id=7;
if(hidCheckSectionUpdateTime(&hidSharedMem[42], Id)==0)
{
tPos = *(touchPosition*)&hidSharedMem[42 + 8 + Id*2];
if (hidSharedMem[42 + 8 + Id*2 + 1])
kHeld |= KEY_TOUCH;
}
kDown = (~kOld) & kHeld; kDown = (~kOld) & kHeld;
kUp = kOld & (~kHeld); kUp = kOld & (~kHeld);
Id = hidSharedMem[66 + 4];//Accelerometer
if(Id>7)Id=7;
if(hidCheckSectionUpdateTime(&hidSharedMem[66], Id)==0)
{
aVec = *(accelVector*)&hidSharedMem[66 + 8 + Id*2];
}
Id = hidSharedMem[86 + 4];//Gyroscope
if(Id>31)Id=31;
if(hidCheckSectionUpdateTime(&hidSharedMem[86], Id)==0)
{
gRate = *(angularRate*)&hidSharedMem[86 + 8 + Id*2];
}
} }
u32 hidKeysHeld() u32 hidKeysHeld()
@ -106,6 +151,16 @@ void hidCircleRead(circlePosition* pos)
if (pos) *pos = cPos; if (pos) *pos = cPos;
} }
void hidAccelRead(accelVector* vector)
{
if (vector) *vector = aVec;
}
void hidGyroRead(angularRate* rate)
{
if (rate) *rate = gRate;
}
Result HIDUSER_GetHandles(Handle* outMemHandle, Handle *eventpad0, Handle *eventpad1, Handle *eventaccel, Handle *eventgyro, Handle *eventdebugpad) Result HIDUSER_GetHandles(Handle* outMemHandle, Handle *eventpad0, Handle *eventpad1, Handle *eventaccel, Handle *eventgyro, Handle *eventdebugpad)
{ {
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
@ -168,3 +223,4 @@ Result HIDUSER_DisableGyroscope()
return cmdbuf[1]; return cmdbuf[1];
} }