diff options
author | David Crocker <dcrocker@eschertech.com> | 2020-07-08 11:28:30 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2020-07-08 11:28:30 +0300 |
commit | 9043327a240145cc24cb4c408cfa3c5f83fc3b53 (patch) | |
tree | 4e02fd7272d851579759eaa8c4746777cbb3b5d2 /src/Networking | |
parent | 546c5d6081105c0623f0079affbcaee02f601f28 (diff) |
Added support for dummy uploads, also use SDHC DMA on 5LC
Note, writing to SD card on 5LC not currently working
Diffstat (limited to 'src/Networking')
-rw-r--r-- | src/Networking/ESP8266WiFi/WiFiInterface.cpp | 19 | ||||
-rw-r--r-- | src/Networking/FtpResponder.cpp | 3 | ||||
-rw-r--r-- | src/Networking/HttpResponder.cpp | 18 | ||||
-rw-r--r-- | src/Networking/UploadingNetworkResponder.cpp | 124 | ||||
-rw-r--r-- | src/Networking/UploadingNetworkResponder.h | 3 |
5 files changed, 97 insertions, 70 deletions
diff --git a/src/Networking/ESP8266WiFi/WiFiInterface.cpp b/src/Networking/ESP8266WiFi/WiFiInterface.cpp index eeb17d4c..a8e85222 100644 --- a/src/Networking/ESP8266WiFi/WiFiInterface.cpp +++ b/src/Networking/ESP8266WiFi/WiFiInterface.cpp @@ -512,9 +512,8 @@ void WiFiInterface::Start() noexcept // Make sure the ESP8266 is in the reset state pinMode(EspResetPin, OUTPUT_LOW); -#ifdef DUET_NG - // Take the ESP8266 out of power down - pinMode(EspEnablePin, OUTPUT_HIGH); +#if defined(DUET_NG) || defined(DUET_5LC) + pinMode(EspEnablePin, OUTPUT_LOW); #endif // Set up our transfer request pin (GPIO4) as an output and set it low @@ -566,6 +565,9 @@ void WiFiInterface::Stop() noexcept digitalWrite(SamTfrReadyPin, false); // tell the ESP we can't receive digitalWrite(EspResetPin, false); // put the ESP back into reset +#if defined(DUET_NG) || defined(DUET_5LC) + digitalWrite(EspEnablePin, false); +#endif DisableEspInterrupt(); // ignore IRQs from the transfer request pin NVIC_DisableIRQ(ESP_SPI_IRQn); @@ -1951,6 +1953,12 @@ void WiFiInterface::SpiInterrupt() noexcept void WiFiInterface::StartWiFi() noexcept { digitalWrite(EspResetPin, true); + +#if defined(DUET_NG) || defined(DUET_5LC) + delayMicroseconds(150); // ESP8266 datasheet specifies minimum 100us from releasing reset to power up + digitalWrite(EspEnablePin, true); +#endif + #if SAME5x for (Pin p : WiFiUartSercomPins) { @@ -1969,6 +1977,11 @@ void WiFiInterface::StartWiFi() noexcept void WiFiInterface::ResetWiFi() noexcept { pinMode(EspResetPin, OUTPUT_LOW); // assert ESP8266 /RESET + +#if defined(DUET_NG) || defined(DUET_5LC) + pinMode(EspEnablePin, OUTPUT_LOW); +#endif + #if defined(DUET_5LC) for (Pin p : WiFiUartSercomPins) { diff --git a/src/Networking/FtpResponder.cpp b/src/Networking/FtpResponder.cpp index 0f6743d9..ae0a9603 100644 --- a/src/Networking/FtpResponder.cpp +++ b/src/Networking/FtpResponder.cpp @@ -718,8 +718,7 @@ void FtpResponder::ProcessLine() noexcept filenameBeingProcessed.Clear(); const char * const filename = GetParameter("STOR"); - FileStore * const file = StartUpload(currentDirectory.c_str(), filename, OpenMode::write); - if (file != nullptr) + if (StartUpload(currentDirectory.c_str(), filename, OpenMode::write)) { outBuf->copy("150 OK to send data.\r\n"); Commit(ResponderState::uploading); diff --git a/src/Networking/HttpResponder.cpp b/src/Networking/HttpResponder.cpp index e5f65b8e..7bdb7b11 100644 --- a/src/Networking/HttpResponder.cpp +++ b/src/Networking/HttpResponder.cpp @@ -1182,8 +1182,7 @@ void HttpResponder::ProcessRequest() noexcept } // Start a new file upload - FileStore * const file = StartUpload(FS_PREFIX, filename, (postFileGotCrc) ? OpenMode::writeWithCrc : OpenMode::write, postFileLength); - if (file == nullptr) + if (!StartUpload(FS_PREFIX, filename, (postFileGotCrc) ? OpenMode::writeWithCrc : OpenMode::write, postFileLength)) { RejectMessage("could not create file"); return; @@ -1287,13 +1286,16 @@ void HttpResponder::DoUpload() noexcept (void)CheckAuthenticated(); // uploading may take a long time, so make sure the requester IP is not timed out timer = millis(); // reset the timer - if (!fileBeingUploaded.Write(buffer, len)) + if (!dummyUpload) { - uploadError = true; - GetPlatform().Message(ErrorMessage, "HTTP: could not write upload data\n"); - CancelUpload(); - SendJsonResponse("upload"); - return; + if (!fileBeingUploaded.Write(buffer, len)) + { + uploadError = true; + GetPlatform().Message(ErrorMessage, "HTTP: could not write upload data\n"); + CancelUpload(); + SendJsonResponse("upload"); + return; + } } } else if (!skt->CanRead() || millis() - timer >= HttpSessionTimeout) diff --git a/src/Networking/UploadingNetworkResponder.cpp b/src/Networking/UploadingNetworkResponder.cpp index e7c2529f..9924f9f2 100644 --- a/src/Networking/UploadingNetworkResponder.cpp +++ b/src/Networking/UploadingNetworkResponder.cpp @@ -11,7 +11,7 @@ UploadingNetworkResponder::UploadingNetworkResponder(NetworkResponder *n) noexcept : NetworkResponder(n) #if HAS_MASS_STORAGE - , uploadError(false) + , uploadError(false), dummyUpload(false) #endif { } @@ -41,85 +41,97 @@ void UploadingNetworkResponder::CancelUpload() noexcept #if HAS_MASS_STORAGE -// Start writing to a new file -FileStore * UploadingNetworkResponder::StartUpload(const char* folder, const char *fileName, const OpenMode mode, const uint32_t preAllocSize) noexcept +// Start writing to a new file, returning true if successful +bool UploadingNetworkResponder::StartUpload(const char* folder, const char *fileName, const OpenMode mode, const uint32_t preAllocSize) noexcept { - if (!MassStorage::CombineName(filenameBeingProcessed.GetRef(), folder, fileName)) + if (fileName[0] == 0) { filenameBeingProcessed.Clear(); - return nullptr; + dummyUpload = true; } - if (filenameBeingProcessed.cat(UPLOAD_EXTENSION)) + else { - filenameBeingProcessed.Clear(); - return nullptr; - } - FileStore * file = GetPlatform().OpenFile(folder, filenameBeingProcessed.c_str(), mode, preAllocSize); - if (file == nullptr) - { - filenameBeingProcessed.Clear(); - return file; + if (!MassStorage::CombineName(filenameBeingProcessed.GetRef(), folder, fileName)) + { + filenameBeingProcessed.Clear(); + return false; + } + if (filenameBeingProcessed.cat(UPLOAD_EXTENSION)) + { + filenameBeingProcessed.Clear(); + return false; + } + FileStore * const file = GetPlatform().OpenFile(folder, filenameBeingProcessed.c_str(), mode, preAllocSize); + if (file == nullptr) + { + filenameBeingProcessed.Clear(); + return false; + } + fileBeingUploaded.Set(file); + dummyUpload = false; } - fileBeingUploaded.Set(file); responderState = ResponderState::uploading; uploadError = false; - return file; + return true; } // Finish a file upload. Set variable uploadError if anything goes wrong. void UploadingNetworkResponder::FinishUpload(uint32_t fileLength, time_t fileLastModified, bool gotCrc, uint32_t expectedCrc) noexcept { - // Flush remaining data for FSO - if (!fileBeingUploaded.Flush()) + if (!dummyUpload) { - uploadError = true; - GetPlatform().Message(ErrorMessage, "Could not flush remaining data while finishing upload\n"); - } - - // Check the file length is as expected - if (fileLength != 0 && fileBeingUploaded.Length() != fileLength) - { - uploadError = true; - GetPlatform().MessageF(ErrorMessage, "Uploaded file size is different (%lu vs. expected %lu bytes)\n", fileBeingUploaded.Length(), fileLength); - } - else if (gotCrc && expectedCrc != fileBeingUploaded.GetCrc32()) - { - uploadError = true; - GetPlatform().MessageF(ErrorMessage, "Uploaded file CRC is different (%08" PRIx32 " vs. expected %08" PRIx32 ")\n", fileBeingUploaded.GetCrc32(), expectedCrc); - } + // Flush remaining data for FSO + if (!fileBeingUploaded.Flush()) + { + uploadError = true; + GetPlatform().Message(ErrorMessage, "Could not flush remaining data while finishing upload\n"); + } - // Close the file - if (fileBeingUploaded.IsLive()) - { - fileBeingUploaded.Close(); - } + // Check the file length is as expected + if (fileLength != 0 && fileBeingUploaded.Length() != fileLength) + { + uploadError = true; + GetPlatform().MessageF(ErrorMessage, "Uploaded file size is different (%lu vs. expected %lu bytes)\n", fileBeingUploaded.Length(), fileLength); + } + else if (gotCrc && expectedCrc != fileBeingUploaded.GetCrc32()) + { + uploadError = true; + GetPlatform().MessageF(ErrorMessage, "Uploaded file CRC is different (%08" PRIx32 " vs. expected %08" PRIx32 ")\n", fileBeingUploaded.GetCrc32(), expectedCrc); + } - // Delete the file again if an error has occurred - if (!filenameBeingProcessed.IsEmpty()) - { - const char *uploadFilename = filenameBeingProcessed.c_str(); - if (uploadError) + // Close the file + if (fileBeingUploaded.IsLive()) { - MassStorage::Delete(uploadFilename, true); + fileBeingUploaded.Close(); } - else + + // Delete the file again if an error has occurred + if (!filenameBeingProcessed.IsEmpty()) { - String<MaxFilenameLength> origFilename; - origFilename.catn(uploadFilename, filenameBeingProcessed.GetRef().strlen() - strlen(UPLOAD_EXTENSION)); + const char *uploadFilename = filenameBeingProcessed.c_str(); + if (uploadError) + { + MassStorage::Delete(uploadFilename, true); + } + else + { + String<MaxFilenameLength> origFilename; + origFilename.catn(uploadFilename, filenameBeingProcessed.GetRef().strlen() - strlen(UPLOAD_EXTENSION)); - // Delete possibly existing files with that name (i.e. prepare "overwrite") - MassStorage::Delete(origFilename.c_str(), true); + // Delete possibly existing files with that name (i.e. prepare "overwrite") + MassStorage::Delete(origFilename.c_str(), true); - // Rename the uploaded file to it's original name - MassStorage::Rename(uploadFilename, origFilename.c_str(), true); + // Rename the uploaded file to it's original name + MassStorage::Rename(uploadFilename, origFilename.c_str(), true); - if (fileLastModified != 0) - { - // Update the file timestamp if it was specified - (void)MassStorage::SetLastModifiedTime(origFilename.c_str(), fileLastModified); + if (fileLastModified != 0) + { + // Update the file timestamp if it was specified + (void)MassStorage::SetLastModifiedTime(origFilename.c_str(), fileLastModified); + } } + filenameBeingProcessed.Clear(); } - filenameBeingProcessed.Clear(); } } diff --git a/src/Networking/UploadingNetworkResponder.h b/src/Networking/UploadingNetworkResponder.h index 1265d094..b3b08505 100644 --- a/src/Networking/UploadingNetworkResponder.h +++ b/src/Networking/UploadingNetworkResponder.h @@ -19,13 +19,14 @@ protected: virtual void CancelUpload() noexcept; #if HAS_MASS_STORAGE - FileStore * StartUpload(const char* folder, const char *fileName, const OpenMode mode, const uint32_t preAllocSize = 0) noexcept; + bool StartUpload(const char* folder, const char *fileName, const OpenMode mode, const uint32_t preAllocSize = 0) noexcept; void FinishUpload(uint32_t fileLength, time_t fileLastModified, bool gotCrc, uint32_t expectedCrc) noexcept; // File uploads FileData fileBeingUploaded; uint32_t uploadedBytes; // how many bytes have already been written bool uploadError; + bool dummyUpload; #endif String<MaxFilenameLength> filenameBeingProcessed; // usually the name of the file being uploaded, but also used by HttpResponder and FtpResponder |