USBUS CDC ACM: discard oldest data if unconnected

This commit is contained in:
Antonio Galea 2019-10-09 18:27:06 +02:00
parent b0b2ba61c1
commit 01c3043f6f

View File

@ -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;