s16 dx, dy;
} circlePosition;
+typedef struct
+{
+ s16 x;
+ s16 y;
+ s16 z;
+} accelVector;
+
+typedef struct
+{
+ s16 x;//roll
+ s16 z;//yaw
+ s16 y;//pitch
+} angularRate;
+
typedef enum
{
HIDEVENT_PAD0 = 0, //"Event signaled by HID-module, when the sharedmem+0(PAD/circle-pad)/+0xA8(touch-screen) region was updated."
u32 hidKeysUp();
void hidTouchRead(touchPosition* pos);
void hidCircleRead(circlePosition* pos);
+void hidAccelRead(accelVector* vector);
+void hidGyroRead(angularRate* rate);
void hidWaitForEvent(HID_Event id, bool nextEvent);
Result HIDUSER_DisableAccelerometer();
Result HIDUSER_EnableGyroscope();
Result HIDUSER_DisableGyroscope();
+
static u32 kOld, kHeld, kDown, kUp;
static touchPosition tPos;
static circlePosition cPos;
+static accelVector aVec;
+static angularRate gRate;
Result hidInit(u32* sharedMem)
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()
{
- kOld = kHeld;
+ u32 Id=0;
- u32 padId = hidSharedMem[4];
- if(padId>7)padId=7;
- kHeld = hidSharedMem[10 + padId*4];
- cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3];
+ kOld = kHeld;
- 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;
+ kHeld = 0;
+ memset(&cPos, 0, sizeof(circlePosition));
+ memset(&tPos, 0, sizeof(touchPosition));
+ memset(&aVec, 0, sizeof(accelVector));
+ memset(&gRate, 0, sizeof(angularRate));
+
+ Id = hidSharedMem[4];//PAD / circle-pad
+ if(Id>7)Id=7;
+ if(hidCheckSectionUpdateTime(hidSharedMem, Id)==0)
+ {
+ 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;
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()
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)
{
u32* cmdbuf=getThreadCommandBuffer();
return cmdbuf[1];
}
+