@@ -41,6 +41,7 @@ WiFiUDP::WiFiUDP()
41
41
_rcvSize = 0 ;
42
42
_rcvPort = 0 ;
43
43
_rcvIP = 0 ;
44
+ _sndSize = 0 ;
44
45
}
45
46
46
47
/* Start WiFiUDP socket, listening at local port PORT */
@@ -55,6 +56,7 @@ uint8_t WiFiUDP::begin(uint16_t port)
55
56
_rcvSize = 0 ;
56
57
_rcvPort = 0 ;
57
58
_rcvIP = 0 ;
59
+ _sndSize = 0 ;
58
60
59
61
// Initialize socket address structure.
60
62
addr.sin_family = AF_INET;
@@ -67,7 +69,7 @@ uint8_t WiFiUDP::begin(uint16_t port)
67
69
}
68
70
69
71
// Add socket buffer handler:
70
- socketBufferRegister (_socket, &_flag, &_head, &_tail, (uint8 *)_buffer );
72
+ socketBufferRegister (_socket, &_flag, &_head, &_tail, (uint8 *)_recvBuffer );
71
73
setsockopt (_socket, SOL_SOCKET, SO_SET_UDP_SEND_CALLBACK, &u32EnableCallbacks, 0 );
72
74
73
75
// Bind socket:
@@ -134,6 +136,7 @@ int WiFiUDP::beginPacket(const char *host, uint16_t port)
134
136
if (WiFi.hostByName (host, ip)) {
135
137
_sndIP = ip;
136
138
_sndPort = port;
139
+ _sndSize = 0 ;
137
140
}
138
141
139
142
return 0 ;
@@ -143,21 +146,12 @@ int WiFiUDP::beginPacket(IPAddress ip, uint16_t port)
143
146
{
144
147
_sndIP = ip;
145
148
_sndPort = port;
149
+ _sndSize = 0 ;
146
150
147
151
return 1 ;
148
152
}
149
153
150
154
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)
161
155
{
162
156
struct sockaddr_in addr;
163
157
@@ -169,7 +163,7 @@ size_t WiFiUDP::write(const uint8_t *buffer, size_t size)
169
163
addr.sin_port = _htons (_sndPort);
170
164
addr.sin_addr .s_addr = _sndIP;
171
165
172
- if (sendto (_socket, (void *)buffer, size , 0 ,
166
+ if (sendto (_socket, (void *)_sndBuffer, _sndSize , 0 ,
173
167
(struct sockaddr *)&addr, sizeof (addr)) < 0 ) {
174
168
// Network led OFF (rev A then rev B).
175
169
m2m_periph_gpio_set_val (M2M_PERIPH_GPIO16, 1 );
@@ -181,6 +175,24 @@ size_t WiFiUDP::write(const uint8_t *buffer, size_t size)
181
175
m2m_periph_gpio_set_val (M2M_PERIPH_GPIO16, 1 );
182
176
m2m_periph_gpio_set_val (M2M_PERIPH_GPIO5, 1 );
183
177
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
+
184
196
return size;
185
197
}
186
198
@@ -193,10 +205,10 @@ int WiFiUDP::parsePacket()
193
205
return _rcvSize;
194
206
}
195
207
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 ];
200
212
_tail += SOCKET_BUFFER_UDP_HEADER_SIZE;
201
213
return _rcvSize;
202
214
}
@@ -230,7 +242,7 @@ int WiFiUDP::read(unsigned char* buf, size_t size)
230
242
}
231
243
232
244
for (uint32_t i = 0 ; i < size_tmp; ++i) {
233
- buf[i] = _buffer [_tail++];
245
+ buf[i] = _recvBuffer [_tail++];
234
246
_rcvSize--;
235
247
236
248
if (_tail == _head) {
@@ -243,9 +255,9 @@ int WiFiUDP::read(unsigned char* buf, size_t size)
243
255
// setup buffer and buffer size to transfer the remainder of the current packet
244
256
// or next received packet
245
257
if (hif_small_xfer) {
246
- recvfrom (_socket, _buffer , SOCKET_BUFFER_MTU, 0 );
258
+ recvfrom (_socket, _recvBuffer , SOCKET_BUFFER_MTU, 0 );
247
259
} 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 );
249
261
}
250
262
m2m_wifi_handle_events (NULL );
251
263
}
@@ -259,7 +271,7 @@ int WiFiUDP::peek()
259
271
if (!available ())
260
272
return -1 ;
261
273
262
- return _buffer [_tail];
274
+ return _recvBuffer [_tail];
263
275
}
264
276
265
277
void WiFiUDP::flush ()
0 commit comments