Skip to content

Commit e89ae46

Browse files
committed
add WiFiClient::write_P to be used with PROGMEM
1 parent b28e879 commit e89ae46

File tree

2 files changed

+40
-5
lines changed

2 files changed

+40
-5
lines changed

libraries/ESP8266WiFi/src/WiFiClient.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,38 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size)
177177
return _client->write(reinterpret_cast<const char*>(buf), size);
178178
}
179179

180+
size_t WiFiClient::write_P(PGM_P buf, size_t size)
181+
{
182+
if (!_client || !size)
183+
{
184+
return 0;
185+
}
186+
187+
char chunkUnit[WIFICLIENT_MAX_PACKET_SIZE + 1];
188+
chunkUnit[WIFICLIENT_MAX_PACKET_SIZE] = '\0';
189+
while (buf != NULL)
190+
{
191+
size_t chunkUnitLen;
192+
PGM_P chunkNext;
193+
chunkNext = (PGM_P)memccpy_P((void*)chunkUnit, (PGM_VOID_P)buf, 0, WIFICLIENT_MAX_PACKET_SIZE);
194+
if (chunkNext == NULL)
195+
{
196+
// no terminator, more data available
197+
buf += WIFICLIENT_MAX_PACKET_SIZE;
198+
chunkUnitLen = WIFICLIENT_MAX_PACKET_SIZE;
199+
}
200+
else
201+
{
202+
// reached terminator
203+
chunkUnitLen = chunkNext - buf;
204+
buf = NULL;
205+
}
206+
if (size < WIFICLIENT_MAX_PACKET_SIZE) chunkUnitLen = size;
207+
_client->write((const char*)chunkUnit, chunkUnitLen);
208+
}
209+
return size;
210+
}
211+
180212
int WiFiClient::available()
181213
{
182214
if (!_client)

libraries/ESP8266WiFi/src/WiFiClient.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include <memory>
2929
#include "include/slist.h"
3030

31+
#define WIFICLIENT_MAX_PACKET_SIZE 1460
32+
3133
class ClientContext;
3234
class WiFiServer;
3335

@@ -46,6 +48,7 @@ class WiFiClient : public Client, public SList<WiFiClient> {
4648
virtual int connect(const char *host, uint16_t port);
4749
virtual size_t write(uint8_t);
4850
virtual size_t write(const uint8_t *buf, size_t size);
51+
size_t write_P(PGM_P buf, size_t size);
4952
template <typename T>
5053
size_t write(T& source, size_t unitSize);
5154

@@ -65,16 +68,16 @@ class WiFiClient : public Client, public SList<WiFiClient> {
6568
static void setLocalPortStart(uint16_t port) { _localPort = port; }
6669

6770
template<typename T> size_t write(T &src){
68-
uint8_t obuf[1460];
71+
uint8_t obuf[WIFICLIENT_MAX_PACKET_SIZE];
6972
size_t doneLen = 0;
7073
size_t sentLen;
7174
int i;
7275

73-
while (src.available() > 1460){
74-
src.read(obuf, 1460);
75-
sentLen = write(obuf, 1460);
76+
while (src.available() > WIFICLIENT_MAX_PACKET_SIZE){
77+
src.read(obuf, WIFICLIENT_MAX_PACKET_SIZE);
78+
sentLen = write(obuf, WIFICLIENT_MAX_PACKET_SIZE);
7679
doneLen = doneLen + sentLen;
77-
if(sentLen != 1460){
80+
if(sentLen != WIFICLIENT_MAX_PACKET_SIZE){
7881
return doneLen;
7982
}
8083
}

0 commit comments

Comments
 (0)