diff options
Diffstat (limited to 'Software/Embedded_SW/Embedded/Common/SWUpdate')
| -rw-r--r-- | Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c | 280 | ||||
| -rw-r--r-- | Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c | 16 |
2 files changed, 162 insertions, 134 deletions
diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c index ce36f57e6..d39c335ef 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c @@ -44,14 +44,18 @@ ErrorCode FileError_to_ErrorCode[FR_INVALID_PARAMETER+1] = {ERROR_CODE__NONE,ERR ERROR_CODE__FILE_REQUEST_INVALID_PARAMETER}; -FIL *FileHandle = 0; //the system supports a single active file +FIL *UploadFileHandle = 0; //the system supports a single active file +FIL *DownloadFileHandle = 0; //the system supports a single active file char FileHandleChar[5]; char ErrorMsg[100]; #define MAX_CHUNK_LENGTH 2000 -int FileLength = 0; -int FileReceivedLength = 0; +int32_t FileLength = 0; +int32_t FileReceivedLength = 0; +int32_t FileSentLength = 0; static char g_cCwdBuf[50] = "/"; uint32_t WrittenBytes = 0; +uint32_t ReadBytes = 0; + ErrorCode getErrorCode(FRESULT Fresult) { @@ -77,12 +81,12 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) FileUploadResponse response = FILE_UPLOAD_RESPONSE__INIT; WrittenBytes=0; - FileHandle = my_malloc(sizeof(FIL)); - if (FileHandle == 0) + UploadFileHandle = my_malloc(sizeof(FIL)); + if (UploadFileHandle == 0) Fresult = FR_DENIED; else { - Fresult = f_open(FileHandle,request->path,FA_READ | FA_WRITE | FA_OPEN_ALWAYS ); + Fresult = f_open(UploadFileHandle,request->path,FA_READ | FA_WRITE | FA_OPEN_ALWAYS ); if (Fresult == FR_OK) { FileLength = request->length; @@ -93,8 +97,8 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) } else { - free (FileHandle); - FileHandle = 0; + free (UploadFileHandle); + UploadFileHandle = 0; } } @@ -115,7 +119,6 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) return OK; } - uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) { //uint32_t status = OK; @@ -131,7 +134,7 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) FIL *ReceivedFileHandle; //the system supports a single active file // if (request->uploadid == 1) - ReceivedFileHandle = FileHandle; + ReceivedFileHandle = UploadFileHandle; // memcpy (&ReceivedFileHandle,request->uploadid,sizeof(ReceivedFileHandle)); //if (ReceivedFileHandle == FileHandle) //{ @@ -147,7 +150,8 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) { REPORT_MSG (FileReceivedLength,"file upload ended successfully"); f_close(ReceivedFileHandle); - free (FileHandle); + free (UploadFileHandle); + FileReceivedLength = 0; } else { @@ -155,7 +159,8 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) { REPORT_MSG (FileReceivedLength,"file upload too much data!"); f_close(ReceivedFileHandle); - free (FileHandle); + free (UploadFileHandle); + FileReceivedLength = 0; } } } @@ -183,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; @@ -251,15 +374,15 @@ uint32_t CreateRequestFunc(MessageContainer* requestContainer) } else { - FileHandle = my_malloc(sizeof(FIL)); - if (FileHandle == 0) + UploadFileHandle = my_malloc(sizeof(FIL)); + if (UploadFileHandle == 0) Fresult = FR_DENIED; else { - Fresult = f_open(FileHandle,request->path,FA_CREATE_NEW); + Fresult = f_open(UploadFileHandle,request->path,FA_CREATE_NEW); if (Fresult == FR_OK) { - if (f_close (FileHandle)!= FR_OK) + if (f_close (UploadFileHandle)!= FR_OK) { Fresult = FR_LOCKED; } @@ -272,7 +395,7 @@ uint32_t CreateRequestFunc(MessageContainer* requestContainer) usnprintf(ErrorMsg, 100, "File Operation failed error code %d",Fresult); } - free (FileHandle); + free (UploadFileHandle); responseContainer = createContainer(MESSAGE_TYPE__CreateResponse, requestContainer->token, false, &response, &create_response__pack, &create_response__get_packed_size); if (Fresult!= OK) @@ -304,7 +427,7 @@ uint32_t DeleteRequestFunc(MessageContainer* requestContainer) //int NumOfFiles = 0; FRESULT Fresult = FR_OK; - Fresult |= f_opendir(&dir, g_cCwdBuf); + /*Fresult |= f_opendir(&dir, g_cCwdBuf); if(Fresult != FR_OK) { LOG_ERROR (Fresult,"f_write error"); @@ -320,10 +443,10 @@ uint32_t DeleteRequestFunc(MessageContainer* requestContainer) if (isDirectory(fno->fattrib)) { //============================ - Fresult = f_opendir(&dir, request->path); /* Open the directory */ + Fresult = f_opendir(&dir, request->path); if (Fresult == FR_OK) { - Fresult = f_readdir(&dir, &fno); /* Read a directory item */ + Fresult = f_readdir(&dir, &fno); if (Fresult == FR_OK) { if(fno->fname[0] ==0) @@ -343,7 +466,9 @@ uint32_t DeleteRequestFunc(MessageContainer* requestContainer) Fresult = f_unlink(request->path); } } - } + }*/ + Fresult = f_unlink(request->path); + responseContainer = createContainer(MESSAGE_TYPE__DeleteResponse, requestContainer->token, false, &response, &delete_response__pack, &delete_response__get_packed_size); if (Fresult!= OK) { @@ -384,10 +509,10 @@ uint32_t GetStorageInfoRequestFunc(MessageContainer* requestContainer) tot_sect = (fs->n_fatent - 2) * fs->csize; fre_sect = fre_clust * fs->csize; response.has_capacity = true; - response.capacity = tot_sect/2; + response.capacity = tot_sect/2*1024; response.has_freespace = true; - response.freespace = fre_sect/2; - response.root = "0:"; + response.freespace = fre_sect/2*1024; + response.root = "/"; } @@ -463,7 +588,6 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) FilesInfo[i] = &Data[i]; Data[i].has_attribute = true; Data[i].attribute = fno[i]->fattrib; - Data[i].has_length = true; Data[i].name = fno[i]->fname; Data[i].has_length = true; Data[i].length = fno[i]->fsize; @@ -476,7 +600,10 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) if (i==0) usnprintf(&FullPath[i], 50, "%s", request->path); else - usnprintf(&FullPath[i], 50, "%s%c%c%s", request->path,'\\','\\'/*"/"*/, fno[i]->fname); + if (strlen(request->path)==1) //info under the root + usnprintf(&FullPath[i], 50, "%s%s", request->path, fno[i]->fname); + else + usnprintf(&FullPath[i], 50, "%s%s%s", request->path,"/", fno[i]->fname); Data[i].fullpath = &FullPath[i]; } @@ -509,107 +636,6 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) } return Fresult; } -uint32_t FileDownloadRequestFunc(MessageContainer* requestContainer) -{ - //uint32_t status = OK; - - FRESULT Fresult = FR_OK; - - MessageContainer responseContainer; - - FileDownloadRequest* request = file_download_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); - - FileDownloadResponse response = FILE_DOWNLOAD_RESPONSE__INIT; - - WrittenBytes=0; - FileHandle = my_malloc(sizeof(FIL)); - if (FileHandle == 0) - Fresult = FR_DENIED; - else - { - Fresult = f_open(FileHandle,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 = FileHandle; - char *Buffer = 0; - Buffer = my_malloc (2000); - if (Buffer != NULL) - { - Fresult = f_read(ReceivedFileHandle,response.buffer.data,2000,&WrittenBytes ); - if(Fresult != FR_OK) - { - LOG_ERROR (Fresult,"f_write error"); - } - else - { - response.buffer.len = WrittenBytes; - FileReceivedLength += WrittenBytes; - if (FileReceivedLength == FileLength) - { - REPORT_MSG (FileReceivedLength,"file download ended successfully"); - f_close(ReceivedFileHandle); - free (FileHandle); - } - else - { - if (FileReceivedLength > FileLength) - { - REPORT_MSG (FileReceivedLength,"file download too much data!"); - f_close(ReceivedFileHandle); - free (FileHandle); - } - } - } - } - - 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; diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c index 35bde3636..dcb8cf8f2 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c @@ -24,13 +24,12 @@ #include "drivers/FPGA/Full_Vme/FPGA_Programming_Up.h" #include "Common/SWUpdate/FileSystem.h" - uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) { - uint32_t status = OK; void* buffer = NULL; uint32_t Bytes = 0; char SWINFOPath[100]; + char FullPath[50]; FRESULT Fresult = FR_OK; int File_i; @@ -41,12 +40,13 @@ uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) ActivateVersionResponse response = ACTIVATE_VERSION_RESPONSE__INIT; VersionPackageDescriptor* VersionPackage;// = VERSION_PACKAGE_DESCRIPTOR__INIT; + FPGA_ID FileDestinationToFPGAId[VERSION_FILE_DESTINATION__FPGA3+1] = {MAX_FPGA,FPGA1,FPGA2,FPGA3}; + strcpy (SWINFOPath,request->path); - strcat(SWINFOPath,"//SWINFO.DAT"); + strcat(SWINFOPath,"/file1.pck"); Fresult = FileRead(SWINFOPath, &Bytes, &buffer); - if (Fresult == FR_OK) { VersionPackage = version_package_descriptor__unpack(NULL,Bytes,buffer); @@ -61,17 +61,19 @@ uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) case VERSION_FILE_DESTINATION__FPGA3: //validate //update - Fresult = FPGA_Programming_Up( VersionPackage->filedescriptors[File_i]->destination, VersionPackage->filedescriptors[File_i]->filename, false); + usnprintf(FullPath, 50, "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename); + + Fresult = FPGA_Programming_Request( FileDestinationToFPGAId[VersionPackage->filedescriptors[File_i]->destination], FullPath, false); break; default: - LOG_ERROR (VersionPackage->filedescriptors[File_i]->destination,"wrong fule update Destination"); + LOG_ERROR (VersionPackage->filedescriptors[File_i]->destination,"wrong file update Destination"); Fresult = FR_INVALID_NAME; break; } } } responseContainer = createContainer(MESSAGE_TYPE__ActivateVersionResponse, requestContainer->token, false, &response, &activate_version_response__pack, &activate_version_response__get_packed_size); - if (status!= OK) + if (Fresult!= OK) { responseContainer.error = FileError_to_ErrorCode[Fresult]; responseContainer.errormessage = "Activate Version Request error"; |
