Skip to content

Commit 2c7897d

Browse files
committed
Implement UDP communication via LWIP for TC6 library.
1 parent b1a1654 commit 2c7897d

File tree

2 files changed

+81
-36
lines changed

2 files changed

+81
-36
lines changed

Diff for: src/microchip/TC6_Arduino_10BASE_T1S_UDP.cpp

+72-34
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ TC6_Arduino_10BASE_T1S_UDP::TC6_Arduino_10BASE_T1S_UDP(TC6_Io * tc6_io)
132132
, _udp_pcb{nullptr}
133133
, _remote_ip{0,0,0,0}
134134
, _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}
137137
{
138138
_lw.io = tc6_io;
139139
}
@@ -277,7 +277,7 @@ uint8_t TC6_Arduino_10BASE_T1S_UDP::begin(uint16_t port)
277277
_udp_pcb = udp_new();
278278

279279
/* 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);
281281
if (err != ERR_OK)
282282
return 0;
283283

@@ -289,13 +289,26 @@ uint8_t TC6_Arduino_10BASE_T1S_UDP::begin(uint16_t port)
289289

290290
void TC6_Arduino_10BASE_T1S_UDP::stop()
291291
{
292-
/* TODO */
292+
if (_udp_pcb != nullptr)
293+
{
294+
udp_disconnect(_udp_pcb);
295+
udp_remove(_udp_pcb);
296+
_udp_pcb = nullptr;
297+
}
293298
}
294299

295300
int TC6_Arduino_10BASE_T1S_UDP::beginPacket(IPAddress ip, uint16_t port)
296301
{
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;
299312
}
300313

301314
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)
306319

307320
int TC6_Arduino_10BASE_T1S_UDP::endPacket()
308321
{
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;
311351
}
312352

313353
size_t TC6_Arduino_10BASE_T1S_UDP::write(uint8_t data)
314354
{
315-
/* TODO */
316-
return 0;
355+
_tx_data.push_back(data);
356+
return 1;
317357
}
318358

319359
size_t TC6_Arduino_10BASE_T1S_UDP::write(const uint8_t * buffer, size_t size)
320360
{
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;
323364
}
324365

325366
int TC6_Arduino_10BASE_T1S_UDP::parsePacket()
326367
{
327-
/* TODO */
328-
return _udp_rx_data_len;
368+
return available();
329369
}
330370

331371
int TC6_Arduino_10BASE_T1S_UDP::available()
332372
{
333-
/* TODO */
334-
return _udp_rx_data_len;
373+
return _rx_data.size();
335374
}
336375

337376
int TC6_Arduino_10BASE_T1S_UDP::read()
338377
{
339-
/* TODO */
340-
return 0;
378+
uint8_t const data = _rx_data.front();
379+
_rx_data.pop_front();
380+
return data;
341381
}
342382

343383
int TC6_Arduino_10BASE_T1S_UDP::read(unsigned char* buffer, size_t len)
344384
{
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;
347392
}
348393

349394
int TC6_Arduino_10BASE_T1S_UDP::read(char* buffer, size_t len)
350395
{
351-
/* TODO */
352-
return 0;
396+
return read((unsigned char*)buffer, len);
353397
}
354398

355399
int TC6_Arduino_10BASE_T1S_UDP::peek()
356400
{
357-
/* TODO */
358-
return 0;
401+
return _rx_data.front();
359402
}
360403

361404
void TC6_Arduino_10BASE_T1S_UDP::flush()
362405
{
363-
/* TODO */
406+
/* Nothing to be done. */
364407
}
365408

366409
IPAddress TC6_Arduino_10BASE_T1S_UDP::remoteIP()
@@ -382,16 +425,11 @@ void TC6_Arduino_10BASE_T1S_UDP::onUdpRawRecv(struct udp_pcb *pcb, struct pbuf *
382425
ip4_addr4(addr));
383426
_remote_port = port;
384427

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?
391428
/* 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+
395433
/* Free pbuf */
396434
pbuf_free(p);
397435
}

Diff for: src/microchip/TC6_Arduino_10BASE_T1S_UDP.h

+9-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626

2727
#include <stdint.h>
2828

29+
#include <deque>
30+
#include <vector>
31+
2932
#include "lib/liblwip/include/lwip/udp.h"
3033
#include "lib/liblwip/include/lwip/netif.h"
3134
#include "lib/liblwip/include/lwip/ip_addr.h"
@@ -133,12 +136,16 @@ class TC6_Arduino_10BASE_T1S_UDP : public Arduino_10BASE_T1S_UDP
133136
TC6LwIP_t _lw;
134137
T1SPlcaSettings _t1s_plca_settings;
135138

139+
/* arduino:UDP */
136140
struct udp_pcb * _udp_pcb;
141+
137142
IPAddress _remote_ip;
138143
uint16_t _remote_port;
144+
std::deque<uint8_t> _rx_data;
139145

140-
uint8_t * _udp_rx_data;
141-
size_t _udp_rx_data_len;
146+
IPAddress _send_to_ip;
147+
uint16_t _send_to_port;
148+
std::vector<uint8_t> _tx_data;
142149
};
143150

144151
/**************************************************************************************

0 commit comments

Comments
 (0)