Skip to content

Commit 7f38e14

Browse files
BREAKING: Add Print::availableForWrite method (#7658)
* Add Print::availableForWrite method Adds an availableForWrite() method to the Print class, matching current ArduinoCore-API commit 398e70f188e2b861c10d9ffe5e2bfcb6a4a4f489 . Hook availableForWrite into the SDFS filesystem (other FSes don't have this capability built-in). Fixes #7650 * WiFiClient::availableForWrite proto matching Print * Fix Netdump signedness warning * Clean up Serial availableForWrite This is evidently a breaking change due to the type difference. Arduino's `availableForWrite` returns an `int`, while the (multiply-implemented, non-virtual) core `availableForWrite` returned `size_t`.
1 parent 95de525 commit 7f38e14

File tree

10 files changed

+28
-9
lines changed

10 files changed

+28
-9
lines changed

cores/esp8266/FS.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@ int File::available() {
4646
return _p->size() - _p->position();
4747
}
4848

49+
int File::availableForWrite() {
50+
if (!_p)
51+
return false;
52+
53+
return _p->availableForWrite();
54+
}
55+
56+
4957
int File::read() {
5058
if (!_p)
5159
return -1;

cores/esp8266/FS.h

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class File : public Stream
5757
// Print methods:
5858
size_t write(uint8_t) override;
5959
size_t write(const uint8_t *buf, size_t size) override;
60+
int availableForWrite() override;
6061

6162
// Stream methods:
6263
int available() override;

cores/esp8266/FSImpl.h

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class FileImpl {
3535
virtual bool seek(uint32_t pos, SeekMode mode) = 0;
3636
virtual size_t position() const = 0;
3737
virtual size_t size() const = 0;
38+
virtual int availableForWrite() { return 0; }
3839
virtual bool truncate(uint32_t size) = 0;
3940
virtual void close() = 0;
4041
virtual const char* name() const = 0;

cores/esp8266/HardwareSerial.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class HardwareSerial: public Stream
150150
{
151151
return readBytes((char*)buffer, size);
152152
}
153-
int availableForWrite(void)
153+
int availableForWrite(void) override
154154
{
155155
return static_cast<int>(uart_tx_free(_uart));
156156
}

cores/esp8266/Print.h

+4
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ class Print {
7575
inline size_t write(char c) { return write((uint8_t) c); }
7676
inline size_t write(int8_t c) { return write((uint8_t) c); }
7777

78+
// default to zero, meaning "a single write may block"
79+
// should be overriden by subclasses with buffering
80+
virtual int availableForWrite() { return 0; }
81+
7882
size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3)));
7983
size_t printf_P(PGM_P format, ...) __attribute__((format(printf, 2, 3)));
8084
size_t print(const __FlashStringHelper *);

libraries/ESP8266WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino

+4-4
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,10 @@ void loop() {
173173

174174
// determine maximum output size "fair TCP use"
175175
// client.availableForWrite() returns 0 when !client.connected()
176-
size_t maxToTcp = 0;
176+
int maxToTcp = 0;
177177
for (int i = 0; i < MAX_SRV_CLIENTS; i++)
178178
if (serverClients[i]) {
179-
size_t afw = serverClients[i].availableForWrite();
179+
int afw = serverClients[i].availableForWrite();
180180
if (afw) {
181181
if (!maxToTcp) {
182182
maxToTcp = afw;
@@ -190,11 +190,11 @@ void loop() {
190190
}
191191

192192
//check UART for data
193-
size_t len = std::min((size_t)Serial.available(), maxToTcp);
193+
size_t len = std::min(Serial.available(), maxToTcp);
194194
len = std::min(len, (size_t)STACK_PROTECTOR);
195195
if (len) {
196196
uint8_t sbuf[len];
197-
size_t serial_got = Serial.readBytes(sbuf, len);
197+
int serial_got = Serial.readBytes(sbuf, len);
198198
// push UART data to all connected telnet clients
199199
for (int i = 0; i < MAX_SRV_CLIENTS; i++)
200200
// if client.availableForWrite() was 0 (congested)

libraries/ESP8266WiFi/src/WiFiClient.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ bool WiFiClient::getSync() const
195195
return _client->getSync();
196196
}
197197

198-
size_t WiFiClient::availableForWrite ()
198+
int WiFiClient::availableForWrite ()
199199
{
200200
return _client? _client->availableForWrite(): 0;
201201
}

libraries/ESP8266WiFi/src/WiFiClient.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class WiFiClient : public Client, public SList<WiFiClient> {
8686

8787
static void setLocalPortStart(uint16_t port) { _localPort = port; }
8888

89-
size_t availableForWrite();
89+
int availableForWrite() override;
9090

9191
friend class WiFiServer;
9292

libraries/Netdump/src/Netdump.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ void Netdump::tcpDumpProcess(const Packet& np)
176176
bufferIndex += incl_len;
177177
}
178178

179-
if (bufferIndex && tcpDumpClient && tcpDumpClient.availableForWrite() >= bufferIndex)
179+
if (bufferIndex && tcpDumpClient && tcpDumpClient.availableForWrite() >= (int)bufferIndex)
180180
{
181181
tcpDumpClient.write(packetBuffer, bufferIndex);
182182
bufferIndex = 0;
@@ -202,7 +202,7 @@ void Netdump::tcpDumpLoop(WiFiServer &tcpDumpServer, const Filter nf)
202202
{
203203
setCallback(nullptr);
204204
}
205-
if (bufferIndex && tcpDumpClient && tcpDumpClient.availableForWrite() >= bufferIndex)
205+
if (bufferIndex && tcpDumpClient && tcpDumpClient.availableForWrite() >= (int)bufferIndex)
206206
{
207207
tcpDumpClient.write(packetBuffer, bufferIndex);
208208
bufferIndex = 0;

libraries/SDFS/src/SDFS.h

+5
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,11 @@ class SDFSFileImpl : public FileImpl
268268
close();
269269
}
270270

271+
int availableForWrite() override
272+
{
273+
return _opened ? _fd->availableForWrite() : 0;
274+
}
275+
271276
size_t write(const uint8_t *buf, size_t size) override
272277
{
273278
return _opened ? _fd->write(buf, size) : -1;

0 commit comments

Comments
 (0)