PicoW_UDP/src/udp/udp_client.c

63 lines
1.6 KiB
C

#include "udp_client.h"
#include <stdio.h>
udp_client_t udp_client;
static inline void handle_receive(struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
if(p->len >= 2)
{
uint8_t packet_number = ((uint8_t*)p->payload)[0];
uint8_t instruction = ((uint8_t*)p->payload)[1];
udp_client.message_callback(packet_number, instruction, addr, port);
}
pbuf_free(p);
}
static void udp_receive_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
udp_client_t *udp_client_received_data = (udp_client_t *)arg;
handle_receive(p, addr, port);
}
// Default callback func
static void default_message_callback(uint8_t packet_number, uint8_t instruction, const ip_addr_t *addr, u16_t port)
{
printf("Reçu: packet=%d, instruction=%d depuis %s:%d\n", packet_number, instruction, ipaddr_ntoa(addr), port);
}
void udp_client_init(int port, message_callback_t callback)
{
udp_client.message_callback = callback ? callback : default_message_callback;
udp_client.pcb = udp_new();
if(udp_client.pcb == NULL)
{
puts("Error creating UDP client");
return;
}
udp_recv(udp_client.pcb, udp_receive_callback, &udp_client);
err_t err = udp_bind(udp_client.pcb, IP_ADDR_ANY, port);
if(err != ERR_OK)
{
printf("Erreur bind UDP client: %d\n", err);
return;
}
printf("UDP client started on port %d\n", port);
}
void udp_client_exit(void)
{
if(udp_client.pcb)
{
udp_remove(udp_client.pcb);
udp_client.pcb = NULL;
}
}