ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
input.c File Reference
#include <stdio.h>
#include <malloc.h>
#include <libpad.h>
#include <input.h>
+ Include dependency graph for input.c:

Go to the source code of this file.

Functions

pad_tpad_open (unsigned int port, unsigned int slot, unsigned int mode, unsigned int lock)
 
void pad_close (pad_t *pad)
 
int pad_get_state (pad_t *pad)
 
void pad_wait (pad_t *pad)
 
int pad_get_num_modes (pad_t *pad)
 
int pad_has_type (pad_t *pad, int type)
 
int pad_get_type (pad_t *pad)
 
void pad_set_mode (pad_t *pad, int mode, int lock)
 
void pad_set_sensitivity (pad_t *pad, int enable)
 
void pad_init_actuators (pad_t *pad)
 
void pad_set_actuators (pad_t *pad, int small, unsigned char large)
 

Function Documentation

◆ pad_close()

void pad_close ( pad_t pad)

Close the pad

Definition at line 82 of file input.c.

83 {
84 
85  if (pad == NULL)
86  {
87  return;
88  }
89 
90  if (pad->actuator != NULL)
91  {
92  free(pad->actuator);
93  }
94 
95  padPortClose(pad->port,pad->slot);
96 
97  free(pad->buttons);
98  free(pad->buffer);
99  free(pad);
100 
101 }
int padPortClose(int port, int slot)
Definition: libpad.c:449
char slot
Definition: input.h:43
char * buffer
Definition: input.h:58
actuator_t * actuator
Definition: input.h:57
char port
Definition: input.h:42
struct padButtonStatus * buttons
Definition: input.h:55
#define NULL
Definition: tamtypes.h:91

References pad_t::actuator, pad_t::buffer, pad_t::buttons, NULL, padPortClose(), pad_t::port, and pad_t::slot.

◆ pad_get_num_modes()

int pad_get_num_modes ( pad_t pad)

Get number of modes supported by pad

Definition at line 145 of file input.c.

146 {
147 
148  pad->num_modes = padInfoMode(pad->port,pad->slot,PAD_MODETABLE,-1);
149 
150  return pad->num_modes;
151 
152 }
int padInfoMode(int port, int slot, int infoMode, int index)
Definition: libpad.c:588
#define PAD_MODETABLE
Definition: libpad.h:75
char num_modes
Definition: input.h:52

References pad_t::num_modes, PAD_MODETABLE, padInfoMode(), pad_t::port, and pad_t::slot.

Referenced by pad_has_type().

◆ pad_get_state()

int pad_get_state ( pad_t pad)

Get the pad's state

Definition at line 103 of file input.c.

104 {
105 
106  pad->state = padGetState(pad->port, pad->slot);
107 
108  return pad->state;
109 
110 }
int padGetState(int port, int slot)
Definition: libpad.c:482
char state
Definition: input.h:49

References padGetState(), pad_t::port, pad_t::slot, and pad_t::state.

Referenced by pad_wait().

◆ pad_get_type()

int pad_get_type ( pad_t pad)

Get the pad's type

Definition at line 206 of file input.c.

207 {
208 
209  pad->type = padInfoMode(pad->port,pad->slot,PAD_MODECURID,0);
210 
211  return pad->type;
212 
213 }
#define PAD_MODECURID
Definition: libpad.h:72
int type
Definition: input.h:47

References PAD_MODECURID, padInfoMode(), pad_t::port, pad_t::slot, and pad_t::type.

◆ pad_has_type()

int pad_has_type ( pad_t pad,
int  type 
)

Check if a type is supported by pad

Definition at line 178 of file input.c.

179 {
180 
181  int i = 0;
182 
183  if (pad->num_modes < 0)
184  {
185  pad_get_num_modes(pad);
186  }
187 
188  if ((pad->num_modes == 0) && (type == PAD_TYPE_DIGITAL))
189  {
190  return 1;
191  }
192 
193  for (i = 0; i < pad->num_modes; i++)
194  {
195  if (padInfoMode(pad->port,pad->slot,PAD_MODETABLE,i) == type)
196  {
197  return 1;
198  }
199 
200  }
201 
202  return 0;
203 
204 }
int pad_get_num_modes(pad_t *pad)
Definition: input.c:145
#define PAD_TYPE_DIGITAL
Definition: libpad.h:62

References pad_t::num_modes, pad_get_num_modes(), PAD_MODETABLE, PAD_TYPE_DIGITAL, padInfoMode(), pad_t::port, and pad_t::slot.

Referenced by pad_set_mode().

◆ pad_init_actuators()

void pad_init_actuators ( pad_t pad)

Init actuators

Definition at line 288 of file input.c.

289 {
290 
291  if (pad->actuator == NULL)
292  {
293 #ifdef _XINPUT
294  if (padInfoAct(pad->port, pad->slot, -1, 0))
295 #else
296  if (padInfoMode(pad->port,pad->slot,PAD_MODECUREXID,0))
297 #endif
298  {
299  pad_wait(pad);
300  pad->actuator = (actuator_t*)malloc(sizeof(actuator_t));
301  }
302  else
303  {
304  pad_wait(pad);
305  return;
306  }
307  }
308 
309  pad->actuator->small = 0;
310  pad->actuator->large = 0x00;
311 
312  pad->actuator->status[0] = 0;
313  pad->actuator->status[1] = 1;
314  pad->actuator->status[2] = 0xFF;
315  pad->actuator->status[3] = 0xFF;
316  pad->actuator->status[4] = 0xFF;
317  pad->actuator->status[5] = 0xFF;
318 
319 
320  pad_wait(pad);
321  padSetActAlign(pad->port,pad->slot,pad->actuator->status);
322  pad_wait(pad);
323 
324 }
void pad_wait(pad_t *pad)
Definition: input.c:122
#define PAD_MODECUREXID
Definition: libpad.h:73
int padSetActAlign(int port, int slot, char act_align[6])
Definition: libpad.c:777
unsigned char padInfoAct(int port, int slot, int word, int byte)
Definition: libpad.c:738
char status[6]
Definition: input.h:37
char small
Definition: input.h:35
unsigned char large
Definition: input.h:36

References pad_t::actuator, actuator_t::large, NULL, PAD_MODECUREXID, pad_wait(), padInfoAct(), padInfoMode(), padSetActAlign(), pad_t::port, pad_t::slot, actuator_t::small, and actuator_t::status.

◆ pad_open()

pad_t* pad_open ( unsigned int  port,
unsigned int  slot,
unsigned int  mode,
unsigned int  lock 
)

Open and initialize a pad

Definition at line 10 of file input.c.

11 {
12 
13  pad_t *pad = (pad_t*)malloc(sizeof(pad_t));
14 
15  pad->buffer = (char*)memalign(64,256);
16  pad->buttons = (struct padButtonStatus*)malloc(sizeof(struct padButtonStatus));
17  pad->actuator = NULL;
18 
19  // there are only two ports
20  if (port > 1)
21  {
22  free(pad->buttons);
23  free(pad);
24  return NULL;
25  }
26 
27 #ifdef _XINPUT
28  if (mtapGetConnection(pad->port))
29  {
30  // there are only four slots
31  if (slot > 3)
32  {
33  free(pad->buttons);
34  free(pad);
35  return NULL;
36  }
37  }
38  else
39  {
40 #endif
41  // there's only one slot
42  if (slot)
43  {
44  free(pad->buttons);
45  free(pad);
46  return NULL;
47  }
48 #ifdef _XINPUT
49  }
50 #endif
51 
52  pad->port = port;
53 #ifdef _XINPUT
54  pad->slot = slot;
55 #else
56  pad->slot = 0;
57 #endif
58 
59  // Placeholders
60  pad->type = PAD_TYPE_DIGITAL;
61 
62  pad->state = 0;
63  pad->last_state = -1;
64  pad->exec_cmd = 0;
65  pad->num_modes = -1;
66  pad->sensitivity = 0;
67 
68  // These get verified by pad_set_mode()
69  pad->mode = mode;
70  pad->lock = lock;
71 
72  padPortOpen(pad->port,pad->slot,pad->buffer);
73 
74  pad_wait(pad);
75 
76  pad_set_mode(pad,pad->mode,pad->lock);
77 
78  return pad;
79 
80 }
void pad_set_mode(pad_t *pad, int mode, int lock)
Definition: input.c:215
int mtapGetConnection(int port)
Definition: libmtap.c:87
s32 slot
Definition: libpad.c:176
s32 lock
Definition: libpad.c:200
s32 port
Definition: libpad.c:176
int padPortOpen(int port, int slot, void *padArea)
Definition: libpad.c:392
s32 mode
Definition: rpc_client.c:15
Definition: input.h:40
char lock
Definition: input.h:45
char last_state
Definition: input.h:50
char exec_cmd
Definition: input.h:51
char mode
Definition: input.h:44
char sensitivity
Definition: input.h:53

References pad_t::actuator, pad_t::buffer, pad_t::buttons, pad_t::exec_cmd, pad_t::last_state, pad_t::lock, lock, pad_t::mode, mode, mtapGetConnection(), NULL, pad_t::num_modes, pad_set_mode(), PAD_TYPE_DIGITAL, pad_wait(), padPortOpen(), pad_t::port, port, pad_t::sensitivity, pad_t::slot, slot, pad_t::state, and pad_t::type.

◆ pad_set_actuators()

void pad_set_actuators ( pad_t pad,
int  small,
unsigned char  large 
)

Set actuators

Definition at line 326 of file input.c.

327 {
328 
329  if (!small)
330  {
331  pad->actuator->small = small;
332  }
333  else
334  {
335  pad->actuator->small = 0x01;
336  }
337 
338  pad->actuator->large = large;
339 
340  pad->actuator->status[0] = pad->actuator->small;
341  pad->actuator->status[1] = pad->actuator->large;
342 
343  padSetActDirect(pad->port,pad->slot,pad->actuator->status);
344 
345 }
int padSetActDirect(int port, int slot, char act_align[6])
Definition: libpad.c:800

References pad_t::actuator, actuator_t::large, padSetActDirect(), pad_t::port, pad_t::slot, actuator_t::small, and actuator_t::status.

◆ pad_set_mode()

void pad_set_mode ( pad_t pad,
int  mode,
int  lock 
)

Set the pad's mode and mode lock

Definition at line 215 of file input.c.

216 {
217 
218  int status = 0;
219 
220  if (lock == PAD_MMODE_LOCK)
221  {
222  pad->lock = lock;
223  }
224  else
225  {
226  pad->lock = PAD_MMODE_UNLOCK;
227  }
228 
230  {
232  {
233  status = padSetMainMode(pad->port,pad->slot,pad->mode,pad->lock);
234  }
235 
236  if (status)
237  {
238  pad->mode = PAD_MMODE_DUALSHOCK;
239  }
240  }
241  else
242  {
244  {
245  status = padSetMainMode(pad->port,pad->slot,pad->mode,pad->lock);
246  }
247 
248  if (status)
249  {
250  pad->mode = PAD_MMODE_DIGITAL;
251  }
252  }
253 
254  if (status)
255  {
256  pad_wait(pad);
257  }
258 
259 }
int pad_has_type(pad_t *pad, int type)
Definition: input.c:178
#define PAD_MMODE_DIGITAL
Definition: libpad.h:80
#define PAD_MMODE_UNLOCK
Definition: libpad.h:83
#define PAD_MMODE_DUALSHOCK
Definition: libpad.h:81
#define PAD_TYPE_DUALSHOCK
Definition: libpad.h:65
#define PAD_MMODE_LOCK
Definition: libpad.h:84
int padSetMainMode(int port, int slot, int mode, int lock)
Definition: libpad.c:656

References pad_t::lock, lock, pad_t::mode, mode, pad_has_type(), PAD_MMODE_DIGITAL, PAD_MMODE_DUALSHOCK, PAD_MMODE_LOCK, PAD_MMODE_UNLOCK, PAD_TYPE_DIGITAL, PAD_TYPE_DUALSHOCK, pad_wait(), padSetMainMode(), pad_t::port, and pad_t::slot.

Referenced by pad_open().

◆ pad_set_sensitivity()

void pad_set_sensitivity ( pad_t pad,
int  enable 
)

Set the pad's pressure sensitivity

Definition at line 261 of file input.c.

262 {
263 
264  if(padInfoPressMode(pad->port,pad->slot))
265  {
266  pad_wait(pad);
267  pad->sensitivity = 1;
268  }
269  else
270  {
271  pad_wait(pad);
272  pad->sensitivity = 0;
273  return;
274  }
275 
276  if (enable)
277  {
278  padEnterPressMode(pad->port,pad->slot);
279  }
280  else
281  {
282  padExitPressMode(pad->port,pad->slot);
283  }
284 
285 
286 }
int padExitPressMode(int port, int slot)
Definition: libpad.c:696
int padInfoPressMode(int port, int slot)
Definition: libpad.c:675
int padEnterPressMode(int port, int slot)
Definition: libpad.c:690

References pad_wait(), padEnterPressMode(), padExitPressMode(), padInfoPressMode(), pad_t::port, pad_t::sensitivity, and pad_t::slot.

◆ pad_wait()

void pad_wait ( pad_t pad)

Wait until the pad is ready to accept commands

Definition at line 122 of file input.c.

123 {
124 
125  pad_get_state(pad);
126 
127  if (pad->state != pad->last_state)
128  {
129 #ifdef DEBUG
130  pad_print_state(pad);
131 #endif
132  pad->last_state = pad->state;
133 
134  }
135 
136  if (pad->state == PAD_STATE_STABLE) return;
137  if (pad->state == PAD_STATE_ERROR) return;
138  if (pad->state == PAD_STATE_DISCONN) return;
139  if (pad->state == PAD_STATE_FINDCTP1) return;
140 
141  return pad_wait(pad);
142 
143 }
int pad_get_state(pad_t *pad)
Definition: input.c:103
#define PAD_STATE_ERROR
Definition: libpad.h:48
#define PAD_STATE_STABLE
Definition: libpad.h:47
#define PAD_STATE_DISCONN
Definition: libpad.h:43
#define PAD_STATE_FINDCTP1
Definition: libpad.h:45

References pad_t::last_state, pad_get_state(), PAD_STATE_DISCONN, PAD_STATE_ERROR, PAD_STATE_FINDCTP1, PAD_STATE_STABLE, pad_wait(), and pad_t::state.

Referenced by pad_init_actuators(), pad_open(), pad_set_mode(), pad_set_sensitivity(), and pad_wait().