diff options
author | David Crocker <dcrocker@eschertech.com> | 2020-08-17 15:28:35 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2020-08-17 15:28:35 +0300 |
commit | 3532dadb4ed57373ce8c0550d543c58381a60cea (patch) | |
tree | 081fc5bd1307791546a6cf55414e63bf8b39b0f5 /src/Networking | |
parent | b2257bb02c40ba3657e9c23466c2012fd7a3ca35 (diff) |
Networking and SBC buffers are now allocated dynamically
Also we don't activate the network when using SBC, to save memory
Diffstat (limited to 'src/Networking')
-rw-r--r-- | src/Networking/ESP8266WiFi/WiFiInterface.cpp | 64 | ||||
-rw-r--r-- | src/Networking/ESP8266WiFi/WiFiInterface.h | 18 | ||||
-rw-r--r-- | src/Networking/Network.cpp | 60 |
3 files changed, 77 insertions, 65 deletions
diff --git a/src/Networking/ESP8266WiFi/WiFiInterface.cpp b/src/Networking/ESP8266WiFi/WiFiInterface.cpp index 47cc1b12..7f33e959 100644 --- a/src/Networking/ESP8266WiFi/WiFiInterface.cpp +++ b/src/Networking/ESP8266WiFi/WiFiInterface.cpp @@ -132,18 +132,6 @@ static void spi_dma_disable() noexcept; static bool spi_dma_check_rx_complete() noexcept; #endif -struct MessageBufferOut -{ - MessageHeaderSamToEsp hdr; - uint8_t data[MaxDataLength]; // data to send -}; - -struct MessageBufferIn -{ - MessageHeaderEspToSam hdr; - uint8_t data[MaxDataLength]; // data to send -}; - #ifdef DUET_5LC Uart *SerialWiFiDevice; @@ -170,8 +158,6 @@ void SERIAL_WIFI_ISR3() noexcept #endif -static MessageBufferOut bufferOut; -static MessageBufferIn bufferIn; static volatile bool transferPending = false; static WiFiInterface *wifiInterface; @@ -223,9 +209,11 @@ static inline void DisableEspInterrupt() noexcept /*-----------------------------------------------------------------------------------*/ // WiFi interface class -WiFiInterface::WiFiInterface(Platform& p) noexcept : platform(p), uploader(nullptr), espWaitingTask(nullptr), ftpDataPort(0), closeDataPort(false), - requestedMode(WiFiState::disabled), currentMode(WiFiState::disabled), activated(false), - espStatusChanged(false), spiTxUnderruns(0), spiRxOverruns(0), serialRunning(false), debugMessageChars(0) +WiFiInterface::WiFiInterface(Platform& p) noexcept + : platform(p), bufferOut(nullptr), bufferIn(nullptr), uploader(nullptr), espWaitingTask(nullptr), + ftpDataPort(0), closeDataPort(false), + requestedMode(WiFiState::disabled), currentMode(WiFiState::disabled), activated(false), + espStatusChanged(false), spiTxUnderruns(0), spiRxOverruns(0), serialRunning(false), debugMessageChars(0) { wifiInterface = this; @@ -294,7 +282,6 @@ void WiFiInterface::Init() noexcept sockets[i]->Init(i); } - uploader = new WifiFirmwareUploader(SERIAL_WIFI_DEVICE, *this); currentSocket = 0; } @@ -454,6 +441,11 @@ void WiFiInterface::Activate() noexcept if (!activated) { activated = true; + + bufferOut = new MessageBufferOut; + bufferIn = new MessageBufferIn; + uploader = new WifiFirmwareUploader(SERIAL_WIFI_DEVICE, *this); + if (requestedMode != WiFiState::disabled) { Start(); @@ -1607,7 +1599,7 @@ static void spi_rx_dma_setup(void *buf, uint32_t transferLength) noexcept /** * \brief Set SPI slave transfer. */ -static void spi_slave_dma_setup(uint32_t dataOutSize, uint32_t dataInSize) noexcept +void WiFiInterface::spi_slave_dma_setup(uint32_t dataOutSize, uint32_t dataInSize) noexcept { #if USE_PDC pdc_disable_transfer(spi_pdc, PERIPH_PTCR_TXTDIS | PERIPH_PTCR_RXTDIS); @@ -1618,8 +1610,8 @@ static void spi_slave_dma_setup(uint32_t dataOutSize, uint32_t dataInSize) noexc #if USE_DMAC || USE_XDMAC || USE_DMAC_MANAGER spi_dma_disable(); // if we don't do this we get strange crashes on the Duet 3 Mini DisableSpi(); - spi_rx_dma_setup(&bufferIn, dataInSize + sizeof(MessageHeaderEspToSam)); - spi_tx_dma_setup(&bufferOut, dataOutSize + sizeof(MessageHeaderSamToEsp)); + spi_rx_dma_setup(bufferIn, dataInSize + sizeof(MessageHeaderEspToSam)); + spi_tx_dma_setup(bufferOut, dataOutSize + sizeof(MessageHeaderSamToEsp)); #endif spi_dma_enable(); @@ -1746,18 +1738,18 @@ int32_t WiFiInterface::SendCommand(NetworkCommand cmd, SocketNumber socketNum, u } } - bufferOut.hdr.formatVersion = MyFormatVersion; - bufferOut.hdr.command = cmd; - bufferOut.hdr.socketNumber = socketNum; - bufferOut.hdr.flags = flags; - bufferOut.hdr.param32 = param32; - bufferOut.hdr.dataLength = (uint16_t)dataOutLength; - bufferOut.hdr.dataBufferAvailable = (uint16_t)dataInLength; + bufferOut->hdr.formatVersion = MyFormatVersion; + bufferOut->hdr.command = cmd; + bufferOut->hdr.socketNumber = socketNum; + bufferOut->hdr.flags = flags; + bufferOut->hdr.param32 = param32; + bufferOut->hdr.dataLength = (uint16_t)dataOutLength; + bufferOut->hdr.dataBufferAvailable = (uint16_t)dataInLength; if (dataOut != nullptr) { - memcpy(bufferOut.data, dataOut, dataOutLength); + memcpy(bufferOut->data, dataOut, dataOutLength); } - bufferIn.hdr.formatVersion = InvalidFormatVersion; + bufferIn->hdr.formatVersion = InvalidFormatVersion; espWaitingTask = TaskBase::GetCallerTaskHandle(); transferPending = true; @@ -1834,27 +1826,27 @@ int32_t WiFiInterface::SendCommand(NetworkCommand cmd, SocketNumber socketNum, u Cache::InvalidateAfterDMAReceive(&bufferIn, sizeof(bufferIn)); // Look at the response - if (bufferIn.hdr.formatVersion != MyFormatVersion) + if (bufferIn->hdr.formatVersion != MyFormatVersion) { if (reprap.Debug(moduleNetwork)) { - debugPrintf("bad format version %02x\n", bufferIn.hdr.formatVersion); + debugPrintf("bad format version %02x\n", bufferIn->hdr.formatVersion); } return ResponseBadReplyFormatVersion; } - if ( (bufferIn.hdr.state == WiFiState::autoReconnecting || bufferIn.hdr.state == WiFiState::reconnecting) + if ( (bufferIn->hdr.state == WiFiState::autoReconnecting || bufferIn->hdr.state == WiFiState::reconnecting) && currentMode != WiFiState::autoReconnecting && currentMode != WiFiState::reconnecting ) { ++reconnectCount; } - currentMode = bufferIn.hdr.state; - const int32_t response = bufferIn.hdr.response; + currentMode = bufferIn->hdr.state; + const int32_t response = bufferIn->hdr.response; if (response > 0 && dataIn != nullptr) { - memcpy(dataIn, bufferIn.data, min<size_t>(dataInLength, (size_t)response)); + memcpy(dataIn, bufferIn->data, min<size_t>(dataInLength, (size_t)response)); } if (response < 0 && reprap.Debug(moduleNetwork)) diff --git a/src/Networking/ESP8266WiFi/WiFiInterface.h b/src/Networking/ESP8266WiFi/WiFiInterface.h index 4a794d95..0879da4e 100644 --- a/src/Networking/ESP8266WiFi/WiFiInterface.h +++ b/src/Networking/ESP8266WiFi/WiFiInterface.h @@ -108,13 +108,29 @@ private: void SendListenCommand(TcpPort port, NetworkProtocol protocol, unsigned int maxConnections) noexcept; void GetNewStatus() noexcept; - static const char* TranslateWiFiResponse(int32_t response) noexcept; + void spi_slave_dma_setup(uint32_t dataOutSize, uint32_t dataInSize) noexcept; + static const char* TranslateWiFiResponse(int32_t response) noexcept; static const char* TranslateEspResetReason(uint32_t reason) noexcept; Platform& platform; uint32_t lastTickMillis; + struct MessageBufferOut + { + MessageHeaderSamToEsp hdr; + uint8_t data[MaxDataLength]; // data to send + }; + + struct MessageBufferIn + { + MessageHeaderEspToSam hdr; + uint8_t data[MaxDataLength]; // data to send + }; + + MessageBufferOut *bufferOut; + MessageBufferIn *bufferIn; + WifiFirmwareUploader *uploader; TaskHandle espWaitingTask; diff --git a/src/Networking/Network.cpp b/src/Networking/Network.cpp index 6abc8854..269a936c 100644 --- a/src/Networking/Network.cpp +++ b/src/Networking/Network.cpp @@ -178,35 +178,8 @@ void Network::Init() noexcept HttpResponder::InitStatic(); #endif -#if SUPPORT_TELNET - TelnetResponder::InitStatic(); - - for (size_t i = 0; i < NumTelnetResponders; ++i) - { - responders = new TelnetResponder(responders); - } -#endif - -#if SUPPORT_FTP - FtpResponder::InitStatic(); - - for (size_t i = 0; i < NumFtpResponders; ++i) - { - responders = new FtpResponder(responders); - } -#endif - -#if SUPPORT_HTTP - for (size_t i = 0; i < NumHttpResponders; ++i) - { - responders = new HttpResponder(responders); - } -#endif - SafeStrncpy(hostname, DEFAULT_HOSTNAME, ARRAY_SIZE(hostname)); - NetworkBuffer::AllocateBuffers(NetworkBufferCount); - for (NetworkInterface *iface : interfaces) { iface->Init(); @@ -416,11 +389,15 @@ extern "C" [[noreturn]]void NetworkLoop(void *) noexcept } #endif -// This is called at the end of config.g processing. +// This is called at the end of config.g processing. It must only be called once. // Start the network if it was enabled void Network::Activate() noexcept { #if HAS_NETWORKING + // Allocate network buffers + NetworkBuffer::AllocateBuffers(NetworkBufferCount); + + // Activate the interfaces for (NetworkInterface *iface : interfaces) { if (iface != nullptr) @@ -429,6 +406,33 @@ void Network::Activate() noexcept } } + // Create the network responders +# if SUPPORT_TELNET + TelnetResponder::InitStatic(); + + for (size_t i = 0; i < NumTelnetResponders; ++i) + { + responders = new TelnetResponder(responders); + } +# endif + +# if SUPPORT_FTP + FtpResponder::InitStatic(); + + for (size_t i = 0; i < NumFtpResponders; ++i) + { + responders = new FtpResponder(responders); + } +# endif + +# if SUPPORT_HTTP + for (size_t i = 0; i < NumHttpResponders; ++i) + { + responders = new HttpResponder(responders); + } +# endif + + // Finally, create the network task networkTask.Create(NetworkLoop, "NETWORK", nullptr, TaskPriority::SpinPriority); #endif } |