aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c')
-rw-r--r--Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c238
1 files changed, 121 insertions, 117 deletions
diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
index 6c7ee97a4..a12c02867 100644
--- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
+++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
@@ -51,8 +51,11 @@ char ErrorMsg[100];
#define MAX_CHUNK_LENGTH 2000
int FileLength = 0;
int FileReceivedLength = 0;
+int FileSentLength = 0;
static char g_cCwdBuf[50] = "/";
uint32_t WrittenBytes = 0;
+uint32_t ReadBytes = 0;
+
ErrorCode getErrorCode(FRESULT Fresult)
{
@@ -116,7 +119,6 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer)
return OK;
}
-
uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer)
{
//uint32_t status = OK;
@@ -186,6 +188,124 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer)
return OK;
}
+uint32_t FileDownloadRequestFunc(MessageContainer* requestContainer)
+{
+ //uint32_t status = OK;
+
+ FRESULT Fresult = FR_OK;
+ FILINFO* fno;
+
+ MessageContainer responseContainer;
+
+ FileDownloadRequest* request = file_download_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
+
+ FileDownloadResponse response = FILE_DOWNLOAD_RESPONSE__INIT;
+
+ ReadBytes=0;
+ FileSentLength = 0;
+
+ fno = my_malloc(sizeof(FILINFO));
+ if (fno == 0)
+ Fresult = FR_DENIED;
+ else
+ {
+ memset (fno,0,sizeof(FILINFO));
+ Fresult = f_stat(request->filename,fno);
+ FileLength = fno->fsize;
+ DownloadFileHandle = my_malloc(sizeof(FIL));
+ if (DownloadFileHandle == 0)
+ Fresult = FR_DENIED;
+ else
+ {
+ Fresult = f_open(DownloadFileHandle,request->filename,FA_READ );
+ if (Fresult == FR_OK)
+ {
+ response.has_maxchunklength = true;
+ response.maxchunklength = MAX_CHUNK_LENGTH;
+ strcpy(FileHandleChar, "1234");
+ response.downloadid = FileHandleChar; //supporting only single file at each time.
+ }
+
+ }
+ }
+
+
+ responseContainer = createContainer(MESSAGE_TYPE__FileDownloadResponse, requestContainer->token, false, &response, &file_download_response__pack, &file_download_response__get_packed_size);
+ if (Fresult!= FR_OK)
+ {
+ responseContainer.error = getErrorCode(Fresult);
+ responseContainer.errormessage = "File operation error";
+ }
+ responseContainer.continuous = false;
+ uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
+ size_t container_size = message_container__pack(&responseContainer, container_buffer);
+ my_free(responseContainer.data.data);
+ file_download_request__free_unpacked(request,NULL);
+ SendChars(container_buffer, container_size);
+ my_free(fno);
+
+ return OK;
+}
+uint32_t FileChunkDownloadRequestFunc(MessageContainer* requestContainer)
+{
+ MessageContainer responseContainer;
+ FileChunkDownloadRequest* request = file_chunk_download_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
+ FileChunkDownloadResponse response = FILE_CHUNK_DOWNLOAD_RESPONSE__INIT;
+ FRESULT Fresult = FR_OK;
+ FIL *SentFileHandle; //the system supports a single active file
+
+ SentFileHandle = DownloadFileHandle;
+ char *Buffer = 0;
+ Buffer = my_malloc (MAX_CHUNK_LENGTH);
+ if (Buffer != NULL)
+ {
+ Fresult = f_read(SentFileHandle,Buffer,2000,&ReadBytes );
+ if(Fresult != FR_OK)
+ {
+ LOG_ERROR (Fresult,"f_write error");
+ }
+ else
+ {
+ response.has_buffer = true;
+ response.buffer.len = ReadBytes;
+ response.buffer.data = Buffer;
+ FileSentLength += ReadBytes;
+ if (FileSentLength == FileLength)
+ {
+ REPORT_MSG (FileSentLength,"file download ended successfully");
+ f_close(SentFileHandle);
+ free (DownloadFileHandle);
+ FileSentLength = 0;
+ }
+ else
+ {
+ if (FileSentLength > FileLength)
+ {
+ REPORT_MSG (FileSentLength,"file download too much data!");
+ f_close(SentFileHandle);
+ free (DownloadFileHandle);
+ FileSentLength = 0;
+ }
+ }
+ }
+ }
+
+ responseContainer = createContainer(MESSAGE_TYPE__FileChunkDownloadResponse, requestContainer->token, false, &response, &file_chunk_download_response__pack, &file_chunk_download_response__get_packed_size);
+ if (Fresult!= OK)
+ {
+ responseContainer.error = getErrorCode(Fresult);
+ responseContainer.errormessage = "File operation error";
+ }
+ responseContainer.continuous = false;
+ uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
+ size_t container_size = message_container__pack(&responseContainer, container_buffer);
+ file_chunk_download_request__free_unpacked(request,NULL);
+ my_free(responseContainer.data.data);
+ my_free(Buffer);
+ SendChars(container_buffer, container_size);
+
+ return OK;
+}
uint32_t ExecuteProcessRequestFunc(MessageContainer* requestContainer)
{
uint32_t status = OK;
@@ -517,122 +637,6 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer)
}
return Fresult;
}
-uint32_t FileDownloadRequestFunc(MessageContainer* requestContainer)
-{
- //uint32_t status = OK;
-
- FRESULT Fresult = FR_OK;
- FILINFO* fno;
-
- MessageContainer responseContainer;
-
- FileDownloadRequest* request = file_download_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
-
- FileDownloadResponse response = FILE_DOWNLOAD_RESPONSE__INIT;
-
- WrittenBytes=0;
- FileReceivedLength = 0;
-
- fno = my_malloc(sizeof(FILINFO));
- if (fno == 0)
- Fresult = FR_DENIED;
- else
- {
- memset (fno,0,sizeof(FILINFO));
- Fresult = f_stat(request->filename,fno);
- FileLength = fno->fsize;
- DownloadFileHandle = my_malloc(sizeof(FIL));
- if (DownloadFileHandle == 0)
- Fresult = FR_DENIED;
- else
- {
- Fresult = f_open(DownloadFileHandle,request->filename,FA_READ );
- if (Fresult == FR_OK)
- {
- response.has_maxchunklength = true;
- response.maxchunklength = MAX_CHUNK_LENGTH;
- strcpy(FileHandleChar, "1234");
- response.downloadid = FileHandleChar; //supporting only single file at each time.
- }
-
- }
- }
-
-
- responseContainer = createContainer(MESSAGE_TYPE__FileDownloadResponse, requestContainer->token, false, &response, &file_download_response__pack, &file_download_response__get_packed_size);
- if (Fresult!= FR_OK)
- {
- responseContainer.error = getErrorCode(Fresult);
- responseContainer.errormessage = "File operation error";
- }
- responseContainer.continuous = false;
- uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
- size_t container_size = message_container__pack(&responseContainer, container_buffer);
- my_free(responseContainer.data.data);
- file_download_request__free_unpacked(request,NULL);
- SendChars(container_buffer, container_size);
-
- return OK;
-}
-uint32_t FileChunkDownloadRequestFunc(MessageContainer* requestContainer)
-{
- MessageContainer responseContainer;
- FileChunkDownloadRequest* request = file_chunk_download_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
- FileChunkDownloadResponse response = FILE_CHUNK_DOWNLOAD_RESPONSE__INIT;
- FRESULT Fresult = FR_OK;
- FIL *ReceivedFileHandle; //the system supports a single active file
-
- ReceivedFileHandle = DownloadFileHandle;
- char *Buffer = 0;
- Buffer = my_malloc (MAX_CHUNK_LENGTH);
- if (Buffer != NULL)
- {
- Fresult = f_read(ReceivedFileHandle,Buffer,2000,&WrittenBytes );
- if(Fresult != FR_OK)
- {
- LOG_ERROR (Fresult,"f_write error");
- }
- else
- {
- response.buffer.len = WrittenBytes;
- response.buffer.data = Buffer;
- FileReceivedLength += WrittenBytes;
- if (FileReceivedLength == FileLength)
- {
- REPORT_MSG (FileReceivedLength,"file download ended successfully");
- f_close(ReceivedFileHandle);
- free (DownloadFileHandle);
- FileReceivedLength = 0;
- }
- else
- {
- if (FileReceivedLength > FileLength)
- {
- REPORT_MSG (FileReceivedLength,"file download too much data!");
- f_close(ReceivedFileHandle);
- free (DownloadFileHandle);
- FileReceivedLength = 0;
- }
- }
- }
- }
-
- responseContainer = createContainer(MESSAGE_TYPE__FileChunkDownloadResponse, requestContainer->token, false, &response, &file_chunk_download_response__pack, &file_chunk_download_response__get_packed_size);
- if (Fresult!= OK)
- {
- responseContainer.error = getErrorCode(Fresult);
- responseContainer.errormessage = "File operation error";
- }
- responseContainer.continuous = false;
- uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
- size_t container_size = message_container__pack(&responseContainer, container_buffer);
- file_chunk_download_request__free_unpacked(request,NULL);
- my_free(responseContainer.data.data);
- my_free(Buffer);
- SendChars(container_buffer, container_size);
-
- return OK;
-}
FRESULT FileWrite(void * buffer, uint16_t size,char *path)
{
FRESULT Fresult = FR_OK;