diff options
Diffstat (limited to 'Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c')
| -rw-r--r-- | Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c | 457 |
1 files changed, 154 insertions, 303 deletions
diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c index efc156da3..018e83ce0 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c @@ -31,11 +31,14 @@ #include <Communication/PMR/IO/GetFilesResponse.pb-c.h> #include <Communication/PMR/IO/FileAttribute.pb-c.h> - +#include "third_party/fatfs/src/ffconf.h" +#include "third_party/fatfs/src/diskio.h" +#include "drivers/Flash_Memory/Flash_Memory.h" #include "drivers/Flash_Memory/fatfs/ff.h" #include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" -#include "Modules/Control/Control.h" +#include "third_party/fatfs/src/ffconf.h" + #include "StateMachines/Printing/PrintingSTM.h" @@ -50,7 +53,7 @@ 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 4096 +#define MAX_CHUNK_LENGTH 3500 int32_t FileLength = 0; int32_t FileReceivedLength = 0; int32_t FileSentLength = 0; @@ -60,7 +63,6 @@ uint32_t ReadBytes = 0; Task_Handle CommRxTaskHandle; extern Semaphore_Handle FFS_Sem; -extern Semaphore_Handle FileUpload_sem_param; ErrorCode getErrorCode(FRESULT Fresult) { @@ -72,19 +74,14 @@ bool isDirectory(FileAttribute FileAtt) return true; return false; } -bool FileDone = true; -bool FileUploadGetState(void) -{ - return FileDone; -} -int CommRxpri; +bool FileDone = false; uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) { //uint32_t status = OK; FRESULT Fresult = FR_OK; - bool sem_ok = false; + MessageContainer responseContainer; FileUploadRequest* request = file_upload_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); @@ -93,10 +90,7 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) WrittenBytes=0; if (JobIsActive()) - { Fresult = FR_DENIED; - Report("file uplad rejected - job is running", __FILE__, __LINE__, 4, RpWarning, (int)0, 0); - } else { UploadFileHandle = my_malloc(sizeof(FIL)); @@ -104,58 +98,38 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) Fresult = FR_DENIED; else { - if (1)//(Semaphore_pend(FileUpload_sem_param, BIOS_NO_WAIT)) + Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER); + Fresult = f_open(UploadFileHandle,request->path,FA_READ | FA_WRITE | FA_OPEN_ALWAYS | FA_CREATE_ALWAYS); + if (Fresult == FR_OK) { - sem_ok = true; + FileLength = request->length; + FileReceivedLength = 0; + REPORT_MSG (FileLength,"file upload request"); + response.has_maxchunklength = true; + response.maxchunklength = MAX_CHUNK_LENGTH; + strcpy(FileHandleChar, "1234"); + response.uploadid = FileHandleChar; //supporting only single file at each time. + FileDone = false; } else { - Semaphore_post(FileUpload_sem_param); - Report("semaphore was not free", __FILE__, __LINE__, request->length, RpWarning, (int)MAX_CHUNK_LENGTH, 0); - sem_ok = true; + my_free (UploadFileHandle); + UploadFileHandle = 0; + Semaphore_post(FFS_Sem); } - if (sem_ok == true) - { - CommRxTaskHandle = Task_self(); - CommRxpri = Task_getPri(CommRxTaskHandle); - Task_setPri(CommRxTaskHandle, 11); - Report("Task_setPri", __FILE__, __LINE__, 11, RpWarning, (int)CommRxTaskHandle, 0); - //Report("FileUploadRequestFunc 2", __FILE__, __LINE__, msec_millisecondCounter, RpWarning, (int)0, 0); - Fresult = f_open(UploadFileHandle,request->path,FA_READ | FA_WRITE | FA_OPEN_ALWAYS | FA_CREATE_ALWAYS); - if (Fresult == FR_OK) - { - usnprintf(ErrorMsg, 100, "file upload request %s %d",request->path,request->length); - Report(ErrorMsg, __FILE__, __LINE__, request->length, RpWarning, (int)MAX_CHUNK_LENGTH, 0); - FileLength = request->length; - FileReceivedLength = 0; - response.has_maxchunklength = true; - response.maxchunklength = MAX_CHUNK_LENGTH; - strcpy(FileHandleChar, "1234"); - response.uploadid = FileHandleChar; //supporting only single file at each time. - FileDone = false; - } - else - { - my_free (UploadFileHandle); - UploadFileHandle = 0; - Semaphore_post(FileUpload_sem_param); - } - } - else - { - Fresult = FR_DENIED; - Report("Semaphore_pend failed", __FILE__, __LINE__, 4, RpWarning, (int)0, 0); - } } } + CommRxTaskHandle = Task_self(); + Task_setPri(CommRxTaskHandle, 4); + // Report("Task_setPri", __FILE__, __LINE__, 4, RpWarning, (int)CommRxTaskHandle, 0); - responseContainer = createContainer(MESSAGE_TYPE__FileUploadResponse, requestContainer->token, true, &response, &file_upload_response__pack, &file_upload_response__get_packed_size); + + responseContainer = createContainer(MESSAGE_TYPE__FileUploadResponse, requestContainer->token, false, &response, &file_upload_response__pack, &file_upload_response__get_packed_size); if (Fresult!= FR_OK) { - responseContainer.has_error = true; responseContainer.error = getErrorCode(Fresult); - responseContainer.errormessage = "File operation upload request error"; + responseContainer.errormessage = "File operation error"; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -167,25 +141,6 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) return OK; } FRESULT lFresult = FR_OK; -uint32_t Chunk_ControlId = 0xFF; -uint32_t FileChunkUploadCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) -{ - Report("chunk timeout error",__FILE__,IfIndex,FileReceivedLength,RpWarning,BusyFlag,0); - f_close(UploadFileHandle); - my_free (UploadFileHandle); - UploadFileHandle = 0; - FileReceivedLength = 0; - FileDone = true; - Task_setPri(CommRxTaskHandle, CommRxpri); - Semaphore_post(FileUpload_sem_param); - Report("Task_setPri", __FILE__, __LINE__, CommRxpri, RpWarning, (int)CommRxTaskHandle, 0); - if (SafeRemoveControlCallback(Chunk_ControlId, FileChunkUploadCallBackFunction )==OK) - Chunk_ControlId = 0xFF; - - return OK; - -} - uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) { //uint32_t status = OK; @@ -200,27 +155,15 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) FIL *ReceivedFileHandle; //the system supports a single active file - uint32_t save_milisec = 0; // if (request->uploadid == 1) ReceivedFileHandle = UploadFileHandle; // memcpy (&ReceivedFileHandle,request->uploadid,sizeof(ReceivedFileHandle)); //if (ReceivedFileHandle == FileHandle) //{ - //Control_WD(ENABLE,55); //activate heaters/dispenser watchdog, 0.5 seconds - //GeneralHwReady = false; - if (ReceivedFileHandle==NULL) - { - Fresult = FR_DENIED; - Report("file chunk upload rejected - file not created", __FILE__, __LINE__, 4, RpWarning, (int)0, 0); - FileDone = true; - } - else - { - KeepAliveOneSecondCounter = 0; - save_milisec = msec_millisecondCounter; - Chunk_ControlId = AddControlCallback("chunk", FileChunkUploadCallBackFunction, eOneSecond, TemplateDataReadCBFunction,0,request->buffer.len, WrittenBytes ); - - Fresult = f_write(ReceivedFileHandle,request->buffer.data,request->buffer.len,&WrittenBytes ); + Control_WD(ENABLE,55); //activate heaters/dispenser watchdog, 0.5 seconds + GeneralHwReady = false; + KeepAliveOneSecondCounter = 0; + Fresult = f_write(ReceivedFileHandle,request->buffer.data,request->buffer.len,&WrittenBytes ); lFresult = Fresult; if(Fresult != FR_OK) { @@ -230,10 +173,6 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) else { FileReceivedLength += WrittenBytes; - ReportWithPackageFilter(CommFilter,"Chunk received", __FILE__,FileLength,FileReceivedLength, RpMessage,msec_millisecondCounter-save_milisec, 0); - RemoveControlCallback(Chunk_ControlId, FileChunkUploadCallBackFunction ); - Chunk_ControlId = 0xFF; - //REPORT_MSG (FileReceivedLength,"file upload chunk"); if (FileReceivedLength == FileLength) { @@ -257,14 +196,20 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) } } } - } + /*} + else + { + LOG_ERROR (ReceivedFileHandle,"file id error"); + f_close(FileHandle); + free (FileHandle); + status = ERROR_CODE__FILE_NOT_FOUND; + }*/ responseContainer = createContainer(MESSAGE_TYPE__FileChunkUploadResponse, requestContainer->token, FileDone, &response, &file_chunk_upload_response__pack, &file_chunk_upload_response__get_packed_size); if (Fresult!= OK) { - responseContainer.has_error = true; responseContainer.error = getErrorCode(Fresult); - responseContainer.errormessage = "File operation chunk upload error"; + responseContainer.errormessage = "File operation error"; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -275,26 +220,13 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) SendCharsWithType(container_buffer, container_size,MESSAGE_TYPE__FileChunkUploadResponse); if (FileDone == true) { - Task_setPri(CommRxTaskHandle, CommRxpri); - Semaphore_post(FileUpload_sem_param); - Report("Task_setPri", __FILE__, __LINE__, CommRxpri, RpWarning, (int)CommRxTaskHandle, 0); + Task_setPri(CommRxTaskHandle, 9); + GeneralHwReady = true; + Semaphore_post(FFS_Sem); + //Report("Task_setPri", __FILE__, __LINE__, 9, RpWarning, (int)CommRxTaskHandle, 0); } return OK; } -void FileChunkUploadError(void) -{ - if (FileDone == false) - { - REPORT_MSG (FileReceivedLength,"file upload too much data!"); - f_close(UploadFileHandle); - //my_free (UploadFileHandle); CAN NOT CALL FREE() FROM INTERRUPT - UploadFileHandle = 0; - FileReceivedLength = 0; - FileDone = true; - Task_setPri(CommRxTaskHandle, CommRxpri); - Semaphore_post(FileUpload_sem_param); - } -} uint32_t FileDownloadRequestFunc(MessageContainer* requestContainer) { //uint32_t status = OK; @@ -324,27 +256,16 @@ uint32_t FileDownloadRequestFunc(MessageContainer* requestContainer) Fresult = FR_DENIED; else { - if (1)//(Semaphore_pend(FFS_Sem, BIOS_NO_WAIT)) - { - 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. - Report("data request", __FILE__, 1234, MAX_CHUNK_LENGTH, RpWarning, (int)fno->fsize, 0); - } - else - { - Semaphore_post(FFS_Sem); - } - } - else + Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER); + Fresult = f_open(DownloadFileHandle,request->filename,FA_READ ); + if (Fresult == FR_OK) { - Fresult = FR_DENIED; - Report("Semaphore_pend failed", __FILE__, __LINE__, 4, RpWarning, (int)0, 0); + response.has_maxchunklength = true; + response.maxchunklength = MAX_CHUNK_LENGTH; + strcpy(FileHandleChar, "1234"); + response.downloadid = FileHandleChar; //supporting only single file at each time. } + } } @@ -352,9 +273,8 @@ uint32_t FileDownloadRequestFunc(MessageContainer* requestContainer) responseContainer = createContainer(MESSAGE_TYPE__FileDownloadResponse, requestContainer->token, false, &response, &file_download_response__pack, &file_download_response__get_packed_size); if (Fresult!= FR_OK) { - responseContainer.has_error = true; responseContainer.error = getErrorCode(Fresult); - responseContainer.errormessage = "File operation download request error"; + responseContainer.errormessage = "File operation error"; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -379,11 +299,10 @@ uint32_t FileChunkDownloadRequestFunc(MessageContainer* requestContainer) Buffer = my_malloc (MAX_CHUNK_LENGTH); if (Buffer != NULL) { - Fresult = f_read(SentFileHandle,Buffer,MAX_CHUNK_LENGTH,&ReadBytes ); + Fresult = f_read(SentFileHandle,Buffer,2000,&ReadBytes ); if(Fresult != FR_OK) { - LOG_ERROR (Fresult,"f_read error"); - Semaphore_post(FFS_Sem); + LOG_ERROR (Fresult,"f_write error"); } else { @@ -391,7 +310,6 @@ uint32_t FileChunkDownloadRequestFunc(MessageContainer* requestContainer) response.buffer.len = ReadBytes; response.buffer.data = Buffer; FileSentLength += ReadBytes; - Report("sending data to MS", __FILE__, ReadBytes, FileSentLength, RpWarning, (int)FileLength, 0); if (FileSentLength == FileLength) { REPORT_MSG (FileSentLength,"file download ended successfully"); @@ -417,9 +335,8 @@ uint32_t FileChunkDownloadRequestFunc(MessageContainer* requestContainer) 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.has_error = true; responseContainer.error = getErrorCode(Fresult); - responseContainer.errormessage = "File operation chunk download error"; + responseContainer.errormessage = "File operation error"; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -445,9 +362,8 @@ uint32_t ExecuteProcessRequestFunc(MessageContainer* requestContainer) responseContainer = createContainer(MESSAGE_TYPE__ExecuteProcessResponse, requestContainer->token, false, &response, &execute_process_response__pack, &execute_process_response__get_packed_size); if (status!= OK) { - responseContainer.has_error = true; responseContainer.error = ERROR_CODE__GENERAL_ERROR;//getErrorCode(Fresult); - responseContainer.errormessage = "File operation execute error"; + responseContainer.errormessage = "File operation error"; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -472,9 +388,8 @@ uint32_t KillProcessRequestFunc(MessageContainer* requestContainer) responseContainer = createContainer(MESSAGE_TYPE__KillProcessResponse, requestContainer->token, false, &response, &kill_process_response__pack, &kill_process_response__get_packed_size); if (status!= OK) { - responseContainer.has_error = true; responseContainer.error = ERROR_CODE__GENERAL_ERROR;//getErrorCode(Fresult); - responseContainer.errormessage = "File operation kill error"; + responseContainer.errormessage = "File operation error"; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -498,8 +413,6 @@ uint32_t CreateRequestFunc(MessageContainer* requestContainer) if (isDirectory(request->attribute)) { Fresult = f_mkdir(request->path); - if (Fresult == FR_EXIST) - Fresult = FR_OK; //ingnore f_exist in directory create } else { @@ -508,30 +421,22 @@ uint32_t CreateRequestFunc(MessageContainer* requestContainer) Fresult = FR_DENIED; else { - if (1)//(Semaphore_pend(FFS_Sem, BIOS_NO_WAIT)) + Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER); + Fresult = f_open(UploadFileHandle,request->path,FA_CREATE_NEW); + if (Fresult == FR_OK) { - Fresult = f_open(UploadFileHandle,request->path,FA_READ | FA_WRITE | FA_OPEN_ALWAYS | FA_CREATE_ALWAYS); - if (Fresult == FR_OK) + if (f_close (UploadFileHandle)!= FR_OK) { - if (f_close (UploadFileHandle)!= FR_OK) - { - Fresult = FR_LOCKED; - } + Fresult = FR_LOCKED; } - Semaphore_post(FFS_Sem); - } - else - { - Fresult = FR_DENIED; - Report("Semaphore_pend failed", __FILE__, __LINE__, 4, RpWarning, (int)0, 0); } + Semaphore_post(FFS_Sem); } } if (Fresult != FR_OK) { //status = ERROR_CODE__FILE_NOT_FOUND; - //usnprintf(ErrorMsg, 100, "File Operation failed error code %d",Fresult); - Report("File Operation failed error code", __FILE__, __LINE__, Fresult, RpWarning, (int)0, 0); + usnprintf(ErrorMsg, 100, "File Operation failed error code %d",Fresult); } free (UploadFileHandle); @@ -539,9 +444,8 @@ uint32_t CreateRequestFunc(MessageContainer* requestContainer) responseContainer = createContainer(MESSAGE_TYPE__CreateResponse, requestContainer->token, false, &response, &create_response__pack, &create_response__get_packed_size); if (Fresult!= OK) { - responseContainer.has_error = true; responseContainer.error = getErrorCode(Fresult); - responseContainer.errormessage = "File operation create error"; + responseContainer.errormessage = "File operation error"; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -566,17 +470,17 @@ uint32_t DeleteRequestFunc(MessageContainer* requestContainer) //int NumOfFiles = 0; FRESULT Fresult = FR_OK; + Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER); Fresult = f_unlink(request->path); Semaphore_post(FFS_Sem); REPORT_MSG(Fresult, "File Delete"); responseContainer = createContainer(MESSAGE_TYPE__DeleteResponse, requestContainer->token, false, &response, &delete_response__pack, &delete_response__get_packed_size); - if ((Fresult!= FR_OK)&&(Fresult!= FR_NO_FILE)) + if (Fresult!= OK) { - //usnprintf(ErrorMsg, 100, "File Operation failed error code %d",Fresult); - responseContainer.has_error = true; + usnprintf(ErrorMsg, 100, "File Operation failed error code %d",Fresult); responseContainer.error = getErrorCode(Fresult); - responseContainer.errormessage = "File operation delete error"; + responseContainer.errormessage = ErrorMsg; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -621,9 +525,8 @@ uint32_t GetStorageInfoRequestFunc(MessageContainer* requestContainer) responseContainer = createContainer(MESSAGE_TYPE__GetStorageInfoResponse, requestContainer->token, false, &response, &get_storage_info_response__pack, &get_storage_info_response__get_packed_size); if (Fresult!= OK) { - responseContainer.has_error = true; responseContainer.error = getErrorCode(Fresult); - responseContainer.errormessage = "File operation get storage info error"; + responseContainer.errormessage = "File operation error"; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -634,8 +537,6 @@ uint32_t GetStorageInfoRequestFunc(MessageContainer* requestContainer) return OK; } -//char Datestr[100]; - uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) { //uint32_t status = OK; @@ -645,98 +546,77 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) GetFilesRequest* request = get_files_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); GetFilesResponse response = GET_FILES_RESPONSE__INIT; - //struct tm RTC_time; - #define MAX_NUM_OF_FILES 40 + + #define MAX_NUM_OF_FILES 20 DIR dir; FILINFO* fno[MAX_NUM_OF_FILES]; char FullPath[MAX_NUM_OF_FILES][60]; - int i,NumOfFiles = 0, ListedFiles = 0; + int i,NumOfFiles = 0; FRESULT Fresult = FR_OK; - FileInfo **FilesInfo = (FileInfo**)my_malloc(sizeof(FileInfo *)*(MAX_NUM_OF_FILES)); - FileInfo Data[MAX_NUM_OF_FILES]; - if (1)//(Semaphore_pend(FFS_Sem, BIOS_NO_WAIT)) + Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER); + Fresult |= f_opendir(&dir, g_cCwdBuf); + if(Fresult != FR_OK) { - Fresult |= f_opendir(&dir, g_cCwdBuf); - if(Fresult != FR_OK) - { - Semaphore_post(FFS_Sem); - return(Fresult); - } + Semaphore_post(FFS_Sem); + return(Fresult); + } - memset (fno,0,sizeof(fno)); - memset(fno,0,sizeof(fno)); - fno[0] = my_malloc(sizeof(FILINFO)); - memset (fno[0],0,sizeof(FILINFO)); + memset (fno,0,sizeof(fno)); + FileInfo **FilesInfo = (FileInfo**)my_malloc(sizeof(FileInfo *)*(MAX_NUM_OF_FILES)); + FileInfo Data[MAX_NUM_OF_FILES]; + memset(fno,0,sizeof(fno)); + fno[0] = my_malloc(sizeof(FILINFO)); + memset (fno[0],0,sizeof(FILINFO)); - //============================ - Fresult = f_opendir(&dir, request->path); /* Open the directory */ - if (Fresult == FR_OK) + //============================ + Fresult = f_opendir(&dir, request->path); /* Open the directory */ + if (Fresult == FR_OK) + { + for (NumOfFiles = 1;NumOfFiles < MAX_NUM_OF_FILES;NumOfFiles++) { - for (NumOfFiles = 1;NumOfFiles < MAX_NUM_OF_FILES;NumOfFiles++) + fno[NumOfFiles] = my_malloc(sizeof(FILINFO)); + memset (fno[NumOfFiles],0,sizeof(FILINFO)); + Fresult = f_readdir(&dir, fno[NumOfFiles]); /* Read a directory item */ + if (Fresult == FR_OK) { - fno[NumOfFiles] = my_malloc(sizeof(FILINFO)); - memset (fno[NumOfFiles],0,sizeof(FILINFO)); - Fresult = f_readdir(&dir, fno[NumOfFiles]); /* Read a directory item */ - if (Fresult == FR_OK) + if(fno[NumOfFiles]->fname[0] ==0) { - if(fno[NumOfFiles]->fname[0] ==0) - { - break; - } + break; } } } - Semaphore_post(FFS_Sem); - } - else - { - Fresult = FR_DENIED; - Report("Semaphore_pend failed", __FILE__, __LINE__, 4, RpWarning, (int)0, 0); - } + } + Semaphore_post(FFS_Sem); if ((Fresult == FR_OK)&&(NumOfFiles)) { for (i = 0;i < NumOfFiles;i++) { - if (i==0) - usnprintf(&FullPath[ListedFiles], 50, "%s", request->path); - else - if (strlen(request->path)==1) //info under the root - usnprintf(&FullPath[ListedFiles], 50, "%s%s", request->path, fno[i]->fname); - else - usnprintf(&FullPath[ListedFiles], 50, "%s%s%s", request->path,"/", fno[i]->fname); - if (fno[i]->fattrib != 0xFF) //garbage - { - file_info__init(&Data[ListedFiles]); - FilesInfo[ListedFiles] = &Data[ListedFiles]; - Data[ListedFiles].has_attribute = true; - Data[ListedFiles].attribute = fno[i]->fattrib; - Data[ListedFiles].name = fno[i]->fname; - Data[ListedFiles].has_length = true; - Data[ListedFiles].length = fno[i]->fsize; - Data[ListedFiles].has_lastmodifieddate = true; - Data[ListedFiles].lastmodifieddate = fno[i]->fdate; - Data[ListedFiles].has_lastmodifiedtime = true; - Data[ListedFiles].lastmodifiedtime = fno[i]->ftime; - Data[ListedFiles].fullpath = &FullPath[i][0]; - ListedFiles++; - } - else - { - // f_unlink(Data[ListedFiles].fullpath); - Report("file system error - format FFS", __FILE__, __LINE__, 255, RpWarning, (int)0, 0); - } - /*RTC_time.tm_year=(fno[i]->fdate>>9)+1980;//populate the time struct (FAT start==1980, RTC.year==0) - RTC_time.tm_mon=(fno[i]->fdate>>5)&0x000F; - RTC_time.tm_mday=fno[i]->fdate&0x001F; - RTC_time.tm_hour=(fno[i]->ftime>>11)&0x001F; - RTC_time.tm_min=(fno[i]->ftime>>5)&0x003F; - RTC_time.tm_sec=(fno[i]->ftime<<1)&0x003E;*/ + file_info__init(&Data[i]); + FilesInfo[i] = &Data[i]; + Data[i].has_attribute = true; + Data[i].attribute = fno[i]->fattrib; + Data[i].name = fno[i]->fname; + Data[i].has_length = true; + Data[i].length = fno[i]->fsize; + Data[i].has_lastmodifieddate = true; + Data[i].lastmodifieddate = fno[i]->fdate; + Data[i].has_lastmodifiedtime = true; + Data[i].lastmodifiedtime = fno[i]->ftime; + //Report(Data[i].name, __FILE__, __LINE__, Data[i].lastmodifieddate, RpWarning, (int)Data[i].lastmodifiedtime, 0); + if (i==0) + usnprintf(&FullPath[i], 50, "%s", request->path); + else + 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]; } - response.n_items = ListedFiles; + response.n_items = NumOfFiles; response.items = FilesInfo; } else @@ -748,9 +628,8 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) if (Fresult!= OK) { - responseContainer.has_error = true; responseContainer.error = getErrorCode(Fresult); - responseContainer.errormessage = "File operation get files error"; + responseContainer.errormessage = "File operation error"; } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -759,10 +638,8 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) size_t container_size = message_container__pack(&responseContainer, container_buffer); SendChars(container_buffer, container_size); } - if (responseContainer.data.data) - my_free(responseContainer.data.data); - if (FilesInfo) - my_free(FilesInfo); + my_free(responseContainer.data.data); + my_free(FilesInfo); get_files_request__free_unpacked(request,NULL); for (i = 0;i < NumOfFiles;i++) { @@ -784,35 +661,27 @@ FRESULT FileWrite(void * buffer, uint16_t size,char *path, uint32_t timeout) Fresult = FR_DENIED; else { - if (1)//(Semaphore_pend(FFS_Sem, BIOS_NO_WAIT)) + if (Semaphore_pend(FFS_Sem, timeout) == false) + { + LOG_ERROR (false,"file system busy error"); + return FR_TIMEOUT; + } + + Fresult = f_open(FileHandle,path,FA_WRITE | FA_OPEN_ALWAYS); + if (Fresult == FR_OK) { - Fresult = f_open(FileHandle,path,FA_WRITE | FA_OPEN_ALWAYS|FA_CREATE_ALWAYS); - if (Fresult == FR_OK) - { - Fresult = f_write(FileHandle,buffer,size,&Bytes ); - if(Fresult != FR_OK) - { - LOG_ERROR (Fresult,"fwrite error"); - } - else - { - //LOG_ERROR (Bytes,"f_write ok no of bytes"); - Report("f_write ok no of bytes", __FILE__, __LINE__, Bytes, RpWarning, (int)size, 0); - } - f_close(FileHandle); - } - else + Fresult = f_write(FileHandle,buffer,size,&Bytes ); + if(Fresult != FR_OK) { - LOG_ERROR (Fresult,"fopen error"); + LOG_ERROR (Fresult,"fread error"); } - Semaphore_post(FFS_Sem); + f_close(FileHandle); } else { - Fresult = FR_DENIED; - Report("Semaphore_pend failed", __FILE__, __LINE__, 4, RpWarning, (int)0, 0); + LOG_ERROR (Fresult,"fopen error"); } - + Semaphore_post(FFS_Sem); my_free(FileHandle); } } @@ -842,50 +711,40 @@ FRESULT FileRead(char *path, uint32_t *Size, void **Buffer) Fresult = FR_DENIED; else { - if (1)//(Semaphore_pend(FFS_Sem, BIOS_NO_WAIT)) + Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER); + Fresult = f_open(FileHandle,path,FA_READ); + if (Fresult == FR_OK) { - Fresult = f_open(FileHandle,path,FA_READ); - if (Fresult == FR_OK) + Fresult = f_read(FileHandle,buffer,fno->fsize,&Bytes ); + if(Fresult == FR_OK) { - Fresult = f_read(FileHandle,buffer,fno->fsize,&Bytes ); - if(Fresult == FR_OK) - { - *Buffer = buffer; - *Size = (uint32_t)fno->fsize; - Report("f_read ok no of bytes", __FILE__, __LINE__, Bytes, RpWarning, (int)fno->fsize, 0); - } - else - { - LOG_ERROR (Fresult,"fread error"); - my_free (buffer); - } - f_close(FileHandle); + *Buffer = buffer; + *Size = (uint32_t)fno->fsize; } else { - LOG_ERROR (Fresult,"fopen error"); + LOG_ERROR (Fresult,"fread error"); my_free (buffer); } + f_close(FileHandle); Semaphore_post(FFS_Sem); } else { - Fresult = FR_DENIED; - Report("Semaphore_pend failed", __FILE__, __LINE__, 4, RpWarning, (int)0, 0); + LOG_ERROR (Fresult,"fopen error"); + my_free (buffer); } my_free(FileHandle); } } else { - Report("malloc error", __FILE__, __LINE__, Fresult, RpWarning, (int)fno->fsize, 0); - Fresult = FR_DENIED; + LOG_ERROR (Fresult,"malloc error"); } } else { - Report("f_stat error", __FILE__, __LINE__, Fresult, RpWarning, (int)0, 0); - Fresult = FR_DENIED; + LOG_ERROR (Fresult,"f_stat error"); } my_free(fno); return Fresult; @@ -907,20 +766,12 @@ FRESULT FileOpen(char *path, uint32_t *Size, FIL *FileHandle) if (FileHandle == 0) Fresult = FR_DENIED; else - if (1)//(Semaphore_pend(FFS_Sem, BIOS_NO_WAIT)) - { - Fresult = f_open(FileHandle,path,FA_READ); - Semaphore_post(FFS_Sem); //will be closed with the f_close, in the job - } - else - { - Fresult = FR_DENIED; - Report("Semaphore_pend failed", __FILE__, __LINE__, 4, RpWarning, (int)0, 0); - } + Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER); + Fresult = f_open(FileHandle,path,FA_READ); } else { - Report("f_stat error", __FILE__, __LINE__,Fresult, RpWarning, (int)0, 0); + LOG_ERROR (Fresult,"f_stat error"); } my_free(fno); return Fresult; |
