diff --git a/src/SparkFun_u-blox_SARA-R5_Arduino_Library.cpp b/src/SparkFun_u-blox_SARA-R5_Arduino_Library.cpp index 490a161..31b2fe4 100644 --- a/src/SparkFun_u-blox_SARA-R5_Arduino_Library.cpp +++ b/src/SparkFun_u-blox_SARA-R5_Arduino_Library.cpp @@ -4693,6 +4693,76 @@ SARA_R5_error_t SARA_R5::ftpGetFile(const String& filename) free(command); return err; } +SARA_R5_error_t SARA_R5::ftpChangeWorkingDirectory(const String& dirName) +{ + char *command; + + command = sara_r5_calloc_char(strlen(SARA_R5_FTP_COMMAND) + dirName.length() + 16); + if (command==NULL) + { + return SARA_R5_ERROR_OUT_OF_MEMORY; + } + + sprintf(command, "%s=%d,\"%s\"", SARA_R5_FTP_COMMAND, SARA_R5_FTP_COMMAND_CHANGE_DIR, dirName.c_str()); + + SARA_R5_error_t err = sendCommandWithResponse(command, SARA_R5_RESPONSE_OK_OR_ERROR, NULL, + SARA_R5_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; +} + +SARA_R5_error_t SARA_R5::ftpCreateDirectory(const String &dirName) { + + char * command; + + command = sara_r5_calloc_char(strlen(SARA_R5_FTP_COMMAND) + dirName.length() + 16); + if (command==NULL) + { + return SARA_R5_ERROR_OUT_OF_MEMORY; + } + + sprintf(command, "%s=%d,\"%s\"", SARA_R5_FTP_COMMAND, SARA_R5_FTP_COMMAND_MKDIR, dirName.c_str()); + + SARA_R5_error_t err = sendCommandWithResponse(command, SARA_R5_RESPONSE_OK_OR_ERROR, NULL, + SARA_R5_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; +} + +SARA_R5_error_t SARA_R5::ftpList(const String &dirName, char * response) { + + char * command; + + command = sara_r5_calloc_char(strlen(SARA_R5_FTP_COMMAND) + dirName.length() + 16); + if (command==NULL) + { + return SARA_R5_ERROR_OUT_OF_MEMORY; + } + + sprintf(command, "%s=%d,\"%s\"", SARA_R5_FTP_COMMAND, SARA_R5_FTP_COMMAND_LS, dirName.c_str()); + + SARA_R5_error_t err = sendCommandWithResponse(command, SARA_R5_RESPONSE_OK_OR_ERROR, response, + SARA_R5_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; +} + +SARA_R5_error_t SARA_R5::ftpPutFile(const String &localFilename, const String &remoteFileName) { + char * command; + + command = sara_r5_calloc_char(strlen(SARA_R5_FTP_COMMAND) + localFilename.length() + remoteFileName.length() + 16); + if (command==NULL) + { + return SARA_R5_ERROR_OUT_OF_MEMORY; + } + + sprintf(command, "%s=%d,\"%s\",\"%s\"", SARA_R5_FTP_COMMAND, SARA_R5_FTP_COMMAND_PUT_FILE, localFilename.c_str(), remoteFileName.c_str()); + + SARA_R5_error_t err = sendCommandWithResponse(command, SARA_R5_RESPONSE_OK_OR_ERROR,NULL, + SARA_R5_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; +} SARA_R5_error_t SARA_R5::getFTPprotocolError(int *error_code, int *error_code2) { @@ -5648,6 +5718,69 @@ SARA_R5_error_t SARA_R5::getFileBlock(const String& filename, char* buffer, size return SARA_R5_ERROR_SUCCESS; } +SARA_R5_error_t SARA_R5::getAvailableSize(size_t * size) +{ + + // Get the remaining space available on the modem in bytes + char * command; + char * response; + + command = sara_r5_calloc_char(strlen(SARA_R5_FILE_SYSTEM_LIST_FILES) + 3); + if (command==NULL) + { + return SARA_R5_ERROR_OUT_OF_MEMORY; + } + + sprintf(command, "%s=1", SARA_R5_FILE_SYSTEM_LIST_FILES); + + response = sara_r5_calloc_char(minimumResponseAllocation); + if (response == nullptr) + { + free(command); + return SARA_R5_ERROR_OUT_OF_MEMORY; + } + SARA_R5_error_t err = sendCommandWithResponse(command, SARA_R5_RESPONSE_OK_OR_ERROR,response, + SARA_R5_STANDARD_RESPONSE_TIMEOUT); + + // Process result + if (err != SARA_R5_ERROR_SUCCESS) + { + if (_printDebug == true) + { + _debugPort->print(F("getAvailableSize: Fail: Error: ")); + _debugPort->print(err); + _debugPort->print(F(" Response: {")); + _debugPort->print(response); + _debugPort->println(F("}")); + } + free(command); + free(response); + return err; + } + char *responseStart = strstr(response, "+ULSTFILE:"); + if (responseStart == nullptr) + { + if (_printDebug == true) + { + _debugPort->print(F("getAvailableSize: Failure: {")); + _debugPort->print(response); + _debugPort->println(F("}")); + } + free(command); + free(response); + return SARA_R5_ERROR_UNEXPECTED_RESPONSE; + } + + size_t availableSpace; + responseStart += strlen("+ULSTFILE:"); // Move searchPtr to first char + while (*responseStart == ' ') responseStart++; // skip spaces + sscanf(responseStart, "%d", &availableSpace); + *size = availableSpace; + + free(command); + free(response); + return err; +} SARA_R5_error_t SARA_R5::getFileSize(String filename, int *size) { diff --git a/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h b/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h index ea1a274..825db44 100644 --- a/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h +++ b/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h @@ -944,6 +944,10 @@ class SARA_R5 : public Print SARA_R5_error_t connectFTP(void); SARA_R5_error_t disconnectFTP(void); SARA_R5_error_t ftpGetFile(const String& filename); + SARA_R5_error_t ftpChangeWorkingDirectory(const String& dirName); + SARA_R5_error_t ftpCreateDirectory(const String& dirName); + SARA_R5_error_t ftpList(const String& dirName, char * response); + SARA_R5_error_t ftpPutFile(const String& localFilename, const String& remoteFileName); SARA_R5_error_t getFTPprotocolError(int *error_code, int *error_code2); // Configure security profiles @@ -1012,6 +1016,8 @@ class SARA_R5 : public Print SARA_R5_error_t getFileContents(String filename, char *contents); // OK for binary files. Make sure contents can hold the entire file. Get the size first with getFileSize. SARA_R5_error_t getFileBlock(const String& filename, char* buffer, size_t offset, size_t length, size_t& bytes_read); // OK for binary files. Make sure buffer can hold the requested block size. + SARA_R5_error_t getAvailableSize(size_t * size); // Get available FS space + // Append data to a file, delete file first to not appends the data. SARA_R5_error_t appendFileContents(String filename, String str); SARA_R5_error_t appendFileContents(String filename, const char *str, int len);