diff --git a/wled00/net_debug.cpp b/wled00/net_debug.cpp index 4d9552a867..1069007f0d 100644 --- a/wled00/net_debug.cpp +++ b/wled00/net_debug.cpp @@ -2,9 +2,7 @@ #ifdef WLED_DEBUG_HOST -size_t NetworkDebugPrinter::write(uint8_t c) { - if (!WLED_CONNECTED || !netDebugEnabled) return 0; - +void NetworkDebugPrinter::resolveHostName() { if (!debugPrintHostIP && !debugPrintHostIP.fromString(netDebugPrintHost)) { #ifdef ESP8266 WiFi.hostByName(netDebugPrintHost, debugPrintHostIP, 750); @@ -16,34 +14,50 @@ size_t NetworkDebugPrinter::write(uint8_t c) { #endif #endif } +} +void NetworkDebugPrinter::flushBuffer() { + if (buffer.length() == 0) return; + + resolveHostName(); + debugUdp.beginPacket(debugPrintHostIP, netDebugPrintPort); - debugUdp.write(c); + debugUdp.printf("%s %s", serverDescription, buffer.c_str()); debugUdp.endPacket(); + buffer = ""; +} + +size_t NetworkDebugPrinter::write(uint8_t c) { + if (!WLED_CONNECTED || !netDebugEnabled) return 0; + + buffer += (char)c; + + // Flush on newline or if buffer gets too large + if (c == '\n' || buffer.length() >= MAX_BUFFER_SIZE) { + flushBuffer(); + } + return 1; } size_t NetworkDebugPrinter::write(const uint8_t *buf, size_t size) { if (!WLED_CONNECTED || buf == nullptr || !netDebugEnabled) return 0; - - if (!debugPrintHostIP && !debugPrintHostIP.fromString(netDebugPrintHost)) { - #ifdef ESP8266 - WiFi.hostByName(netDebugPrintHost, debugPrintHostIP, 750); - #else - #ifdef WLED_USE_ETHERNET - ETH.hostByName(netDebugPrintHost, debugPrintHostIP); - #else - WiFi.hostByName(netDebugPrintHost, debugPrintHostIP); - #endif - #endif + + for (size_t i = 0; i < size; i++) { + buffer += (char)buf[i]; + if (buf[i] == '\n') { + flushBuffer(); + } } - - debugUdp.beginPacket(debugPrintHostIP, netDebugPrintPort); - size = debugUdp.write(buf, size); - debugUdp.endPacket(); + + // If buffer is large but no newline was found, flush anyway + if (buffer.length() >= MAX_BUFFER_SIZE) { + flushBuffer(); + } + return size; } NetworkDebugPrinter NetDebug; -#endif +#endif \ No newline at end of file diff --git a/wled00/net_debug.h b/wled00/net_debug.h index 13028fdc1a..64825ee42b 100644 --- a/wled00/net_debug.h +++ b/wled00/net_debug.h @@ -6,14 +6,16 @@ class NetworkDebugPrinter : public Print { private: - WiFiUDP debugUdp; // needs to be here otherwise UDP messages get truncated upon destruction + WiFiUDP debugUdp; IPAddress debugPrintHostIP; + String buffer; + const size_t MAX_BUFFER_SIZE = 1024; // Safety limit + void resolveHostName(); + void flushBuffer(); public: virtual size_t write(uint8_t c); virtual size_t write(const uint8_t *buf, size_t s); }; - -// use it on your linux/macOS with: nc -p 7868 -u -l -s extern NetworkDebugPrinter NetDebug; #endif \ No newline at end of file