From 01c3043f6f2a06f260e0915c1950d41f3ec5186c Mon Sep 17 00:00:00 2001 From: Antonio Galea Date: Wed, 9 Oct 2019 18:27:06 +0200 Subject: [PATCH] USBUS CDC ACM: discard oldest data if unconnected --- sys/usb/usbus/cdc/acm/cdc_acm.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/sys/usb/usbus/cdc/acm/cdc_acm.c b/sys/usb/usbus/cdc/acm/cdc_acm.c index f67dfb7e43..a132fce5ba 100644 --- a/sys/usb/usbus/cdc/acm/cdc_acm.c +++ b/sys/usb/usbus/cdc/acm/cdc_acm.c @@ -126,7 +126,20 @@ static size_t _gen_full_acm_descriptor(usbus_t *usbus, void *arg) /* Submit (ACM interface in) */ size_t usbus_cdc_acm_submit(usbus_cdcacm_device_t *cdcacm, const uint8_t *buf, size_t len) { - return tsrb_add(&cdcacm->tsrb, buf, len); + if (cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DISCONNECTED) { + return tsrb_add(&cdcacm->tsrb, buf, len); + } + /* stuff as much data as possible into tsrb, discarding the oldest */ + size_t n = tsrb_free(&cdcacm->tsrb); + if (len > n) { + n += tsrb_drop(&cdcacm->tsrb, len - n); + buf += len - n; + } else { + n = len; + } + tsrb_add(&cdcacm->tsrb, buf, n); + /* behave as if everything has been written correctly */ + return len; } void usbus_cdc_acm_set_coding_cb(usbus_cdcacm_device_t *cdcacm, @@ -161,7 +174,7 @@ void usbus_cdc_acm_init(usbus_t *usbus, usbus_cdcacm_device_t *cdcacm, static void _init(usbus_t *usbus, usbus_handler_t *handler) { - DEBUG("CDC_ACM: intialization\n"); + DEBUG("CDC_ACM: initialization\n"); usbus_cdcacm_device_t *cdcacm = (usbus_cdcacm_device_t*)handler; cdcacm->flush.handler = _handle_flush;