Skip to content

Commit 4995d03

Browse files
committed
Merge pull request #714 from martinayotte/esp8266
add toCharArray() to IPAddress class
2 parents 1d0222c + e89ae46 commit 4995d03

File tree

4 files changed

+49
-5
lines changed

4 files changed

+49
-5
lines changed

cores/esp8266/IPAddress.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,10 @@ size_t IPAddress::printTo(Print& p) const {
6464
return n;
6565
}
6666

67+
String IPAddress::toString()
68+
{
69+
char szRet[16];
70+
sprintf(szRet,"%u.%u.%u.%u", _address.bytes[0], _address.bytes[1], _address.bytes[2], _address.bytes[3]);
71+
return String(szRet);
72+
}
73+

cores/esp8266/IPAddress.h

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#define IPAddress_h
2222

2323
#include <stdint.h>
24+
#include <WString.h>
2425
#include <Printable.h>
2526

2627
// A class to make it easier to handle and pass around IP addresses
@@ -70,6 +71,7 @@ class IPAddress: public Printable {
7071
IPAddress& operator=(uint32_t address);
7172

7273
virtual size_t printTo(Print& p) const;
74+
String toString();
7375

7476
friend class EthernetClass;
7577
friend class UDP;

libraries/ESP8266WiFi/src/WiFiClient.cpp

+32
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

+8-5
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

@@ -67,16 +70,16 @@ class WiFiClient : public Client, public SList<WiFiClient> {
6770
static void setLocalPortStart(uint16_t port) { _localPort = port; }
6871

6972
template<typename T> size_t write(T &src){
70-
uint8_t obuf[1460];
73+
uint8_t obuf[WIFICLIENT_MAX_PACKET_SIZE];
7174
size_t doneLen = 0;
7275
size_t sentLen;
7376
int i;
7477

75-
while (src.available() > 1460){
76-
src.read(obuf, 1460);
77-
sentLen = write(obuf, 1460);
78+
while (src.available() > WIFICLIENT_MAX_PACKET_SIZE){
79+
src.read(obuf, WIFICLIENT_MAX_PACKET_SIZE);
80+
sentLen = write(obuf, WIFICLIENT_MAX_PACKET_SIZE);
7881
doneLen = doneLen + sentLen;
79-
if(sentLen != 1460){
82+
if(sentLen != WIFICLIENT_MAX_PACKET_SIZE){
8083
return doneLen;
8184
}
8285
}

0 commit comments

Comments
 (0)