/*
  Simple DirectMedia Layer
  Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.
*/
#include "../../SDL_internal.h"

#ifdef SDL_JOYSTICK_HIDAPI

#include "SDL_hints.h"
#include "SDL_events.h"
#include "SDL_timer.h"
#include "SDL_joystick.h"
#include "SDL_gamecontroller.h"
#include "../SDL_sysjoystick.h"
#include "SDL_hidapijoystick_c.h"



#ifdef SDL_JOYSTICK_HIDAPI_STEAM

/*****************************************************************************************************/

#include <stdint.h>

typedef enum
{
    false,
    true
} bool;

typedef uint32_t uint32;
typedef uint64_t uint64;
    
#include "steam/controller_constants.h"
#include "steam/controller_structs.h"

typedef struct SteamControllerStateInternal_t
{
    // Controller Type for this Controller State
    uint32 eControllerType;

    // If packet num matches that on your prior call, then the controller state hasn't been changed since 
    // your last call and there is no need to process it
    uint32 unPacketNum;
    
    // bit flags for each of the buttons
    uint64 ulButtons;
    
    // Left pad coordinates
    short sLeftPadX;
    short sLeftPadY;
    
    // Right pad coordinates
    short sRightPadX;
    short sRightPadY;

    // Center pad coordinates
    short sCenterPadX;
    short sCenterPadY;
    
    // Left analog stick coordinates
    short sLeftStickX;
    short sLeftStickY;

    // Right analog stick coordinates
    short sRightStickX;
    short sRightStickY;
    
    unsigned short sTriggerL;
    unsigned short sTriggerR;
    
    short sAccelX;
    short sAccelY;
    short sAccelZ;
    
    short sGyroX;
    short sGyroY;
    short sGyroZ;
    
    float sGyroQuatW;
    float sGyroQuatX;
    float sGyroQuatY;
    float sGyroQuatZ;
    
    short sGyroSteeringAngle;
    
    unsigned short sBatteryLevel;

    // Pressure sensor data.
    unsigned short sPressurePadLeft;
    unsigned short sPressurePadRight;
    
    unsigned short sPressureBumperLeft;
    unsigned short sPressureBumperRight;
    
    // Internal state data
    short sPrevLeftPad[2];
    short sPrevLeftStick[2];
} SteamControllerStateInternal_t;


/* Defines for ulButtons in SteamControllerStateInternal_t */
#define STEAM_RIGHT_TRIGGER_MASK            0x00000001
#define STEAM_LEFT_TRIGGER_MASK             0x00000002
#define STEAM_RIGHT_BUMPER_MASK             0x00000004
#define STEAM_LEFT_BUMPER_MASK              0x00000008
#define STEAM_BUTTON_0_MASK                 0x00000010    /* Y */
#define STEAM_BUTTON_1_MASK                 0x00000020    /* B */
#define STEAM_BUTTON_2_MASK                 0x00000040    /* X */
#define STEAM_BUTTON_3_MASK                 0x00000080    /* A */
#define STEAM_TOUCH_0_MASK                  0x00000100    /* DPAD UP */
#define STEAM_TOUCH_1_MASK                  0x00000200    /* DPAD RIGHT */
#define STEAM_TOUCH_2_MASK                  0x00000400    /* DPAD LEFT */
#define STEAM_TOUCH_3_MASK                  0x00000800    /* DPAD DOWN */
#define STEAM_BUTTON_MENU_MASK              0x00001000    /* SELECT */
#define STEAM_BUTTON_STEAM_MASK             0x00002000    /* GUIDE */
#define STEAM_BUTTON_ESCAPE_MASK            0x00004000    /* START */
#define STEAM_BUTTON_BACK_LEFT_MASK         0x00008000
#define STEAM_BUTTON_BACK_RIGHT_MASK        0x00010000
#define STEAM_BUTTON_LEFTPAD_CLICKED_MASK   0x00020000
#define STEAM_BUTTON_RIGHTPAD_CLICKED_MASK  0x00040000
#define STEAM_LEFTPAD_FINGERDOWN_MASK       0x00080000
#define STEAM_RIGHTPAD_FINGERDOWN_MASK      0x00100000
#define STEAM_JOYSTICK_BUTTON_MASK          0x00400000
#define STEAM_LEFTPAD_AND_JOYSTICK_MASK     0x00800000


// Look for report version 0x0001, type WIRELESS (3), length >= 1 byte
#define D0G_IS_VALID_WIRELESS_EVENT(data, len)    ((len) >= 5 && (data)[0] == 1 && (data)[1] == 0 && (data)[2] == 3 && (data)[3] >= 1)
#define D0G_GET_WIRELESS_EVENT_TYPE(data)        ((data)[4])
#define D0G_WIRELESS_DISCONNECTED    1
#define D0G_WIRELESS_ESTABLISHED    2
#define D0G_WIRELESS_NEWLYPAIRED    3

#define D0G_IS_WIRELESS_DISCONNECT(data, len)    ( D0G_IS_VALID_WIRELESS_EVENT(data,len) && D0G_GET_WIRELESS_EVENT_TYPE(data) == D0G_WIRELESS_DISCONNECTED )

#define MAX_REPORT_SEGMENT_PAYLOAD_SIZE    18
/*
 * SteamControllerPacketAssembler has to be used when reading output repots from controllers.
 */
typedef struct
{
    uint8_t uBuffer[ MAX_REPORT_SEGMENT_PAYLOAD_SIZE * 8 + 1 ];
    int nExpectedSegmentNumber;
    bool bIsBle;
} SteamControllerPacketAssembler;


#undef clamp
#define clamp(val, min, max) (((val) > (max)) ? (max) : (((val) < (min)) ? (min) : (val)))

#undef offsetof
#define offsetof(s,m)    (size_t)&(((s *)0)->m)

#ifdef DEBUG_STEAM_CONTROLLER
#define DPRINTF(format, ...) printf(format, ##__VA_ARGS__)
#define HEXDUMP(ptr, len) hexdump(ptr, len)
#else
#define DPRINTF(format, ...)
#define HEXDUMP(ptr, len)
#endif
#define printf  SDL_Log

#define MAX_REPORT_SEGMENT_SIZE        ( MAX_REPORT_SEGMENT_PAYLOAD_SIZE + 2 )
#define CALC_REPORT_SEGMENT_NUM(index)  ( ( index / MAX_REPORT_SEGMENT_PAYLOAD_SIZE ) & 0x07 )
#define REPORT_SEGMENT_DATA_FLAG    0x80
#define REPORT_SEGMENT_LAST_FLAG    0x40
#define BLE_REPORT_NUMBER        0x03

#define STEAMCONTROLLER_TRIGGER_MAX_ANALOG 26000

// Enable mouse mode when using the Steam Controller locally
#undef ENABLE_MOUSE_MODE


// Wireless firmware quirk: the firmware intentionally signals "failure" when performing
// SET_FEATURE / GET_FEATURE when it actually means "pending radio round-trip". The only
// way to make SET_FEATURE / GET_FEATURE work is to loop several times with a sleep. If
// it takes more than 50ms to get the response for SET_FEATURE / GET_FEATURE, we assume
// that the controller has failed.
#define RADIO_WORKAROUND_SLEEP_ATTEMPTS 50
#define RADIO_WORKAROUND_SLEEP_DURATION_US 500

// This was defined by experimentation. 2000 seemed to work but to give that extra bit of margin, set to 3ms.
#define CONTROLLER_CONFIGURATION_DELAY_US 3000

static uint8_t GetSegmentHeader( int nSegmentNumber, bool bLastPacket )
{
    uint8_t header = REPORT_SEGMENT_DATA_FLAG;
    header |= nSegmentNumber;
    if ( bLastPacket )
        header |= REPORT_SEGMENT_LAST_FLAG;
    
    return header;
}

static void hexdump( const uint8_t *ptr, int len )
{
    int i;
    for ( i = 0; i < len ; ++i )
        printf("%02x ", ptr[i]);
    printf("\n");
}

static void ResetSteamControllerPacketAssembler( SteamControllerPacketAssembler *pAssembler )
{
    memset( pAssembler->uBuffer, 0, sizeof( pAssembler->uBuffer ) );
    pAssembler->nExpectedSegmentNumber = 0;
}

static void InitializeSteamControllerPacketAssembler( SteamControllerPacketAssembler *pAssembler )
{
    /* We only support BLE devices right now */
    pAssembler->bIsBle = true;
    ResetSteamControllerPacketAssembler( pAssembler );
}

// Returns:
//     <0 on error
//     0 on not ready
//     Complete packet size on completion
static int WriteSegmentToSteamControllerPacketAssembler( SteamControllerPacketAssembler *pAssembler, const uint8_t *pSegment, int nSegmentLength )
{
    if ( pAssembler->bIsBle )
    {
        HEXDUMP( pSegment, nSegmentLength );

        if ( pSegment[ 0 ] != BLE_REPORT_NUMBER )
        {
            // We may get keyboard/mouse input events until controller stops sending them
            return 0;
        }
        
        if ( nSegmentLength != MAX_REPORT_SEGMENT_SIZE )
        {
            printf( "Bad segment size! %d\n", (int)nSegmentLength );
            hexdump( pSegment, nSegmentLength );
            ResetSteamControllerPacketAssembler( pAssembler );
            return -1;
        }
        
        uint8_t uSegmentHeader = pSegment[ 1 ];
        DPRINTF("GOT PACKET HEADER = 0x%x\n", uSegmentHeader);
        
        if ( ( uSegmentHeader & REPORT_SEGMENT_DATA_FLAG ) == 0 )
        {
            // We get empty segments, just ignore them
            return 0;
        }
        
        int nSegmentNumber = uSegmentHeader & 0x07;
        if ( nSegmentNumber != pAssembler->nExpectedSegmentNumber )
        {
            ResetSteamControllerPacketAssembler( pAssembler );
            
            if ( nSegmentNumber )
            {
                // This happens occasionally
                DPRINTF("Bad segment number, got %d, expected %d\n",
                    nSegmentNumber, pAssembler->nExpectedSegmentNumber );
                return -1;
            }
        }
        
        memcpy( pAssembler->uBuffer + nSegmentNumber * MAX_REPORT_SEGMENT_PAYLOAD_SIZE,
               pSegment + 2, // ignore header and report number
               MAX_REPORT_SEGMENT_PAYLOAD_SIZE );
        
        if ( uSegmentHeader & REPORT_SEGMENT_LAST_FLAG )
        {
            pAssembler->nExpectedSegmentNumber = 0;
            return ( nSegmentNumber + 1 ) * MAX_REPORT_SEGMENT_PAYLOAD_SIZE;
        }
        
        pAssembler->nExpectedSegmentNumber++;
    }
    else
    {
        // Just pass through
        memcpy( pAssembler->uBuffer,
               pSegment,
               nSegmentLength );
        return nSegmentLength;
    }
    
    return 0;
}

#define BLE_MAX_READ_RETRIES    8

static int SetFeatureReport( hid_device *dev, unsigned char uBuffer[65], int nActualDataLen )
{
    DPRINTF("SetFeatureReport %p %p %d\n", dev, uBuffer, nActualDataLen);
    int nRet = -1;
    bool bBle = true; // only wireless/BLE for now, though macOS could do wired in the future
    
    if ( bBle )
    {
        if ( nActualDataLen < 1 )
            return -1;
        
        int nSegmentNumber = 0;
        uint8_t uPacketBuffer[ MAX_REPORT_SEGMENT_SIZE ];
        
        // Skip report number in data
        unsigned char *pBufferPtr = uBuffer + 1;
        nActualDataLen--;
        
        while ( nActualDataLen > 0 )
        {
            int nBytesInPacket = nActualDataLen > MAX_REPORT_SEGMENT_PAYLOAD_SIZE ? MAX_REPORT_SEGMENT_PAYLOAD_SIZE : nActualDataLen;
            
            nActualDataLen -= nBytesInPacket;

            // Construct packet
            memset( uPacketBuffer, 0, sizeof( uPacketBuffer ) );
            uPacketBuffer[ 0 ] = BLE_REPORT_NUMBER;
            uPacketBuffer[ 1 ] = GetSegmentHeader( nSegmentNumber, nActualDataLen == 0 );
            memcpy( &uPacketBuffer[ 2 ], pBufferPtr, nBytesInPacket );
            
            pBufferPtr += nBytesInPacket;
            nSegmentNumber++;
            
            nRet = hid_send_feature_report( dev, uPacketBuffer, sizeof( uPacketBuffer ) );
            DPRINTF("SetFeatureReport() ret = %d\n", nRet);
        }
    }
    
    return nRet;
}

static int GetFeatureReport( hid_device *dev, unsigned char uBuffer[65] )
{
    DPRINTF("GetFeatureReport( %p %p )\n", dev, uBuffer );
    int nRet = -1;
    bool bBle = true;

    if ( bBle )
    {
        SteamControllerPacketAssembler assembler;
        InitializeSteamControllerPacketAssembler( &assembler );
        
        int nRetries = 0;
        uint8_t uSegmentBuffer[ MAX_REPORT_SEGMENT_SIZE ];
        while( nRetries < BLE_MAX_READ_RETRIES )
        {
            memset( uSegmentBuffer, 0, sizeof( uSegmentBuffer ) );
            uSegmentBuffer[ 0 ] = BLE_REPORT_NUMBER;
            nRet = hid_get_feature_report( dev, uSegmentBuffer, sizeof( uSegmentBuffer ) );
            DPRINTF( "GetFeatureReport ble ret=%d\n", nRet );
            HEXDUMP( uSegmentBuffer, nRet );
            
            // Zero retry counter if we got data
            if ( nRet > 2 && ( uSegmentBuffer[ 1 ] & REPORT_SEGMENT_DATA_FLAG ) )
                nRetries = 0;
            else
                nRetries++;
            
            if ( nRet > 0 )
            {
                int nPacketLength = WriteSegmentToSteamControllerPacketAssembler( &assembler,
                                                                                 uSegmentBuffer,
                                                                                 nRet );
                
                if ( nPacketLength > 0 && nPacketLength < 65 )
                {
                    // Leave space for "report number"
                    uBuffer[ 0 ] = 0;
                    memcpy( uBuffer + 1, assembler.uBuffer, nPacketLength );
                    return nPacketLength;
                }
            }
            
            
        }
        printf("Could not get a full ble packet after %d retries\n", nRetries );
        return -1;
    }
    
    return nRet;
}

static int ReadResponse( hid_device *dev, uint8_t uBuffer[65], int nExpectedResponse )
{
    DPRINTF("ReadResponse( %p %p %d )\n", dev, uBuffer, nExpectedResponse );
    int nRet = GetFeatureReport( dev, uBuffer );

    if ( nRet < 0 )
        return nRet;
    
    DPRINTF("ReadResponse got %d bytes of data: ", nRet );
    HEXDUMP( uBuffer, nRet );
    
    if ( uBuffer[1] != nExpectedResponse )
        return -1;
    
    return nRet;
}

//---------------------------------------------------------------------------
// Reset steam controller (unmap buttons and pads) and re-fetch capability bits
//---------------------------------------------------------------------------
static bool ResetSteamController( hid_device *dev, bool bSuppressErrorSpew )
{
    DPRINTF( "ResetSteamController hid=%p\n", dev );
    // Firmware quirk: Set Feature and Get Feature requests always require a 65-byte buffer.
    unsigned char buf[65];
    int res = -1;
    
    buf[0] = 0;
    buf[1] = ID_GET_ATTRIBUTES_VALUES;
    res = SetFeatureReport( dev, buf, 2 );
    if ( res < 0 )
    {
        if ( !bSuppressErrorSpew )
            printf( "GET_ATTRIBUTES_VALUES failed for controller %p\n", dev );
        return false;
    }
    
    // Retrieve GET_ATTRIBUTES_VALUES result
    // Wireless controller endpoints without a connected controller will return nAttrs == 0
    res = ReadResponse( dev, buf, ID_GET_ATTRIBUTES_VALUES );
    if ( res < 0 || buf[1] != ID_GET_ATTRIBUTES_VALUES )
    {
        HEXDUMP(buf, res);
        if ( !bSuppressErrorSpew )
            printf( "Bad GET_ATTRIBUTES_VALUES response for controller %p\n", dev );
        return false;
    }
    
    int nAttributesLength = buf[ 2 ];
    if ( nAttributesLength > res )
    {
        if ( !bSuppressErrorSpew )
            printf( "Bad GET_ATTRIBUTES_VALUES response for controller %p\n", dev );
        return false;
    }
    
    // Clear digital button mappings
    buf[0] = 0;
    buf[1] = ID_CLEAR_DIGITAL_MAPPINGS;
    res = SetFeatureReport( dev, buf, 2 );
    if ( res < 0 )
    {
        if ( !bSuppressErrorSpew )
            printf( "CLEAR_DIGITAL_MAPPINGS failed for controller %p\n", dev );
        return false;
    }
    
    // Reset the default settings
    memset( buf, 0, 65 );
    buf[1] = ID_LOAD_DEFAULT_SETTINGS;
    buf[2] = 0;
    res = SetFeatureReport( dev, buf, 3 );
    if ( res < 0 )
    {
        if ( !bSuppressErrorSpew )
            printf( "LOAD_DEFAULT_SETTINGS failed for controller %p\n", dev );
        return false;
    }
    
    // Apply custom settings - clear trackpad modes (cancel mouse emulation), etc
    int nSettings = 0;
#define ADD_SETTING(SETTING, VALUE)    \
buf[3+nSettings*3] = SETTING;    \
buf[3+nSettings*3+1] = ((uint16_t)VALUE)&0xFF; \
buf[3+nSettings*3+2] = ((uint16_t)VALUE)>>8; \
++nSettings;
    
    memset( buf, 0, 65 );
    buf[1] = ID_SET_SETTINGS_VALUES;
    ADD_SETTING( SETTING_WIRELESS_PACKET_VERSION, 2 );
    ADD_SETTING( SETTING_LEFT_TRACKPAD_MODE, TRACKPAD_NONE );
#ifdef ENABLE_MOUSE_MODE
    ADD_SETTING( SETTING_RIGHT_TRACKPAD_MODE, TRACKPAD_ABSOLUTE_MOUSE );
    ADD_SETTING( SETTING_SMOOTH_ABSOLUTE_MOUSE, 1 );
    ADD_SETTING( SETTING_MOMENTUM_MAXIMUM_VELOCITY, 20000 );    // [0-20000] default 8000
    ADD_SETTING( SETTING_MOMENTUM_DECAY_AMMOUNT, 50 );        // [0-50] default 5
#else
    ADD_SETTING( SETTING_RIGHT_TRACKPAD_MODE, TRACKPAD_NONE );
    ADD_SETTING( SETTING_SMOOTH_ABSOLUTE_MOUSE, 0 );
#endif
    buf[2] = nSettings*3;
    
    res = SetFeatureReport( dev, buf, 3+nSettings*3 );
    if ( res < 0 )
    {
        if ( !bSuppressErrorSpew )
            printf( "SET_SETTINGS failed for controller %p\n", dev );
        return false;
    }
    
#ifdef ENABLE_MOUSE_MODE
    // Wait for ID_CLEAR_DIGITAL_MAPPINGS to be processed on the controller
    bool bMappingsCleared = false;
    int iRetry;
    for ( iRetry = 0; iRetry < 2; ++iRetry )
    {
        memset( buf, 0, 65 );
        buf[1] = ID_GET_DIGITAL_MAPPINGS;
        buf[2] = 1; // one byte - requesting from index 0
        buf[3] = 0;
        res = SetFeatureReport( dev, buf, 4 );
        if ( res < 0 )
        {
            printf( "GET_DIGITAL_MAPPINGS failed for controller %p\n", dev );
            return false;
        }
        
        res = ReadResponse( dev, buf, ID_GET_DIGITAL_MAPPINGS );
        if ( res < 0 || buf[1] != ID_GET_DIGITAL_MAPPINGS )
        {
            printf( "Bad GET_DIGITAL_MAPPINGS response for controller %p\n", dev );
            return false;
        }
        
        // If the length of the digital mappings result is not 1 (index byte, no mappings) then clearing hasn't executed
        if ( buf[2] == 1 && buf[3] == 0xFF )
        {
            bMappingsCleared = true;
            break;
        }
        usleep( CONTROLLER_CONFIGURATION_DELAY_US );
    }
    
    if ( !bMappingsCleared && !bSuppressErrorSpew )
    {
        printf( "Warning: CLEAR_DIGITAL_MAPPINGS never completed for controller %p\n", dev );
    }
    
    // Set our new mappings
    memset( buf, 0, 65 );
    buf[1] = ID_SET_DIGITAL_MAPPINGS;
    buf[2] = 6; // 2 settings x 3 bytes
    buf[3] = IO_DIGITAL_BUTTON_RIGHT_TRIGGER;
    buf[4] = DEVICE_MOUSE;
    buf[5] = MOUSE_BTN_LEFT;
    buf[6] = IO_DIGITAL_BUTTON_LEFT_TRIGGER;
    buf[7] = DEVICE_MOUSE;
    buf[8] = MOUSE_BTN_RIGHT;
    
    res = SetFeatureReport( dev, buf, 9 );
    if ( res < 0 )
    {
        if ( !bSuppressErrorSpew )
            printf( "SET_DIGITAL_MAPPINGS failed for controller %p\n", dev );
        return false;
    }
#endif // ENABLE_MOUSE_MODE
    
    return true;
}


//---------------------------------------------------------------------------
// Read from a Steam Controller
//---------------------------------------------------------------------------
static int ReadSteamController( hid_device *dev, uint8_t *pData, int nDataSize )
{
    memset( pData, 0, nDataSize );
    pData[ 0 ] = BLE_REPORT_NUMBER; // hid_read will also overwrite this with the same value, 0x03
    return hid_read( dev, pData, nDataSize );
}


//---------------------------------------------------------------------------
// Close a Steam Controller
//---------------------------------------------------------------------------
static void CloseSteamController( hid_device *dev )
{
    // Switch the Steam Controller back to lizard mode so it works with the OS
    unsigned char buf[65];
    int nSettings = 0;
    
    // Reset digital button mappings
    memset( buf, 0, 65 );
    buf[1] = ID_SET_DEFAULT_DIGITAL_MAPPINGS;
    SetFeatureReport( dev, buf, 2 );

    // Reset the default settings
    memset( buf, 0, 65 );
    buf[1] = ID_LOAD_DEFAULT_SETTINGS;
    buf[2] = 0;
    SetFeatureReport( dev, buf, 3 );

    // Reset mouse mode for lizard mode
    memset( buf, 0, 65 );
    buf[1] = ID_SET_SETTINGS_VALUES;
    ADD_SETTING( SETTING_RIGHT_TRACKPAD_MODE, TRACKPAD_ABSOLUTE_MOUSE );
    buf[2] = nSettings*3;
    SetFeatureReport( dev, buf, 3+nSettings*3 );
}


//---------------------------------------------------------------------------
// Scale and clamp values to a range
//---------------------------------------------------------------------------
static float RemapValClamped( float val, float A, float B, float C, float D)
{
    if ( A == B )
    {
        return ( val - B ) >= 0.0f ? D : C;
    }
    else
    {
        float cVal = (val - A) / (B - A);
        cVal = clamp( cVal, 0.0f, 1.0f );

        return C + (D - C) * cVal;
    }
}


//---------------------------------------------------------------------------
// Rotate the pad coordinates
//---------------------------------------------------------------------------
static void RotatePad( int *pX, int *pY, float flAngleInRad )
{
    short int origX = *pX, origY = *pY;

    *pX = (int)( SDL_cosf( flAngleInRad ) * origX - SDL_sinf( flAngleInRad ) * origY );
    *pY = (int)( SDL_sinf( flAngleInRad ) * origX + SDL_cosf( flAngleInRad ) * origY );
}
static void RotatePadShort( short *pX, short *pY, float flAngleInRad )
{
    short int origX = *pX, origY = *pY;

    *pX = (short)( SDL_cosf( flAngleInRad ) * origX - SDL_sinf( flAngleInRad ) * origY );
    *pY = (short)( SDL_sinf( flAngleInRad ) * origX + SDL_cosf( flAngleInRad ) * origY );
}


//---------------------------------------------------------------------------
// Format the first part of the state packet
//---------------------------------------------------------------------------
static void FormatStatePacketUntilGyro( SteamControllerStateInternal_t *pState, ValveControllerStatePacket_t *pStatePacket )
{
    memset(pState, 0, offsetof(SteamControllerStateInternal_t, sBatteryLevel));

    //pState->eControllerType = m_eControllerType;
    pState->eControllerType = 2; // k_eControllerType_SteamController;
    pState->unPacketNum = pStatePacket->unPacketNum;

    // We have a chunk of trigger data in the packet format here, so zero it out afterwards
    memcpy(&pState->ulButtons, &pStatePacket->ButtonTriggerData.ulButtons, 8);
    pState->ulButtons &= ~0xFFFF000000LL;

    // The firmware uses this bit to tell us what kind of data is packed into the left two axises
    if (pStatePacket->ButtonTriggerData.ulButtons & STEAM_LEFTPAD_FINGERDOWN_MASK)
    {
        // Finger-down bit not set; "left pad" is actually trackpad
        pState->sLeftPadX = pState->sPrevLeftPad[0] = pStatePacket->sLeftPadX;
        pState->sLeftPadY = pState->sPrevLeftPad[1] = pStatePacket->sLeftPadY;

        if (pStatePacket->ButtonTriggerData.ulButtons & STEAM_LEFTPAD_AND_JOYSTICK_MASK)
        {
            // The controller is interleaving both stick and pad data, both are active
            pState->sLeftStickX = pState->sPrevLeftStick[0];
            pState->sLeftStickY = pState->sPrevLeftStick[1];
        }
        else
        {
            // The stick is not active
            pState->sPrevLeftStick[0] = 0;
            pState->sPrevLeftStick[1] = 0;
        }
    }
    else
    {
        // Finger-down bit not set; "left pad" is actually joystick

        // XXX there's a firmware bug where sometimes padX is 0 and padY is a large number (acutally the battery voltage)
        // If that happens skip this packet and report last frames stick
/*
        if ( m_eControllerType == k_eControllerType_SteamControllerV2 && pStatePacket->sLeftPadY > 900 )
        {
            pState->sLeftStickX = pState->sPrevLeftStick[0];
            pState->sLeftStickY = pState->sPrevLeftStick[1];
        }
        else
*/
        {
            pState->sPrevLeftStick[0] = pState->sLeftStickX = pStatePacket->sLeftPadX;
            pState->sPrevLeftStick[1] = pState->sLeftStickY = pStatePacket->sLeftPadY;
        }
/*
        if (m_eControllerType == k_eControllerType_SteamControllerV2)
        {
            UpdateV2JoystickCap(&state);
        }
*/

        if (pStatePacket->ButtonTriggerData.ulButtons & STEAM_LEFTPAD_AND_JOYSTICK_MASK)
        {
            // The controller is interleaving both stick and pad data, both are active
            pState->sLeftPadX = pState->sPrevLeftPad[0];
            pState->sLeftPadY = pState->sPrevLeftPad[1];
        }
        else
        {
            // The trackpad is not active
            pState->sPrevLeftPad[0] = 0;
            pState->sPrevLeftPad[1] = 0;

            // Old controllers send trackpad click for joystick button when trackpad is not active
            if (pState->ulButtons & STEAM_BUTTON_LEFTPAD_CLICKED_MASK)
            {
                pState->ulButtons &= ~STEAM_BUTTON_LEFTPAD_CLICKED_MASK;
                pState->ulButtons |= STEAM_JOYSTICK_BUTTON_MASK;
            }
        }
    }

    // Fingerdown bit indicates if the packed left axis data was joystick or pad,
    // but if we are interleaving both, the left finger is definitely on the pad.
    if (pStatePacket->ButtonTriggerData.ulButtons & STEAM_LEFTPAD_AND_JOYSTICK_MASK)
        pState->ulButtons |= STEAM_LEFTPAD_FINGERDOWN_MASK;

    pState->sRightPadX = pStatePacket->sRightPadX;
    pState->sRightPadY = pStatePacket->sRightPadY;

    int nLeftPadX = pState->sLeftPadX;
    int nLeftPadY = pState->sLeftPadY;
    int nRightPadX = pState->sRightPadX;
    int nRightPadY = pState->sRightPadY;

    // 15 degrees in rad
    const float flRotationAngle = 0.261799f;

    RotatePad(&nLeftPadX, &nLeftPadY, -flRotationAngle);
    RotatePad(&nRightPadX, &nRightPadY, flRotationAngle);

    int nPadOffset;
    if (pState->ulButtons & STEAM_LEFTPAD_FINGERDOWN_MASK)
        nPadOffset = 1000;
    else
        nPadOffset = 0;

    pState->sLeftPadX = clamp(nLeftPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
    pState->sLeftPadY = clamp(nLeftPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);

    nPadOffset = 0;
    if (pState->ulButtons & STEAM_RIGHTPAD_FINGERDOWN_MASK)
        nPadOffset = 1000;
    else
        nPadOffset = 0;

    pState->sRightPadX = clamp(nRightPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
    pState->sRightPadY = clamp(nRightPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);

    pState->sTriggerL = (unsigned short)RemapValClamped( (pStatePacket->ButtonTriggerData.Triggers.nLeft << 7) | pStatePacket->ButtonTriggerData.Triggers.nLeft, 0, STEAMCONTROLLER_TRIGGER_MAX_ANALOG, 0, SDL_MAX_SINT16 );
    pState->sTriggerR = (unsigned short)RemapValClamped( (pStatePacket->ButtonTriggerData.Triggers.nRight << 7) | pStatePacket->ButtonTriggerData.Triggers.nRight, 0, STEAMCONTROLLER_TRIGGER_MAX_ANALOG, 0, SDL_MAX_SINT16 );
}


//---------------------------------------------------------------------------
// Update Steam Controller state from a BLE data packet, returns true if it parsed data
//---------------------------------------------------------------------------
static bool UpdateBLESteamControllerState( const uint8_t *pData, int nDataSize, SteamControllerStateInternal_t *pState )
{
    const float flRotationAngle = 0.261799f;
    uint32_t ucOptionDataMask;

    pState->unPacketNum++;
    ucOptionDataMask = ( *pData++ & 0xF0 );
    ucOptionDataMask |= (uint32_t)(*pData++) << 8;
    if ( ucOptionDataMask & k_EBLEButtonChunk1 )
    {
        memcpy( &pState->ulButtons, pData, 3 );
        pData += 3;
    }
    if ( ucOptionDataMask & k_EBLEButtonChunk2 )
    {
        // The middle 2 bytes of the button bits over the wire are triggers when over the wire and non-SC buttons in the internal controller state packet
        pState->sTriggerL = (unsigned short)RemapValClamped( ( pData[ 0 ] << 7 ) | pData[ 0 ], 0, STEAMCONTROLLER_TRIGGER_MAX_ANALOG, 0, SDL_MAX_SINT16 );
        pState->sTriggerR = (unsigned short)RemapValClamped( ( pData[ 1 ] << 7 ) | pData[ 1 ], 0, STEAMCONTROLLER_TRIGGER_MAX_ANALOG, 0, SDL_MAX_SINT16 );
        pData += 2;
    }
    if ( ucOptionDataMask & k_EBLEButtonChunk3 )
    {
        uint8_t *pButtonByte = (uint8_t *)&pState->ulButtons;
        pButtonByte[ 5 ] = *pData++;
        pButtonByte[ 6 ] = *pData++;
        pButtonByte[ 7 ] = *pData++;
    }
    if ( ucOptionDataMask & k_EBLELeftJoystickChunk )
    {
        // This doesn't handle any of the special headcrab stuff for raw joystick which is OK for now since that FW doesn't support
        // this protocol yet either
        int nLength = sizeof( pState->sLeftStickX ) + sizeof( pState->sLeftStickY );
        memcpy( &pState->sLeftStickX, pData, nLength );
        pData += nLength;
    }
    if ( ucOptionDataMask & k_EBLELeftTrackpadChunk )
    {
        int nLength = sizeof( pState->sLeftPadX ) + sizeof( pState->sLeftPadY );
        int nPadOffset;
        memcpy( &pState->sLeftPadX, pData, nLength );
        if ( pState->ulButtons & STEAM_LEFTPAD_FINGERDOWN_MASK )
            nPadOffset = 1000;
        else
            nPadOffset = 0;

        RotatePadShort( &pState->sLeftPadX, &pState->sLeftPadY, -flRotationAngle );
        pState->sLeftPadX = clamp( pState->sLeftPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16 );
        pState->sLeftPadY = clamp( pState->sLeftPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16 );
        pData += nLength;
    }
    if ( ucOptionDataMask & k_EBLERightTrackpadChunk )
    {
        int nLength = sizeof( pState->sRightPadX ) + sizeof( pState->sRightPadY );
        int nPadOffset = 0;

        memcpy( &pState->sRightPadX, pData, nLength );

        if ( pState->ulButtons & STEAM_RIGHTPAD_FINGERDOWN_MASK )
            nPadOffset = 1000;
        else
            nPadOffset = 0;

        RotatePadShort( &pState->sRightPadX, &pState->sRightPadY, flRotationAngle );
        pState->sRightPadX = clamp( pState->sRightPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16 );
        pState->sRightPadY = clamp( pState->sRightPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16 );
        pData += nLength;
    }
    if ( ucOptionDataMask & k_EBLEIMUAccelChunk )
    {
        int nLength = sizeof( pState->sAccelX ) + sizeof( pState->sAccelY ) + sizeof( pState->sAccelZ );
        memcpy( &pState->sAccelX, pData, nLength );
        pData += nLength;
    }
    if ( ucOptionDataMask & k_EBLEIMUGyroChunk )
    {
        int nLength = sizeof( pState->sAccelX ) + sizeof( pState->sAccelY ) + sizeof( pState->sAccelZ );
        memcpy( &pState->sGyroX, pData, nLength );
        pData += nLength;
    }
    if ( ucOptionDataMask & k_EBLEIMUQuatChunk )
    {
        int nLength = sizeof( pState->sGyroQuatW ) + sizeof( pState->sGyroQuatX ) + sizeof( pState->sGyroQuatY ) + sizeof( pState->sGyroQuatZ );
        memcpy( &pState->sGyroQuatW, pData, nLength );
        pData += nLength;
    }
    return true;
}


//---------------------------------------------------------------------------
// Update Steam Controller state from a data packet, returns true if it parsed data
//---------------------------------------------------------------------------
static bool UpdateSteamControllerState( const uint8_t *pData, int nDataSize, SteamControllerStateInternal_t *pState )
{
    ValveInReport_t *pInReport = (ValveInReport_t*)pData;

    if ( pInReport->header.unReportVersion != k_ValveInReportMsgVersion )
    {
        if ( ( pData[ 0 ] & 0x0F ) == k_EBLEReportState )
        {
            return UpdateBLESteamControllerState( pData, nDataSize, pState );
        }
        return false;
    }

    if ( ( pInReport->header.ucType != ID_CONTROLLER_STATE ) &&
         ( pInReport->header.ucType != ID_CONTROLLER_BLE_STATE ) )
    {
        return false;
    }

    if ( pInReport->header.ucType == ID_CONTROLLER_STATE )
    {
        ValveControllerStatePacket_t *pStatePacket = &pInReport->payload.controllerState;

        // No new data to process; indicate that we received a state packet, but otherwise do nothing.
        if ( pState->unPacketNum == pStatePacket->unPacketNum )
            return true;

        FormatStatePacketUntilGyro( pState, pStatePacket );

        pState->sAccelX = pStatePacket->sAccelX;
        pState->sAccelY = pStatePacket->sAccelY;
        pState->sAccelZ = pStatePacket->sAccelZ;

        pState->sGyroQuatW = pStatePacket->sGyroQuatW;
        pState->sGyroQuatX = pStatePacket->sGyroQuatX;
        pState->sGyroQuatY = pStatePacket->sGyroQuatY;
        pState->sGyroQuatZ = pStatePacket->sGyroQuatZ;

        pState->sGyroX = pStatePacket->sGyroX;
        pState->sGyroY = pStatePacket->sGyroY;
        pState->sGyroZ = pStatePacket->sGyroZ;

    }
    else if ( pInReport->header.ucType == ID_CONTROLLER_BLE_STATE )
    {
        ValveControllerBLEStatePacket_t *pBLEStatePacket = &pInReport->payload.controllerBLEState;
        ValveControllerStatePacket_t *pStatePacket = &pInReport->payload.controllerState;

        // No new data to process; indicate that we received a state packet, but otherwise do nothing.
        if ( pState->unPacketNum == pStatePacket->unPacketNum )
            return true;

        FormatStatePacketUntilGyro( pState, pStatePacket );

        switch ( pBLEStatePacket->ucGyroDataType )
        {
        case 1:
            pState->sGyroQuatW = (( float ) pBLEStatePacket->sGyro[0]);
            pState->sGyroQuatX = (( float ) pBLEStatePacket->sGyro[1]);
            pState->sGyroQuatY = (( float ) pBLEStatePacket->sGyro[2]);
            pState->sGyroQuatZ = (( float ) pBLEStatePacket->sGyro[3]);
            break;

        case 2:
            pState->sAccelX = pBLEStatePacket->sGyro[0];
            pState->sAccelY = pBLEStatePacket->sGyro[1];
            pState->sAccelZ = pBLEStatePacket->sGyro[2];
            break;

        case 3:
            pState->sGyroX = pBLEStatePacket->sGyro[0];
            pState->sGyroY = pBLEStatePacket->sGyro[1];
            pState->sGyroZ = pBLEStatePacket->sGyro[2];
            break;

        default:
            break;
        }
    }

    return true;
}

/*****************************************************************************************************/

typedef struct {
    SteamControllerPacketAssembler m_assembler;
    SteamControllerStateInternal_t m_state;
    SteamControllerStateInternal_t m_last_state;
} SDL_DriverSteam_Context;


static SDL_bool
HIDAPI_DriverSteam_IsSupportedDevice(const char *name, SDL_GameControllerType type, Uint16 vendor_id, Uint16 product_id, Uint16 version, int interface_number, int interface_class, int interface_subclass, int interface_protocol)
{
    return SDL_IsJoystickSteamController(vendor_id, product_id);
}

static const char *
HIDAPI_DriverSteam_GetDeviceName(Uint16 vendor_id, Uint16 product_id)
{
    return "Steam Controller";
}

static SDL_bool
HIDAPI_DriverSteam_InitDevice(SDL_HIDAPI_Device *device)
{
    return HIDAPI_JoystickConnected(device, NULL);
}

static int
HIDAPI_DriverSteam_GetDevicePlayerIndex(SDL_HIDAPI_Device *device, SDL_JoystickID instance_id)
{
    return -1;
}

static void
HIDAPI_DriverSteam_SetDevicePlayerIndex(SDL_HIDAPI_Device *device, SDL_JoystickID instance_id, int player_index)
{
}

static SDL_bool
HIDAPI_DriverSteam_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick)
{
    SDL_DriverSteam_Context *ctx;

    ctx = (SDL_DriverSteam_Context *)SDL_calloc(1, sizeof(*ctx));
    if (!ctx) {
        SDL_OutOfMemory();
        goto error;
    }
    device->context = ctx;

    device->dev = hid_open_path(device->path, 0);
    if (!device->dev) {
        SDL_SetError("Couldn't open %s", device->path);
        goto error;
    }

    if (!ResetSteamController(device->dev, false)) {
        goto error;
    }

    InitializeSteamControllerPacketAssembler(&ctx->m_assembler);

    /* Initialize the joystick capabilities */
    joystick->nbuttons = 17;
    joystick->naxes = SDL_CONTROLLER_AXIS_MAX;

    return SDL_TRUE;

error:
    SDL_LockMutex(device->dev_lock);
    {
        if (device->dev) {
            hid_close(device->dev);
            device->dev = NULL;
        }
        if (device->context) {
            SDL_free(device->context);
            device->context = NULL;
        }
    }
    SDL_UnlockMutex(device->dev_lock);
    return SDL_FALSE;
}

static int
HIDAPI_DriverSteam_RumbleJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
{
    /* You should use the full Steam Input API for rumble support */
    return SDL_Unsupported();
}

static int
HIDAPI_DriverSteam_RumbleJoystickTriggers(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble)
{
    return SDL_Unsupported();
}

static SDL_bool
HIDAPI_DriverSteam_HasJoystickLED(SDL_HIDAPI_Device *device, SDL_Joystick *joystick)
{
    /* You should use the full Steam Input API for LED support */
    return SDL_FALSE;
}

static int
HIDAPI_DriverSteam_SetJoystickLED(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue)
{
    /* You should use the full Steam Input API for LED support */
    return SDL_Unsupported();
}

static int
HIDAPI_DriverSteam_SetSensorsEnabled(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, SDL_bool enabled)
{
    /* You should use the full Steam Input API for sensor support */
    return SDL_Unsupported();
}

static SDL_bool
HIDAPI_DriverSteam_UpdateDevice(SDL_HIDAPI_Device *device)
{
    SDL_DriverSteam_Context *ctx = (SDL_DriverSteam_Context *)device->context;
    SDL_Joystick *joystick = NULL;

    if (device->num_joysticks > 0) {
        joystick = SDL_JoystickFromInstanceID(device->joysticks[0]);
    }
    if (!joystick) {
        return SDL_FALSE;
    }

    for (;;)
    {
        uint8_t data[128];
        int r, nPacketLength;
        const Uint8 *pPacket;

        r = ReadSteamController(device->dev, data, sizeof(data));
        if (r == 0)
        {
            break;
        }

        nPacketLength = 0;
        if (r > 0) {
            nPacketLength = WriteSegmentToSteamControllerPacketAssembler(&ctx->m_assembler, data, r);
        }

        pPacket = ctx->m_assembler.uBuffer;

        if (nPacketLength > 0 && UpdateSteamControllerState(pPacket, nPacketLength, &ctx->m_state)) {
            if (ctx->m_state.ulButtons != ctx->m_last_state.ulButtons) {
                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_A,
                    (ctx->m_state.ulButtons & STEAM_BUTTON_3_MASK) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_B,
                    (ctx->m_state.ulButtons & STEAM_BUTTON_1_MASK) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_X,
                    (ctx->m_state.ulButtons & STEAM_BUTTON_2_MASK) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_Y,
                    (ctx->m_state.ulButtons & STEAM_BUTTON_0_MASK) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
                    (ctx->m_state.ulButtons & STEAM_LEFT_BUMPER_MASK) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
                    (ctx->m_state.ulButtons & STEAM_RIGHT_BUMPER_MASK) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_BACK,
                    (ctx->m_state.ulButtons & STEAM_BUTTON_MENU_MASK) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_START,
                    (ctx->m_state.ulButtons & STEAM_BUTTON_ESCAPE_MASK) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_GUIDE,
                    (ctx->m_state.ulButtons & STEAM_BUTTON_STEAM_MASK) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_LEFTSTICK,
                    (ctx->m_state.ulButtons & STEAM_JOYSTICK_BUTTON_MASK) ? SDL_PRESSED : SDL_RELEASED);
                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1 + 0,
                    (ctx->m_state.ulButtons & STEAM_BUTTON_BACK_LEFT_MASK) ? SDL_PRESSED : SDL_RELEASED);
                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1 + 1,
                    (ctx->m_state.ulButtons & STEAM_BUTTON_BACK_RIGHT_MASK) ? SDL_PRESSED : SDL_RELEASED);
            }
            {
                /* Minimum distance from center of pad to register a direction */
                const int kPadDeadZone = 10000;

                /* Pad coordinates are like math grid coordinates: negative is bottom left */
                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_UP,
                    (ctx->m_state.sLeftPadY > kPadDeadZone) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_DOWN,
                    (ctx->m_state.sLeftPadY < -kPadDeadZone) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_LEFT,
                    (ctx->m_state.sLeftPadX < -kPadDeadZone) ? SDL_PRESSED : SDL_RELEASED);

                SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
                    (ctx->m_state.sLeftPadX > kPadDeadZone) ? SDL_PRESSED : SDL_RELEASED);
            }

            SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERLEFT, (int)ctx->m_state.sTriggerL * 2 - 32768);
            SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, (int)ctx->m_state.sTriggerR * 2 - 32768);

            SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_LEFTX, ctx->m_state.sLeftStickX);
            SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_LEFTY, ~ctx->m_state.sLeftStickY);
            SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_RIGHTX, ctx->m_state.sRightPadX);
            SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_RIGHTY, ~ctx->m_state.sRightPadY);

            ctx->m_last_state = ctx->m_state;
        }

        if (r <= 0) {
            /* Failed to read from controller */
            HIDAPI_JoystickDisconnected(device, device->joysticks[0]);
            return SDL_FALSE;
        }
    }
    return SDL_TRUE;
}

static void
HIDAPI_DriverSteam_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick)
{
    SDL_LockMutex(device->dev_lock);
    {
        CloseSteamController(device->dev);

        hid_close(device->dev);
        device->dev = NULL;

        SDL_free(device->context);
        device->context = NULL;
    }
    SDL_UnlockMutex(device->dev_lock);
}

static void
HIDAPI_DriverSteam_FreeDevice(SDL_HIDAPI_Device *device)
{
}

SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverSteam =
{
    SDL_HINT_JOYSTICK_HIDAPI_STEAM,
    SDL_TRUE,
    HIDAPI_DriverSteam_IsSupportedDevice,
    HIDAPI_DriverSteam_GetDeviceName,
    HIDAPI_DriverSteam_InitDevice,
    HIDAPI_DriverSteam_GetDevicePlayerIndex,
    HIDAPI_DriverSteam_SetDevicePlayerIndex,
    HIDAPI_DriverSteam_UpdateDevice,
    HIDAPI_DriverSteam_OpenJoystick,
    HIDAPI_DriverSteam_RumbleJoystick,
    HIDAPI_DriverSteam_RumbleJoystickTriggers,
    HIDAPI_DriverSteam_HasJoystickLED,
    HIDAPI_DriverSteam_SetJoystickLED,
    HIDAPI_DriverSteam_SetSensorsEnabled,
    HIDAPI_DriverSteam_CloseJoystick,
    HIDAPI_DriverSteam_FreeDevice,
};

#endif /* SDL_JOYSTICK_HIDAPI_STEAM */

#endif /* SDL_JOYSTICK_HIDAPI */

/* vi: set ts=4 sw=4 expandtab: */
