handle resending failed HID reports

This commit is contained in:
2025-09-30 12:39:33 -04:00
parent 3014bc0c3b
commit 9762476e4b
2 changed files with 37 additions and 6 deletions
+28 -4
View File
@@ -19,6 +19,7 @@ uint8_t num_mounted=0;
static absolute_time_t request_time; static absolute_time_t request_time;
static bool enabled=false; static bool enabled=false;
static uint8_t kb_addr=0; static uint8_t kb_addr=0;
static struct hid_report last_report;
static void usb_host_init(void); static void usb_host_init(void);
static void host_ready(void); static void host_ready(void);
@@ -79,6 +80,22 @@ void usb_host_main(void) {
if (enabled) { if (enabled) {
rgb_task(kb_addr); 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; break;
default: default:
break; break;
@@ -142,14 +159,21 @@ void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t cons
cdc_print_hex(report, len); cdc_print_hex(report, len);
} }
forward_report(instance, report, len); // 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 // continue to request to receive report
if ( !tuh_hid_receive_report(dev_addr, instance) ) if ( !tuh_hid_receive_report(dev_addr, instance) ) {
{
tud_cdc_write_str("Error: cannot request report\r\n"); tud_cdc_write_str("Error: cannot request report\r\n");
} }
} }
}
// start listening on host for HID events // start listening on host for HID events
static void host_ready(void) { static void host_ready(void) {
+7
View File
@@ -23,6 +23,13 @@ struct report_desc {
bool listening; 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)) #define REPORT_DESC_ALLOC() (struct report_desc *)malloc(sizeof(struct report_desc))
extern host_state_t host_state; extern host_state_t host_state;