From 404c9e4068dc73f224710725ff3b2185ea0d1937 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 22 May 2019 00:48:41 +0700 Subject: [PATCH] improve TinyUSB port add yield to stream timeRead() timePeek() and Serial::bool() --- .../Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.cpp | 13 +++++++------ .../Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.h | 3 --- cores/arduino/Stream.cpp | 2 ++ cores/arduino/hooks.c | 10 ++++++++++ cores/arduino/main.cpp | 15 +-------------- 5 files changed, 20 insertions(+), 23 deletions(-) diff --git a/cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.cpp b/cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.cpp index 5195370..dd3d29b 100644 --- a/cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.cpp +++ b/cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.cpp @@ -64,7 +64,13 @@ void Adafruit_USBD_CDC::end(void) Adafruit_USBD_CDC::operator bool() { - return tud_cdc_connected(); + bool ret = tud_cdc_connected(); + + // Add an yield to run usb background in case sketch block wait as follows + // while(!Serial) {} + if ( !ret ) yield(); + + return ret; } int Adafruit_USBD_CDC::available(void) @@ -82,11 +88,6 @@ int Adafruit_USBD_CDC::read(void) return (int) tud_cdc_read_char(); } -size_t Adafruit_USBD_CDC::readBytes(char *buffer, size_t length) -{ - return tud_cdc_read(buffer, length); -} - void Adafruit_USBD_CDC::flush(void) { tud_cdc_write_flush(); diff --git a/cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.h b/cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.h index bb45107..560604c 100644 --- a/cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.h +++ b/cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.h @@ -51,9 +51,6 @@ public: return write((const uint8_t *)buffer, size); } operator bool(); - - size_t readBytes(char *buffer, size_t length); - size_t readBytes(uint8_t *buffer, size_t length) { return readBytes((char *)buffer, length); } }; extern Adafruit_USBD_CDC Serial; diff --git a/cores/arduino/Stream.cpp b/cores/arduino/Stream.cpp index d284631..c32f89d 100644 --- a/cores/arduino/Stream.cpp +++ b/cores/arduino/Stream.cpp @@ -35,6 +35,7 @@ int Stream::timedRead() do { c = read(); if (c >= 0) return c; + yield(); // running TinyUSB task } while(millis() - _startMillis < _timeout); return -1; // -1 indicates timeout } @@ -47,6 +48,7 @@ int Stream::timedPeek() do { c = peek(); if (c >= 0) return c; + yield(); // running TinyUSB task } while(millis() - _startMillis < _timeout); return -1; // -1 indicates timeout } diff --git a/cores/arduino/hooks.c b/cores/arduino/hooks.c index f87c204..1da548c 100644 --- a/cores/arduino/hooks.c +++ b/cores/arduino/hooks.c @@ -28,7 +28,17 @@ static void __empty() { // Empty } + +#ifdef USE_TINYUSB +#include "tusb.h" +void yield(void) +{ + tud_task(); + tud_cdc_write_flush(); +} +#else void yield(void) __attribute__ ((weak, alias("__empty"))); +#endif /** * SysTick hook diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp index d92d2a8..b7dd43f 100644 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -52,23 +52,10 @@ int main( void ) for (;;) { loop(); - -#ifdef USE_TINYUSB - tud_task(); - tud_cdc_write_flush(); -#endif + yield(); // yield run usb background task if (serialEventRun) serialEventRun(); } return 0; } - -#ifdef USE_TINYUSB -void yield(void) -{ - tud_task(); - tud_cdc_write_flush(); -} -#endif -