Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Crocker <dcrocker@eschertech.com>2020-08-17 15:28:35 +0300
committerDavid Crocker <dcrocker@eschertech.com>2020-08-17 15:28:35 +0300
commit3532dadb4ed57373ce8c0550d543c58381a60cea (patch)
tree081fc5bd1307791546a6cf55414e63bf8b39b0f5 /src/Networking
parentb2257bb02c40ba3657e9c23466c2012fd7a3ca35 (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.cpp64
-rw-r--r--src/Networking/ESP8266WiFi/WiFiInterface.h18
-rw-r--r--src/Networking/Network.cpp60
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
}