@@ -128,12 +128,14 @@ extern "C" uint16_t tusb_hid_load_descriptor(uint8_t * dst, uint8_t * itf)
128
128
static USBHIDDevice * tinyusb_hid_devices[USB_HID_DEVICES_MAX+1 ];
129
129
static uint8_t tinyusb_hid_devices_num = 0 ;
130
130
static bool tinyusb_hid_devices_is_initialized = false ;
131
+ static xSemaphoreHandle tinyusb_hid_device_input_sem = NULL ;
132
+ static xSemaphoreHandle tinyusb_hid_device_input_mutex = NULL ;
131
133
132
134
133
135
// Invoked when received GET HID REPORT DESCRIPTOR request
134
136
// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
135
137
uint8_t const * tud_hid_descriptor_report_cb (uint8_t instance){
136
- log_d (" instance: %u" , instance);
138
+ log_v (" instance: %u" , instance);
137
139
return tinyusb_hid_device_descriptor;
138
140
}
139
141
@@ -191,48 +193,70 @@ void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_
191
193
}
192
194
}
193
195
194
- // Invoked when sent REPORT successfully to host
195
- // Application can use this to send the next report
196
- // Note: For composite reports, report[0] is report ID
197
- void tud_hid_report_complete_cb (uint8_t instance, uint8_t const * report, uint8_t len){
198
- if (report[0 ] < USB_HID_DEVICES_MAX && tinyusb_hid_devices[report[0 ]]){
199
- tinyusb_hid_devices[report[0 ]]->_onInputDone (report+1 , len-1 );
200
- } else {
201
- log_i (" instance: %u, report_id: %u, report_type: %s, bufsize:%u" , instance, report[0 ], tinyusb_hid_device_report_types[HID_REPORT_TYPE_INPUT], len-1 );
202
- log_print_buf (report+1 , len-1 );
203
- }
204
- }
205
-
206
- bool tud_hid_n_wait_ready (uint8_t instance, uint32_t timeout_ms){
207
- if (tud_hid_n_ready (instance)){
208
- return true ;
209
- }
210
- uint32_t start_ms = millis ();
211
- while (!tud_hid_n_ready (instance)){
212
- if ((millis () - start_ms) > timeout_ms){
213
- return false ;
214
- }
215
- delay (1 );
216
- }
217
- return true ;
218
- }
219
-
220
196
USBHID::USBHID (){
221
197
if (!tinyusb_hid_devices_is_initialized){
222
198
tinyusb_hid_devices_is_initialized = true ;
223
199
memset (tinyusb_hid_devices, 0 , sizeof (tinyusb_hid_devices));
224
200
tinyusb_hid_devices_num = 0 ;
225
201
tinyusb_enable_interface (USB_INTERFACE_HID, TUD_HID_INOUT_DESC_LEN, tusb_hid_load_descriptor);
226
202
}
227
-
228
203
}
229
204
230
205
void USBHID::begin (){
231
-
206
+ if (tinyusb_hid_device_input_sem == NULL ){
207
+ tinyusb_hid_device_input_sem = xSemaphoreCreateBinary ();
208
+ }
209
+ if (tinyusb_hid_device_input_mutex == NULL ){
210
+ tinyusb_hid_device_input_mutex = xSemaphoreCreateMutex ();
211
+ }
232
212
}
233
213
234
214
void USBHID::end (){
215
+ if (tinyusb_hid_device_input_sem != NULL ) {
216
+ vSemaphoreDelete (tinyusb_hid_device_input_sem);
217
+ tinyusb_hid_device_input_sem = NULL ;
218
+ }
219
+ if (tinyusb_hid_device_input_mutex != NULL ) {
220
+ vSemaphoreDelete (tinyusb_hid_device_input_mutex);
221
+ tinyusb_hid_device_input_mutex = NULL ;
222
+ }
223
+ }
224
+
225
+ void tud_hid_report_complete_cb (uint8_t instance, uint8_t const * report, uint8_t len){
226
+ if (tinyusb_hid_device_input_sem) {
227
+ xSemaphoreGive (tinyusb_hid_device_input_sem);
228
+ }
229
+ }
230
+
231
+ bool USBHID::SendReport (uint8_t id, const void * data, size_t len, uint32_t timeout_ms){
232
+ if (!tinyusb_hid_device_input_sem || !tinyusb_hid_device_input_mutex){
233
+ log_e (" TX Semaphore is NULL. You must call USBHID::begin() before you can send reports" );
234
+ return false ;
235
+ }
236
+
237
+ if (xSemaphoreTake (tinyusb_hid_device_input_mutex, timeout_ms / portTICK_PERIOD_MS) != pdTRUE){
238
+ log_e (" report %u mutex failed" , id);
239
+ return false ;
240
+ }
241
+
242
+ bool res = tud_hid_n_ready (0 );
243
+ if (!res){
244
+ log_e (" not ready" );
245
+ } else {
246
+ res = tud_hid_n_report (0 , id, data, len);
247
+ if (!res){
248
+ log_e (" report %u failed" , id);
249
+ } else {
250
+ xSemaphoreTake (tinyusb_hid_device_input_sem, 0 );
251
+ if (xSemaphoreTake (tinyusb_hid_device_input_sem, timeout_ms / portTICK_PERIOD_MS) != pdTRUE){
252
+ log_e (" report %u wait failed" , id);
253
+ res = false ;
254
+ }
255
+ }
256
+ }
235
257
258
+ xSemaphoreGive (tinyusb_hid_device_input_mutex);
259
+ return res;
236
260
}
237
261
238
262
bool USBHID::addDevice (USBHIDDevice * device, uint16_t descriptor_len, tinyusb_hid_device_descriptor_cb_t cb){
0 commit comments