diff --git a/CMakeLists.txt b/CMakeLists.txt index 69953843..d9a3aa16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ set(CORE_SRCS cores/esp32/esp32-hal-timer.c cores/esp32/esp32-hal-touch.c cores/esp32/esp32-hal-uart.c + cores/esp32/esp32-hal-usb.c cores/esp32/esp32-hal-rmt.c cores/esp32/Esp.cpp cores/esp32/FunctionalInterrupt.cpp @@ -61,6 +62,8 @@ set(LIBRARY_SRCS libraries/Ticker/src/Ticker.cpp libraries/Update/src/Updater.cpp libraries/Update/src/HttpsOTAUpdate.cpp + libraries/USB/src/USB.cpp + libraries/USB/src/USBCDC.cpp libraries/WebServer/src/WebServer.cpp libraries/WebServer/src/Parsing.cpp libraries/WebServer/src/detail/mimetable.cpp diff --git a/libraries/USB/src/USBCDC.cpp b/libraries/USB/src/USBCDC.cpp index 9e33a3c9..2414e1c4 100644 --- a/libraries/USB/src/USBCDC.cpp +++ b/libraries/USB/src/USBCDC.cpp @@ -13,6 +13,7 @@ // limitations under the License. #include "esp32-hal.h" #include "esp32-hal-tinyusb.h" +#include "USB.h" #include "USBCDC.h" #if CONFIG_USB_ENABLED @@ -99,11 +100,16 @@ void tud_cdc_rx_cb(uint8_t itf) //void tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char); +static void usb_unplugged_cb(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data){ + ((USBCDC*)arg)->_onUnplugged(); +} + USBCDC::USBCDC(uint8_t itfn) : itf(itfn), bit_rate(0), stop_bits(0), parity(0), data_bits(0), dtr(false), rts(false), connected(false), reboot_enable(true), rx_queue(NULL) { tinyusb_enable_interface(USB_INTERFACE_CDC); tinyusb_enable_interface(USB_INTERFACE_DFU); if(itf < MAX_USB_CDC_DEVICES){ devices[itf] = this; + arduino_usb_event_handler_register_with(ARDUINO_USB_EVENTS, ARDUINO_USB_STOPPED_EVENT, usb_unplugged_cb, this); } } @@ -131,6 +137,16 @@ void USBCDC::end() tinyusb_persist_set_mode(REBOOT_NO_PERSIST); } +void USBCDC::_onUnplugged(void){ + if(connected){ + connected = false; + dtr = false; + rts = false; + arduino_usb_cdc_event_data_t p = {0}; + arduino_usb_event_post(ARDUINO_USB_CDC_EVENTS, ARDUINO_USB_CDC_DISCONNECTED_EVENT, &p, sizeof(arduino_usb_cdc_event_data_t), portMAX_DELAY); + } +} + void USBCDC::_onDFU(void){ if(reboot_enable){ tinyusb_persist_set_mode(REBOOT_BOOTLOADER_DFU); diff --git a/libraries/USB/src/USBCDC.h b/libraries/USB/src/USBCDC.h index f944e52c..894f074a 100644 --- a/libraries/USB/src/USBCDC.h +++ b/libraries/USB/src/USBCDC.h @@ -108,6 +108,7 @@ public: void _onLineState(bool _dtr, bool _rts); void _onLineCoding(uint32_t _bit_rate, uint8_t _stop_bits, uint8_t _parity, uint8_t _data_bits); void _onRX(void); + void _onUnplugged(void); protected: uint8_t itf;