Fixed rumble order on PS5

Sam Lantinga 2020-11-16 09:11:15 -08:00
parent eb94c19a63
commit f28c01a4fb
2 changed files with 11 additions and 25 deletions

View File

@ -328,7 +328,7 @@ HIDAPI_DriverPS4_RumbleJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystic
}
/* In order to send rumble, we have to send a complete effect packet */
SDL_memset(data, 0, sizeof(data));
SDL_zero(data);
if (ctx->is_bluetooth) {
data[0] = k_EPS4ReportIdBluetoothEffects;

View File

@ -39,7 +39,7 @@
typedef enum
{
k_EPS5ReportIdState = 0x01,
k_EPS5ReportIDOutput = 0x02,
k_EPS5ReportIDOutput = 0x02,
k_EPS5ReportIdBluetoothState = 0x31,
} EPS5ReportId;
@ -87,22 +87,6 @@ typedef struct
/* There's more unknown data at the end, and a 32-bit CRC on Bluetooth */
} PS5StatePacket_t;
typedef struct
{
Uint8 ucReportID;
Uint8 ucHeader;
Uint8 ucEnableBits;
Uint8 ucRumbleRight;
Uint8 ucRumbleLeft;
Uint8 rgucUnknown[3];
Uint8 ucUnknown;
Uint8 ucMuteLED;
Uint8 ucBits;
Uint8 rgucForceFeedbackRight[11];
Uint8 rgucForceFeedbackLeft[11];
Uint8 rgucUnknown2[3];
Uint8 rgucUnknown3[13];
} PS5OutputReportPacket_t;
static void ReadFeatureReport(hid_device *dev, Uint8 report_id)
{
@ -198,14 +182,16 @@ HIDAPI_DriverPS5_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick)
static int
HIDAPI_DriverPS5_RumbleJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
{
PS5OutputReportPacket_t OutputReport;
SDL_memset( &OutputReport, 0, sizeof( OutputReport ) );
OutputReport.ucReportID = k_EPS5ReportIDOutput;
OutputReport.ucHeader = 0x7;
OutputReport.ucRumbleLeft = high_frequency_rumble >> 8;
OutputReport.ucRumbleRight = low_frequency_rumble >> 8;
Uint8 data[6];
if (SDL_HIDAPI_SendRumble(device, &OutputReport, sizeof(OutputReport)) != sizeof(OutputReport)) {
/* This works over USB, not over Bluetooth */
SDL_zero(data);
data[0] = k_EPS5ReportIDOutput;
data[1] = 0x7; /* Magic value */
data[3] = (high_frequency_rumble >> 8);
data[4] = (low_frequency_rumble >> 8);
if (SDL_HIDAPI_SendRumble(device, data, sizeof(data)) != sizeof(data)) {
return SDL_SetError("Couldn't send rumble packet");
}
return 0;