Skip to content

Commit e0b9957

Browse files
authored
Update USBCDC.cpp
1 parent 9945886 commit e0b9957

File tree

1 file changed

+38
-22
lines changed

1 file changed

+38
-22
lines changed

cores/esp32/USBCDC.cpp

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,39 @@ size_t USBCDC::setRxBufferSize(size_t rx_queue_len){
117117
size_t currentQueueSize = rx_queue ?
118118
uxQueueSpacesAvailable(rx_queue) + uxQueueMessagesWaiting(rx_queue) : 0;
119119

120-
if (rx_queue && (!rx_queue_len || rx_queue_len != currentQueueSize)) {
121-
vQueueDelete(rx_queue);
122-
rx_queue = NULL;
123-
}
124-
if(!rx_queue_len || rx_queue_len == currentQueueSize){
125-
return 0;
126-
}
127-
rx_queue = xQueueCreate(rx_queue_len, sizeof(uint8_t));
128-
if(!rx_queue){
129-
return 0;
120+
if (rx_queue_len != currentQueueSize) {
121+
xQueueHandle new_rx_queue = NULL;
122+
if (rx_queue_len) {
123+
new_rx_queue = xQueueCreate(rx_queue_len, sizeof(uint8_t));
124+
if(!new_rx_queue){
125+
log_e("CDC Queue creation failed.");
126+
return 0;
127+
}
128+
if (rx_queue) {
129+
size_t copySize = uxQueueMessagesWaiting(rx_queue);
130+
if (copySize > 0) {
131+
for(size_t i = 0; i < copySize; i++) {
132+
uint8_t ch = 0;
133+
xQueueReceive(rx_queue, &ch, 0);
134+
if (!xQueueSend(new_rx_queue, &ch, 0)) {
135+
arduino_usb_cdc_event_data_t p;
136+
p.rx_overflow.dropped_bytes = copySize - i;
137+
arduino_usb_event_post(ARDUINO_USB_CDC_EVENTS, ARDUINO_USB_CDC_RX_OVERFLOW_EVENT, &p, sizeof(arduino_usb_cdc_event_data_t), portMAX_DELAY);
138+
log_e("CDC RX Overflow.");
139+
break;
140+
}
141+
}
142+
}
143+
vQueueDelete(rx_queue);
144+
}
145+
rx_queue = new_rx_queue;
146+
return rx_queue_len;
147+
} else {
148+
if (rx_queue) {
149+
vQueueDelete(rx_queue);
150+
rx_queue = NULL;
151+
}
152+
}
130153
}
131154
return rx_queue_len;
132155
}
@@ -249,26 +272,19 @@ void USBCDC::_onLineCoding(uint32_t _bit_rate, uint8_t _stop_bits, uint8_t _pari
249272
}
250273

251274
void USBCDC::_onRX(){
275+
arduino_usb_cdc_event_data_t p;
252276
uint8_t buf[CONFIG_TINYUSB_CDC_RX_BUFSIZE+1];
253277
uint32_t count = tud_cdc_n_read(itf, buf, CONFIG_TINYUSB_CDC_RX_BUFSIZE);
254-
255-
if(rx_queue == NULL) {
256-
return;
257-
}
258-
if (uxQueueSpacesAvailable(rx_queue) < count) {
259-
//this VTaskDelay gives, to Arduino's task, time to the CPU do its processing
260-
//without it, data may be lost when the number of bytes received is higher than CDC buffer size
261-
vTaskDelay(10);
262-
}
263278
for(uint32_t i=0; i<count; i++){
264-
if(!xQueueSend(rx_queue, buf+i, 0)){
265-
// rx_queue overflow - data will be lost
279+
if(rx_queue == NULL || !xQueueSend(rx_queue, buf+i, 10)) {
280+
p.rx_overflow.dropped_bytes = count - i;
281+
arduino_usb_event_post(ARDUINO_USB_CDC_EVENTS, ARDUINO_USB_CDC_RX_OVERFLOW_EVENT, &p, sizeof(arduino_usb_cdc_event_data_t), portMAX_DELAY);
282+
log_e("CDC RX Overflow.");
266283
count = i;
267284
break;
268285
}
269286
}
270287
if (count) {
271-
arduino_usb_cdc_event_data_t p;
272288
p.rx.len = count;
273289
arduino_usb_event_post(ARDUINO_USB_CDC_EVENTS, ARDUINO_USB_CDC_RX_EVENT, &p, sizeof(arduino_usb_cdc_event_data_t), portMAX_DELAY);
274290
}

0 commit comments

Comments
 (0)