34
34
uint8_t const _ascii2keycode[128 ][2 ] = {HID_ASCII_TO_KEYCODE};
35
35
36
36
// TODO multiple instances
37
- static Adafruit_USBD_HID *_hid_dev = NULL ;
37
+ // static Adafruit_USBD_HID *_hid_dev = NULL;
38
+
39
+ // support 2 instances
40
+ static uint8_t _instance_count = 0 ;
41
+ static Adafruit_USBD_HID *_hid_devs[2 ] = {NULL , NULL };
38
42
39
43
#ifdef ARDUINO_ARCH_ESP32
40
44
static uint16_t hid_load_descriptor (uint8_t *dst, uint8_t *itf) {
@@ -162,27 +166,29 @@ bool Adafruit_USBD_HID::begin(void) {
162
166
return false ;
163
167
}
164
168
165
- _hid_dev = this ;
169
+ _instance = _instance_count++;
170
+ _hid_devs[_instance] = this ;
171
+
166
172
return true ;
167
173
}
168
174
169
175
bool Adafruit_USBD_HID::ready (void ) { return tud_hid_ready (); }
170
176
171
177
bool Adafruit_USBD_HID::sendReport (uint8_t report_id, void const *report,
172
178
uint8_t len) {
173
- return tud_hid_report ( report_id, report, len);
179
+ return tud_hid_n_report (_instance, report_id, report, len);
174
180
}
175
181
176
182
bool Adafruit_USBD_HID::sendReport8 (uint8_t report_id, uint8_t num) {
177
- return tud_hid_report ( report_id, &num, sizeof (num));
183
+ return tud_hid_n_report (_instance, report_id, &num, sizeof (num));
178
184
}
179
185
180
186
bool Adafruit_USBD_HID::sendReport16 (uint8_t report_id, uint16_t num) {
181
- return tud_hid_report ( report_id, &num, sizeof (num));
187
+ return tud_hid_n_report (_instance, report_id, &num, sizeof (num));
182
188
}
183
189
184
190
bool Adafruit_USBD_HID::sendReport32 (uint8_t report_id, uint32_t num) {
185
- return tud_hid_report ( report_id, &num, sizeof (num));
191
+ return tud_hid_n_report (_instance, report_id, &num, sizeof (num));
186
192
}
187
193
188
194
// ------------- TinyUSB callbacks -------------//
@@ -191,8 +197,8 @@ extern "C" {
191
197
// Invoked when received GET HID REPORT DESCRIPTOR
192
198
// Application return pointer to descriptor, whose contents must exist long
193
199
// enough for transfer to complete
194
- uint8_t const *tud_hid_descriptor_report_cb (uint8_t itf ) {
195
- ( void )itf ;
200
+ uint8_t const *tud_hid_descriptor_report_cb (uint8_t instance ) {
201
+ Adafruit_USBD_HID *_hid_dev = _hid_devs[instance] ;
196
202
197
203
if (!_hid_dev) {
198
204
return NULL ;
@@ -204,10 +210,10 @@ uint8_t const *tud_hid_descriptor_report_cb(uint8_t itf) {
204
210
// Invoked when received GET_REPORT control request
205
211
// Application must fill buffer report's content and return its length.
206
212
// Return zero will cause the stack to STALL request
207
- uint16_t tud_hid_get_report_cb (uint8_t itf , uint8_t report_id,
213
+ uint16_t tud_hid_get_report_cb (uint8_t instance , uint8_t report_id,
208
214
hid_report_type_t report_type, uint8_t *buffer,
209
215
uint16_t reqlen) {
210
- ( void )itf ;
216
+ Adafruit_USBD_HID *_hid_dev = _hid_devs[instance] ;
211
217
212
218
if (!(_hid_dev && _hid_dev->_get_report_cb )) {
213
219
return 0 ;
@@ -218,10 +224,10 @@ uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id,
218
224
219
225
// Invoked when received SET_REPORT control request or
220
226
// received data on OUT endpoint ( Report ID = 0, Type = 0 )
221
- void tud_hid_set_report_cb (uint8_t itf , uint8_t report_id,
227
+ void tud_hid_set_report_cb (uint8_t instance , uint8_t report_id,
222
228
hid_report_type_t report_type, uint8_t const *buffer,
223
229
uint16_t bufsize) {
224
- ( void )itf ;
230
+ Adafruit_USBD_HID *_hid_dev = _hid_devs[instance] ;
225
231
226
232
if (!(_hid_dev && _hid_dev->_set_report_cb )) {
227
233
return ;
@@ -238,7 +244,7 @@ void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id,
238
244
239
245
bool Adafruit_USBD_HID::keyboardReport (uint8_t report_id, uint8_t modifier,
240
246
uint8_t keycode[6 ]) {
241
- return tud_hid_keyboard_report ( report_id, modifier, keycode);
247
+ return tud_hid_n_keyboard_report (_instance, report_id, modifier, keycode);
242
248
}
243
249
244
250
bool Adafruit_USBD_HID::keyboardPress (uint8_t report_id, char ch) {
@@ -251,11 +257,11 @@ bool Adafruit_USBD_HID::keyboardPress(uint8_t report_id, char ch) {
251
257
}
252
258
keycode[0 ] = _ascii2keycode[uch][1 ];
253
259
254
- return tud_hid_keyboard_report ( report_id, modifier, keycode);
260
+ return tud_hid_n_keyboard_report (_instance, report_id, modifier, keycode);
255
261
}
256
262
257
263
bool Adafruit_USBD_HID::keyboardRelease (uint8_t report_id) {
258
- return tud_hid_keyboard_report ( report_id, 0 , NULL );
264
+ return tud_hid_n_keyboard_report (_instance, report_id, 0 , NULL );
259
265
}
260
266
261
267
// --------------------------------------------------------------------+
@@ -268,24 +274,27 @@ bool Adafruit_USBD_HID::mouseReport(uint8_t report_id, uint8_t buttons,
268
274
// cache mouse button for other API such as move, scroll
269
275
_mouse_button = buttons;
270
276
271
- return tud_hid_mouse_report (report_id, buttons, x, y, vertical, horizontal);
277
+ return tud_hid_n_mouse_report (_instance, report_id, buttons, x, y, vertical,
278
+ horizontal);
272
279
}
273
280
274
281
bool Adafruit_USBD_HID::mouseMove (uint8_t report_id, int8_t x, int8_t y) {
275
- return tud_hid_mouse_report (report_id, _mouse_button, x, y, 0 , 0 );
282
+ return tud_hid_n_mouse_report (_instance, report_id, _mouse_button, x, y, 0 ,
283
+ 0 );
276
284
}
277
285
278
286
bool Adafruit_USBD_HID::mouseScroll (uint8_t report_id, int8_t scroll,
279
287
int8_t pan) {
280
- return tud_hid_mouse_report (report_id, _mouse_button, 0 , 0 , scroll, pan);
288
+ return tud_hid_n_mouse_report (_instance, report_id, _mouse_button, 0 , 0 ,
289
+ scroll, pan);
281
290
}
282
291
283
292
bool Adafruit_USBD_HID::mouseButtonPress (uint8_t report_id, uint8_t buttons) {
284
- return tud_hid_mouse_report ( report_id, buttons, 0 , 0 , 0 , 0 );
293
+ return tud_hid_n_mouse_report (_instance, report_id, buttons, 0 , 0 , 0 , 0 );
285
294
}
286
295
287
296
bool Adafruit_USBD_HID::mouseButtonRelease (uint8_t report_id) {
288
- return tud_hid_mouse_report ( report_id, 0 , 0 , 0 , 0 , 0 );
297
+ return tud_hid_n_mouse_report (_instance, report_id, 0 , 0 , 0 , 0 , 0 );
289
298
}
290
299
291
300
#endif // TUSB_OPT_DEVICE_ENABLED
0 commit comments