diff options
Diffstat (limited to 'Software/Embedded_SW/Embedded/Common/SWUpdate')
| -rw-r--r-- | Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c | 238 |
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; |
