diff --git a/docs/api.md b/docs/api.md index 1f3d39cc..b9ea19f6 100644 --- a/docs/api.md +++ b/docs/api.md @@ -2778,12 +2778,12 @@ Tells the server to begin listening for incoming connections. ``` server.begin() - +server.begin(port) ``` #### Parameters -- None +- port (optional): the port to listen on (int) #### Returns diff --git a/src/WiFiServer.cpp b/src/WiFiServer.cpp index ef7f12f0..7839a180 100644 --- a/src/WiFiServer.cpp +++ b/src/WiFiServer.cpp @@ -29,6 +29,13 @@ extern "C" { #include "WiFiClient.h" #include "WiFiServer.h" +WiFiServer::WiFiServer() : + _sock(NO_SOCKET_AVAIL), + _lastSock(NO_SOCKET_AVAIL) +{ + _port = 80; +} + WiFiServer::WiFiServer(uint16_t port) : _sock(NO_SOCKET_AVAIL), _lastSock(NO_SOCKET_AVAIL) @@ -38,6 +45,7 @@ WiFiServer::WiFiServer(uint16_t port) : void WiFiServer::begin() { + end(); _sock = ServerDrv::getSocket(); if (_sock != NO_SOCKET_AVAIL) { @@ -45,6 +53,22 @@ void WiFiServer::begin() } } +void WiFiServer::begin(uint16_t port) +{ + end(); + _port = port; + begin(); +} + +void WiFiServer::end() +{ + if (_sock != NO_SOCKET_AVAIL) { + ServerDrv::stopServer(_sock); + _sock = NO_SOCKET_AVAIL; + _lastSock = NO_SOCKET_AVAIL; + } +} + WiFiClient WiFiServer::available(byte* status) { int sock = NO_SOCKET_AVAIL; diff --git a/src/WiFiServer.h b/src/WiFiServer.h index 58ad5bf3..81ced8eb 100644 --- a/src/WiFiServer.h +++ b/src/WiFiServer.h @@ -36,10 +36,13 @@ class WiFiServer : public Server { uint16_t _port; void* pcb; public: + WiFiServer(); WiFiServer(uint16_t); WiFiClient available(uint8_t* status = NULL); WiFiClient accept(); void begin(); + void begin(uint16_t port); + void end(); virtual size_t write(uint8_t); virtual size_t write(const uint8_t *buf, size_t size); uint8_t status(); diff --git a/src/utility/server_drv.cpp b/src/utility/server_drv.cpp index e07d2430..0d410934 100644 --- a/src/utility/server_drv.cpp +++ b/src/utility/server_drv.cpp @@ -84,6 +84,28 @@ void ServerDrv::startServer(uint32_t ipAddress, uint16_t port, uint8_t sock, uin SpiDrv::spiSlaveDeselect(); } +void ServerDrv::stopServer(uint8_t sock) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(STOP_SERVER_TCP_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, 1, LAST_PARAM); + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(STOP_SERVER_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); +} + // Start server TCP on port specified void ServerDrv::startClient(uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode) { diff --git a/src/utility/server_drv.h b/src/utility/server_drv.h index 59f76980..a4f2f86d 100644 --- a/src/utility/server_drv.h +++ b/src/utility/server_drv.h @@ -35,6 +35,8 @@ class ServerDrv static void startServer(uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode=TCP_MODE); + static void stopServer(uint8_t sock); + static void startClient(uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode=TCP_MODE); static void startClient(const char* host, uint8_t host_len, uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode=TCP_MODE); diff --git a/src/utility/wifi_spi.h b/src/utility/wifi_spi.h index c740ae05..d4d11daf 100644 --- a/src/utility/wifi_spi.h +++ b/src/utility/wifi_spi.h @@ -83,7 +83,7 @@ enum { GET_HOST_BY_NAME_CMD = 0x35, START_SCAN_NETWORKS = 0x36, GET_FW_VERSION_CMD = 0x37, -// GET_TEST_CMD = 0x38, + STOP_SERVER_TCP_CMD = 0x38, SEND_DATA_UDP_CMD = 0x39, GET_REMOTE_DATA_CMD = 0x3A, GET_TIME_CMD = 0x3B,