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_PIXEL 0x1E // 30 dec
47
48//-------------------------------------------------------------------
49// Report sizes (bytes)
50//-------------------------------------------------------------------
51
53#define GAMEPAD_REPORT_SIZE 20
55#define CAPABILITIES_REPORT_SIZE 20
57#define CONFIG_REPORT_SIZE 7
59#define BUTTONS_MAP_REPORT_SIZE 3
61#define HARDWARE_ID_REPORT_SIZE 6
63#define POWERTRAIN_REPORT_SIZE 10
65#define ECU_REPORT_SIZE 9
67#define RACE_CONTROL_REPORT_SIZE 11
69#define GAUGES_REPORT_SIZE 12
71#define PIXEL_REPORT_SIZE 6
72
73//-------------------------------------------------------------------
74// GAME CONTROLLER APPEARANCES
75//-------------------------------------------------------------------
76
78#define CONTROLLER_TYPE_GAMEPAD 0x05
80#define CONTROLLER_TYPE_JOYSTICK 0x04
81
82//-------------------------------------------------------------------
83// INPUT REPORT constants
84//-------------------------------------------------------------------
85
87#define BUTTON_COUNT 128
88
89//-------------------------------------------------------------------
90// BLE implementation
91//-------------------------------------------------------------------
92
94#define BLE_VENDOR_SOURCE 0x00
96#define BLE_VENDOR_ID 0x1d50
98#define BLE_PRODUCT_ID 0xffff
100#define TEST_HARDWARE_ID 0xffff
102#define BLE_SERIAL_NUMBER_CHR_UUID 0x2A25
104#define BLE_BATTERY_STATUS_CHR_UUID 0x2BED
105
106// See https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/one-minute-to-understand-ble-mtu-data-package
107// BLE_MTU_SIZE must be greater than 23 bytes
108// BLE_MTU_SIZE = max report size + report ID + payload metadata
109
111#define BLE_MTU_SIZE GAMEPAD_REPORT_SIZE + 1 + 14
112
113//-------------------------------------------------------------------
114// Hardware revision
115//-------------------------------------------------------------------
116
118#define PRODUCT_REVISION 0x0100
119
120//-------------------------------------------------------------------
121// Data specification version
122//-------------------------------------------------------------------
123
125#define DATA_MAJOR_VERSION 1
127#define DATA_MINOR_VERSION 6
128
129//-------------------------------------------------------------------
130// Magic number, do not change
131//-------------------------------------------------------------------
132
134#define MAGIC_NUMBER_LOW 0x51
136#define MAGIC_NUMBER_HIGH 0xBF
137
138//-------------------------------------------------------------------
139// HID report descriptor
140//-------------------------------------------------------------------
141
146static const uint8_t hid_descriptor[] = {
147 0x05, 0x01, // UsagePage(Generic Desktop[1])
148 0x09, CONTROLLER_TYPE_GAMEPAD, // UsageId
149 0xA1, 0x01, // Collection(Application)
150
151 // ___ INPUT REPORT ___
152 0x85, RID_INPUT_GAMEPAD, // ReportId
153
154 // Buttons (128 bits=16 bytes)
155 0x05, 0x09, // UsagePage(Button[9])
156 0x19, 0x01, // UsageIdMin(Button 1[1])
157 0x29, 0x80, // UsageIdMax(Button 128[128])
158 0x15, 0x00, // LogicalMinimum(0)
159 0x25, 0x01, // LogicalMaximum(1)
160 0x95, 0x80, // ReportCount(128)
161 0x75, 0x01, // ReportSize(1)
162 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
163
164 // axis (1 byte)
165 0x05, 0x01, // UsagePage(Generic Desktop[1])
166 0x09, 0x35, // UsageId(Rz[53])
167 // 0x15, 0x00, // LogicalMinimum
168 // 0x25, CLUTCH_FULL_VALUE, // LogicalMaximum
169 0x26, 0xFE, 0x00, // LogicalMaximum(254)
170 0x95, 0x01, // ReportCount(1)
171 0x75, 0x08, // ReportSize(8)
172 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
173
174 // axis (1 byte)
175 0x09, 0x34, // UsageId(Ry[52])
176 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
177
178 // axis (1 byte)
179 0x09, 0x33, // UsageId(Rx[51])
180 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
181
182 // D-PAD (hat switch), (4 bits)
183 0x09, 0x39, // UsageId(Hat Switch[57])
184 0x46, 0x40, 0x01, // PhysicalMaximum(320)
185 0x65, 0x14, // Unit('degrees', EnglishRotation, Degrees:1)
186 0x15, 0x01, // LogicalMinimum(1)
187 0x25, 0x08, // LogicalMaximum(8)
188 0x75, 0x04, // ReportSize(4)
189 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
190
191 // Feature notification (4 bits)
192 0x09, 0x47, // UsageId(Feature Notification[71])
193 0x45, 0x00, // PhysicalMaximum(0)
194 0x65, 0x00, // Unit(None)
195 0x81, 0x02, // Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
196
197 // ___ CAPABILITIES (FEATURE) REPORT ___
198 0x09, 0x00, // USAGE (undefined)
199 0x15, 0x00, // LogicalMinimum(0)
200 0x25, 0xff, // LogicalMaximum(256)
201 0x85, RID_FEATURE_CAPABILITIES, // REPORT ID
202 0x75, 0x08, // Report Size (8)
203 0x95, CAPABILITIES_REPORT_SIZE, // Report count
204 0xb1, 0x23, // FEATURE (Cnst,var,abs,Nprf)
205
206 // ___ CONFIG (FEATURE) REPORT ___
207 0x09, 0x00, // USAGE (undefined)
208 0x85, RID_FEATURE_CONFIG, // REPORT ID
209 0x75, 0x08, // Report Size (8)
210 0x95, CONFIG_REPORT_SIZE, // Report count
211 0xb1, 0xa2, // FEATURE (Data,var,abs,Nprf,Vol)
212
213 // ___ MAP (FEATURE) REPORT ___
214 0x09, 0x00, // USAGE (undefined)
215 0x85, RID_FEATURE_BUTTONS_MAP, // REPORT ID
216 0x75, 0x08, // Report Size (8)
217 0x95, BUTTONS_MAP_REPORT_SIZE, // Report count
218 0xb1, 0xa2, // FEATURE (Data,var,abs,Nprf,Vol)
219
220 // ___ HARDWARE ID (FEATURE) REPORT ___
221 0x09, 0x00, // USAGE (undefined)
222 0x85, RID_FEATURE_HARDWARE_ID, // REPORT ID
223 0x75, 0x08, // Report Size (8)
224 0x95, HARDWARE_ID_REPORT_SIZE, // Report count
225 0xb1, 0xa2, // FEATURE (Data,var,abs,Nprf,Vol)
226
227 // ___ POWERTRAIN TELEMETRY (OUTPUT) REPORT ___
228 0x09, 0x00, // USAGE (undefined)
229 0x85, RID_OUTPUT_POWERTRAIN, // REPORT ID
230 0x75, 0x08, // Report Size (8)
231 0x95, POWERTRAIN_REPORT_SIZE, // Report count
232 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
233
234 // ___ ECU TELEMETRY (OUTPUT) REPORT ___
235 0x09, 0x00, // USAGE (undefined)
236 0x85, RID_OUTPUT_ECU, // REPORT ID
237 0x75, 0x08, // Report Size (8)
238 0x95, ECU_REPORT_SIZE, // Report count
239 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
240
241 // ___ RACE CONTROL TELEMETRY (OUTPUT) REPORT ___
242 0x09, 0x00, // USAGE (undefined)
243 0x85, RID_OUTPUT_RACE_CONTROL, // REPORT ID
244 0x75, 0x08, // Report Size (8)
245 0x95, RACE_CONTROL_REPORT_SIZE, // Report count
246 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
247
248 // ___ GAUGES (OUTPUT) REPORT ___
249 0x09, 0x00, // USAGE (undefined)
250 0x85, RID_OUTPUT_GAUGES, // REPORT ID
251 0x75, 0x08, // Report Size (8)
252 0x95, GAUGES_REPORT_SIZE, // Report count
253 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
254
255 // ___ PIXEL CONTROL (OUTPUT) REPORT ___
256 0x09, 0x00, // USAGE (undefined)
257 0x85, RID_OUTPUT_PIXEL, // REPORT ID
258 0x75, 0x08, // Report Size (8)
259 0x95, PIXEL_REPORT_SIZE, // Report count
260 0x91, 0x22, // OUTPUT (Data,var,abs,Nprf)
261
262 // END APPLICATION
263 0xC0 // EndCollection()
264};
265
266// Input report packed structure:
267// typedef struct {
268// uint64_t inputsLow;
269// uint64_t inputsHigh;
270// uint8_t clutchAxis;
271// uint8_t leftAxis;
272// uint8_t rightAxis;
273// uint8_t POVState: 4;
274// uint8_t notifyConfigChanges: 4;
275// } hidInputReport_t;
#define RID_OUTPUT_GAUGES
Gauges report ID.
#define RACE_CONTROL_REPORT_SIZE
Race control report size.
#define RID_FEATURE_CONFIG
Configuration 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.