]> Chaos Git - corbenik/ctrulib.git/commitdiff
HID: Various improvements.
authorplutoo <plutoo@univor.se>
Thu, 21 Aug 2014 18:06:05 +0000 (20:06 +0200)
committerplutoo <plutoo@univor.se>
Thu, 21 Aug 2014 18:08:08 +0000 (20:08 +0200)
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.

libctru/include/3ds/HID.h
libctru/source/services/hid.c

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