diff --git a/usb_host.c b/usb_host.c index b9828c6..aaf722d 100644 --- a/usb_host.c +++ b/usb_host.c @@ -19,6 +19,7 @@ uint8_t num_mounted=0; static absolute_time_t request_time; static bool enabled=false; static uint8_t kb_addr=0; +static struct hid_report last_report; static void usb_host_init(void); static void host_ready(void); @@ -79,6 +80,22 @@ void usb_host_main(void) { if (enabled) { rgb_task(kb_addr); } + + if (last_report.len > 0 ) { + // previous report was not forwarded, resend + if ( forward_report(last_report.instance, last_report.report, last_report.len) ) { + // clear queue + last_report.len = 0; + memset(last_report.report, 0x00, REPORT_MAX_SIZE); + + // continue requesting reports + if ( !tuh_hid_receive_report(last_report.dev_addr, last_report.instance) ) { + tud_cdc_write_str("Error: cannot request report\r\n"); + } + } else { + tud_cdc_write_str("Error: failed resend report\r\n"); + } + } break; default: break; @@ -142,12 +159,19 @@ void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t cons cdc_print_hex(report, len); } - forward_report(instance, report, len); - - // continue to request to receive report - if ( !tuh_hid_receive_report(dev_addr, instance) ) - { - tud_cdc_write_str("Error: cannot request report\r\n"); + // forward report to device output + if ( !forward_report(instance, report, len) ) { + tud_cdc_write_str("Error: cannot forward report\r\n"); + // queue report for resending + last_report.dev_addr = dev_addr; + last_report.instance = instance; + last_report.len = len; + memcpy(last_report.report, report, len); + } else { + // continue to request to receive report + if ( !tuh_hid_receive_report(dev_addr, instance) ) { + tud_cdc_write_str("Error: cannot request report\r\n"); + } } } diff --git a/usb_host.h b/usb_host.h index 5137902..f7ee047 100644 --- a/usb_host.h +++ b/usb_host.h @@ -23,6 +23,13 @@ struct report_desc { bool listening; }; +struct hid_report { + uint8_t dev_addr; + uint8_t instance; + uint16_t len; + uint8_t report[REPORT_MAX_SIZE]; +}; + #define REPORT_DESC_ALLOC() (struct report_desc *)malloc(sizeof(struct report_desc)) extern host_state_t host_state;