Sfoglia il codice sorgente

Ignore the PS4 packet CRC if it's not being set correctly

This fixes handling the 8BitDo SN30 Pro with the 2.00 firmware in PS4 mode

Fixes https://github.com/libsdl-org/SDL/issues/7270
Sam Lantinga 2 anni fa
parent
commit
3951cae4a5
1 ha cambiato i file con 13 aggiunte e 1 eliminazioni
  1. 13 1
      src/joystick/hidapi/SDL_hidapi_ps4.c

+ 13 - 1
src/joystick/hidapi/SDL_hidapi_ps4.c

@@ -147,6 +147,7 @@ typedef struct
     Uint8 led_blue;
     Uint64 sensor_ticks;
     Uint16 last_tick;
+    Uint16 valid_crc_packets; /* wrapping counter */
     PS4StatePacket_t last_state;
 } SDL_DriverPS4_Context;
 
@@ -1026,7 +1027,18 @@ static SDL_bool HIDAPI_DriverPS4_IsPacketValid(SDL_DriverPS4_Context *ctx, Uint8
     case k_EPS4ReportIdBluetoothState8:
     case k_EPS4ReportIdBluetoothState9:
         /* Bluetooth state packets have two additional bytes at the beginning, the first notes if HID data is present */
-        if (size >= 78 && (data[1] & 0x80) && VerifyCRC(data, 78)) {
+        if (size >= 78 && (data[1] & 0x80)) {
+            if (VerifyCRC(data, 78)) {
+                ++ctx->valid_crc_packets;
+            } else {
+                if (ctx->valid_crc_packets > 0) {
+                    --ctx->valid_crc_packets;
+                }
+                if (ctx->valid_crc_packets >= 3) {
+                    /* We're generally getting valid CRC, but failed one */
+                    return SDL_FALSE;
+                }
+            }
             return SDL_TRUE;
         }
         break;