#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 settingNum;
unsigned short settingValue;
} ControllerSetting;
typedef struct
{
unsigned char attributeTag;
uint32_t attributeValue;
} ControllerAttribute;
typedef struct
{
ControllerSetting settings[ ( HID_FEATURE_REPORT_BYTES - sizeof( FeatureReportHeader ) ) / sizeof( ControllerSetting ) ];
} MsgSetSettingsValues, MsgGetSettingsValues, MsgGetSettingsDefaults, MsgGetSettingsMaxs;
typedef struct
{
ControllerAttribute attributes[ ( HID_FEATURE_REPORT_BYTES - sizeof( FeatureReportHeader ) ) / sizeof( ControllerAttribute ) ];
} MsgGetAttributes;
typedef struct
{
unsigned char attributeTag;
char attributeValue[20];
} MsgGetStringAttribute;
typedef struct
{
unsigned char mode;
} MsgSetControllerMode;
typedef struct {
unsigned char which_pad;
unsigned short pulse_duration;
unsigned short pulse_interval;
unsigned short pulse_count;
short dBgain;
unsigned char priority;
} MsgFireHapticPulse;
typedef struct {
uint8_t mode;
} MsgHapticSetMode;
typedef enum {
HAPTIC_TYPE_OFF,
HAPTIC_TYPE_TICK,
HAPTIC_TYPE_CLICK,
HAPTIC_TYPE_TONE,
HAPTIC_TYPE_RUMBLE,
HAPTIC_TYPE_NOISE,
HAPTIC_TYPE_SCRIPT,
HAPTIC_TYPE_LOG_SWEEP,
} haptic_type_t;
typedef enum {
HAPTIC_INTENSITY_SYSTEM,
HAPTIC_INTENSITY_SHORT,
HAPTIC_INTENSITY_MEDIUM,
HAPTIC_INTENSITY_LONG,
HAPTIC_INTENSITY_INSANE,
} haptic_intensity_t;
typedef struct {
uint8_t side; uint8_t cmd; uint8_t ui_intensity; int8_t dBgain; uint16_t freq; int16_t dur_ms;
uint16_t noise_intensity;
uint16_t lfo_freq; uint8_t lfo_depth; uint8_t rand_tone_gain; uint8_t script_id;
uint16_t lss_start_freq; uint16_t lss_end_freq; } MsgTriggerHaptic;
typedef struct {
uint8_t unRumbleType;
uint16_t unIntensity;
uint16_t unLeftMotorSpeed;
uint16_t unRightMotorSpeed;
int8_t nLeftGain;
int8_t nRightGain;
} MsgSimpleRumbleCmd;
typedef struct
{
FeatureReportHeader header;
union
{
MsgSetSettingsValues setSettingsValues;
MsgGetSettingsValues getSettingsValues;
MsgGetSettingsMaxs getSettingsMaxs;
MsgGetSettingsDefaults getSettingsDefaults;
MsgGetAttributes getAttributes;
MsgSetControllerMode controllerMode;
MsgFireHapticPulse fireHapticPulse;
MsgGetStringAttribute getStringAttribute;
MsgHapticSetMode hapticMode;
MsgTriggerHaptic triggerHaptic;
MsgSimpleRumbleCmd simpleRumble;
} payload;
} FeatureReportMsg;
typedef struct
{
uint8_t type;
uint16_t intensity;
struct
{
uint16_t speed;
int8_t gain;
} left, right;
} MsgHapticRumble;
#define HID_RUMBLE_OUTPUT_REPORT_BYTES 10
typedef struct
{
uint8_t side;
uint16_t on_us;
uint16_t off_us;
uint16_t repeat_count;
uint16_t gain_db;
} MsgHapticPulse;
#define HID_HAPTIC_PULSE_OUTPUT_REPORT_BYTES 10
typedef struct
{
uint8_t side;
uint8_t command;
int8_t gain_db;
} MsgHapticCommand;
#define HID_HAPTIC_COMMAND_REPORT_BYTES 4
typedef struct
{
uint8_t side;
int8_t gain_db;
uint16_t frequency;
uint16_t duration_ms;
uint16_t lfo_freq;
uint8_t lfo_depth;
} MsgHapticLfoTone;
#define HID_HAPTIC_LFO_TONE_REPORT_BYTES 10
typedef struct
{
uint8_t side;
int8_t gain_db;
uint16_t duration_ms;
struct
{
uint16_t frequency;
} start, end;
} MsgHapticLogSweep;
#define HID_HAPTIC_LOG_SWEEP_REPORT_BYTES 9
typedef struct m
{
uint8_t side;
uint8_t script_id;
int8_t gain_db;
} MsgHapticScript;
#define HID_HAPTIC_SCRIPT_REPORT_BYTES 4
typedef enum
{
ID_OUT_REPORT_HAPTIC_RUMBLE = 0x80,
ID_OUT_REPORT_HAPTIC_PULSE = 0x81,
ID_OUT_REPORT_HAPTIC_COMMAND = 0x82,
ID_OUT_REPORT_HAPTIC_LFO_TONE = 0x83,
ID_OUT_REPORT_HAPTIC_LOG_SWEEP = 0x85,
ID_OUT_REPORT_HAPTIC_SCRIPT = 0x86,
} ValveTritonOutReportMessageIDs;
typedef struct
{
uint8_t report_id;
union
{
MsgHapticRumble hapticRumble;
MsgHapticPulse hapticPulse;
MsgHapticCommand hapticCommand;
MsgHapticLfoTone hapticLfoTone;
MsgHapticLogSweep hapticLogSweep;
MsgHapticScript hapticScript;
} payload;
} OutputReportMsg;
#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_DECK_STATE = 9,
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
{
Uint32 unPacketNum;
union
{
Uint64 ulButtons;
struct
{
Uint32 ulButtonsL;
Uint32 ulButtonsH;
};
};
short sLeftPadX;
short sLeftPadY;
short sRightPadX;
short sRightPadY;
short sAccelX;
short sAccelY;
short sAccelZ;
short sGyroX;
short sGyroY;
short sGyroZ;
short sGyroQuatW;
short sGyroQuatX;
short sGyroQuatY;
short sGyroQuatZ;
unsigned short sTriggerRawL;
unsigned short sTriggerRawR;
short sLeftStickX;
short sLeftStickY;
short sRightStickX;
short sRightStickY;
unsigned short sPressurePadLeft;
unsigned short sPressurePadRight;
} SteamDeckStatePacket_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;
SteamDeckStatePacket_t deckState;
} 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,
};
enum ETritonReportIDTypes
{
ID_TRITON_CONTROLLER_STATE = 0x42,
ID_TRITON_BATTERY_STATUS = 0x43,
ID_TRITON_CONTROLLER_STATE_BLE = 0x45,
ID_TRITON_WIRELESS_STATUS_X = 0x46,
ID_TRITON_WIRELESS_STATUS = 0x79,
};
enum ETritonWirelessState
{
k_ETritonWirelessStateDisconnect = 1,
k_ETritonWirelessStateConnect = 2,
};
typedef struct
{
uint32_t uTimestamp;
short sAccelX;
short sAccelY;
short sAccelZ;
short sGyroX;
short sGyroY;
short sGyroZ;
short sGyroQuatW;
short sGyroQuatX;
short sGyroQuatY;
short sGyroQuatZ;
} TritonMTUIMU_t;
typedef struct
{
uint8_t cSeq_num;
uint32_t uButtons;
short sTriggerLeft;
short sTriggerRight;
short sLeftStickX;
short sLeftStickY;
short sRightStickX;
short sRightStickY;
short sLeftPadX;
short sLeftPadY;
unsigned short ucPressureLeft;
short sRightPadX;
short sRightPadY;
unsigned short ucPressureRight;
TritonMTUIMU_t imu;
} TritonMTUFull_t;
enum EChargeState
{
k_EChargeStateReset,
k_EChargeStateDischarging,
k_EChargeStateCharging,
k_EChargeStateSrcValidate,
k_EChargeStateChargingDone,
};
typedef struct
{
unsigned char ucChargeState; unsigned char ucBatteryLevel;
unsigned short sBatteryVoltage;
unsigned short sSystemVoltage;
unsigned short sInputVoltage;
unsigned short sCurrent;
unsigned short sInputCurrent;
unsigned short sTemperature;
} TritonBatteryStatus_t;
typedef struct
{
unsigned char state;
} TritonWirelessStatus_t;
#pragma pack()
#endif