@@ -148,8 +148,16 @@ BYTE Joystick_get_vbtn_state(WORD n)
148
148
149
149
#endif
150
150
151
+ #ifndef PSP
152
+ SDL_Joystick * sdl_joy ;
153
+ #endif
154
+
151
155
void Joystick_Init (void )
152
156
{
157
+ #ifndef PSP
158
+ int i , nr_joys , nr_btns ;
159
+ #endif
160
+
153
161
joy [0 ] = 1 ; // active only one
154
162
joy [1 ] = 0 ;
155
163
JoyKeyState = 0 ;
@@ -165,6 +173,42 @@ void Joystick_Init(void)
165
173
#if defined(ANDROID ) || TARGET_OS_IPHONE
166
174
Joystick_Vbtn_Update (WinUI_get_vkscale ());
167
175
#endif
176
+
177
+ #ifndef PSP
178
+ sdl_joy = 0 ;
179
+
180
+ SDL_InitSubSystem (SDL_INIT_JOYSTICK );
181
+
182
+ nr_joys = SDL_NumJoysticks ();
183
+ p6logd ("joy num %d\n" , nr_joys );
184
+ for (i = 0 ; i < nr_joys ; i ++ ) {
185
+ sdl_joy = SDL_JoystickOpen (i );
186
+ if (sdl_joy ) {
187
+ p6logd ("Name: %s\n" , SDL_JoystickNameForIndex (i ));
188
+ p6logd ("# of Axes: %d\n" , SDL_JoystickNumAxes (sdl_joy ));
189
+ p6logd ("# of Btns: %d\n" , SDL_JoystickNumButtons (sdl_joy ));
190
+ p6logd ("# of Balls: %d\n" , SDL_JoystickNumBalls (sdl_joy ));
191
+ p6logd ("# of Hats: %d\n" , SDL_JoystickNumHats (sdl_joy ));
192
+ nr_btns = SDL_JoystickNumButtons (sdl_joy );
193
+ if (nr_btns < 2 ) {
194
+ sdl_joy = 0 ;
195
+ } else {
196
+ break ;
197
+ }
198
+ } else {
199
+ p6logd ("can't open joy %d\n" , i );
200
+ }
201
+ }
202
+ #endif
203
+ }
204
+
205
+ void Joystick_Cleanup (void )
206
+ {
207
+ #ifndef PSP
208
+ if (SDL_JoystickGetAttached (sdl_joy )) {
209
+ SDL_JoystickClose (sdl_joy );
210
+ }
211
+ #endif
168
212
}
169
213
170
214
BYTE FASTCALL Joystick_Read (BYTE num )
@@ -202,7 +246,11 @@ void FASTCALL Joystick_Write(BYTE num, BYTE data)
202
246
if ( (num == 0 )|| (num == 1 ) ) JoyPortData [num ] = data ;
203
247
}
204
248
249
+ #ifdef PSP
205
250
void FASTCALL Joystick_Update (void )
251
+ #else
252
+ void FASTCALL Joystick_Update (SDL_Keycode key )
253
+ #endif
206
254
{
207
255
#if defined(PSP )
208
256
BYTE ret0 = 0xff , ret1 = 0xff ;
@@ -248,11 +296,13 @@ void FASTCALL Joystick_Update(void)
248
296
JoyAnaPadX = psppad .Lx ;
249
297
JoyAnaPadY = psppad .Ly ;
250
298
251
- #elif defined(ANDROID ) || TARGET_OS_IPHONE
299
+ #else // defined(PSP)
252
300
BYTE ret0 = 0xff , ret1 = 0xff ;
253
301
int num = 0 ; //xxx only joy1
254
302
static BYTE pre_ret0 = 0xff ;
303
+ signed int x , y ;
255
304
305
+ #if defined(ANDROID ) || TARGET_OS_IPHONE
256
306
SDL_Finger * finger ;
257
307
SDL_FingerID fid ;
258
308
float fx , fy ;
@@ -322,18 +372,71 @@ void FASTCALL Joystick_Update(void)
322
372
if (vbtn_state [5 ] == VBTN_ON ) {
323
373
ret0 ^= (Config .VbtnSwap == 0 )? JOY_TRG2 : JOY_TRG1 ;
324
374
}
375
+ #endif //defined(ANDROID) || TARGET_OS_IPHONE
376
+
377
+ // real gamepad
378
+ if (sdl_joy ) {
379
+ SDL_JoystickUpdate ();
380
+ x = SDL_JoystickGetAxis (sdl_joy , 0 );
381
+ y = SDL_JoystickGetAxis (sdl_joy , 1 );
382
+
383
+ if (x < -256 ) {
384
+ ret0 ^= JOY_LEFT ;
385
+ }
386
+ if (x > 256 ) {
387
+ ret0 ^= JOY_RIGHT ;
388
+ }
389
+ if (y < -256 ) {
390
+ ret0 ^= JOY_UP ;
391
+ }
392
+ if (y > 256 ) {
393
+ ret0 ^= JOY_DOWN ;
394
+ }
395
+ if (SDL_JoystickGetButton (sdl_joy , 0 )) {
396
+ ret0 ^= JOY_TRG1 ;
397
+ }
398
+ if (SDL_JoystickGetButton (sdl_joy , 1 )) {
399
+ ret0 ^= JOY_TRG2 ;
400
+ }
401
+ }
402
+
403
+ // scan keycode for menu UI
404
+ if (key != SDLK_UNKNOWN ) {
405
+ switch (key ) {
406
+ case SDLK_UP :
407
+ ret0 ^= JOY_UP ;
408
+ break ;
409
+ case SDLK_DOWN :
410
+ ret0 ^= JOY_DOWN ;
411
+ break ;
412
+ case SDLK_LEFT :
413
+ ret0 ^= JOY_LEFT ;
414
+ break ;
415
+ case SDLK_RIGHT :
416
+ ret0 ^= JOY_RIGHT ;
417
+ break ;
418
+ case SDLK_RETURN :
419
+ ret0 ^= JOY_TRG1 ;
420
+ break ;
421
+ case SDLK_ESCAPE :
422
+ ret0 ^= JOY_TRG2 ;
423
+ break ;
424
+ }
425
+ }
325
426
326
427
JoyDownState0 = ~(ret0 ^ pre_ret0 ) | ret0 ;
327
428
JoyUpState0 = (ret0 ^ pre_ret0 ) & ret0 ;
328
429
pre_ret0 = ret0 ;
329
- #endif
330
430
331
- #if defined(USE_OGLES11 ) || defined(PSP )
431
+ #endif //defined(PSP)
432
+
332
433
// disable Joystick when software keyboard or mouse is active
333
434
if (!Keyboard_IsSwKeyboard () && !Config .JoyOrMouse ) {
334
435
JoyState0 [num ] = ret0 ;
335
436
JoyState1 [num ] = ret1 ;
336
437
}
438
+
439
+ #if defined(USE_OGLES11 ) || defined(PSP )
337
440
// update the states of the mouse buttons
338
441
// when sw keyboard is inactive and mouse is active.
339
442
// state is updated when menu is open, but don't care
@@ -355,36 +458,6 @@ void FASTCALL Joystick_Update(void)
355
458
#endif
356
459
}
357
460
358
- #if !defined(PSP ) && !defined(ANDROID )
359
- void menukey_update (signed int key )
360
- {
361
- BYTE ret0 = 0xff ;
362
- switch (key ) {
363
- case SDLK_UP :
364
- ret0 ^= JOY_UP ;
365
- break ;
366
- case SDLK_DOWN :
367
- ret0 ^= JOY_DOWN ;
368
- break ;
369
- case SDLK_LEFT :
370
- ret0 ^= JOY_LEFT ;
371
- break ;
372
- case SDLK_RIGHT :
373
- ret0 ^= JOY_RIGHT ;
374
- break ;
375
- case SDLK_RETURN :
376
- ret0 ^= JOY_TRG1 ;
377
- break ;
378
- case SDLK_ESCAPE :
379
- ret0 ^= JOY_TRG2 ;
380
- break ;
381
-
382
- }
383
- JoyDownState0 = ret0 ;
384
-
385
- }
386
- #endif
387
-
388
461
BYTE get_joy_downstate (void )
389
462
{
390
463
return JoyDownState0 ;
0 commit comments