My Project
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules
irrst.c
Go to the documentation of this file.
1 /*
2  _irrst.c - C-stick, ZL/ZR
3 */
4 #include <stdlib.h>
5 #include <string.h>
6 #include <3ds.h>
7 
11 
13 
14 static u32 kHeld;
15 static circlePosition csPos;
16 static bool irrstUsed = false;
17 
18 Result irrstInit(u32* sharedMem)
19 {
20  if(irrstUsed)return 0;
21 
22  if(!sharedMem)sharedMem=(u32*)IRRST_SHAREDMEM_DEFAULT;
23  Result ret=0;
24 
25  // Request service.
26  if((ret=srvGetServiceHandle(&irrstHandle, "ir:rst")))return ret;
27 
28  // Get sharedmem handle.
29  if((ret=IRRST_GetHandles(&irrstMemHandle, &irrstEvent))) goto cleanup1;
30 
31  // Map ir:rst shared memory at addr "sharedMem".
32  irrstSharedMem=sharedMem;
33  if((ret=svcMapMemoryBlock(irrstMemHandle, (u32)irrstSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
34 
35  // Reset internal state.
36  irrstUsed = true;
37  kHeld = 0;
38  return 0;
39 
40 cleanup2:
42 cleanup1:
44  return ret;
45 }
46 
47 void irrstExit()
48 {
49  if(!irrstUsed)return;
50 
51  irrstUsed = false;
53  // Unmap ir:rst sharedmem and close handles.
57 }
58 
59 void irrstWaitForEvent(bool nextEvent)
60 {
61  if(nextEvent)svcClearEvent(irrstEvent);
63  if(!nextEvent)svcClearEvent(irrstEvent);
64 }
65 
66 u32 irrstCheckSectionUpdateTime(vu32 *sharedmem_section, u32 id)
67 {
68  s64 tick0=0, tick1=0;
69 
70  if(id==0)
71  {
72  tick0 = *((u64*)&sharedmem_section[0]);
73  tick1 = *((u64*)&sharedmem_section[2]);
74 
75  if(tick0==tick1 || tick0<0 || tick1<0)return 1;
76  }
77 
78  return 0;
79 }
80 
82 {
83  if(!irrstUsed)return;
84 
85  u32 Id=0;
86  kHeld = 0;
87  memset(&csPos, 0, sizeof(circlePosition));
88 
89  Id = irrstSharedMem[4]; //PAD / circle-pad
90  if(Id>7)Id=7;
92  {
93  kHeld = irrstSharedMem[6 + Id*4];
94  csPos = *(circlePosition*)&irrstSharedMem[6 + Id*4 + 3];
95  }
96 }
97 
99 {
100  if(irrstUsed)return kHeld;
101  return 0;
102 }
103 
105 {
106  if (pos) *pos = csPos;
107 }
108 
109 Result IRRST_GetHandles(Handle* outMemHandle, Handle* outEventHandle)
110 {
111  u32* cmdbuf=getThreadCommandBuffer();
112  cmdbuf[0]=0x00010000; //request header code
113 
114  Result ret=0;
115  if((ret=svcSendSyncRequest(irrstHandle)))return ret;
116 
117  if(outMemHandle)*outMemHandle=cmdbuf[3];
118  if(outEventHandle)*outEventHandle=cmdbuf[4];
119 
120  return cmdbuf[1];
121 }
122 
124 {
125  u32* cmdbuf=getThreadCommandBuffer();
126  cmdbuf[0]=0x00020080; //request header code
127  cmdbuf[1]=unk1;
128  cmdbuf[2]=unk2;
129 
130  Result ret=0;
131  if((ret=svcSendSyncRequest(irrstHandle)))return ret;
132 
133  return cmdbuf[1];
134 }
135 
137 {
138  u32* cmdbuf=getThreadCommandBuffer();
139  cmdbuf[0]=0x00030000; //request header code
140 
141  Result ret=0;
142  if((ret=svcSendSyncRequest(irrstHandle)))return ret;
143 
144  return cmdbuf[1];
145 }
volatile u32 vu32
Definition: types.h:33
s32 svcClearEvent(Handle handle)
s32 Result
Definition: types.h:42
s32 svcCloseHandle(Handle handle)
s32 svcWaitSynchronization(Handle handle, s64 nanoseconds)
Result srvGetServiceHandle(Handle *out, const char *name)
Definition: srv.c:109
void irrstWaitForEvent(bool nextEvent)
Definition: irrst.c:59
u32 Handle
Definition: types.h:41
s32 svcUnmapMemoryBlock(Handle memblock, u32 addr)
#define U64_MAX
Definition: types.h:12
u32 irrstKeysHeld()
Definition: irrst.c:98
Result IRRST_Initialize(u32 unk1, u8 unk2)
Definition: irrst.c:123
u32 * getThreadCommandBuffer(void)
uint8_t u8
Definition: types.h:21
void irrstCstickRead(circlePosition *pos)
Definition: irrst.c:104
Result irrstInit(u32 *sharedMem)
Definition: irrst.c:18
uint64_t u64
Definition: types.h:24
Result IRRST_Shutdown(void)
Definition: irrst.c:136
u32 irrstCheckSectionUpdateTime(vu32 *sharedmem_section, u32 id)
Definition: irrst.c:66
uint32_t u32
Definition: types.h:23
Handle irrstMemHandle
Definition: irrst.c:9
Handle irrstEvent
Definition: irrst.c:10
#define IRRST_SHAREDMEM_DEFAULT
Definition: irrst.h:7
Result IRRST_GetHandles(Handle *outMemHandle, Handle *outEventHandle)
Definition: irrst.c:109
vu32 * irrstSharedMem
Definition: irrst.c:12
int64_t s64
Definition: types.h:29
s32 svcMapMemoryBlock(Handle memblock, u32 addr, MemPerm my_perm, MemPerm other_perm)
s32 svcSendSyncRequest(Handle session)
void irrstScanInput()
Definition: irrst.c:81
Handle irrstHandle
Definition: irrst.c:8
void irrstExit()
Definition: irrst.c:47