diff --git a/libraries/WiFi/src/SecSocket.cpp b/libraries/WiFi/src/SecSocket.cpp index f9ed662..62ead18 100644 --- a/libraries/WiFi/src/SecSocket.cpp +++ b/libraries/WiFi/src/SecSocket.cpp @@ -14,16 +14,30 @@ Socket::Socket(): _status(SOCKET_STATUS_UNINITED), _last_error(CY_RSLT_SUCCESS), remote_ip(0, 0, 0, 0), - _port(0) { + _port(0), + _protocol(0) { } -void Socket::begin() { +void Socket::begin(socket_protocol_t protocol) { _last_error = Socket::global_sockets_init(); socket_assert(_last_error); + int socket_type = 0, socket_proto = 0; + + _protocol = protocol; + switch (_protocol) { + case SOCKET_PROTOCOL_TCP: + socket_type = CY_SOCKET_TYPE_STREAM; + socket_proto = CY_SOCKET_IPPROTO_TCP; + break; + case SOCKET_PROTOCOL_UDP: + socket_type = CY_SOCKET_TYPE_DGRAM; + socket_proto = CY_SOCKET_IPPROTO_UDP; + break; + } - _last_error = cy_socket_create(CY_SOCKET_DOMAIN_AF_INET, CY_SOCKET_TYPE_STREAM, - CY_SOCKET_IPPROTO_TCP, &socket); + _last_error = cy_socket_create(CY_SOCKET_DOMAIN_AF_INET, socket_type, + socket_proto, &socket); socket_assert(_last_error); _status = SOCKET_STATUS_CREATED; diff --git a/libraries/WiFi/src/SecSocket.h b/libraries/WiFi/src/SecSocket.h index a373b11..3d3a929 100644 --- a/libraries/WiFi/src/SecSocket.h +++ b/libraries/WiFi/src/SecSocket.h @@ -16,13 +16,18 @@ typedef enum { SOCKET_STATUS_ERROR = -1 } socket_status_t; +typedef enum { + SOCKET_PROTOCOL_TCP = 0, + SOCKET_PROTOCOL_UDP, +} socket_protocol_t; + class Socket { public: Socket(); - void begin(); + void begin(socket_protocol_t protocol); void end(); void setTimeout(uint32_t timeout); @@ -58,6 +63,7 @@ class Socket { IPAddress remote_ip; uint16_t _port; + socket_protocol_t _protocol; void setOptCallback(int optname, cy_socket_callback_t cback, void *arg); diff --git a/libraries/WiFi/src/WiFiClient.cpp b/libraries/WiFi/src/WiFiClient.cpp index 26cbf2f..4e32f9d 100644 --- a/libraries/WiFi/src/WiFiClient.cpp +++ b/libraries/WiFi/src/WiFiClient.cpp @@ -14,7 +14,7 @@ WiFiClient::WiFiClient() : } int WiFiClient::connect(IPAddress ip, uint16_t port) { - socket->begin(); + socket->begin(SOCKET_PROTOCOL_TCP); socket->setReceiveOptCallback(receiveCallback, this); socket->setDisconnectOptCallback(disconnectionCallback, this); @@ -23,7 +23,7 @@ int WiFiClient::connect(IPAddress ip, uint16_t port) { } int WiFiClient::connect(const char *host, uint16_t port) { - socket->begin(); + socket->begin(SOCKET_PROTOCOL_TCP); socket->setReceiveOptCallback(receiveCallback, this); socket->setDisconnectOptCallback(disconnectionCallback, this); diff --git a/libraries/WiFi/src/WiFiServer.cpp b/libraries/WiFi/src/WiFiServer.cpp index 5327500..22df914 100644 --- a/libraries/WiFi/src/WiFiServer.cpp +++ b/libraries/WiFi/src/WiFiServer.cpp @@ -9,7 +9,7 @@ WiFiServer::WiFiServer() { } void WiFiServer::begin(uint16_t port) { - socket.begin(); + socket.begin(SOCKET_PROTOCOL_TCP); socket.setTimeout(SERVER_RECV_TIMEOUT_MS); socket.setConnectOptCallback(connectionCallback, this); diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp new file mode 100644 index 0000000..4afb88f --- /dev/null +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -0,0 +1,97 @@ +#include "WiFiUdp.h" +#include + +#define udp_assert(cy_ret) if (cy_ret != CY_RSLT_SUCCESS) { \ + _status = SOCKET_STATUS_ERROR; \ + return; \ +} + +#define udp_assert_raise(cy_ret) if (cy_ret != CY_RSLT_SUCCESS) { \ + return cy_ret; \ +} + +WiFiUDP::WiFiUDP() : + client_handle(nullptr), + _status(SOCKET_STATUS_UNINITED), + _last_error(CY_RSLT_SUCCESS), + remote_ip(0, 0, 0, 0), + _port(0) { +} + +uint8_t WiFiUDP::begin(uint16_t port) { + _port = port; + + // Initialize the socket for UDP + socket.begin(SOCKET_PROTOCOL_UDP); + if (socket.status() != SOCKET_STATUS_CREATED) { + return 0; // Return 0 if socket creation fails + } + // Bind the socket to the specified port + socket.bind(port); + if (socket.status() != SOCKET_STATUS_BOUND) { + return 0; // Return 0 if binding fail + + } + return socket.status(); // Return the socket status +} + + +void WiFiUDP::stop() { + +} + +int WiFiUDP::beginPacket(IPAddress ip, uint16_t port) { + return 0; +} + +int WiFiUDP::beginPacket(const char *host, uint16_t port) { + return 0; +} + +int WiFiUDP::endPacket() { + return 0; +} + +size_t WiFiUDP::write(uint8_t) { + return 0; +} + +size_t WiFiUDP::write(const uint8_t *buffer, size_t size) { + return 0; +} + +int WiFiUDP::parsePacket() { + return 0; +} + +int WiFiUDP::available() { + return 0; +} + +int WiFiUDP::read() { + return 0; +} + +int WiFiUDP::read(unsigned char *buffer, size_t len) { + return 0; +} + +int WiFiUDP::read(char *buffer, size_t len) { + return 0; +} + +int WiFiUDP::peek() { + return 0; +} + +void WiFiUDP::flush() { + return; +} + +IPAddress WiFiUDP::remoteIP() { + return IPAddress(); +} + +uint16_t WiFiUDP::remotePort() { + return 0; +} diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h new file mode 100644 index 0000000..0cf6510 --- /dev/null +++ b/libraries/WiFi/src/WiFiUdp.h @@ -0,0 +1,49 @@ +#ifndef WIFI_UDP_H +#define WIFI_UDP_H + +#include +#include +#include +#include "WiFiClient.h" +#include "WiFi.h" +#include "WiFiServer.h" +#include "SecSocket.h" + +class WiFiUDP: public arduino::UDP { +public: + WiFiUDP(); + uint8_t begin(uint16_t); + + // yet to implement these functions + void stop(); + int beginPacket(IPAddress ip, uint16_t port); + int beginPacket(const char *host, uint16_t port); + int endPacket(); + size_t write(uint8_t); + size_t write(const uint8_t *buffer, size_t size); + + using Print::write; + int parsePacket(); + int available(); + int read(); + int read(unsigned char *buffer, size_t len); + int read(char *buffer, size_t len); + int peek(); + void flush(); + IPAddress remoteIP(); + uint16_t remotePort(); + + + +private: + Socket socket; + + cy_socket_t client_handle; + socket_status_t _status; + cy_rslt_t _last_error; + IPAddress remote_ip; + uint16_t _port; + +}; + +#endif /* WIFI_UDP_H */ diff --git a/tests/arduino-core-tests b/tests/arduino-core-tests index 54b9b18..71ff2f9 160000 --- a/tests/arduino-core-tests +++ b/tests/arduino-core-tests @@ -1 +1 @@ -Subproject commit 54b9b187970d82cc08fe7ec63aab06e04307b476 +Subproject commit 71ff2f988288fa7f5c4824a1a65e9c2826f8edd2