From 94a7f5623d3114d813252cfc21b9be31545a3c01 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 13 Apr 2023 22:59:09 +0200 Subject: [PATCH] handling of Serial on CDC USB board ... like the typical -C3 * Replaced a few direct Serial.printf with macros * Always check if Serial is connected before printing (CDC sometimes hangs when trying to send/receive without connection) --- wled00/cfg.cpp | 8 ++++---- wled00/ir.cpp | 2 +- wled00/set.cpp | 4 ++-- wled00/src/dependencies/toki/Toki.h | 2 +- wled00/wled.cpp | 32 +++++++++++++++-------------- wled00/wled_serial.cpp | 4 ++-- 6 files changed, 27 insertions(+), 25 deletions(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 6cf9012d..d0a731b0 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -320,9 +320,9 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { Wire.setPins(i2c_sda, i2c_scl); // this will fail if Wire is initilised (Wire.begin() called prior) #endif // Wire.begin(); // WLEDMM moved into pinManager - Serial.printf("pinmgr success for global i2c %d %d\n", i2c_sda, i2c_scl); + DEBUG_PRINTF("pinmgr success for global i2c %d %d\n", i2c_sda, i2c_scl); } else { - Serial.printf("pinmgr not success for global i2c %d %d\n", i2c_sda, i2c_scl); + DEBUG_PRINTF("pinmgr not success for global i2c %d %d\n", i2c_sda, i2c_scl); } JsonArray hw_if_spi = hw[F("if")][F("spi-pin")]; CJSON(spi_mosi, hw_if_spi[0]); @@ -335,9 +335,9 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { #else SPI.begin(); #endif - Serial.printf("pinmgr success for global spi %d %d %d\n", spi_mosi, spi_miso, spi_sclk); + DEBUG_PRINTF("pinmgr success for global spi %d %d %d\n", spi_mosi, spi_miso, spi_sclk); } else { - Serial.printf("pinmgr not success for global spi %d %d %d\n", spi_mosi, spi_miso, spi_sclk); + DEBUG_PRINTF("pinmgr not success for global spi %d %d %d\n", spi_mosi, spi_miso, spi_sclk); } //int hw_status_pin = hw[F("status")]["pin"]; // -1 diff --git a/wled00/ir.cpp b/wled00/ir.cpp index a25a25be..50490634 100644 --- a/wled00/ir.cpp +++ b/wled00/ir.cpp @@ -767,7 +767,7 @@ void handleIR() if (results.value != 0) // only print results if anything is received ( != 0 ) { if (!pinManager.isPinAllocated(hardwareTX) || pinManager.getPinOwner(hardwareTX) == PinOwner::DebugOut) // Serial TX pin (GPIO 1 on ESP32 and ESP8266) - Serial.printf_P(PSTR("IR recv: 0x%lX\n"), (unsigned long)results.value); + if (Serial) Serial.printf_P(PSTR("IR recv: 0x%lX\n"), (unsigned long)results.value); } decodeIR(results.value); irrecv->resume(); diff --git a/wled00/set.cpp b/wled00/set.cpp index d3be194f..034e2be2 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -579,7 +579,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) DEBUG_PRINTLN(F("handleSettingsSet(): Could not allocate I2C pins - deallocating.")); uint8_t i2c[2] = { static_cast(i2c_scl), static_cast(i2c_sda) }; pinManager.deallocateMultiplePins(i2c, 2, PinOwner::HW_I2C); // just in case deallocation of old pins - Serial.printf("pinmgr not success for global i2c %d %d\n", i2c_sda, i2c_scl); + DEBUG_PRINTF("pinmgr not success for global i2c %d %d\n", i2c_sda, i2c_scl); } #ifdef ESP8266 @@ -610,7 +610,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) DEBUG_PRINTLN(F("Could not allocate SPI pins.")); uint8_t spi[3] = { static_cast(spi_mosi), static_cast(spi_miso), static_cast(spi_sclk) }; pinManager.deallocateMultiplePins(spi, 3, PinOwner::HW_SPI); // just in case deallocation of old pins - Serial.printf("pinmgr not success for global spi %d %d %d\n", spi_mosi, spi_miso, spi_sclk); + DEBUG_PRINTF("pinmgr not success for global spi %d %d %d\n", spi_mosi, spi_miso, spi_sclk); } JsonObject um = doc.createNestedObject("um"); diff --git a/wled00/src/dependencies/toki/Toki.h b/wled00/src/dependencies/toki/Toki.h index e7f12a45..b4c27862 100644 --- a/wled00/src/dependencies/toki/Toki.h +++ b/wled00/src/dependencies/toki/Toki.h @@ -156,6 +156,6 @@ class Toki { } void printTime(const Time& t) { - Serial.printf_P(PSTR("%u,%03u\n"),t.sec,t.ms); + if (Serial) Serial.printf_P(PSTR("%u,%03u\n"),t.sec,t.ms); } }; \ No newline at end of file diff --git a/wled00/wled.cpp b/wled00/wled.cpp index b3f001e4..bcc2b05f 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -343,27 +343,29 @@ void WLED::setup() Serial.begin(115200); if (!Serial) delay(1000); // WLEDMM make sure that Serial has initalized - #if !ARDUINO_USB_CDC_ON_BOOT - Serial.setTimeout(50); // this causes troubles on new MCUs that have a "virtual" USB Serial (HWCDC) - #else - #endif - #if defined(WLED_DEBUG) && defined(ARDUINO_ARCH_ESP32) && (defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || ARDUINO_USB_CDC_ON_BOOT) + #ifdef ARDUINO_ARCH_ESP32 + #if defined(WLED_DEBUG) && (defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || ARDUINO_USB_CDC_ON_BOOT) if (!Serial) delay(2500); // WLEDMM allow CDC USB serial to initialise #endif - - #if ARDUINO_USB_CDC_ON_BOOT + #if ARDUINO_USB_CDC_ON_BOOT || ARDUINO_USB_MODE if (!Serial) delay(2500); // WLEDMM: always allow CDC USB serial to initialise - Serial.println("wait 1"); // waiting a bit longer ensures that a debug messages are shown in serial monitor + if (Serial) Serial.println("wait 1"); // waiting a bit longer ensures that a debug messages are shown in serial monitor if (!Serial) delay(2500); - Serial.println("wait 2"); + if (Serial) Serial.println("wait 2"); if (!Serial) delay(2500); if (Serial) Serial.flush(); // WLEDMM - Serial.setTimeout(350); // WLEDMM: don't change timeout, as it causes crashes later + //Serial.setTimeout(350); // WLEDMM: don't change timeout, as it causes crashes later // WLEDMM: redirect debug output to HWCDC + #if defined(WLED_DEBUG) || defined (SR_DEBUG) Serial0.setDebugOutput(false); Serial.setDebugOutput(true); - #else + #endif + // WLEDMM don't touch serial timeout when we use CDC USB or tinyUSB + #else // "standard" serial-to-USB chip + if (Serial) Serial.setTimeout(50); // WLEDMM - only when serial is initialized + #endif + #else // 8266 if (Serial) Serial.setTimeout(50); // WLEDMM - only when serial is initialized #endif @@ -587,7 +589,7 @@ void WLED::setup() //Serial RX (Adalight, Improv, Serial JSON) only possible if GPIO3 unused //Serial TX (Debug, Improv, Serial JSON) only possible if GPIO1 unused if (!pinManager.isPinAllocated(hardwareRX) && !pinManager.isPinAllocated(hardwareTX)) { - Serial.println(F("Ada")); + if (Serial) Serial.println(F("Ada")); } #endif @@ -599,7 +601,7 @@ void WLED::setup() #endif #ifdef WLED_ENABLE_ADALIGHT - if (Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket(); + if (Serial && (Serial.available() > 0) && (Serial.peek() == 'I')) handleImprovPacket(); #endif strip.service(); // why? @@ -626,7 +628,7 @@ void WLED::setup() #endif #ifdef WLED_ENABLE_ADALIGHT - if (Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket(); + if (Serial && (Serial.available() > 0) && (Serial.peek() == 'I')) handleImprovPacket(); #endif // HTTP server page init @@ -704,7 +706,7 @@ void WLED::setup() // repeat Ada prompt #ifdef WLED_ENABLE_ADALIGHT if (!pinManager.isPinAllocated(hardwareRX) && !pinManager.isPinAllocated(hardwareTX)) { - Serial.println(F("Ada")); + if (Serial) Serial.println(F("Ada")); } #endif diff --git a/wled00/wled_serial.cpp b/wled00/wled_serial.cpp index 30336d08..4cca3180 100644 --- a/wled00/wled_serial.cpp +++ b/wled00/wled_serial.cpp @@ -32,10 +32,10 @@ void updateBaudRate(uint32_t rate){ currentBaud = rate100; if (!pinManager.isPinAllocated(hardwareTX) || pinManager.getPinOwner(hardwareTX) == PinOwner::DebugOut){ - Serial.print(F("Baud is now ")); Serial.println(rate); + if (Serial) { Serial.print(F("Baud is now ")); Serial.println(rate); } } - Serial.flush(); + if (Serial) Serial.flush(); Serial.begin(rate); }