25#define NS_TO_IMU_TICKS(ns) (((uint64_t)(ns) * 3) / 1000)
26#define IMU_TICKS_TO_NS(ticks) (((uint64_t)(ticks) * 1000) / 3)
29#define PCM_SAMPLE_RATE 3000
30#define PCM_HAPTIC_BUF_SIZE 32
32const uint8_t INPUT_REPORT_ID = 0x31;
33const uint8_t OUTPUT_REPORT_ID = 0x31;
34const uint8_t OUTPUT_REPORT_TAG = 0x10;
35const uint8_t CALIBRATION_DATA_FEATURE_REPORT_ID = 0x05;
37#define CALIBRATION_DATA_PART_ID_1 0
38#define CALIBRATION_DATA_PART_ID_2 0x81
40const uint8_t INPUT_REPORT_CRC32_SEED = 0xa1;
41const uint8_t OUTPUT_REPORT_CRC32_SEED = 0xa2;
42const uint8_t FEATURE_REPORT_CRC32_SEED = 0xa3;
49const uint8_t CHARGE_STATE_DISCHARGING = 0x00;
50const uint8_t CHARGE_STATE_CHARGING = 0x01;
51const uint8_t CHARGE_STATE_FULL = 0x02;
52const uint8_t CHARGE_STATE_ABNORMAL_VOLTAGE = 0x0A;
53const uint8_t CHARGE_STATE_ABNORMAL_TEMP = 0x0B;
54const uint8_t CHARGE_STATE_CHARGING_ERROR = 0x0F;
56#define INPUT_REPORT_LENGTH 78
66 uint8_t trigger_value;
67 uint8_t trigger_proximity;
68 uint8_t squeeze_proximity;
78 uint8_t trigger_feedback_state;
79 uint8_t trigger_feedback_mode;
80 uint8_t battery_state;
82 __le32 host_timestamp;
83 __le32 device_timestamp_ticks;
87 uint8_t crc_failure_count;
91static_assert(
sizeof(
struct pssense_input_report) == INPUT_REPORT_LENGTH,
"Incorrect input report struct length");
93#define PS5_OUTPUT_REPORT_LENGTH 78
95enum pssense_output_settings_flag1
97 PSSENSE_OUTPUT_SETTINGS_FLAG1_UNK0 = 1 << 0,
98 PSSENSE_OUTPUT_SETTINGS_FLAG1_RUMBLE_EMULATION = 1 << 1,
99 PSSENSE_OUTPUT_SETTINGS_FLAG1_ADAPTIVE_TRIGGER_ENABLE = 1 << 2,
100 PSSENSE_OUTPUT_SETTINGS_FLAG1_INTENSITY_INCREASE_SET_ENABLE = 1 << 3,
101 PSSENSE_OUTPUT_SETTINGS_FLAG1_INTENSITY_REDUCTION_SET_ENABLE = 1 << 4,
102 PSSENSE_OUTPUT_SETTINGS_FLAG1_UNK5 = 1 << 5,
103 PSSENSE_OUTPUT_SETTINGS_FLAG1_UNK6 = 1 << 6,
104 PSSENSE_OUTPUT_SETTINGS_FLAG1_UNK7 = 1 << 7,
107#define OUTPUT_SETTINGS_ENABLE_VIBRATION_BITS \
108 (PSSENSE_OUTPUT_SETTINGS_FLAG1_UNK0 | PSSENSE_OUTPUT_SETTINGS_FLAG1_RUMBLE_EMULATION)
110#define OUTPUT_SETTINGS_VIBRATE_MODE_HIGH_120HZ 0x00
112#define OUTPUT_SETTINGS_VIBRATE_MODE_LOW_60HZ (PSSENSE_OUTPUT_SETTINGS_FLAG1_UNK5)
114#define OUTPUT_SETTINGS_VIBRATE_MODE_CLASSIC_RUMBLE (PSSENSE_OUTPUT_SETTINGS_FLAG1_UNK6)
116#define OUTPUT_SETTINGS_VIBRATE_MODE_DIET_RUMBLE \
117 (PSSENSE_OUTPUT_SETTINGS_FLAG1_UNK5 | PSSENSE_OUTPUT_SETTINGS_FLAG1_UNK6)
121 PSSENSE_OUTPUT_SETTINGS_FLAG2_UNK0 = 1 << 0,
122 PSSENSE_OUTPUT_SETTINGS_FLAG2_UNK1 = 1 << 1,
125 PSSENSE_OUTPUT_SETTINGS_FLAG2_UNK3 = 1 << 3,
126 PSSENSE_OUTPUT_SETTINGS_FLAG2_UNK4 = 1 << 4,
127 PSSENSE_OUTPUT_SETTINGS_FLAG2_UNK5 = 1 << 5,
128 PSSENSE_OUTPUT_SETTINGS_FLAG2_UNK6 = 1 << 6,
129 PSSENSE_OUTPUT_SETTINGS_FLAG2_UNK7 = 1 << 7,
132enum pssense_adaptive_trigger_mode
134 TRIGGER_FEEDBACK_MODE_OFF = 0x05,
137 TRIGGER_FEEDBACK_MODE_SIMPLE_FEEDBACK = 0x01,
138 TRIGGER_FEEDBACK_MODE_SIMPLE_WEAPON = 0x02,
139 TRIGGER_FEEDBACK_MODE_SIMPLE_VIBRATION = 0x06,
142 TRIGGER_FEEDBACK_MODE_LIMITED_FEEDBACK = 0x11,
143 TRIGGER_FEEDBACK_MODE_LIMITED_WEAPON = 0x12,
146 TRIGGER_FEEDBACK_MODE_FEEDBACK = 0x21,
147 TRIGGER_FEEDBACK_MODE_SLOPE_FEEDBACK = 0x22,
148 TRIGGER_FEEDBACK_MODE_WEAPON = 0x25,
149 TRIGGER_FEEDBACK_MODE_VIBRATION = 0x26,
152 TRIGGER_FEEDBACK_MODE_GALLOPING = 0x23,
153 TRIGGER_FEEDBACK_MODE_MACHINE = 0x27,
160 uint8_t raw_parameters[10];
164enum pssense_led_sync_phase
167 LED_SYNC_PHASE_INIT = 0,
169 LED_SYNC_PHASE_PRESCAN = 1,
171 LED_SYNC_PHASE_BROAD = 2,
173 LED_SYNC_PHASE_BG = 3,
175 LED_SYNC_PHASE_STABLE = 4,
177 LED_SYNC_PHASE_LED_ALL_OFF = 5,
179 LED_SYNC_PHASE_LED_ALL_ON = 6,
181 LED_SYNC_PHASE_DEBUG = 7,
187 uint8_t sequence_number;
193 uint8_t led_blink[4];
233 uint8_t haptics[PCM_HAPTIC_BUF_SIZE];
237 "Incorrect output report struct length");
239#define FEATURE_REPORT_LENGTH 64
240#define CALIBRATION_DATA_LENGTH 116
249 uint8_t data[CALIBRATION_DATA_LENGTH / 2];
252static_assert(
sizeof(
struct pssense_feature_report) == FEATURE_REPORT_LENGTH,
"Incorrect feature report struct length");
#define MATH_GRAVITY_M_S2
Standard gravity acceleration constant.
Definition m_api.h:53
C interface to math library.
pssense_output_settings_flag2
Definition pssense_protocol.h:120
@ PSSENSE_OUTPUT_SETTINGS_FLAG2_STATUS_LED_SET_ENABLE
Used to mark whether to read the status LED enable bool or not.
Definition pssense_protocol.h:124
const double PSSENSE_ACCEL_SCALE
Accelerometer read value range is +-32768 and covers +-8 g.
Definition pssense_protocol.h:47
const double PSSENSE_GYRO_SCALE_DEG
Gyro read value range is +-32768.
Definition pssense_protocol.h:45
HID output report data packet.
Definition pssense_protocol.h:246
Definition pssense_protocol.h:185
__le32 cycle_position
The position, in IMU ticks, NS_PER_IMU_TICK.
Definition pssense_protocol.h:190
__le32 cycle_length
The length, in thirds of a nanosecond.
Definition pssense_protocol.h:192
Definition pssense_protocol.h:157
Definition pssense_protocol.h:197
uint8_t flag2
See enum pssense_output_settings_flag2.
Definition pssense_protocol.h:201
struct pssense_led_settings led_settings
Settings of the tracking LEDs.
Definition pssense_protocol.h:211
__le32 host_timestamp_send_time_us
Time of packet send, in host time, in microseconds.
Definition pssense_protocol.h:209
uint8_t status_led_enable
Whether to enable the status LED or not.
Definition pssense_protocol.h:215
uint8_t vibration_amplitude
Vibration amplitude from 0x00-0xff. Sending 0 turns vibration off.
Definition pssense_protocol.h:203
uint8_t flag1
See enum pssense_output_settings_flag1.
Definition pssense_protocol.h:199
struct pssense_output_adaptive_trigger_settings trigger_settings
Settings for the adaptive trigger.
Definition pssense_protocol.h:207
uint8_t trigger_haptics_reduction
Lower 4 bits for haptics reduction, upper 4 bits for trigger reduction. Decreases in 12....
Definition pssense_protocol.h:213
uint8_t unk0
Sony driver sometimes sets to 0x82.
Definition pssense_protocol.h:205
HID output report data packet matching the PS5 layout, with PCM haptics.
Definition pssense_protocol.h:227
Endian-specific byte order defines.