101 lines
2.2 KiB
C
101 lines
2.2 KiB
C
#include "PicoW_UDP.h"
|
|
|
|
#include <stdio.h>
|
|
#include <pico/cyw43_arch.h>
|
|
#include <lwip/udp.h>
|
|
#include "Config.h"
|
|
|
|
inline int udp_server_init(struct udp_server_t *udp_server)
|
|
{
|
|
udp_server->pcb = udp_new();
|
|
if(udp_server->pcb == NULL)
|
|
{
|
|
puts("Error creating UDP server pcb.");
|
|
return PICO_ERROR_GENERIC;
|
|
}
|
|
|
|
err_t err = udp_bind(udp_server->pcb, IP_ADDR_ANY, UDP_SERVER_PORT);
|
|
if(err)
|
|
{
|
|
printf("Error binding UDP server: %d\n", err);
|
|
return err;
|
|
}
|
|
|
|
return PICO_OK;
|
|
}
|
|
|
|
inline void udp_server_exit(struct udp_server_t *udp_server)
|
|
{
|
|
if(udp_server->pcb)
|
|
{
|
|
udp_remove(udp_server->pcb);
|
|
udp_server->pcb = NULL;
|
|
}
|
|
}
|
|
|
|
int udp_server_send(struct udp_server_t *udp_server, void *data, uint16_t len)
|
|
{
|
|
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
|
|
if(p == NULL)
|
|
{
|
|
puts("Pbuf memory allocation error");
|
|
return PICO_ERROR_INSUFFICIENT_RESOURCES;
|
|
}
|
|
|
|
memcpy((uint8_t *)p->payload, data, len);
|
|
|
|
err_t err = udp_sendto(udp_server->pcb, p, IP_ADDR_ANY, UDP_CLIENT_PORT);
|
|
|
|
pbuf_free(p);
|
|
|
|
if(err)
|
|
{
|
|
printf("UDP send error : %d\n", err);
|
|
return err;
|
|
}
|
|
|
|
return PICO_OK;
|
|
}
|
|
|
|
static inline void builtin_udp_client_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
|
|
{
|
|
struct udp_client_t *udp_client = arg;
|
|
|
|
if(p->len != UDP_CLIENT_DATA_LEN)
|
|
return;
|
|
|
|
memcpy(udp_client->data, p->payload, UDP_CLIENT_DATA_LEN);
|
|
|
|
pbuf_free(p);
|
|
}
|
|
|
|
inline int udp_client_init(struct udp_client_t *udp_client, udp_recv_fn callback)
|
|
{
|
|
udp_client->pcb = udp_new();
|
|
if(udp_client->pcb == NULL)
|
|
{
|
|
puts("Error creating UDP server pcb.");
|
|
return PICO_ERROR_GENERIC;
|
|
}
|
|
|
|
err_t err = udp_bind(udp_client->pcb, IP_ADDR_ANY, UDP_CLIENT_PORT);
|
|
if(err)
|
|
{
|
|
printf("Error binding UDP server: %d\n", err);
|
|
return err;
|
|
}
|
|
|
|
udp_recv(udp_client->pcb, callback ? callback : builtin_udp_client_callback, &udp_client);
|
|
|
|
return PICO_OK;
|
|
}
|
|
|
|
inline void udp_client_exit(struct udp_client_t *udp_client)
|
|
{
|
|
if(udp_client->pcb)
|
|
{
|
|
udp_remove(udp_client->pcb);
|
|
udp_client->pcb = NULL;
|
|
}
|
|
}
|