USBUS CDC ACM: discard oldest data if unconnected
This commit is contained in:
parent
b0b2ba61c1
commit
01c3043f6f
@ -126,7 +126,20 @@ static size_t _gen_full_acm_descriptor(usbus_t *usbus, void *arg)
|
|||||||
/* Submit (ACM interface in) */
|
/* Submit (ACM interface in) */
|
||||||
size_t usbus_cdc_acm_submit(usbus_cdcacm_device_t *cdcacm, const uint8_t *buf, size_t len)
|
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,
|
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)
|
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;
|
usbus_cdcacm_device_t *cdcacm = (usbus_cdcacm_device_t*)handler;
|
||||||
|
|
||||||
cdcacm->flush.handler = _handle_flush;
|
cdcacm->flush.handler = _handle_flush;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user