diff options
Diffstat (limited to 'src/Networking/ESP8266WiFi/WiFiInterface.cpp')
-rw-r--r-- | src/Networking/ESP8266WiFi/WiFiInterface.cpp | 112 |
1 files changed, 64 insertions, 48 deletions
diff --git a/src/Networking/ESP8266WiFi/WiFiInterface.cpp b/src/Networking/ESP8266WiFi/WiFiInterface.cpp index 3b8bfaa1..235f7a83 100644 --- a/src/Networking/ESP8266WiFi/WiFiInterface.cpp +++ b/src/Networking/ESP8266WiFi/WiFiInterface.cpp @@ -24,23 +24,25 @@ static_assert(SsidLength == SsidBufferLength, "SSID lengths in NetworkDefs.h and #if defined(DUET_NG) // The PDC seems to be too slow to work reliably without getting transmit underruns, so we use the DMAC now. -# define USE_PDC 0 // use peripheral DMA controller -# define USE_DMAC 1 // use general DMA controller -# define USE_XDMAC 0 // use XDMA controller +# define USE_PDC 0 // use peripheral DMA controller +# define USE_DMAC 1 // use general DMA controller +# define USE_XDMAC 0 // use XDMA controller -# define ESP_SPI SPI -# define ESP_SPI_ID ID_SPI -# define ESP_SPI_IRQn SPI_IRQn +# define ESP_SPI SPI +# define ESP_SPI_ID ID_SPI +# define ESP_SPI_IRQn SPI_IRQn +# define ESP_SPI_HANDLER SPI_Handler #elif defined(SAME70_TEST_BOARD) -# define USE_PDC 0 // use peripheral DMA controller -# define USE_DMAC 0 // use general DMA controller -# define USE_XDMAC 1 // use XDMA controller +# define USE_PDC 0 // use peripheral DMA controller +# define USE_DMAC 0 // use general DMA controller +# define USE_XDMAC 1 // use XDMA controller -# define ESP_SPI SPI0 -# define ESP_SPI_ID ID_SPI0 -# define ESP_SPI_IRQn SPI0_IRQn +# define ESP_SPI SPI0 +# define ESP_SPI_ID ID_SPI0 +# define ESP_SPI_IRQn SPI0_IRQn +# define ESP_SPI_HANDLER SPI0_Handler #else # error Unknown board @@ -630,14 +632,14 @@ void WiFiInterface::Spin(bool full) } InitSockets(); reconnectCount = 0; - platform.MessageF(NetworkInfoMessage, "Wifi module is %s%s, IP address %s\n", + platform.MessageF(NetworkInfoMessage, "WiFi module is %s%s, IP address %s\n", TranslateWiFiState(currentMode), actualSsid, IP4String(ipAddress).c_str()); } else { - platform.MessageF(NetworkInfoMessage, "Wifi module is %s\n", TranslateWiFiState(currentMode)); + platform.MessageF(NetworkInfoMessage, "WiFi module is %s\n", TranslateWiFiState(currentMode)); } } } @@ -1020,6 +1022,12 @@ GCodeResult WiFiInterface::HandleWiFiCode(int mcode, GCodeBuffer &gb, const Stri if (ok) { SafeStrncpy(config.password, password.c_str(), ARRAY_SIZE(config.password)); + if (password.strlen() < 8 && password.strlen() != 0) // WPA2 passwords must be at least 8 characters + { + reply.copy("WiFi password must be at least 8 characters"); + return GCodeResult::error; + } + SafeStrncpy(config.password, password.c_str(), ARRAY_SIZE(config.password)); if (gb.Seen('I')) { ok = gb.GetIPAddress(config.ip); @@ -1540,7 +1548,7 @@ int32_t WiFiInterface::SendCommand(NetworkCommand cmd, SocketNumber socketNum, u // Wait for the ESP to be ready, with timeout { const uint32_t now = millis(); - while (!digitalRead(EspDataReadyPin)) + while (!digitalRead(EspDataReadyPin) || !digitalRead(SamCsPin)) { if (millis() - now > WiFiWaitReadyMillis) { @@ -1586,11 +1594,12 @@ int32_t WiFiInterface::SendCommand(NetworkCommand cmd, SocketNumber socketNum, u digitalWrite(SamTfrReadyPin, HIGH); // Wait for the DMA complete interrupt, with timeout + // When we use RTOS we should allow other tasks to run here { const uint32_t now = millis(); while (transferPending || !spi_dma_check_rx_complete()) { - if (millis() - now > WifiResponseTimeoutMillis) + if (digitalRead(SamCsPin) && millis() - now > WifiResponseTimeoutMillis) // if no transfer in progress and timed out { if (reprap.Debug(moduleNetwork)) { @@ -1605,39 +1614,33 @@ int32_t WiFiInterface::SendCommand(NetworkCommand cmd, SocketNumber socketNum, u } // Look at the response - int32_t response; if (bufferIn.hdr.formatVersion != MyFormatVersion) { - response = ResponseBadReplyFormatVersion; + if (reprap.Debug(moduleNetwork)) + { + debugPrintf("bad format version %02x\n", bufferIn.hdr.formatVersion); + } + return ResponseBadReplyFormatVersion; } - else - { - 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; - response = bufferIn.hdr.response; - if (response > 0 && dataIn != nullptr) - { - memcpy(dataIn, bufferIn.data, min<size_t>(dataInLength, (size_t)response)); - } + { + ++reconnectCount; } - if (response < 0 && reprap.Debug(moduleNetwork)) + currentMode = bufferIn.hdr.state; + const int32_t response = bufferIn.hdr.response; + if (response > 0 && dataIn != nullptr) { - debugPrintf("Network command %d socket %u returned error %" PRIi32 "\n", (int)cmd, socketNum, response); + memcpy(dataIn, bufferIn.data, min<size_t>(dataInLength, (size_t)response)); } -#if 0 - //***TEMP debug - if (cmd != NetworkCommand::connGetStatus) + if (response < 0 && reprap.Debug(moduleNetwork)) { - debugPrintBuffer("Recv", &bufferIn, (dataIn == nullptr) ? 0 : (size_t)max<int>(0, response)); + debugPrintf("Network command %d socket %u returned error: %s\n", (int)cmd, socketNum, TranslateWiFiResponse(response)); } -#endif return response; } @@ -1674,7 +1677,7 @@ void WiFiInterface::GetNewStatus() rcvr.Value().messageBuffer[ARRAY_UPB(rcvr.Value().messageBuffer)] = 0; if (rslt < 0) { - platform.Message(NetworkInfoMessage, "Error retrieving WiFi status message\n"); + platform.MessageF(NetworkInfoMessage, "Error retrieving WiFi status message: %s\n", TranslateWiFiResponse(rslt)); } else if (rslt > 0 && rcvr.Value().messageBuffer[0] != 0) { @@ -1682,23 +1685,36 @@ void WiFiInterface::GetNewStatus() } } -// SPI interrupt handlers, called when NSS goes high -#if SAME70 -void SPI0_Handler(void) +/*static*/ const char* WiFiInterface::TranslateWiFiResponse(int32_t response) { - wifiInterface->SpiInterrupt(); + switch (response) + { + case ResponseUnknownCommand: return "unknown command"; + case ResponseBadRequestFormatVersion: return "bad request format version"; + case ResponseTooManySsids: return "too many stored SSIDs"; + case ResponseWrongState: return "wrong WiFi module state"; + case ResponseBadDataLength: return "bad data length"; + case ResponseNetworkDisabled: return "WiFi module is disabled"; + case ResponseTimeout: return "SPI timeout"; + case ResponseBusy: return "another SPI transfer is pending"; + case ResponseBufferTooSmall: return "response buffer too small"; + case ResponseBadReplyFormatVersion: return "bad reply format version"; + case ResponseBadParameter: return "bad parameter in request"; + case ResponseUnknownError: return "unknown error"; + default: return "unknown response code"; + } } -#else -void SPI_Handler(void) + +// SPI interrupt handlers, called when NSS goes high +void ESP_SPI_HANDLER(void) { wifiInterface->SpiInterrupt(); } -#endif void WiFiInterface::SpiInterrupt() { - const uint32_t status = ESP_SPI->SPI_SR; // read status and clear interrupt - ESP_SPI->SPI_IDR = SPI_IER_NSSR; // disable the interrupt + const uint32_t status = ESP_SPI->SPI_SR; // read status and clear interrupt + ESP_SPI->SPI_IDR = SPI_IER_NSSR; // disable the interrupt if ((status & SPI_SR_NSSR) != 0) { #if USE_PDC @@ -1707,7 +1723,7 @@ void WiFiInterface::SpiInterrupt() #if USE_DMAC spi_tx_dma_disable(); - dmac_channel_suspend(DMAC, CONF_SPI_DMAC_RX_CH); // suspend the receive channel, don't disable it because the FIFO needs to empty first + dmac_channel_suspend(DMAC, CONF_SPI_DMAC_RX_CH); // suspend the receive channel, don't disable it because the FIFO needs to empty first #endif #if USE_XDMAC |