Skip to content

Commit e3752b5

Browse files
committed
[Serial Console] Fix outputting data to USBCDC port for ESP32S2
See: espressif/arduino-esp32#12178
1 parent 61c3574 commit e3752b5

File tree

5 files changed

+48
-29
lines changed

5 files changed

+48
-29
lines changed

src/src/ESPEasyCore/ESPEasy_Console_Port.cpp

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818

1919

2020
#ifdef ESP32
21-
#define CONSOLE_INPUT_BUFFER_SIZE 1280
21+
# define CONSOLE_INPUT_BUFFER_SIZE 1280
2222
#else
23-
#define CONSOLE_INPUT_BUFFER_SIZE 128
24-
#endif
23+
# define CONSOLE_INPUT_BUFFER_SIZE 128
24+
#endif // ifdef ESP32
2525

2626

2727
/*
@@ -31,19 +31,20 @@
3131
*/
3232

3333
EspEasy_Console_Port::EspEasy_Console_Port(LogDestination log_destination)
34-
: _serialWriteBuffer(log_destination)
34+
: _serialWriteBuffer(log_destination)
3535
{
36-
InputBuffer_Serial = (char*)calloc(1, CONSOLE_INPUT_BUFFER_SIZE);
36+
InputBuffer_Serial = (char *)calloc(1, CONSOLE_INPUT_BUFFER_SIZE);
3737
}
3838

3939
EspEasy_Console_Port::~EspEasy_Console_Port()
4040
{
4141
#if FEATURE_DEFINE_SERIAL_CONSOLE_PORT
42+
4243
if (_serial != nullptr) {
4344
delete _serial;
4445
_serial = nullptr;
4546
}
46-
#endif
47+
#endif // if FEATURE_DEFINE_SERIAL_CONSOLE_PORT
4748
free(InputBuffer_Serial);
4849
}
4950

@@ -111,14 +112,36 @@ void EspEasy_Console_Port::endPort()
111112
}
112113
}
113114

114-
115115
bool EspEasy_Console_Port::process_serialWriteBuffer()
116116
{
117117
if (_serial != nullptr) {
118118
#ifdef ESP32
119-
if (!xPortCanYield()) return false;
120-
#endif
121-
return _serialWriteBuffer.process(_serial, _serial->availableForWrite());
119+
120+
if (!xPortCanYield()) { return false; }
121+
#endif // ifdef ESP32
122+
size_t availableForWrite = _serial->availableForWrite();
123+
124+
if (availableForWrite == 0) { return false; }
125+
126+
if (availableForWrite == 1) {
127+
// For only a single byte, just write it directly
128+
return _serialWriteBuffer.process(_serial, availableForWrite);
129+
}
130+
131+
if (availableForWrite > 64) {
132+
// Set to max. of 64 bytes as this is the optimum 'chunk size' for most
133+
// serial ports, like the CDC ports and I2C to UART.
134+
// Also it is relatively fast to allocate.
135+
availableForWrite = 64;
136+
}
137+
138+
PrintToString str;
139+
str.reserve(availableForWrite);
140+
141+
if (_serialWriteBuffer.process(&str, availableForWrite)) {
142+
_serial->write(str.get().c_str(), str.length());
143+
return true;
144+
}
122145
}
123146
return false;
124147
}
@@ -147,7 +170,7 @@ bool EspEasy_Console_Port::process_consoleInput(uint8_t SerialInByte)
147170
Logging.consolePrintln(concat('>', cmd));
148171
#endif
149172

150-
ExecuteCommand_all({EventValueSource::Enum::VALUE_SOURCE_SERIAL, std::move(cmd)}, true);
173+
ExecuteCommand_all({ EventValueSource::Enum::VALUE_SOURCE_SERIAL, std::move(cmd) }, true);
151174
SerialInByteCounter = 0;
152175
InputBuffer_Serial[0] = 0; // serial data processed, clear buffer
153176
return true;

src/src/Helpers/LogStreamWriter.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ void LogStreamWriter::clear()
1414
_readpos = 0;
1515
}
1616

17-
bool LogStreamWriter::process(Stream*stream, size_t availableForWrite)
17+
bool LogStreamWriter::process(Print*stream, size_t availableForWrite)
1818
{
1919
if (stream == nullptr) { return false; }
2020
return write(*stream, availableForWrite) != 0;
@@ -30,7 +30,7 @@ uint32_t LogStreamWriter::getNrMessages() const
3030
return Logging.getNrMessages(_log_destination);
3131
}
3232

33-
size_t LogStreamWriter::write(Stream& stream, size_t nrBytesToWrite)
33+
size_t LogStreamWriter::write(Print& stream, size_t nrBytesToWrite)
3434
{
3535
size_t bytesWritten = 0;
3636

@@ -45,7 +45,7 @@ size_t LogStreamWriter::write(Stream& stream, size_t nrBytesToWrite)
4545
return bytesWritten;
4646
}
4747

48-
size_t LogStreamWriter::write_single_item(Stream& stream,
48+
size_t LogStreamWriter::write_single_item(Print& stream,
4949
size_t nrBytesToWrite)
5050
{
5151
const size_t res = write_item(stream, nrBytesToWrite);
@@ -54,7 +54,7 @@ size_t LogStreamWriter::write_single_item(Stream& stream,
5454
return res;
5555
}
5656

57-
size_t LogStreamWriter::write_item(Stream& stream,
57+
size_t LogStreamWriter::write_item(Print& stream,
5858
size_t nrBytesToWrite)
5959
{
6060
size_t bytesWritten = 0;
@@ -103,7 +103,7 @@ size_t LogStreamWriter::write_item(Stream& stream,
103103
++_readpos;
104104
} else {
105105
if ((bytesWritten + 2) > nrBytesToWrite) { return bytesWritten; }
106-
bytesWritten += stream.println();
106+
bytesWritten += stream.print(F("\r\n")); // stream.println();
107107

108108
// Done with entry, cleanup and leave
109109
clear();
@@ -113,6 +113,6 @@ size_t LogStreamWriter::write_item(Stream& stream,
113113
return bytesWritten;
114114
}
115115

116-
size_t LogStreamWriter::write_skipping(Stream& stream) { return 0; }
116+
size_t LogStreamWriter::write_skipping(Print& stream) { return 0; }
117117

118118
void LogStreamWriter::prepare_prefix() {}

src/src/Helpers/LogStreamWriter.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class LogStreamWriter
1111

1212
virtual ~LogStreamWriter() {}
1313

14-
virtual bool process(Stream* stream, size_t availableForWrite);
14+
virtual bool process(Print* stream, size_t availableForWrite);
1515

1616
// Only use this from derived classes, as we need a Stream to further process
1717
virtual bool process();
@@ -24,20 +24,20 @@ class LogStreamWriter
2424

2525
// Write continuously until either nrBytesToWrite was reached or no new messages were available to process.
2626
// @retval Number of bytes written. Zero when no new message was available to process.
27-
virtual size_t write(Stream& stream,
27+
virtual size_t write(Print& stream,
2828
size_t nrBytesToWrite);
2929

3030
// Write single item and clear() on return.
3131
// This way each call starts with a new item and long messages may get truncated based on nrBytesToWrite
3232
// @retval Number of bytes written. Zero when no new message was available to process.
33-
virtual size_t write_single_item(Stream& stream,
33+
virtual size_t write_single_item(Print& stream,
3434
size_t nrBytesToWrite);
3535

36-
virtual size_t write_item(Stream& stream,
36+
virtual size_t write_item(Print& stream,
3737
size_t nrBytesToWrite);
3838

3939

40-
virtual size_t write_skipping(Stream& stream);
40+
virtual size_t write_skipping(Print& stream);
4141

4242
virtual void prepare_prefix();
4343

src/src/Helpers/SerialWriteBuffer.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,10 @@ String SerialWriteBuffer_t::colorize(const String& str) const {
3434
}
3535

3636

37-
size_t SerialWriteBuffer_t::write_skipping(Stream& stream)
37+
size_t SerialWriteBuffer_t::write_skipping(Print& stream)
3838
{
39-
size_t bytesWritten{};
40-
4139
// Mark with empty line we skipped the rest of the message.
42-
bytesWritten += stream.println(F(" ..."));
43-
bytesWritten += stream.println();
44-
return bytesWritten;
40+
return stream.print(F(" ...\r\n\r\n"));
4541
}
4642

4743
void SerialWriteBuffer_t::prepare_prefix()

src/src/Helpers/SerialWriteBuffer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class SerialWriteBuffer_t : public LogStreamWriter {
1414

1515
private:
1616

17-
size_t write_skipping(Stream& stream) override;
17+
size_t write_skipping(Print& stream) override;
1818

1919
void prepare_prefix() override;
2020

0 commit comments

Comments
 (0)