Merge pull request #5835 from fjtrujy/psp/improveJoystickDriver

[PSP] Improve Joystick driver
This commit is contained in:
Wouter Wijsman 2022-06-23 01:14:56 +02:00 committed by GitHub
commit 3b0c86a36f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -24,7 +24,6 @@
/* This is the PSP implementation of the SDL joystick API */
#include <pspctrl.h>
#include <pspkernel.h>
#include <stdio.h> /* For the definition of NULL */
#include <stdlib.h>
@ -34,15 +33,9 @@
#include "SDL_events.h"
#include "SDL_error.h"
#include "SDL_mutex.h"
#include "SDL_timer.h"
#include "../../thread/SDL_systhread.h"
/* Current pad state */
static SceCtrlData pad = { .Lx = 0, .Ly = 0, .Buttons = 0 };
static SDL_sem *pad_sem = NULL;
static SDL_Thread *thread = NULL;
static int running = 0;
static const enum PspCtrlButtons button_map[] = {
PSP_CTRL_TRIANGLE, PSP_CTRL_CIRCLE, PSP_CTRL_CROSS, PSP_CTRL_SQUARE,
PSP_CTRL_LTRIGGER, PSP_CTRL_RTRIGGER,
@ -82,23 +75,6 @@ static int calc_bezier_y(float t)
return dest.y;
}
/*
* Collect pad data about once per frame
*/
int JoystickUpdate(void *data)
{
while (running) {
SDL_SemWait(pad_sem);
sceCtrlPeekBufferPositive(&pad, 1);
SDL_SemPost(pad_sem);
/* Delay 1/60th of a second */
sceKernelDelayThread(1000000 / 60);
}
return 0;
}
/* Function to scan the system for joysticks.
* Joystick 0 should be the system default joystick.
* It should return number of joysticks, or -1 on an unrecoverable fatal error.
@ -111,15 +87,6 @@ static int PSP_JoystickInit(void)
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
/* Start thread to read data */
if((pad_sem = SDL_CreateSemaphore(1)) == NULL) {
return SDL_SetError("Can't create input semaphore");
}
running = 1;
if((thread = SDL_CreateThreadInternal(JoystickUpdate, "JoystickThread", 4096, NULL)) == NULL) {
return SDL_SetError("Can't create input thread");
}
/* Create an accurate map from analog inputs (0 to 255)
to SDL joystick positions (-32768 to 32767) */
for (i = 0; i < 128; i++)
@ -132,7 +99,7 @@ static int PSP_JoystickInit(void)
return 1;
}
static int PSP_NumJoysticks(void)
static int PSP_JoystickGetCount(void)
{
return 1;
}
@ -141,21 +108,17 @@ static void PSP_JoystickDetect(void)
{
}
#if 0
static const char *PSP_JoystickName(int idx)
{
if (idx == 0) return "PSP controller";
SDL_SetError("No joystick available with that index");
return NULL;
}
#endif
/* Function to get the device-dependent name of a joystick */
static const char *PSP_JoystickGetDeviceName(int device_index)
{
return "PSP builtin joypad";
if (device_index == 0)
return "PSP builtin joypad";
SDL_SetError("No joystick available with that index");
return(NULL);
}
static const char *PSP_JoystickGetDevicePath(int device_index)
static const char *PSP_JoystickGetDevicePath(int index)
{
return NULL;
}
@ -165,8 +128,7 @@ static int PSP_JoystickGetDevicePlayerIndex(int device_index)
return -1;
}
static void
PSP_JoystickSetDevicePlayerIndex(int device_index, int player_index)
static void PSP_JoystickSetDevicePlayerIndex(int device_index, int player_index)
{
}
@ -193,21 +155,20 @@ static SDL_JoystickID PSP_JoystickGetDeviceInstanceID(int device_index)
*/
static int PSP_JoystickOpen(SDL_Joystick *joystick, int device_index)
{
joystick->nbuttons = 14;
joystick->nbuttons = SDL_arraysize(button_map);
joystick->naxes = 2;
joystick->nhats = 0;
joystick->instance_id = device_index;
return 0;
}
static int
PSP_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
static int PSP_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
{
return SDL_Unsupported();
}
static int
PSP_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble)
static int PSP_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble)
{
return SDL_Unsupported();
}
@ -217,14 +178,12 @@ static Uint32 PSP_JoystickGetCapabilities(SDL_Joystick *joystick)
return 0;
}
static int
PSP_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue)
static int PSP_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue)
{
return SDL_Unsupported();
}
static int
PSP_JoystickSendEffect(SDL_Joystick *joystick, const void *data, int size)
static int PSP_JoystickSendEffect(SDL_Joystick *joystick, const void *data, int size)
{
return SDL_Unsupported();
}
@ -248,11 +207,10 @@ static void PSP_JoystickUpdate(SDL_Joystick *joystick)
static enum PspCtrlButtons old_buttons = 0;
static unsigned char old_x = 0, old_y = 0;
SDL_SemWait(pad_sem);
sceCtrlReadBufferPositive(&pad, 1);
buttons = pad.Buttons;
x = pad.Lx;
y = pad.Ly;
SDL_SemPost(pad_sem);
/* Axes */
if(old_x != x) {
@ -268,8 +226,8 @@ static void PSP_JoystickUpdate(SDL_Joystick *joystick)
changed = old_buttons ^ buttons;
old_buttons = buttons;
if(changed) {
for(i=0; i<sizeof(button_map)/sizeof(button_map[0]); i++) {
if(changed & button_map[i]) {
for (i = 0; i < SDL_arraysize(button_map); i++) {
if (changed & button_map[i]) {
SDL_PrivateJoystickButton(
joystick, i,
(buttons & button_map[i]) ?
@ -277,8 +235,6 @@ static void PSP_JoystickUpdate(SDL_Joystick *joystick)
}
}
}
sceKernelDelayThread(0);
}
/* Function to close a joystick after use */
@ -289,10 +245,6 @@ static void PSP_JoystickClose(SDL_Joystick *joystick)
/* Function to perform any system-specific joystick related cleanup */
static void PSP_JoystickQuit(void)
{
/* Cleanup Threads and Semaphore. */
running = 0;
SDL_WaitThread(thread, NULL);
SDL_DestroySemaphore(pad_sem);
}
static SDL_bool
@ -304,7 +256,7 @@ PSP_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out)
SDL_JoystickDriver SDL_PSP_JoystickDriver =
{
PSP_JoystickInit,
PSP_NumJoysticks,
PSP_JoystickGetCount,
PSP_JoystickDetect,
PSP_JoystickGetDeviceName,
PSP_JoystickGetDevicePath,