From 664d92fbd04cabfdf21e96f5cf174219db64ada4 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Thu, 20 Aug 2015 23:43:01 -0400 Subject: [PATCH 1/3] add toCharArray() to IPAddress class --- cores/esp8266/IPAddress.cpp | 14 ++++++++++++++ cores/esp8266/IPAddress.h | 1 + 2 files changed, 15 insertions(+) diff --git a/cores/esp8266/IPAddress.cpp b/cores/esp8266/IPAddress.cpp index dea1d18a9..dff91d8af 100644 --- a/cores/esp8266/IPAddress.cpp +++ b/cores/esp8266/IPAddress.cpp @@ -64,3 +64,17 @@ size_t IPAddress::printTo(Print& p) const { return n; } +char *IPAddress::toCharArray() +{ + static char szRet[20]; + String str = String(_address.bytes[0]); + str += "."; + str += String(_address.bytes[1]); + str += "."; + str += String(_address.bytes[2]); + str += "."; + str += String(_address.bytes[3]); + str.toCharArray(szRet, 20); + return szRet; +} + diff --git a/cores/esp8266/IPAddress.h b/cores/esp8266/IPAddress.h index 73c6cbdf4..21e775ef5 100644 --- a/cores/esp8266/IPAddress.h +++ b/cores/esp8266/IPAddress.h @@ -70,6 +70,7 @@ class IPAddress: public Printable { IPAddress& operator=(uint32_t address); virtual size_t printTo(Print& p) const; + char * toCharArray(); friend class EthernetClass; friend class UDP; From b28e879af6d544152bba7125364405439c578617 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Fri, 21 Aug 2015 11:07:26 -0400 Subject: [PATCH 2/3] change toCharArray() to toString() --- cores/esp8266/IPAddress.cpp | 15 ++++----------- cores/esp8266/IPAddress.h | 3 ++- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/cores/esp8266/IPAddress.cpp b/cores/esp8266/IPAddress.cpp index dff91d8af..834889749 100644 --- a/cores/esp8266/IPAddress.cpp +++ b/cores/esp8266/IPAddress.cpp @@ -64,17 +64,10 @@ size_t IPAddress::printTo(Print& p) const { return n; } -char *IPAddress::toCharArray() +String IPAddress::toString() { - static char szRet[20]; - String str = String(_address.bytes[0]); - str += "."; - str += String(_address.bytes[1]); - str += "."; - str += String(_address.bytes[2]); - str += "."; - str += String(_address.bytes[3]); - str.toCharArray(szRet, 20); - return szRet; + char szRet[16]; + sprintf(szRet,"%u.%u.%u.%u", _address.bytes[0], _address.bytes[1], _address.bytes[2], _address.bytes[3]); + return String(szRet); } diff --git a/cores/esp8266/IPAddress.h b/cores/esp8266/IPAddress.h index 21e775ef5..b563c7044 100644 --- a/cores/esp8266/IPAddress.h +++ b/cores/esp8266/IPAddress.h @@ -21,6 +21,7 @@ #define IPAddress_h #include +#include #include // A class to make it easier to handle and pass around IP addresses @@ -70,7 +71,7 @@ class IPAddress: public Printable { IPAddress& operator=(uint32_t address); virtual size_t printTo(Print& p) const; - char * toCharArray(); + String toString(); friend class EthernetClass; friend class UDP; From e89ae46a6bcfc37c824fe46d45ef58bbf1159e36 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Sat, 22 Aug 2015 00:25:28 -0400 Subject: [PATCH 3/3] 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; } }