[ESPEasy console] reduce load when USB HWCDC is not connected

This commit is contained in:
TD-er
2026-07-19 22:50:51 +02:00
parent 39f43f14f8
commit 50c52c3b95
5 changed files with 54 additions and 29 deletions
@@ -48,6 +48,20 @@ static void hwcdcEventCallback(void *arg, esp_event_base_t event_base, int32_t e
} }
} }
bool Port_ESPEasySerial_USB_HWCDC_t::isConnected() const
{
static bool connected_cache{};
static uint32_t lastChecked{};
if (!connected_cache) {
const int32_t timePassedSince = (int32_t) (millis() - lastChecked);
if (timePassedSince < 1000) return false;
lastChecked = millis();
}
connected_cache = _hwcdc_serial != nullptr && _hwcdc_serial->isConnected();
return connected_cache;
}
Port_ESPEasySerial_USB_HWCDC_t::Port_ESPEasySerial_USB_HWCDC_t(const ESPEasySerialConfig& config) Port_ESPEasySerial_USB_HWCDC_t::Port_ESPEasySerial_USB_HWCDC_t(const ESPEasySerialConfig& config)
# if ARDUINO_USB_CDC_ON_BOOT // Serial used for USB CDC # if ARDUINO_USB_CDC_ON_BOOT // Serial used for USB CDC
@@ -71,7 +85,7 @@ Port_ESPEasySerial_USB_HWCDC_t::Port_ESPEasySerial_USB_HWCDC_t(const ESPEasySeri
// _hwcdc_serial->begin(); // _hwcdc_serial->begin();
// _hwcdc_serial->onEvent(hwcdcEventCallback); // _hwcdc_serial->onEvent(hwcdcEventCallback);
} }
} }
@@ -106,7 +120,7 @@ void Port_ESPEasySerial_USB_HWCDC_t::end() {
int Port_ESPEasySerial_USB_HWCDC_t::available(void) int Port_ESPEasySerial_USB_HWCDC_t::available(void)
{ {
if (_hwcdc_serial != nullptr && _hwcdc_serial->isConnected()) { if (isConnected()) {
return _hwcdc_serial->available(); return _hwcdc_serial->available();
} }
return 0; return 0;
@@ -114,7 +128,7 @@ int Port_ESPEasySerial_USB_HWCDC_t::available(void)
int Port_ESPEasySerial_USB_HWCDC_t::availableForWrite(void) int Port_ESPEasySerial_USB_HWCDC_t::availableForWrite(void)
{ {
if (_hwcdc_serial != nullptr && _hwcdc_serial->isConnected()) { if (isConnected()) {
return _hwcdc_serial->availableForWrite(); return _hwcdc_serial->availableForWrite();
} }
return 0; return 0;
@@ -122,7 +136,7 @@ int Port_ESPEasySerial_USB_HWCDC_t::availableForWrite(void)
int Port_ESPEasySerial_USB_HWCDC_t::peek(void) int Port_ESPEasySerial_USB_HWCDC_t::peek(void)
{ {
if (_hwcdc_serial != nullptr && _hwcdc_serial->isConnected()) { if (isConnected()) {
return _hwcdc_serial->peek(); return _hwcdc_serial->peek();
} }
return 0; return 0;
@@ -130,7 +144,7 @@ int Port_ESPEasySerial_USB_HWCDC_t::peek(void)
int Port_ESPEasySerial_USB_HWCDC_t::read(void) int Port_ESPEasySerial_USB_HWCDC_t::read(void)
{ {
if (_hwcdc_serial != nullptr && _hwcdc_serial->isConnected()) { if (isConnected()) {
return _hwcdc_serial->read(); return _hwcdc_serial->read();
} }
return 0; return 0;
@@ -139,7 +153,7 @@ int Port_ESPEasySerial_USB_HWCDC_t::read(void)
size_t Port_ESPEasySerial_USB_HWCDC_t::read(uint8_t *buffer, size_t Port_ESPEasySerial_USB_HWCDC_t::read(uint8_t *buffer,
size_t size) size_t size)
{ {
if (_hwcdc_serial != nullptr && _hwcdc_serial->isConnected()) { if (isConnected()) {
return _hwcdc_serial->read(buffer, size); return _hwcdc_serial->read(buffer, size);
} }
return 0; return 0;
@@ -147,7 +161,7 @@ size_t Port_ESPEasySerial_USB_HWCDC_t::read(uint8_t *buffer,
void Port_ESPEasySerial_USB_HWCDC_t::flush(void) void Port_ESPEasySerial_USB_HWCDC_t::flush(void)
{ {
if (_hwcdc_serial != nullptr && _hwcdc_serial->isConnected()) { if (isConnected()) {
return _hwcdc_serial->flush(); return _hwcdc_serial->flush();
} }
} }
@@ -176,7 +190,7 @@ size_t Port_ESPEasySerial_USB_HWCDC_t::write(const uint8_t *buffer,
Port_ESPEasySerial_USB_HWCDC_t::operator bool() const Port_ESPEasySerial_USB_HWCDC_t::operator bool() const
{ {
if (_hwcdc_serial != nullptr && _hwcdc_serial->isConnected()) { if (isConnected()) {
// return usbActive; // return usbActive;
return true; return true;
} }
@@ -212,4 +226,5 @@ bool Port_ESPEasySerial_USB_HWCDC_t::setRS485Mode(int8_t rtsPin, bool enableColl
return false; return false;
} }
#endif // if USES_HWCDC #endif // if USES_HWCDC
@@ -43,6 +43,9 @@ public:
bool setRS485Mode(int8_t rtsPin, bool enableCollisionDetection = false); bool setRS485Mode(int8_t rtsPin, bool enableCollisionDetection = false);
private: private:
bool isConnected() const;
#if !ARDUINO_USB_CDC_ON_BOOT #if !ARDUINO_USB_CDC_ON_BOOT
HWCDC myUsbSerial; HWCDC myUsbSerial;
#endif #endif
+19 -9
View File
@@ -217,6 +217,7 @@ ESPEasySerialPort EspEasy_Console_Port::getPortType() const
bool EspEasy_Console_Port::process_serialWriteBuffer() bool EspEasy_Console_Port::process_serialWriteBuffer()
{ {
if (_serialWriteBuffer.getNrMessages() == 0) { return false; }
if (_serial == nullptr) { return false; } if (_serial == nullptr) { return false; }
#ifdef ESP32 #ifdef ESP32
@@ -234,35 +235,44 @@ bool EspEasy_Console_Port::process_serialWriteBuffer()
PrintToString str; PrintToString str;
str.reserve(CONSOLE_MAX_WRITE_CHUNKSIZE); str.reserve(CONSOLE_MAX_WRITE_CHUNKSIZE);
size_t totalWritten = 0;
do do
{ {
if (availableForWrite == 0) { return false; } if (availableForWrite == 0) { return totalWritten > 0; }
if (availableForWrite == 1) { if (availableForWrite == 1) {
// For only a single byte, just write it directly // For only a single byte, just write it directly
return _serialWriteBuffer.process(_serial, availableForWrite); if (_serialWriteBuffer.process(_serial, availableForWrite)) {
++totalWritten;
}
return totalWritten > 0;
} }
size_t chunkSize = availableForWrite; const size_t chunkSize = availableForWrite > CONSOLE_MAX_WRITE_CHUNKSIZE
? CONSOLE_MAX_WRITE_CHUNKSIZE
: availableForWrite;
if (chunkSize > CONSOLE_MAX_WRITE_CHUNKSIZE) {
chunkSize = CONSOLE_MAX_WRITE_CHUNKSIZE;
}
availableForWrite -= chunkSize; availableForWrite -= chunkSize;
if (!_serialWriteBuffer.process(&str, chunkSize)) { if (!_serialWriteBuffer.process(&str, chunkSize)) {
// Nothing left to write // Nothing left to write
return false; return totalWritten > 0;
} }
if (_serial->write(str.get().c_str(), str.length()) < chunkSize) { const size_t lastWritten = _serial->write(str.get().c_str(), str.length());
totalWritten += lastWritten;
if (lastWritten < chunkSize) {
// Try to end on a full log line to lower the chance of SDK debug logs // Try to end on a full log line to lower the chance of SDK debug logs
// interfering with console output. // interfering with console output.
++nrLinesWritten; ++nrLinesWritten;
} }
str.clear(); str.clear();
} while (availableForWrite > 0 && nrLinesWritten < 3); } while (availableForWrite > 0 && nrLinesWritten < 3);
return true; return totalWritten > 0;
} }
bool EspEasy_Console_Port::process_consoleInput(uint8_t SerialInByte) bool EspEasy_Console_Port::process_consoleInput(uint8_t SerialInByte)
@@ -74,21 +74,19 @@ void EspEasy_Console_t::loop()
} }
bool EspEasy_Console_t::process_serialWriteBuffer() { bool EspEasy_Console_t::process_serialWriteBuffer() {
# if FEATURE_TIMING_STATS
# if FEATURE_TIMING_STATS
START_TIMER; START_TIMER;
bool res = false;
if (_mainSerial.process_serialWriteBuffer()) { if (_mainSerial.process_serialWriteBuffer()) {
res = true; STOP_TIMER(CONSOLE_WRITE_SERIAL);
return true;
} }
if (res) { STOP_TIMER(CONSOLE_WRITE_SERIAL); } return false;
return res;
# else // if FEATURE_TIMING_STATS # else // if FEATURE_TIMING_STATS
return _mainSerial.process_serialWriteBuffer(); return _mainSerial.process_serialWriteBuffer();
# endif // if FEATURE_TIMING_STATS # endif // if FEATURE_TIMING_STATS
} }
void EspEasy_Console_t::setDebugOutput(bool enable) void EspEasy_Console_t::setDebugOutput(bool enable)
@@ -101,14 +101,13 @@ void EspEasy_Console_t::loop()
bool EspEasy_Console_t::process_serialWriteBuffer() { bool EspEasy_Console_t::process_serialWriteBuffer() {
# if FEATURE_TIMING_STATS # if FEATURE_TIMING_STATS
START_TIMER; START_TIMER;
bool res = false;
if (_mainSerial.process_serialWriteBuffer()) { if (_mainSerial.process_serialWriteBuffer()) {
res = true; STOP_TIMER(CONSOLE_WRITE_SERIAL);
return true;
} }
if (res) { STOP_TIMER(CONSOLE_WRITE_SERIAL); } return false;
return res;
# else // if FEATURE_TIMING_STATS # else // if FEATURE_TIMING_STATS
return _mainSerial.process_serialWriteBuffer(); return _mainSerial.process_serialWriteBuffer();