My Project
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules
hid.c
Go to the documentation of this file.
1 /*
2  _hid.c - Touch screen, buttons, gyroscope, accelerometer etc.
3 */
4 #include <stdlib.h>
5 #include <string.h>
6 #include <3ds.h>
7 
10 
12 
14 
15 static u32 kOld, kHeld, kDown, kUp;
16 static touchPosition tPos;
17 static circlePosition cPos;
18 static accelVector aVec;
19 static angularRate gRate;
20 
21 
22 Result hidInit(u32* sharedMem)
23 {
24  u8 val=0;
25 
26  if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
27  Result ret=0;
28 
29  // Request service.
30  if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
31 
32  // Get sharedmem handle.
34 
35  // Map HID shared memory at addr "sharedMem".
36  hidSharedMem=sharedMem;
37  if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
38 
39  APT_CheckNew3DS(NULL, &val);
40 
41  if(val)
42  {
43  ret = irrstInit(NULL);
44  }
45 
46  // Reset internal state.
47  kOld = kHeld = kDown = kUp = 0;
48  return ret;
49 
50 cleanup2:
52 cleanup1:
54  return ret;
55 }
56 
57 void hidExit()
58 {
59  // Unmap HID sharedmem and close handles.
60  u8 val=0;
61  int i; for(i=0; i<5; i++)svcCloseHandle(hidEvents[i]);
65 
66  APT_CheckNew3DS(NULL, &val);
67 
68  if(val)
69  {
70  irrstExit();
71  }
72 }
73 
74 void hidWaitForEvent(HID_Event id, bool nextEvent)
75 {
76  if(id>=HIDEVENT_MAX)return;
77 
78  if (nextEvent)
81  if (!nextEvent)
83 }
84 
85 u32 hidCheckSectionUpdateTime(vu32 *sharedmem_section, u32 id)
86 {
87  s64 tick0=0, tick1=0;
88 
89  if(id==0)
90  {
91  tick0 = *((u64*)&sharedmem_section[0]);
92  tick1 = *((u64*)&sharedmem_section[2]);
93 
94  if(tick0==tick1 || tick0<0 || tick1<0)return 1;
95  }
96 
97  return 0;
98 }
99 
101 {
102  u32 Id=0;
103 
104  kOld = kHeld;
105  irrstScanInput();
106 
107  kHeld = 0;
108  memset(&cPos, 0, sizeof(circlePosition));
109  memset(&tPos, 0, sizeof(touchPosition));
110  memset(&aVec, 0, sizeof(accelVector));
111  memset(&gRate, 0, sizeof(angularRate));
112 
113  Id = hidSharedMem[4];//PAD / circle-pad
114  if(Id>7)Id=7;
116  {
117  kHeld = hidSharedMem[10 + Id*4];
118  cPos = *(circlePosition*)&hidSharedMem[10 + Id*4 + 3];
119  }
120 
121  Id = hidSharedMem[42 + 4];//Touch-screen
122  if(Id>7)Id=7;
123  if(hidCheckSectionUpdateTime(&hidSharedMem[42], Id)==0)
124  {
125  tPos = *(touchPosition*)&hidSharedMem[42 + 8 + Id*2];
126  if (hidSharedMem[42 + 8 + Id*2 + 1])
127  kHeld |= KEY_TOUCH;
128  }
129 
130  kHeld |= irrstKeysHeld();
131 
132  kDown = (~kOld) & kHeld;
133  kUp = kOld & (~kHeld);
134 
135  Id = hidSharedMem[66 + 4];//Accelerometer
136  if(Id>7)Id=7;
137  if(hidCheckSectionUpdateTime(&hidSharedMem[66], Id)==0)
138  {
139  aVec = *(accelVector*)&hidSharedMem[66 + 8 + Id*2];
140  }
141 
142  Id = hidSharedMem[86 + 4];//Gyroscope
143  if(Id>31)Id=31;
144  if(hidCheckSectionUpdateTime(&hidSharedMem[86], Id)==0)
145  {
146  gRate = *(angularRate*)&hidSharedMem[86 + 8 + Id*2];
147  }
148 }
149 
151 {
152  return kHeld;
153 }
154 
156 {
157  return kDown;
158 }
159 
161 {
162  return kUp;
163 }
164 
166 {
167  if (pos) *pos = tPos;
168 }
169 
171 {
172  if (pos) *pos = cPos;
173 }
174 
176 {
177  if (vector) *vector = aVec;
178 }
179 
181 {
182  if (rate) *rate = gRate;
183 }
184 
185 Result HIDUSER_GetHandles(Handle* outMemHandle, Handle *eventpad0, Handle *eventpad1, Handle *eventaccel, Handle *eventgyro, Handle *eventdebugpad)
186 {
187  u32* cmdbuf=getThreadCommandBuffer();
188  cmdbuf[0]=0xa0000; //request header code
189 
190  Result ret=0;
191  if((ret=svcSendSyncRequest(hidHandle)))return ret;
192 
193  if(outMemHandle)*outMemHandle=cmdbuf[3];
194 
195  if(eventpad0)*eventpad0=cmdbuf[4];
196  if(eventpad1)*eventpad1=cmdbuf[5];
197  if(eventaccel)*eventaccel=cmdbuf[6];
198  if(eventgyro)*eventgyro=cmdbuf[7];
199  if(eventdebugpad)*eventdebugpad=cmdbuf[8];
200 
201  return cmdbuf[1];
202 }
203 
205 {
206  u32* cmdbuf=getThreadCommandBuffer();
207  cmdbuf[0]=0x110000; //request header code
208 
209  Result ret=0;
210  if((ret=svcSendSyncRequest(hidHandle)))return ret;
211 
212  return cmdbuf[1];
213 }
214 
216 {
217  u32* cmdbuf=getThreadCommandBuffer();
218  cmdbuf[0]=0x120000; //request header code
219 
220  Result ret=0;
221  if((ret=svcSendSyncRequest(hidHandle)))return ret;
222 
223  return cmdbuf[1];
224 }
225 
227 {
228  u32* cmdbuf=getThreadCommandBuffer();
229  cmdbuf[0]=0x130000; //request header code
230 
231  Result ret=0;
232  if((ret=svcSendSyncRequest(hidHandle)))return ret;
233 
234  return cmdbuf[1];
235 }
236 
238 {
239  u32* cmdbuf=getThreadCommandBuffer();
240  cmdbuf[0]=0x140000; //request header code
241 
242  Result ret=0;
243  if((ret=svcSendSyncRequest(hidHandle)))return ret;
244 
245  return cmdbuf[1];
246 }
247 
void hidExit()
Definition: hid.c:57
void hidCircleRead(circlePosition *pos)
Definition: hid.c:170
Result HIDUSER_DisableAccelerometer()
Definition: hid.c:215
#define HID_SHAREDMEM_DEFAULT
Definition: hid.h:5
volatile u32 vu32
Definition: types.h:33
u32 hidKeysHeld()
Definition: hid.c:150
s32 svcClearEvent(Handle handle)
s32 Result
Definition: types.h:42
s32 svcCloseHandle(Handle handle)
s32 svcWaitSynchronization(Handle handle, s64 nanoseconds)
Handle hidMemHandle
Definition: hid.c:9
Result srvGetServiceHandle(Handle *out, const char *name)
Definition: srv.c:109
Result HIDUSER_DisableGyroscope()
Definition: hid.c:237
Result APT_CheckNew3DS(Handle *handle, u8 *out)
Definition: apt.c:969
u32 Handle
Definition: types.h:41
s32 svcUnmapMemoryBlock(Handle memblock, u32 addr)
u32 irrstKeysHeld()
Definition: irrst.c:98
void hidGyroRead(angularRate *rate)
Definition: hid.c:180
u32 hidCheckSectionUpdateTime(vu32 *sharedmem_section, u32 id)
Definition: hid.c:85
#define U64_MAX
Definition: types.h:12
u32 * getThreadCommandBuffer(void)
uint8_t u8
Definition: types.h:21
uint64_t u64
Definition: types.h:24
u32 hidKeysDown()
Definition: hid.c:155
uint32_t u32
Definition: types.h:23
Handle hidHandle
Definition: hid.c:8
Result HIDUSER_EnableGyroscope()
Definition: hid.c:226
void irrstExit()
Definition: irrst.c:47
u32 hidKeysUp()
Definition: hid.c:160
HID_Event
Definition: hid.h:64
vu32 * hidSharedMem
Definition: hid.c:13
void hidTouchRead(touchPosition *pos)
Definition: hid.c:165
void hidScanInput()
Definition: hid.c:100
Result HIDUSER_EnableAccelerometer()
Definition: hid.c:204
Handle hidEvents[5]
Definition: hid.c:11
Definition: hid.h:23
int64_t s64
Definition: types.h:29
s32 svcMapMemoryBlock(Handle memblock, u32 addr, MemPerm my_perm, MemPerm other_perm)
Result hidInit(u32 *sharedMem)
Definition: hid.c:22
s32 svcSendSyncRequest(Handle session)
void hidAccelRead(accelVector *vector)
Definition: hid.c:175
void irrstScanInput()
Definition: irrst.c:81
void hidWaitForEvent(HID_Event id, bool nextEvent)
Definition: hid.c:74
Result HIDUSER_GetHandles(Handle *outMemHandle, Handle *eventpad0, Handle *eventpad1, Handle *eventaccel, Handle *eventgyro, Handle *eventdebugpad)
Definition: hid.c:185
Result irrstInit(u32 *sharedMem)
Definition: irrst.c:18