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-07-08 11:28:30 +0300
committerDavid Crocker <dcrocker@eschertech.com>2020-07-08 11:28:30 +0300
commit9043327a240145cc24cb4c408cfa3c5f83fc3b53 (patch)
tree4e02fd7272d851579759eaa8c4746777cbb3b5d2 /src/Networking
parent546c5d6081105c0623f0079affbcaee02f601f28 (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.cpp19
-rw-r--r--src/Networking/FtpResponder.cpp3
-rw-r--r--src/Networking/HttpResponder.cpp18
-rw-r--r--src/Networking/UploadingNetworkResponder.cpp124
-rw-r--r--src/Networking/UploadingNetworkResponder.h3
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