Updated APT_CheckNew3DS to only use the APT cmds once(which also now calls aptOpenSession/aptCloseSession), then store the output value in a flag which is then used for all future APT_CheckNew3DS calls. Updated HID init/shutdown code to automatically call irrst init/shutdown code when running on new3ds. Updated irrst init code to only do init when it wasn't already initialized, likewise for the irrst shutdown code.

This commit is contained in:
yellows8 2014-11-01 23:48:35 -04:00
parent 4e90fbb905
commit 3135d1c344
4 changed files with 43 additions and 4 deletions

View File

@ -69,7 +69,7 @@ Result APT_PrepareToCloseApplication(Handle* handle, u8 a);
Result APT_CloseApplication(Handle* handle, u32 a, u32 b, u32 c); Result APT_CloseApplication(Handle* handle, u32 a, u32 b, u32 c);
Result APT_SetAppCpuTimeLimit(Handle* handle, u32 percent); Result APT_SetAppCpuTimeLimit(Handle* handle, u32 percent);
Result APT_GetAppCpuTimeLimit(Handle* handle, u32 *percent); Result APT_GetAppCpuTimeLimit(Handle* handle, u32 *percent);
Result APT_CheckNew3DS_Application(Handle* handle, u8 *out);//*Application and *System use APT commands 0x01010000 and 0x01020000. Using APT_CheckNew3DS() is recommended, this determines which of those two funcs to use automatically. Result APT_CheckNew3DS_Application(Handle* handle, u8 *out);//*Application and *System use APT commands 0x01010000 and 0x01020000. Using APT_CheckNew3DS() is recommended, this determines which of those two funcs to use automatically. When this is first called(this calls aptOpenSession/aptCloseSession internally), this initializes an internal flag, which is then used for the out val for all future calls.
Result APT_CheckNew3DS_System(Handle* handle, u8 *out); Result APT_CheckNew3DS_System(Handle* handle, u8 *out);
Result APT_CheckNew3DS(Handle* handle, u8 *out); Result APT_CheckNew3DS(Handle* handle, u8 *out);

View File

@ -17,6 +17,9 @@ NS_APPID currentAppId;
static char *__apt_servicestr = NULL; static char *__apt_servicestr = NULL;
static char *__apt_servicenames[3] = {"APT:U", "APT:S", "APT:A"}; static char *__apt_servicenames[3] = {"APT:U", "APT:S", "APT:A"};
static u32 __apt_new3dsflag_initialized = 0;
static u8 __apt_new3dsflag = 0;
Handle aptLockHandle; Handle aptLockHandle;
Handle aptuHandle; Handle aptuHandle;
Handle aptEvents[3]; Handle aptEvents[3];
@ -838,7 +841,22 @@ Result APT_CheckNew3DS_System(Handle* handle, u8 *out)
Result APT_CheckNew3DS(Handle* handle, u8 *out) Result APT_CheckNew3DS(Handle* handle, u8 *out)
{ {
if(currentAppId==APPID_APPLICATION)return APT_CheckNew3DS_Application(NULL, out); Result ret=0;
return APT_CheckNew3DS_System(NULL, out);
if(__apt_new3dsflag_initialized)
{
*out = __apt_new3dsflag;
return 0;
}
aptOpenSession();
if(currentAppId==APPID_APPLICATION)ret = APT_CheckNew3DS_Application(NULL, out);
ret = APT_CheckNew3DS_System(NULL, out);
aptCloseSession();
__apt_new3dsflag_initialized = 1;
__apt_new3dsflag = *out;
return ret;
} }

View File

@ -21,6 +21,8 @@ static angularRate gRate;
Result hidInit(u32* sharedMem) Result hidInit(u32* sharedMem)
{ {
u8 val=0;
if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT; if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
Result ret=0; Result ret=0;
@ -34,9 +36,16 @@ Result hidInit(u32* sharedMem)
hidSharedMem=sharedMem; hidSharedMem=sharedMem;
if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2; if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
APT_CheckNew3DS(NULL, &val);
if(val)
{
ret = irrstInit(NULL);
}
// Reset internal state. // Reset internal state.
kOld = kHeld = kDown = kUp = 0; kOld = kHeld = kDown = kUp = 0;
return 0; return ret;
cleanup2: cleanup2:
svcCloseHandle(hidMemHandle); svcCloseHandle(hidMemHandle);
@ -48,10 +57,18 @@ cleanup1:
void hidExit() void hidExit()
{ {
// Unmap HID sharedmem and close handles. // Unmap HID sharedmem and close handles.
u8 val=0;
int i; for(i=0; i<5; i++)svcCloseHandle(hidEvents[i]); int i; for(i=0; i<5; i++)svcCloseHandle(hidEvents[i]);
svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem); svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem);
svcCloseHandle(hidMemHandle); svcCloseHandle(hidMemHandle);
svcCloseHandle(hidHandle); svcCloseHandle(hidHandle);
APT_CheckNew3DS(NULL, &val);
if(val)
{
irrstExit();
}
} }
void hidWaitForEvent(HID_Event id, bool nextEvent) void hidWaitForEvent(HID_Event id, bool nextEvent)

View File

@ -17,6 +17,8 @@ static bool irrstUsed = false;
Result irrstInit(u32* sharedMem) Result irrstInit(u32* sharedMem)
{ {
if(irrstUsed)return 0;
if(!sharedMem)sharedMem=(u32*)IRRST_SHAREDMEM_DEFAULT; if(!sharedMem)sharedMem=(u32*)IRRST_SHAREDMEM_DEFAULT;
Result ret=0; Result ret=0;
@ -44,6 +46,8 @@ cleanup1:
void irrstExit() void irrstExit()
{ {
if(!irrstUsed)return;
irrstUsed = false; irrstUsed = false;
svcCloseHandle(irrstEvent); svcCloseHandle(irrstEvent);
// Unmap ir:rst sharedmem and close handles. // Unmap ir:rst sharedmem and close handles.