OpenSourceSimWheelESP32
Open-source wireless steering wheel/button box for ESP32 boards
Loading...
Searching...
No Matches
HID_definitions.hpp
Go to the documentation of this file.
1
14#pragma once
15
16//-------------------------------------------------------------------
17// Imports
18//-------------------------------------------------------------------
19
20#include <cinttypes>
21
22//-------------------------------------------------------------------
23// Report ID's
24//-------------------------------------------------------------------
25
27#define RID_INPUT_GAMEPAD 0x01
29#define RID_FEATURE_CAPABILITIES 0x02
31#define RID_FEATURE_CONFIG 0x03
33#define RID_FEATURE_BUTTONS_MAP 0x04
35#define RID_FEATURE_HARDWARE_ID 0x05
36
38#define RID_OUTPUT_POWERTRAIN 0x14 // 20 dec
40#define RID_OUTPUT_ECU 0x15 // 21 dec
42#define RID_OUTPUT_RACE_CONTROL 0x16 // 22 dec
44#define RID_OUTPUT_GAUGES 0x17 // 23 dec
46#define RID_OUTPUT_WHEELS 0x18 // 24 dec
48#define RID_OUTPUT_PIXEL 0x1E // 30 dec
49
50//-------------------------------------------------------------------
51// Report sizes (bytes)
52//-------------------------------------------------------------------
53
55#define GAMEPAD_REPORT_SIZE 20
57#define CAPABILITIES_REPORT_SIZE 20
59#define CONFIG_REPORT_SIZE 7
61#define BUTTONS_MAP_REPORT_SIZE 3
63#define HARDWARE_ID_REPORT_SIZE 6
65#define POWERTRAIN_REPORT_SIZE 10
67#define ECU_REPORT_SIZE 9
69#define RACE_CONTROL_REPORT_SIZE 11
71#define GAUGES_REPORT_SIZE 12
73#define WHEELS_REPORT_SIZE 28
75#define PIXEL_REPORT_SIZE 6
76
77//-------------------------------------------------------------------
78// GAME CONTROLLER APPEARANCES
79//-------------------------------------------------------------------
80
82#define CONTROLLER_TYPE_GAMEPAD 0x05
84#define CONTROLLER_TYPE_JOYSTICK 0x04
85
86//-------------------------------------------------------------------
87// INPUT REPORT constants
88//-------------------------------------------------------------------
89
91#define BUTTON_COUNT 128
92
93//-------------------------------------------------------------------
94// BLE implementation
95//-------------------------------------------------------------------
96
98#define BLE_VENDOR_SOURCE 0x00
100#define BLE_VENDOR_ID 0x1d50
102#define BLE_PRODUCT_ID 0xffff
104#define TEST_HARDWARE_ID 0xffff
106#define BLE_SERIAL_NUMBER_CHR_UUID 0x2A25
108#define BLE_BATTERY_STATUS_CHR_UUID 0x2BED
109
110// See https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/one-minute-to-understand-ble-mtu-data-package
111// BLE_MTU_SIZE must be greater than 23 bytes
112// BLE_MTU_SIZE = max report size + report ID + payload metadata
113
115#define BLE_MTU_SIZE GAMEPAD_REPORT_SIZE + 1 + 14
116
117//-------------------------------------------------------------------
118// Hardware revision
119//-------------------------------------------------------------------
120
122#define PRODUCT_REVISION 0x0100
123
124//-------------------------------------------------------------------
125// Data specification version
126//-------------------------------------------------------------------
127
129#define DATA_MAJOR_VERSION 1
131#define DATA_MINOR_VERSION 7
132
133//-------------------------------------------------------------------
134// Magic number, do not change
135//-------------------------------------------------------------------
136
138#define MAGIC_NUMBER_LOW 0x51
140#define MAGIC_NUMBER_HIGH 0xBF
141
142//-------------------------------------------------------------------
143// HID report descriptor
144//-------------------------------------------------------------------
145
150static const uint8_t hid_descriptor[] = {
151 0x05, 0x01, // UsagePage(Generic Desktop[1])
152 0x09, CONTROLLER_TYPE_GAMEPAD, // UsageId
153 0xA1, 0x01, // Collection(Application)
154
155 // ___ INPUT REPORT ___
156 0x85, RID_INPUT_GAMEPAD, // ReportId
157
158 // Buttons (128 bits=16 bytes)
159 0x05, 0x09, // UsagePage(Button[9])
160 0x19, 0x01, // UsageIdMin(Button 1[1])
161 0x29, 0x80, // UsageIdMax(Button 128[128])
162 0x15, 0x00, // LogicalMinimum(0)
163 0x25, 0x01, // LogicalMaximum(1)
164 0x95, 0x80, // ReportCount(128)
165 0x75, 0x01, // ReportSize(1)
166 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
167
168 // axis (1 byte)
169 0x05, 0x01, // UsagePage(Generic Desktop[1])
170 0x09, 0x35, // UsageId(Rz[53])
171 // 0x15, 0x00, // LogicalMinimum
172 // 0x25, CLUTCH_FULL_VALUE, // LogicalMaximum
173 0x26, 0xFE, 0x00, // LogicalMaximum(254)
174 0x95, 0x01, // ReportCount(1)
175 0x75, 0x08, // ReportSize(8)
176 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
177
178 // axis (1 byte)
179 0x09, 0x34, // UsageId(Ry[52])
180 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
181
182 // axis (1 byte)
183 0x09, 0x33, // UsageId(Rx[51])
184 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
185
186 // D-PAD (hat switch), (4 bits)
187 0x09, 0x39, // UsageId(Hat Switch[57])
188 0x46, 0x40, 0x01, // PhysicalMaximum(320)
189 0x65, 0x14, // Unit('degrees', EnglishRotation, Degrees:1)
190 0x15, 0x01, // LogicalMinimum(1)
191 0x25, 0x08, // LogicalMaximum(8)
192 0x75, 0x04, // ReportSize(4)
193 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
194
195 // Feature notification (4 bits)
196 0x09, 0x47, // UsageId(Feature Notification[71])
197 0x45, 0x00, // PhysicalMaximum(0)
198 0x65, 0x00, // Unit(None)
199 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
200
201 // ___ CAPABILITIES (FEATURE) REPORT ___
202 0x09, 0x00, // USAGE (undefined)
203 0x15, 0x00, // LogicalMinimum(0)
204 0x25, 0xff, // LogicalMaximum(256)
205 0x85, RID_FEATURE_CAPABILITIES, // REPORT ID
206 0x75, 0x08, // Report Size (8)
207 0x95, CAPABILITIES_REPORT_SIZE, // Report count
208 0xb1, 0x23, // FEATURE (Cnst,var,abs,Nprf)
209
210 // ___ CONFIG (FEATURE) REPORT ___
211 0x09, 0x00, // USAGE (undefined)
212 0x85, RID_FEATURE_CONFIG, // REPORT ID
213 0x75, 0x08, // Report Size (8)
214 0x95, CONFIG_REPORT_SIZE, // Report count
215 0xb1, 0xa2, // FEATURE (Data,var,abs,Nprf,Vol)
216
217 // ___ MAP (FEATURE) REPORT ___
218 0x09, 0x00, // USAGE (undefined)
219 0x85, RID_FEATURE_BUTTONS_MAP, // REPORT ID
220 0x75, 0x08, // Report Size (8)
221 0x95, BUTTONS_MAP_REPORT_SIZE, // Report count
222 0xb1, 0xa2, // FEATURE (Data,var,abs,Nprf,Vol)
223
224 // ___ HARDWARE ID (FEATURE) REPORT ___
225 0x09, 0x00, // USAGE (undefined)
226 0x85, RID_FEATURE_HARDWARE_ID, // REPORT ID
227 0x75, 0x08, // Report Size (8)
228 0x95, HARDWARE_ID_REPORT_SIZE, // Report count
229 0xb1, 0xa2, // FEATURE (Data,var,abs,Nprf,Vol)
230
231 // ___ POWERTRAIN TELEMETRY (OUTPUT) REPORT ___
232 0x09, 0x00, // USAGE (undefined)
233 0x85, RID_OUTPUT_POWERTRAIN, // REPORT ID
234 0x75, 0x08, // Report Size (8)
235 0x95, POWERTRAIN_REPORT_SIZE, // Report count
236 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
237
238 // ___ ECU TELEMETRY (OUTPUT) REPORT ___
239 0x09, 0x00, // USAGE (undefined)
240 0x85, RID_OUTPUT_ECU, // REPORT ID
241 0x75, 0x08, // Report Size (8)
242 0x95, ECU_REPORT_SIZE, // Report count
243 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
244
245 // ___ RACE CONTROL TELEMETRY (OUTPUT) REPORT ___
246 0x09, 0x00, // USAGE (undefined)
247 0x85, RID_OUTPUT_RACE_CONTROL, // REPORT ID
248 0x75, 0x08, // Report Size (8)
249 0x95, RACE_CONTROL_REPORT_SIZE, // Report count
250 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
251
252 // ___ GAUGES (OUTPUT) REPORT ___
253 0x09, 0x00, // USAGE (undefined)
254 0x85, RID_OUTPUT_GAUGES, // REPORT ID
255 0x75, 0x08, // Report Size (8)
256 0x95, GAUGES_REPORT_SIZE, // Report count
257 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
258
259 // ___ WHEELS (OUTPUT) REPORT ___
260 0x09, 0x00, // USAGE (undefined)
261 0x85, RID_OUTPUT_WHEELS, // REPORT ID
262 0x75, 0x08, // Report Size (8)
263 0x95, WHEELS_REPORT_SIZE, // Report count
264 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
265
266 // ___ PIXEL CONTROL (OUTPUT) REPORT ___
267 0x09, 0x00, // USAGE (undefined)
268 0x85, RID_OUTPUT_PIXEL, // REPORT ID
269 0x75, 0x08, // Report Size (8)
270 0x95, PIXEL_REPORT_SIZE, // Report count
271 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
272
273 // END APPLICATION
274 0xC0 // EndCollection()
275};
276
277// Input report packed structure:
278// typedef struct {
279// uint64_t inputsLow;
280// uint64_t inputsHigh;
281// uint8_t clutchAxis;
282// uint8_t leftAxis;
283// uint8_t rightAxis;
284// uint8_t POVState: 4;
285// uint8_t notifyConfigChanges: 4;
286// } hidInputReport_t;
#define RID_OUTPUT_GAUGES
Gauges report ID.
#define RACE_CONTROL_REPORT_SIZE
Race control report size.
#define WHEELS_REPORT_SIZE
Wheels report size.
#define RID_FEATURE_CONFIG
Configuration report ID.
#define RID_OUTPUT_WHEELS
Wheels report ID.
#define CONTROLLER_TYPE_GAMEPAD
Gamepad usage constant.
#define RID_OUTPUT_POWERTRAIN
Powertrain telemetry report ID.
#define BUTTONS_MAP_REPORT_SIZE
Input map report size.
#define PIXEL_REPORT_SIZE
Pixel control report size.
#define ECU_REPORT_SIZE
ECU telemetry report size.
#define RID_OUTPUT_RACE_CONTROL
Race control report ID.
#define RID_INPUT_GAMEPAD
Input report ID.
#define HARDWARE_ID_REPORT_SIZE
Custom VID/PID report size.
#define CONFIG_REPORT_SIZE
Configuration report size.
#define POWERTRAIN_REPORT_SIZE
Powertrain telemetry report size.
#define RID_FEATURE_BUTTONS_MAP
Input map report ID.
#define RID_FEATURE_HARDWARE_ID
Custom VID/PID report ID.
#define GAUGES_REPORT_SIZE
Gauges report size.
#define RID_OUTPUT_ECU
ECU telemetry report ID.
#define CAPABILITIES_REPORT_SIZE
Capabilities report size.
#define RID_FEATURE_CAPABILITIES
Capabilities report ID.
#define RID_OUTPUT_PIXEL
Pixel control report ID.