@@ -132,8 +132,8 @@ TC6_Arduino_10BASE_T1S_UDP::TC6_Arduino_10BASE_T1S_UDP(TC6_Io * tc6_io)
132
132
, _udp_pcb{nullptr }
133
133
, _remote_ip{0 ,0 ,0 ,0 }
134
134
, _remote_port{0 }
135
- , _udp_rx_data{ nullptr }
136
- , _udp_rx_data_len {0 }
135
+ , _send_to_ip{ 0 , 0 , 0 , 0 }
136
+ , _send_to_port {0 }
137
137
{
138
138
_lw.io = tc6_io;
139
139
}
@@ -277,7 +277,7 @@ uint8_t TC6_Arduino_10BASE_T1S_UDP::begin(uint16_t port)
277
277
_udp_pcb = udp_new ();
278
278
279
279
/* Bind specified port to all local interfaces. */
280
- err_t err = udp_bind (_udp_pcb, IP_ADDR_ANY, port);
280
+ err_t const err = udp_bind (_udp_pcb, IP_ADDR_ANY, port);
281
281
if (err != ERR_OK)
282
282
return 0 ;
283
283
@@ -289,13 +289,26 @@ uint8_t TC6_Arduino_10BASE_T1S_UDP::begin(uint16_t port)
289
289
290
290
void TC6_Arduino_10BASE_T1S_UDP::stop ()
291
291
{
292
- /* TODO */
292
+ if (_udp_pcb != nullptr )
293
+ {
294
+ udp_disconnect (_udp_pcb);
295
+ udp_remove (_udp_pcb);
296
+ _udp_pcb = nullptr ;
297
+ }
293
298
}
294
299
295
300
int TC6_Arduino_10BASE_T1S_UDP::beginPacket (IPAddress ip, uint16_t port)
296
301
{
297
- /* TODO */
298
- return 0 ;
302
+ if (_udp_pcb == nullptr )
303
+ return 0 ;
304
+
305
+ _send_to_ip = ip;
306
+ _send_to_port = port;
307
+
308
+ /* Make sure that the transmit data buffer is empty. */
309
+ _tx_data.clear ();
310
+
311
+ return 1 ;
299
312
}
300
313
301
314
int TC6_Arduino_10BASE_T1S_UDP::beginPacket (const char *host, uint16_t port)
@@ -306,61 +319,91 @@ int TC6_Arduino_10BASE_T1S_UDP::beginPacket(const char *host, uint16_t port)
306
319
307
320
int TC6_Arduino_10BASE_T1S_UDP::endPacket ()
308
321
{
309
- /* TODO */
310
- return 0 ;
322
+ if (_udp_pcb == nullptr )
323
+ return 0 ;
324
+
325
+ /* Convert to IP address required for LWIP. */
326
+ ip_addr_t ipaddr;
327
+ IP_ADDR4 (&ipaddr, _send_to_ip[0 ], _send_to_ip[1 ], _send_to_ip[2 ], _send_to_ip[3 ]);
328
+
329
+ /* Allocate pbuf structure. */
330
+ struct pbuf * p = pbuf_alloc (PBUF_TRANSPORT, _tx_data.size (), PBUF_RAM);
331
+ if (!p)
332
+ return 0 ;
333
+
334
+ /* Copy data from transmit buffer over. */
335
+ err_t err = pbuf_take (p, _tx_data.data (), _tx_data.size ());
336
+ if (err != ERR_OK)
337
+ return -1 ;
338
+
339
+ /* Empty our transmit buffer. */
340
+ _tx_data.clear ();
341
+
342
+ /* Send UDP packet. */
343
+ err = udp_sendto (_udp_pcb, p, &ipaddr, _send_to_port);
344
+ if (err != ERR_OK)
345
+ return -1 ;
346
+
347
+ /* Free pbuf */
348
+ pbuf_free (p);
349
+
350
+ return 1 ;
311
351
}
312
352
313
353
size_t TC6_Arduino_10BASE_T1S_UDP::write (uint8_t data)
314
354
{
315
- /* TODO */
316
- return 0 ;
355
+ _tx_data. push_back (data);
356
+ return 1 ;
317
357
}
318
358
319
359
size_t TC6_Arduino_10BASE_T1S_UDP::write (const uint8_t * buffer, size_t size)
320
360
{
321
- /* TODO */
322
- return 0 ;
361
+ _tx_data.reserve (_tx_data.size () + size);
362
+ std::copy (buffer, buffer + size, std::back_inserter (_tx_data));
363
+ return size;
323
364
}
324
365
325
366
int TC6_Arduino_10BASE_T1S_UDP::parsePacket ()
326
367
{
327
- /* TODO */
328
- return _udp_rx_data_len;
368
+ return available ();
329
369
}
330
370
331
371
int TC6_Arduino_10BASE_T1S_UDP::available ()
332
372
{
333
- /* TODO */
334
- return _udp_rx_data_len;
373
+ return _rx_data.size ();
335
374
}
336
375
337
376
int TC6_Arduino_10BASE_T1S_UDP::read ()
338
377
{
339
- /* TODO */
340
- return 0 ;
378
+ uint8_t const data = _rx_data.front ();
379
+ _rx_data.pop_front ();
380
+ return data;
341
381
}
342
382
343
383
int TC6_Arduino_10BASE_T1S_UDP::read (unsigned char * buffer, size_t len)
344
384
{
345
- /* TODO */
346
- return 0 ;
385
+ size_t bytes_read = 0 ;
386
+ for (; bytes_read < len && !_rx_data.empty (); bytes_read++)
387
+ {
388
+ buffer[bytes_read] = _rx_data.front ();
389
+ _rx_data.pop_front ();
390
+ }
391
+ return bytes_read;
347
392
}
348
393
349
394
int TC6_Arduino_10BASE_T1S_UDP::read (char * buffer, size_t len)
350
395
{
351
- /* TODO */
352
- return 0 ;
396
+ return read ((unsigned char *)buffer, len);
353
397
}
354
398
355
399
int TC6_Arduino_10BASE_T1S_UDP::peek ()
356
400
{
357
- /* TODO */
358
- return 0 ;
401
+ return _rx_data.front ();
359
402
}
360
403
361
404
void TC6_Arduino_10BASE_T1S_UDP::flush ()
362
405
{
363
- /* TODO */
406
+ /* Nothing to be done. */
364
407
}
365
408
366
409
IPAddress TC6_Arduino_10BASE_T1S_UDP::remoteIP ()
@@ -382,16 +425,11 @@ void TC6_Arduino_10BASE_T1S_UDP::onUdpRawRecv(struct udp_pcb *pcb, struct pbuf *
382
425
ip4_addr4 (addr));
383
426
_remote_port = port;
384
427
385
- /* TODO: very pre-eliminary. Need to buffer received data somewhere. */
386
- if (_udp_rx_data)
387
- delete[] _udp_rx_data;
388
-
389
- /* Create data buffer for received message. */
390
- _udp_rx_data = new uint8_t [p->len ]; // Note: There's also "tot_len" - how does that fit in here?
391
428
/* Copy data into buffer. */
392
- memcpy (_udp_rx_data, p->payload , p->len );
393
- /* Update the length field. */
394
- _udp_rx_data_len = 0 ;
429
+ std::copy ((uint8_t *)p->payload ,
430
+ (uint8_t *)p->payload + p->len ,
431
+ std::back_inserter (_rx_data));
432
+
395
433
/* Free pbuf */
396
434
pbuf_free (p);
397
435
}
0 commit comments