#ifndef _CONTROLLER_STRUCTS_
#define _CONTROLLER_STRUCTS_
#pragma pack(1)
#define HID_FEATURE_REPORT_BYTES 64
typedef struct
{
unsigned char type;
unsigned char length;
} FeatureReportHeader;
typedef struct
{
unsigned char attributeTag;
uint32_t attributeValue;
} ControllerAttribute;
typedef struct
{
ControllerAttribute attributes[ ( HID_FEATURE_REPORT_BYTES - sizeof( FeatureReportHeader ) ) / sizeof( ControllerAttribute ) ];
} MsgGetAttributes;
typedef struct
{
FeatureReportHeader header;
union
{
MsgGetAttributes getAttributes;
} payload;
} FeatureReportMsg;
#define k_ValveInReportMsgVersion 0x01
typedef enum
{
ID_CONTROLLER_STATE = 1,
ID_CONTROLLER_DEBUG = 2,
ID_CONTROLLER_WIRELESS = 3,
ID_CONTROLLER_STATUS = 4,
ID_CONTROLLER_DEBUG2 = 5,
ID_CONTROLLER_SECONDARY_STATE = 6,
ID_CONTROLLER_BLE_STATE = 7,
ID_CONTROLLER_MSG_COUNT
} ValveInReportMessageIDs;
typedef struct
{
unsigned short unReportVersion;
unsigned char ucType;
unsigned char ucLength;
} ValveInReportHeader_t;
typedef struct
{
uint32 unPacketNum;
union
{
uint64 ulButtons;
struct
{
unsigned char _pad0[3];
unsigned char nLeft;
unsigned char nRight;
unsigned char _pad1[3];
} Triggers;
} ButtonTriggerData;
short sLeftPadX;
short sLeftPadY;
short sRightPadX;
short sRightPadY;
unsigned short sTriggerL;
unsigned short sTriggerR;
short sAccelX;
short sAccelY;
short sAccelZ;
short sGyroX;
short sGyroY;
short sGyroZ;
short sGyroQuatW;
short sGyroQuatX;
short sGyroQuatY;
short sGyroQuatZ;
} ValveControllerStatePacket_t;
typedef struct
{
uint32 unPacketNum;
union
{
uint64 ulButtons;
struct
{
unsigned char _pad0[3];
unsigned char nLeft;
unsigned char nRight;
unsigned char _pad1[3];
} Triggers;
} ButtonTriggerData;
short sLeftPadX;
short sLeftPadY;
short sRightPadX;
short sRightPadY;
unsigned char ucGyroDataType; short sGyro[4];
} ValveControllerBLEStatePacket_t;
typedef struct
{
short sLeftPadX;
short sLeftPadY;
short sRightPadX;
short sRightPadY;
short sLeftPadMouseDX;
short sLeftPadMouseDY;
short sRightPadMouseDX;
short sRightPadMouseDY;
short sLeftPadMouseFilteredDX;
short sLeftPadMouseFilteredDY;
short sRightPadMouseFilteredDX;
short sRightPadMouseFilteredDY;
unsigned char ucLeftZ;
unsigned char ucRightZ;
unsigned char ucLeftFingerPresent;
unsigned char ucRightFingerPresent;
unsigned char ucLeftTimestamp;
unsigned char ucRightTimestamp;
unsigned char ucLeftTapState;
unsigned char ucRightTapState;
unsigned int unDigitalIOStates0;
unsigned int unDigitalIOStates1;
} ValveControllerDebugPacket_t;
typedef struct
{
unsigned char ucPadNum;
unsigned char ucPad[3]; short Data[20];
unsigned short unNoise;
} ValveControllerTrackpadImage_t;
typedef struct
{
unsigned char ucPadNum;
unsigned char ucOffset;
unsigned char ucPad[2]; short rgData[28];
} ValveControllerRawTrackpadImage_t;
typedef struct
{
unsigned char ucEventType;
} SteamControllerWirelessEvent_t;
typedef struct
{
unsigned int unPacketNum;
unsigned short sEventCode;
unsigned short unStateFlags;
unsigned short sBatteryVoltage;
unsigned char ucBatteryLevel;
} SteamControllerStatusEvent_t;
typedef struct
{
ValveInReportHeader_t header;
union
{
ValveControllerStatePacket_t controllerState;
ValveControllerBLEStatePacket_t controllerBLEState;
ValveControllerDebugPacket_t debugState;
ValveControllerTrackpadImage_t padImage;
ValveControllerRawTrackpadImage_t rawPadImage;
SteamControllerWirelessEvent_t wirelessEvent;
SteamControllerStatusEvent_t statusEvent;
} payload;
} ValveInReport_t;
enum EBLEPacketReportNums
{
k_EBLEReportState = 4,
k_EBLEReportStatus = 5,
};
enum EBLEOptionDataChunksBitmask
{
k_EBLEButtonChunk1 = 0x10,
k_EBLEButtonChunk2 = 0x20,
k_EBLEButtonChunk3 = 0x40,
k_EBLELeftJoystickChunk = 0x80,
k_EBLELeftTrackpadChunk = 0x100,
k_EBLERightTrackpadChunk = 0x200,
k_EBLEIMUAccelChunk = 0x400,
k_EBLEIMUGyroChunk = 0x800,
k_EBLEIMUQuatChunk = 0x1000,
};
#pragma pack()
#endif