From e89ae46a6bcfc37c824fe46d45ef58bbf1159e36 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Sat, 22 Aug 2015 00:25:28 -0400 Subject: [PATCH] add WiFiClient::write_P to be used with PROGMEM --- libraries/ESP8266WiFi/src/WiFiClient.cpp | 32 ++++++++++++++++++++++++ libraries/ESP8266WiFi/src/WiFiClient.h | 13 ++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index 50e8d1123..936a7a289 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -177,6 +177,38 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size) return _client->write(reinterpret_cast(buf), size); } +size_t WiFiClient::write_P(PGM_P buf, size_t size) +{ + if (!_client || !size) + { + return 0; + } + + char chunkUnit[WIFICLIENT_MAX_PACKET_SIZE + 1]; + chunkUnit[WIFICLIENT_MAX_PACKET_SIZE] = '\0'; + while (buf != NULL) + { + size_t chunkUnitLen; + PGM_P chunkNext; + chunkNext = (PGM_P)memccpy_P((void*)chunkUnit, (PGM_VOID_P)buf, 0, WIFICLIENT_MAX_PACKET_SIZE); + if (chunkNext == NULL) + { + // no terminator, more data available + buf += WIFICLIENT_MAX_PACKET_SIZE; + chunkUnitLen = WIFICLIENT_MAX_PACKET_SIZE; + } + else + { + // reached terminator + chunkUnitLen = chunkNext - buf; + buf = NULL; + } + if (size < WIFICLIENT_MAX_PACKET_SIZE) chunkUnitLen = size; + _client->write((const char*)chunkUnit, chunkUnitLen); + } + return size; +} + int WiFiClient::available() { if (!_client) diff --git a/libraries/ESP8266WiFi/src/WiFiClient.h b/libraries/ESP8266WiFi/src/WiFiClient.h index 161ca0be1..746f25ac4 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.h +++ b/libraries/ESP8266WiFi/src/WiFiClient.h @@ -28,6 +28,8 @@ #include #include "include/slist.h" +#define WIFICLIENT_MAX_PACKET_SIZE 1460 + class ClientContext; class WiFiServer; @@ -46,6 +48,7 @@ public: virtual int connect(const char *host, uint16_t port); virtual size_t write(uint8_t); virtual size_t write(const uint8_t *buf, size_t size); + size_t write_P(PGM_P buf, size_t size); template size_t write(T& source, size_t unitSize); @@ -65,16 +68,16 @@ public: static void setLocalPortStart(uint16_t port) { _localPort = port; } template size_t write(T &src){ - uint8_t obuf[1460]; + uint8_t obuf[WIFICLIENT_MAX_PACKET_SIZE]; size_t doneLen = 0; size_t sentLen; int i; - while (src.available() > 1460){ - src.read(obuf, 1460); - sentLen = write(obuf, 1460); + while (src.available() > WIFICLIENT_MAX_PACKET_SIZE){ + src.read(obuf, WIFICLIENT_MAX_PACKET_SIZE); + sentLen = write(obuf, WIFICLIENT_MAX_PACKET_SIZE); doneLen = doneLen + sentLen; - if(sentLen != 1460){ + if(sentLen != WIFICLIENT_MAX_PACKET_SIZE){ return doneLen; } }