* fix sdmmc config * Fix warnings in EEPROM from @Curclamas * remove leftover TAG in EEPROM * Initial add of @stickbreaker i2c * Add log_n * fix warnings when log is off * i2c code clean up and reorganization * add flags to interrupt allocator * fix sdmmc config * Fix warnings in EEPROM from @Curclamas * remove leftover TAG in EEPROM * fix errors with latest IDF * fix debug optimization (#1365) incorrect optimization for debugging tick markers. * Fix some missing BT header * Change BTSerial log calls * Update BLE lib * Arduino-ESP32 release management scripted (#1515) * Calculate an absolute path for a custom partitions table (#1452) * * Arduino-ESP32 release management scripted (ready-to-merge) * * secure env for espressif/arduino-esp32 * * build tests enabled * gitter webhook enabled * * gitter room link fixed * better comment * * filepaths fixed * BT Serial adjustments * * don't run sketch builds & tests for tagged builds * Return false from WiFi.hostByName() if hostname is not resolved * Free BT Memory when BT is not used * WIFI_MODE_NULL is not supported anymore * Select some key examples to build with PlatformIO to save some time * Update BLE lib * Fixed BLE lib * Major WiFi overhaul - auto reconnect on connection loss now works - moved to event groups - some code clean up and procedure optimizations - new methods to get a more elaborate system ststus * Add cmake tests to travis * Add initial AsyncUDP * Add NetBIOS lib and fix CMake includes * Add Initial WebServer * Fix WebServer and examples * travis not quiting on build fail * Try different travis build * Update IDF to aaf1239 * Fix WPS Example * fix script permission and add some fail tests to sketch builder * Add missing space in WiFiClient::write(Stream &stream)
150 lines
4.7 KiB
C++
150 lines
4.7 KiB
C++
#ifndef ESPASYNCUDP_H
|
|
#define ESPASYNCUDP_H
|
|
|
|
#include "IPAddress.h"
|
|
#include "IPv6Address.h"
|
|
#include "Print.h"
|
|
#include <functional>
|
|
extern "C" {
|
|
#include "lwip/ip_addr.h"
|
|
#include <tcpip_adapter.h>
|
|
#include "freertos/queue.h"
|
|
#include "freertos/semphr.h"
|
|
}
|
|
|
|
class AsyncUDP;
|
|
class AsyncUDPPacket;
|
|
class AsyncUDPMessage;
|
|
struct udp_pcb;
|
|
struct pbuf;
|
|
struct netif;
|
|
|
|
typedef std::function<void(AsyncUDPPacket& packet)> AuPacketHandlerFunction;
|
|
typedef std::function<void(void * arg, AsyncUDPPacket& packet)> AuPacketHandlerFunctionWithArg;
|
|
|
|
class AsyncUDPMessage : public Print
|
|
{
|
|
protected:
|
|
uint8_t *_buffer;
|
|
size_t _index;
|
|
size_t _size;
|
|
public:
|
|
AsyncUDPMessage(size_t size=CONFIG_TCP_MSS);
|
|
virtual ~AsyncUDPMessage();
|
|
size_t write(const uint8_t *data, size_t len);
|
|
size_t write(uint8_t data);
|
|
size_t space();
|
|
uint8_t * data();
|
|
size_t length();
|
|
void flush();
|
|
operator bool()
|
|
{
|
|
return _buffer != NULL;
|
|
}
|
|
};
|
|
|
|
class AsyncUDPPacket : public Stream
|
|
{
|
|
protected:
|
|
AsyncUDP *_udp;
|
|
pbuf *_pb;
|
|
tcpip_adapter_if_t _if;
|
|
ip_addr_t _localIp;
|
|
uint16_t _localPort;
|
|
ip_addr_t _remoteIp;
|
|
uint16_t _remotePort;
|
|
uint8_t *_data;
|
|
size_t _len;
|
|
size_t _index;
|
|
public:
|
|
AsyncUDPPacket(AsyncUDP *udp, pbuf *pb, const ip_addr_t *addr, uint16_t port, struct netif * netif);
|
|
virtual ~AsyncUDPPacket();
|
|
|
|
uint8_t * data();
|
|
size_t length();
|
|
bool isBroadcast();
|
|
bool isMulticast();
|
|
bool isIPv6();
|
|
|
|
tcpip_adapter_if_t interface();
|
|
|
|
IPAddress localIP();
|
|
IPv6Address localIPv6();
|
|
uint16_t localPort();
|
|
IPAddress remoteIP();
|
|
IPv6Address remoteIPv6();
|
|
uint16_t remotePort();
|
|
|
|
size_t send(AsyncUDPMessage &message);
|
|
|
|
int available();
|
|
size_t read(uint8_t *data, size_t len);
|
|
int read();
|
|
int peek();
|
|
void flush();
|
|
|
|
size_t write(const uint8_t *data, size_t len);
|
|
size_t write(uint8_t data);
|
|
};
|
|
|
|
class AsyncUDP : public Print
|
|
{
|
|
protected:
|
|
udp_pcb *_pcb;
|
|
//xSemaphoreHandle _lock;
|
|
bool _connected;
|
|
AuPacketHandlerFunction _handler;
|
|
|
|
void _recv(udp_pcb *upcb, pbuf *pb, const ip_addr_t *addr, uint16_t port, struct netif * netif);
|
|
|
|
public:
|
|
AsyncUDP();
|
|
virtual ~AsyncUDP();
|
|
|
|
void onPacket(AuPacketHandlerFunctionWithArg cb, void * arg=NULL);
|
|
void onPacket(AuPacketHandlerFunction cb);
|
|
|
|
bool listen(const ip_addr_t *addr, uint16_t port);
|
|
bool listen(const IPAddress addr, uint16_t port);
|
|
bool listen(const IPv6Address addr, uint16_t port);
|
|
bool listen(uint16_t port);
|
|
|
|
bool listenMulticast(const ip_addr_t *addr, uint16_t port, uint8_t ttl=1, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_STA);
|
|
bool listenMulticast(const IPAddress addr, uint16_t port, uint8_t ttl=1, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_STA);
|
|
bool listenMulticast(const IPv6Address addr, uint16_t port, uint8_t ttl=1, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_STA);
|
|
|
|
bool connect(const ip_addr_t *addr, uint16_t port);
|
|
bool connect(const IPAddress addr, uint16_t port);
|
|
bool connect(const IPv6Address addr, uint16_t port);
|
|
|
|
void close();
|
|
|
|
size_t writeTo(const uint8_t *data, size_t len, const ip_addr_t *addr, uint16_t port, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_MAX);
|
|
size_t writeTo(const uint8_t *data, size_t len, const IPAddress addr, uint16_t port, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_MAX);
|
|
size_t writeTo(const uint8_t *data, size_t len, const IPv6Address addr, uint16_t port, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_MAX);
|
|
size_t write(const uint8_t *data, size_t len);
|
|
size_t write(uint8_t data);
|
|
|
|
size_t broadcastTo(uint8_t *data, size_t len, uint16_t port, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_MAX);
|
|
size_t broadcastTo(const char * data, uint16_t port, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_MAX);
|
|
size_t broadcast(uint8_t *data, size_t len);
|
|
size_t broadcast(const char * data);
|
|
|
|
size_t sendTo(AsyncUDPMessage &message, const ip_addr_t *addr, uint16_t port, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_MAX);
|
|
size_t sendTo(AsyncUDPMessage &message, const IPAddress addr, uint16_t port, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_MAX);
|
|
size_t sendTo(AsyncUDPMessage &message, const IPv6Address addr, uint16_t port, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_MAX);
|
|
size_t send(AsyncUDPMessage &message);
|
|
|
|
size_t broadcastTo(AsyncUDPMessage &message, uint16_t port, tcpip_adapter_if_t tcpip_if=TCPIP_ADAPTER_IF_MAX);
|
|
size_t broadcast(AsyncUDPMessage &message);
|
|
|
|
IPAddress listenIP();
|
|
IPv6Address listenIPv6();
|
|
bool connected();
|
|
operator bool();
|
|
|
|
static void _s_recv(void *arg, udp_pcb *upcb, pbuf *p, const ip_addr_t *addr, uint16_t port, struct netif * netif);
|
|
};
|
|
|
|
#endif
|