Skip to content

Commit 5090bb5

Browse files
committed
Add TX buffer to WiFiUDP, rename _buffer to _recvBuffer
1 parent a9cfad0 commit 5090bb5

File tree

2 files changed

+35
-21
lines changed

2 files changed

+35
-21
lines changed

src/WiFiUdp.cpp

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ WiFiUDP::WiFiUDP()
4141
_rcvSize = 0;
4242
_rcvPort = 0;
4343
_rcvIP = 0;
44+
_sndSize = 0;
4445
}
4546

4647
/* Start WiFiUDP socket, listening at local port PORT */
@@ -55,6 +56,7 @@ uint8_t WiFiUDP::begin(uint16_t port)
5556
_rcvSize = 0;
5657
_rcvPort = 0;
5758
_rcvIP = 0;
59+
_sndSize = 0;
5860

5961
// Initialize socket address structure.
6062
addr.sin_family = AF_INET;
@@ -67,7 +69,7 @@ uint8_t WiFiUDP::begin(uint16_t port)
6769
}
6870

6971
// Add socket buffer handler:
70-
socketBufferRegister(_socket, &_flag, &_head, &_tail, (uint8 *)_buffer);
72+
socketBufferRegister(_socket, &_flag, &_head, &_tail, (uint8 *)_recvBuffer);
7173
setsockopt(_socket, SOL_SOCKET, SO_SET_UDP_SEND_CALLBACK, &u32EnableCallbacks, 0);
7274

7375
// Bind socket:
@@ -134,6 +136,7 @@ int WiFiUDP::beginPacket(const char *host, uint16_t port)
134136
if (WiFi.hostByName(host, ip)) {
135137
_sndIP = ip;
136138
_sndPort = port;
139+
_sndSize = 0;
137140
}
138141

139142
return 0;
@@ -143,21 +146,12 @@ int WiFiUDP::beginPacket(IPAddress ip, uint16_t port)
143146
{
144147
_sndIP = ip;
145148
_sndPort = port;
149+
_sndSize = 0;
146150

147151
return 1;
148152
}
149153

150154
int WiFiUDP::endPacket()
151-
{
152-
return 1;
153-
}
154-
155-
size_t WiFiUDP::write(uint8_t byte)
156-
{
157-
return write(&byte, 1);
158-
}
159-
160-
size_t WiFiUDP::write(const uint8_t *buffer, size_t size)
161155
{
162156
struct sockaddr_in addr;
163157

@@ -169,7 +163,7 @@ size_t WiFiUDP::write(const uint8_t *buffer, size_t size)
169163
addr.sin_port = _htons(_sndPort);
170164
addr.sin_addr.s_addr = _sndIP;
171165

172-
if (sendto(_socket, (void *)buffer, size, 0,
166+
if (sendto(_socket, (void *)_sndBuffer, _sndSize, 0,
173167
(struct sockaddr *)&addr, sizeof(addr)) < 0) {
174168
// Network led OFF (rev A then rev B).
175169
m2m_periph_gpio_set_val(M2M_PERIPH_GPIO16, 1);
@@ -181,6 +175,24 @@ size_t WiFiUDP::write(const uint8_t *buffer, size_t size)
181175
m2m_periph_gpio_set_val(M2M_PERIPH_GPIO16, 1);
182176
m2m_periph_gpio_set_val(M2M_PERIPH_GPIO5, 1);
183177

178+
return 1;
179+
}
180+
181+
size_t WiFiUDP::write(uint8_t byte)
182+
{
183+
return write(&byte, 1);
184+
}
185+
186+
size_t WiFiUDP::write(const uint8_t *buffer, size_t size)
187+
{
188+
if ((size + _sndSize) > sizeof(_sndBuffer)) {
189+
size = sizeof(_sndBuffer) - _sndSize;
190+
}
191+
192+
memcpy(_sndBuffer + _sndSize, buffer, size);
193+
194+
_sndSize += size;
195+
184196
return size;
185197
}
186198

@@ -193,10 +205,10 @@ int WiFiUDP::parsePacket()
193205
return _rcvSize;
194206
}
195207
if (_head != _tail) {
196-
_rcvSize = ((uint16_t)_buffer[_tail] << 8) + (uint16_t)_buffer[_tail + 1];
197-
_rcvPort = ((uint16_t)_buffer[_tail + 2] << 8) + (uint16_t)_buffer[_tail + 3];
198-
_rcvIP = ((uint32_t)_buffer[_tail + 4] << 24) + ((uint32_t)_buffer[_tail + 5] << 16) +
199-
((uint32_t)_buffer[_tail + 6] << 8) + (uint32_t)_buffer[_tail + 7];
208+
_rcvSize = ((uint16_t)_recvBuffer[_tail] << 8) + (uint16_t)_recvBuffer[_tail + 1];
209+
_rcvPort = ((uint16_t)_recvBuffer[_tail + 2] << 8) + (uint16_t)_recvBuffer[_tail + 3];
210+
_rcvIP = ((uint32_t)_recvBuffer[_tail + 4] << 24) + ((uint32_t)_recvBuffer[_tail + 5] << 16) +
211+
((uint32_t)_recvBuffer[_tail + 6] << 8) + (uint32_t)_recvBuffer[_tail + 7];
200212
_tail += SOCKET_BUFFER_UDP_HEADER_SIZE;
201213
return _rcvSize;
202214
}
@@ -230,7 +242,7 @@ int WiFiUDP::read(unsigned char* buf, size_t size)
230242
}
231243

232244
for (uint32_t i = 0; i < size_tmp; ++i) {
233-
buf[i] = _buffer[_tail++];
245+
buf[i] = _recvBuffer[_tail++];
234246
_rcvSize--;
235247

236248
if (_tail == _head) {
@@ -243,9 +255,9 @@ int WiFiUDP::read(unsigned char* buf, size_t size)
243255
// setup buffer and buffer size to transfer the remainder of the current packet
244256
// or next received packet
245257
if (hif_small_xfer) {
246-
recvfrom(_socket, _buffer, SOCKET_BUFFER_MTU, 0);
258+
recvfrom(_socket, _recvBuffer, SOCKET_BUFFER_MTU, 0);
247259
} else {
248-
recvfrom(_socket, _buffer + SOCKET_BUFFER_UDP_HEADER_SIZE, SOCKET_BUFFER_MTU, 0);
260+
recvfrom(_socket, _recvBuffer + SOCKET_BUFFER_UDP_HEADER_SIZE, SOCKET_BUFFER_MTU, 0);
249261
}
250262
m2m_wifi_handle_events(NULL);
251263
}
@@ -259,7 +271,7 @@ int WiFiUDP::peek()
259271
if (!available())
260272
return -1;
261273

262-
return _buffer[_tail];
274+
return _recvBuffer[_tail];
263275
}
264276

265277
void WiFiUDP::flush()

src/WiFiUdp.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ class WiFiUDP : public UDP {
2828
uint32_t _flag;
2929
uint32_t _head;
3030
uint32_t _tail;
31-
uint8_t _buffer[SOCKET_BUFFER_UDP_SIZE];
31+
uint8_t _recvBuffer[SOCKET_BUFFER_UDP_SIZE];
3232
uint16_t _rcvSize;
3333
uint16_t _rcvPort;
3434
uint32_t _rcvIP;
35+
uint8_t _sndBuffer[SOCKET_BUFFER_UDP_SIZE];
36+
uint16_t _sndSize;
3537
uint16_t _sndPort;
3638
uint32_t _sndIP;
3739

0 commit comments

Comments
 (0)