ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
remote.c
Go to the documentation of this file.
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # Copyright 2001-2004, ps2dev - http://www.ps2dev.org
7 # Licenced under Academic Free License version 2.0
8 # Review ps2sdk README & LICENSE files for further details.
9 #
10 # ReMote control Manager RPC sample
11 */
12 
13 #include <stdio.h>
14 #include <kernel.h>
15 #include <sifrpc.h>
16 #include <string.h>
17 #include <iopcontrol.h>
18 #include <loadfile.h>
19 #ifndef USE_ROM_MODULES
20 #include <sbv_patches.h>
21 #endif
22 #include <debug.h>
23 #include <librm.h>
24 
25 #ifndef USE_ROM_MODULES
26 extern unsigned char SIO2MAN_irx[];
27 extern unsigned int size_SIO2MAN_irx;
28 
29 extern unsigned char RMMAN_irx[];
30 extern unsigned int size_RMMAN_irx;
31 #endif
32 
34 
35 static s32 VblankStartHandler(s32 cause)
36 {
38 
39  //As per the SONY documentation, call ExitHandler() at the very end of your interrupt handler.
40  ExitHandler();
41  return 0;
42 }
43 
44 static s32 VblankEndHandler(s32 cause)
45 {
47 
48  //As per the SONY documentation, call ExitHandler() at the very end of your interrupt handler.
49  ExitHandler();
50  return 0;
51 }
52 
53 static const char *getRmStatus(u32 status)
54 {
55  switch(status)
56  {
57  case RM_INIT:
58  return "INITIALIZING";
59  case RM_READY:
60  return "READY";
61  case RM_KEYPRESSED:
62  return "PRESSED";
63  case RM_NOREMOTE:
64  return "DISCONNECTED";
65  default:
66  return "UNKNOWN";
67  }
68 }
69 
70 static const char *getRmButton(u32 button)
71 {
72  switch(button)
73  {
74  case RM_AUDIO:
75  return "AUDIO";
76  case RM_SHUFFLE:
77  return "SHUFFLE";
78  case RM_ANGLE:
79  return "ANGLE";
80  case RM_PROGRAM:
81  return "PROGRAM";
82  case RM_SUBTITLE:
83  return "SUBTITLE";
84  case RM_REPEAT:
85  return "REPEAT";
86  case RM_SLOW_BACK:
87  return "SLOW-BACK";
88  case RM_SLOW_FORW:
89  return "SLOW-FORWARD";
90  case RM_SCAN_BACK:
91  return "SCAN-BACK";
92  case RM_SCAN_FORW:
93  return "SCAN-FORWARD";
94  case RM_ONE:
95  return "ONE";
96  case RM_TWO:
97  return "TWO";
98  case RM_THREE:
99  return "THREE";
100  case RM_FOUR:
101  return "FOUR";
102  case RM_FIVE:
103  return "FIVE";
104  case RM_SIX:
105  return "SIX";
106  case RM_SEVEN:
107  return "SEVEN";
108  case RM_EIGHT:
109  return "EIGHT";
110  case RM_NINE:
111  return "NINE";
112  case RM_ZERO:
113  return "ZERO";
114  case RM_CLEAR:
115  return "CLEAR";
116  case RM_TIME:
117  return "TIME";
118  case RM_PREV:
119  return "PREV";
120  case RM_NEXT:
121  return "NEXT";
122  case RM_ATOB:
123  return "ATOB";
124  case RM_PLAY:
125  return "PLAY";
126  case RM_PAUSE:
127  return "PAUSE";
128  case RM_STOP:
129  return "STOP";
130  case RM_DISPLAY:
131  return "DISPLAY";
132  case RM_TITLE:
133  return "TITLE";
134  case RM_MENU:
135  return "MENU";
136  case RM_RETURN:
137  return "RETURN";
138  case RM_TRIANGLE:
139  return "TRIANGLE";
140  case RM_SQUARE:
141  return "SQUARE";
142  case RM_CIRCLE:
143  return "CIRCLE";
144  case RM_CROSS:
145  return "CROSS";
146  case RM_UP:
147  return "UP";
148  case RM_DOWN:
149  return "DOWN";
150  case RM_LEFT:
151  return "LEFT";
152  case RM_RIGHT:
153  return "RIGHT";
154  case RM_ENTER:
155  return "ENTER";
156  case RM_L1:
157  return "L1";
158  case RM_L2:
159  return "L2";
160  case RM_L3:
161  return "L3";
162  case RM_R1:
163  return "R1";
164  case RM_R2:
165  return "R3";
166  case RM_START:
167  return "START";
168  case RM_SELECT:
169  return "SELECT";
170  case RM_EJECT:
171  return "EJECT";
172  case RM_RESET:
173  return "RESET";
174  case RM_NONE:
175  return "---";
176  default:
177  return "UNKNOWN";
178  }
179 }
180 
181 int main(int argc, char *argv[])
182 {
183  /* Buffers for receiving input from remote controllers. A 256-byte region is required for each possible remote.
184  Buffers must be each aligned to a 64-byte boundary due to how the EE data cache works. */
185  static u8 rmData[256] __attribute__((aligned(64)));
186  struct remote_data data, olddata;
187  int startY, wrap;
188  ee_sema_t sema;
189 
190  //Initialize RPC services
191  SifInitRpc(0);
192  SifIopReset(NULL, 0);
193  while(!SifIopSync()){};
194  SifInitRpc(0);
195 
196  //Initialize graphics library
197  init_scr();
198 
199  scr_printf( "Welcome to the RMMAN sample!\n");
200  scr_printf( "For this demo, the remote should be plugged into port 2.\n");
201  scr_printf( "Loading modules...\n");
202 
203  //Load modules
204  SifLoadFileInit();
205 
206 #ifdef USE_ROM_MODULES
207  if(SifLoadModule("rom0:ADDDRV", 0, NULL) < 0)
208  {
209  scr_printf("Failed to load ADDDRV!\n");
210  SleepThread();
211  }
212 
213  if(SifLoadModule("rom1:SIO2MAN", 0, NULL) < 0)
214  {
215  scr_printf("Failed to load SIO2MAN!\n");
216  SleepThread();
217  }
218 
219  if(SifLoadModule("rom1:RMMAN", 0, NULL) < 0)
220  {
221  scr_printf("Failed to load RMMAN!\n");
222  SleepThread();
223  }
224 #else
226 
228  {
229  scr_printf("Failed to load SIO2MAN!\n");
230  SleepThread();
231  }
233  {
234  scr_printf("Failed to load RMMAN!\n");
235  SleepThread();
236  }
237 #endif
238 
239  SifLoadFileExit();
240 
241  scr_printf( "Initializing...\n");
242 
243  //Prepare semaphores, for detecting Vertical-Blanking events.
244  sema.count = 0;
245  sema.max_count = 1;
246  sema.attr = 0;
247 
248  VblankStartSema = CreateSema(&sema);
249  VblankEndSema = CreateSema(&sema);
250 
251  //Register VBlank start and end interrupt handlers.
254 
255  //Initialize the RMMAN RPC service
256  RMMan_Init();
257  scr_printf( "Module version: 0x%04x\n", RMMan_GetModuleVersion());
258 
259  scr_printf( "Opening ports...");
260 
261  /* The remote can only be connected to slot 0 of any port (multitaps are not supported).
262  For this demo, assume that the remote controller dongle is connected to
263  controller port 2 (port = 1). */
264  RMMan_Open(1, 0, rmData);
265 
266  scr_printf( "done!\n");
267  scr_printf( "New input will be displayed here:\n");
268 
269  //Enable interrupt handlers
272 
273  //In order to preserve the messages above, preserve the current Y coordinate.
274  startY = scr_getY();
275  wrap = 0;
276 
277  //Erase old remote state
278  memset(&olddata, 0, sizeof(olddata));
279 
280  //Enter the main loop
281  while(1)
282  { //Like with PADMAN, RMMAN only sends updates once every 1/60th (NTSC) or 1/50th (PAL) second.
283  //Hence, wait for a VBlank cycle (1/50th or 1/60th second).
286 
287  //Read data that RMMAN has sent.
288  RMMan_Read(1, 0, &data);
289 
290  //If there was a difference, print it.
291  if((olddata.status != data.status) || (olddata.button != data.button))
292  {
293  olddata = data;
294 
295  /* Do not draw past the end of the screen. If this is the last line, prepare to wrap around. */
296  if(scr_getY() + 1 >= 27)
297  wrap = 1;
298 
299  scr_printf("\t%08x (%s)\t%08x (%s)\n", data.status, getRmStatus(data.status), data.button, getRmButton(data.button));
300 
301  if(wrap) //From libdebug itself
302  {
303  scr_setXY(0, startY);
304  wrap = 0;
305  }
306  }
307  }
308 
309  scr_printf("Shutting down...\n");
310 
311  //Prepare for shutdown
312 
313  //Disable interrupts
316 
317  //Unregister interrupt handlers
318 
319  //Delete semaphores
322 
323  //Close opened ports
324  RMMan_Close(1, 0);
325 
326  //Terminate RPC services
327  RMMan_End();
328  SifExitRpc();
329 
330  return 0;
331 }
void init_scr(void)
Definition: scr_printf.c:185
void scr_setXY(int x, int y)
Definition: scr_printf.c:297
void scr_printf(const char *,...)
Definition: scr_printf.c:252
int scr_getY(void)
Definition: scr_printf.c:308
int SifLoadModule(const char *path, int arg_len, const char *args)
void SifLoadFileExit(void)
int SifExecModuleBuffer(void *ptr, u32 size, u32 arg_len, const char *args, int *mod_res)
int SifLoadFileInit(void)
int SifIopReset(const char *arg, int mode)
int SifIopSync(void)
s32 CreateSema(ee_sema_t *sema)
#define ExitHandler()
Definition: kernel.h:28
s32 DeleteSema(s32 sema_id)
s32 iSignalSema(s32 sema_id)
s32 _DisableIntc(s32 cause)
s32 AddIntcHandler(s32 cause, s32(*handler_func)(s32 cause), s32 next)
s32 WaitSema(s32 sema_id)
s32 SleepThread(void)
s32 _EnableIntc(s32 cause)
@ INTC_VBLANK_S
Definition: kernel.h:85
@ INTC_VBLANK_E
Definition: kernel.h:86
u32 data
Definition: libmouse.c:36
#define RM_PREV
Definition: librm.h:57
#define RM_CROSS
Definition: librm.h:70
#define RM_START
Definition: librm.h:82
#define RM_CLEAR
Definition: librm.h:55
#define RM_ENTER
Definition: librm.h:75
#define RM_R2
Definition: librm.h:80
#define RM_NOREMOTE
Definition: librm.h:31
void RMMan_Read(int port, int slot, struct remote_data *data)
Definition: librm.c:162
#define RM_L2
Definition: librm.h:77
#define RM_RIGHT
Definition: librm.h:74
int RMMan_End(void)
Definition: librm.c:127
#define RM_NONE
Definition: librm.h:34
#define RM_AUDIO
Definition: librm.h:35
#define RM_EIGHT
Definition: librm.h:52
#define RM_ANGLE
Definition: librm.h:37
#define RM_READY
Definition: librm.h:29
#define RM_ATOB
Definition: librm.h:59
#define RM_SUBTITLE
Definition: librm.h:39
#define RM_SHUFFLE
Definition: librm.h:36
int RMMan_Close(int port, int slot)
Definition: librm.c:138
#define RM_MENU
Definition: librm.h:65
#define RM_RETURN
Definition: librm.h:66
#define RM_SEVEN
Definition: librm.h:51
#define RM_RESET
Definition: librm.h:85
#define RM_ZERO
Definition: librm.h:54
#define RM_SLOW_FORW
Definition: librm.h:42
#define RM_KEYPRESSED
Definition: librm.h:30
#define RM_EJECT
Definition: librm.h:84
#define RM_DISPLAY
Definition: librm.h:63
#define RM_PROGRAM
Definition: librm.h:38
#define RM_SCAN_BACK
Definition: librm.h:43
#define RM_STOP
Definition: librm.h:62
#define RM_SCAN_FORW
Definition: librm.h:44
#define RM_TITLE
Definition: librm.h:64
#define RM_NINE
Definition: librm.h:53
#define RM_REPEAT
Definition: librm.h:40
#define RM_NEXT
Definition: librm.h:58
int RMMan_Init(void)
Definition: librm.c:54
#define RM_DOWN
Definition: librm.h:72
#define RM_SELECT
Definition: librm.h:83
#define RM_INIT
Definition: librm.h:28
#define RM_TWO
Definition: librm.h:46
#define RM_ONE
Definition: librm.h:45
#define RM_SQUARE
Definition: librm.h:68
#define RM_SIX
Definition: librm.h:50
#define RM_THREE
Definition: librm.h:47
#define RM_FOUR
Definition: librm.h:48
#define RM_TRIANGLE
Definition: librm.h:67
int RMMan_Open(int port, int slot, void *pData)
Definition: librm.c:98
#define RM_SLOW_BACK
Definition: librm.h:41
#define RM_FIVE
Definition: librm.h:49
u32 RMMan_GetModuleVersion(void)
Definition: librm.c:87
#define RM_PLAY
Definition: librm.h:60
#define RM_TIME
Definition: librm.h:56
#define RM_LEFT
Definition: librm.h:73
#define RM_R1
Definition: librm.h:79
#define RM_L3
Definition: librm.h:78
#define RM_L1
Definition: librm.h:76
#define RM_PAUSE
Definition: librm.h:61
#define RM_UP
Definition: librm.h:71
#define RM_CIRCLE
Definition: librm.h:69
static const char * getRmButton(u32 button)
Definition: remote.c:70
int main(int argc, char *argv[])
Definition: remote.c:181
unsigned int size_RMMAN_irx
static s32 VblankEndHandler(s32 cause)
Definition: remote.c:44
static int VblankEndSema
Definition: remote.c:33
unsigned int size_SIO2MAN_irx
unsigned char RMMAN_irx[]
unsigned char SIO2MAN_irx[]
static int VblankStartSema
Definition: remote.c:33
static s32 VblankStartHandler(s32 cause)
Definition: remote.c:35
static const char * getRmStatus(u32 status)
Definition: remote.c:53
int sbv_patch_enable_lmb(void)
void SifInitRpc(int mode)
void SifExitRpc(void)
int count
Definition: kernel.h:216
int max_count
Definition: kernel.h:217
u32 attr
Definition: kernel.h:220
u32 button
Definition: librm.h:24
u32 status
Definition: librm.h:23
#define NULL
Definition: tamtypes.h:91
signed int s32
Definition: tamtypes.h:58
unsigned int u32
Definition: tamtypes.h:30
unsigned char u8
Definition: tamtypes.h:23