From e94f4ad6873324ac69f9e0d4abaef816a7696a2b Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Wed, 31 Oct 2018 15:09:11 +0200 Subject: usb reconnected after ka failure. filesystem draft --- .../Embedded/Common/SWUpdate/FileSystem.c | 239 ++++++++++++++++++++- 1 file changed, 230 insertions(+), 9 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c') diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c index f9806552d..6324c904e 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c @@ -6,6 +6,7 @@ */ #include "include.h" #include "Communication/CommunicationTask.h" +#include #include #include @@ -23,19 +24,57 @@ #include #include #include - - +#include + +#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 "third_party/fatfs/src/ffconf.h" +FIL *FileHandle = 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; + +bool isDirectory(FileAttribute FileAtt) +{ + if (FileAtt&&FILE_ATTRIBUTE__Directory) + return true; + return false; +} uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) { uint32_t status = OK; + FRESULT Fresult = FR_OK; + MessageContainer responseContainer; FileUploadRequest* request = file_upload_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); FileUploadResponse response = FILE_UPLOAD_RESPONSE__INIT; + if (FileHandle == 0) + { + Fresult = f_open(FileHandle,request->filename,FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW); + if (Fresult == FR_OK) + { + FileLength = request->length; + response.has_maxchunklength = true; + response.maxchunklength = MAX_CHUNK_LENGTH; + memcpy (FileHandleChar,FileHandle,sizeof(FileHandle)); + response.uploadid = FileHandleChar; //supporting only single file at each time. + } + } + else + { + Fresult = FR_DENIED; + } + responseContainer = createContainer(MESSAGE_TYPE__FileUploadResponse, requestContainer->token, false, &response, &file_upload_response__pack, &file_upload_response__get_packed_size); if (status!= OK) @@ -55,6 +94,9 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) { uint32_t status = OK; + FRESULT Fresult = FR_OK; + uint32_t WrittenBytes = 0; + MessageContainer responseContainer; @@ -62,6 +104,48 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) FileChunkUploadResponse response = FILE_CHUNK_UPLOAD_RESPONSE__INIT; + FIL *ReceivedFileHandle = 0; //the system supports a single active file + + memcpy (ReceivedFileHandle,request->uploadid,sizeof(ReceivedFileHandle)); + if (ReceivedFileHandle == FileHandle) + { + Fresult = f_write(ReceivedFileHandle,request->buffer.data,request->buffer.len,&WrittenBytes ); +// FIL *fp, /* Pointer to the file object */ +// const void *buff, /* Pointer to the data to be written */ +// UINT btw, /* Number of bytes to write */ +// UINT *bw /* Pointer to number of bytes written */ + if(Fresult != FR_OK) + { + LOG_ERROR (Fresult,"f_write error"); + } + else + { + int FileLength = 0; + FileReceivedLength += WrittenBytes; + if (FileReceivedLength == FileLength) + { + REPORT_MSG (FileReceivedLength,"file upload ended successfully"); + f_close(ReceivedFileHandle); + FileHandle = 0; + } + else + { + if (FileReceivedLength > FileLength) + { + REPORT_MSG (FileReceivedLength,"file upload too much data!"); + f_close(ReceivedFileHandle); + FileHandle = 0; + } + } + } + } + else + { + LOG_ERROR (ReceivedFileHandle,"file id error"); + f_close(FileHandle); + FileHandle = 0; + status = ERROR_CODE__FILE_NOT_FOUND; + } responseContainer = createContainer(MESSAGE_TYPE__FileChunkUploadResponse, requestContainer->token, false, &response, &file_chunk_upload_response__pack, &file_chunk_upload_response__get_packed_size); if (status!= OK) @@ -91,7 +175,7 @@ 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.error = ERROR_CODE__INVALID_PROCESS_ID; + responseContainer.error = ERROR_CODE__FILE_NOT_FOUND; responseContainer.errormessage = "JOb Active or incorrect parameters"; } responseContainer.continuous = false; @@ -116,7 +200,7 @@ 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.error = ERROR_CODE__INVALID_PROCESS_ID; + responseContainer.error = ERROR_CODE__FILE_NOT_FOUND; responseContainer.errormessage = "JOb Active or incorrect parameters"; } responseContainer.continuous = false; @@ -130,19 +214,48 @@ uint32_t KillProcessRequestFunc(MessageContainer* requestContainer) uint32_t CreateRequestFunc(MessageContainer* requestContainer) { uint32_t status = OK; - + FRESULT Fresult = FR_OK; MessageContainer responseContainer; CreateRequest* request = create_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); CreateResponse response = CREATE_RESPONSE__INIT; + if (isDirectory(request->attribute)) + { + Fresult = f_mkdir(request->path); + } + else + { + if (FileHandle == 0) + { + Fresult = f_open(FileHandle,request->path,FA_CREATE_NEW); + if (Fresult == FR_OK) + { + if (f_close (FileHandle)!= FR_OK) + { + Fresult = FR_LOCKED; + } + } + } + else + { + Fresult = FR_DENIED; + } + } + if (Fresult != FR_OK) + { + status = ERROR_CODE__FILE_NOT_FOUND; + usnprintf(ErrorMsg, 100, "File Operation failed error code %d",Fresult); + + } + FileHandle = 0; responseContainer = createContainer(MESSAGE_TYPE__CreateResponse, requestContainer->token, false, &response, &create_response__pack, &create_response__get_packed_size); if (status!= OK) { - responseContainer.error = ERROR_CODE__INVALID_PROCESS_ID; - responseContainer.errormessage = "JOb Active or incorrect parameters"; + responseContainer.error = ERROR_CODE__FILE_NOT_FOUND; + responseContainer.errormessage = ErrorMsg; } responseContainer.continuous = false; uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer)); @@ -162,11 +275,52 @@ uint32_t DeleteRequestFunc(MessageContainer* requestContainer) DeleteResponse response = DELETE_RESPONSE__INIT; + DIR dir; + FILINFO* fno = 0; + int NumOfFiles = 0; + FRESULT Fresult = FR_OK; + + Fresult = f_stat(request->path,fno); + if (Fresult == FR_OK) + { + if (isDirectory(fno->fattrib)) + { + //============================ + Fresult = f_opendir(&dir, request->path); /* Open the directory */ + if (Fresult == FR_OK) + { + Fresult = f_readdir(&dir, &fno); /* Read a directory item */ + if (Fresult == FR_OK) + { + if(fno->fname[0] ==0) + { + //no files + Fresult = f_unlink(request->path); + } + else + { + LOG_ERROR (fno,"Directory not empty"); + } + } + } + } + else + { + Fresult = f_unlink(request->path); + } + } + if (Fresult != FR_OK) + { + status = ERROR_CODE__FILE_NOT_FOUND; + usnprintf(ErrorMsg, 100, "File Operation failed error code %d",Fresult); + } + FileHandle = 0; + responseContainer = createContainer(MESSAGE_TYPE__DeleteResponse, requestContainer->token, false, &response, &delete_response__pack, &delete_response__get_packed_size); if (status!= OK) { - responseContainer.error = ERROR_CODE__INVALID_PROCESS_ID; + responseContainer.error = ERROR_CODE__FILE_NOT_FOUND; responseContainer.errormessage = "JOb Active or incorrect parameters"; } responseContainer.continuous = false; @@ -186,6 +340,24 @@ uint32_t GetStorageInfoRequestFunc(MessageContainer* requestContainer) GetStorageInfoRequest* request = get_storage_info_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); GetStorageInfoResponse response = GET_STORAGE_INFO_RESPONSE__INIT; + FATFS *fs; + DWORD fre_clust, fre_sect, tot_sect; + FRESULT Fresult = FR_OK; + + + /* Get volume information and free clusters of drive 1 */ + Fresult = f_getfree("0:", &fre_clust, &fs); + if (Fresult == FR_OK) + { + + /* Get total sectors and free sectors */ + tot_sect = (fs->n_fatent - 2) * fs->csize; + fre_sect = fre_clust * fs->csize; + response.has_capacity = true; + response.capacity = tot_sect/2; + response.has_freespace = true; + response.freespace = fre_sect/2; + } responseContainer = createContainer(MESSAGE_TYPE__GetStorageInfoResponse, requestContainer->token, false, &response, &get_storage_info_response__pack, &get_storage_info_response__get_packed_size); @@ -212,11 +384,60 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) GetFilesResponse response = GET_FILES_RESPONSE__INIT; + #define MAX_NUM_OF_FILES 10 + DIR dir; + FILINFO* fno[MAX_NUM_OF_FILES] = {0,0,0,0,0,0,0,0,0,0}; + int NumOfFiles = 0; + FRESULT Fresult = FR_OK; + FileInfo **FilesInfo = (FileInfo**)malloc(sizeof(FileInfo *)*(MAX_NUM_OF_FILES)); + FileInfo Data[MAX_NUM_OF_FILES]; + Fresult = f_stat(request->path,fno[0]); + if (Fresult == FR_OK) + { + if (isDirectory(fno[0]->fattrib)) + { + NumOfFiles++; + //============================ + Fresult = f_opendir(&dir, request->path); /* Open the directory */ + if (Fresult == FR_OK) + { + for (NumOfFiles = 1;NumOfFiles < MAX_NUM_OF_FILES;NumOfFiles++) + { + Fresult = f_readdir(&dir, &fno[NumOfFiles]); /* Read a directory item */ + if (Fresult == FR_OK) + { + if(fno[NumOfFiles]->fname[0] ==0) + { + break; + } + } + } + } + } + else + { + Fresult = FR_DENIED; + } + } + + if (Fresult == FR_OK) + { + for (NumOfFiles = 0;NumOfFiles < MAX_NUM_OF_FILES;NumOfFiles++) + { + Data[NumOfFiles].attribute = fno[NumOfFiles]->fattrib; + Data[NumOfFiles].name = fno[NumOfFiles]->fname; + Data[NumOfFiles].length = fno[NumOfFiles]->fsize; + Data[NumOfFiles].lastmodifieddate = fno[NumOfFiles]->fdate; + Data[NumOfFiles].lastmodifiedtime = fno[NumOfFiles]->ftime; + response.items[NumOfFiles] = &Data[NumOfFiles]; + } + } responseContainer = createContainer(MESSAGE_TYPE__GetFilesResponse, requestContainer->token, false, &response, &get_files_response__pack, &get_files_response__get_packed_size); + if (status!= OK) { - responseContainer.error = ERROR_CODE__INVALID_PROCESS_ID; + responseContainer.error = ERROR_CODE__FILE_NOT_FOUND; responseContainer.errormessage = "JOb Active or incorrect parameters"; } responseContainer.continuous = false; -- cgit v1.3.1 From 05538cca177a09a2d97c35700c6dd19a1bf5f7f0 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 4 Nov 2018 18:43:56 +0200 Subject: improve file system (still bugged). usb reconnect, reduce memory usage --- .../Embedded/Common/SWUpdate/FileSystem.c | 12 +++++-- .../Embedded/Drivers/USB_Communication/USBCDCD.c | 10 +++--- Software/Embedded_SW/Embedded/Embedded.cfg | 2 +- Software/Stubs Collection/stubs/test WD.cs | 41 ++++++++++++++++++++++ 4 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 Software/Stubs Collection/stubs/test WD.cs (limited to 'Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c') diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c index 6324c904e..de4f0937a 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c @@ -386,12 +386,14 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) #define MAX_NUM_OF_FILES 10 DIR dir; - FILINFO* fno[MAX_NUM_OF_FILES] = {0,0,0,0,0,0,0,0,0,0}; + FILINFO* fno[MAX_NUM_OF_FILES]; int NumOfFiles = 0; FRESULT Fresult = FR_OK; FileInfo **FilesInfo = (FileInfo**)malloc(sizeof(FileInfo *)*(MAX_NUM_OF_FILES)); FileInfo Data[MAX_NUM_OF_FILES]; + fno[0] = malloc(sizeof(FILINFO)); + memset (fno[0],0,sizeof(FILINFO)); Fresult = f_stat(request->path,fno[0]); if (Fresult == FR_OK) { @@ -404,6 +406,8 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) { for (NumOfFiles = 1;NumOfFiles < MAX_NUM_OF_FILES;NumOfFiles++) { + fno[NumOfFiles] = malloc(sizeof(FILINFO)); + memset (fno[NumOfFiles],0,sizeof(FILINFO)); Fresult = f_readdir(&dir, &fno[NumOfFiles]); /* Read a directory item */ if (Fresult == FR_OK) { @@ -445,6 +449,10 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) size_t container_size = message_container__pack(&responseContainer, container_buffer); free(responseContainer.data.data); SendChars(container_buffer, container_size); - + for (NumOfFiles = 0;NumOfFiles < MAX_NUM_OF_FILES;NumOfFiles++) + { + if (fno[NumOfFiles]) + free (fno[NumOfFiles]); + } return OK; } diff --git a/Software/Embedded_SW/Embedded/Drivers/USB_Communication/USBCDCD.c b/Software/Embedded_SW/Embedded/Drivers/USB_Communication/USBCDCD.c index 0d42057b8..76592f0d5 100644 --- a/Software/Embedded_SW/Embedded/Drivers/USB_Communication/USBCDCD.c +++ b/Software/Embedded_SW/Embedded/Drivers/USB_Communication/USBCDCD.c @@ -770,21 +770,21 @@ void USBCDCD_init(void) void USBCDCD_Reinit(void) { - //USBDCDCTerm(USBDComposite); + USBDCDCTerm(USBDComposite); /* State specific variables */ - //state = USBCDCD_STATE_UNCONFIGURED; + state = USBCDCD_STATE_UNCONFIGURED; /* Set the USB stack mode to Device mode with VBUS monitoring */ - //USBStackModeSet(0, eUSBModeForceDevice, 0); + USBStackModeSet(0, eUSBModeForceDevice, 0); USBBufferInit(&txBuffer); USBBufferInit(&rxBuffer); - /*USBDComposite = USBDCDCInit(0, &g_sCDCDevice); + USBDComposite = USBDCDCInit(0, &g_sCDCDevice); if (!USBDComposite) { System_abort("Error initializing the serial device"); - }*/ + } } diff --git a/Software/Embedded_SW/Embedded/Embedded.cfg b/Software/Embedded_SW/Embedded/Embedded.cfg index ca658a2f8..bc7827bb0 100644 --- a/Software/Embedded_SW/Embedded/Embedded.cfg +++ b/Software/Embedded_SW/Embedded/Embedded.cfg @@ -15,7 +15,7 @@ var GIO = xdc.useModule('ti.sysbios.io.GIO'); var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore'); var Task = xdc.useModule('ti.sysbios.knl.Task'); -//BIOS.heapSize = 30767; // bios heapmem +BIOS.heapSize = 32768; // bios heapmem //Memory.defaultHeapSize = 48767; Program.heap = 50000; //sysmem diff --git a/Software/Stubs Collection/stubs/test WD.cs b/Software/Stubs Collection/stubs/test WD.cs new file mode 100644 index 000000000..ee14d34a6 --- /dev/null +++ b/Software/Stubs Collection/stubs/test WD.cs @@ -0,0 +1,41 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + + + +//to test the WD : stop the stub and stop the embedded software + +public void OnExecute(StubManager stubManager) +{ + + + + + stubManager.Run("StubFpgaWriteRegRequest" ,0x60000000 | 0x160, 0x4000 | 0x01 ); + stubManager.Run("StubFpgaWriteRegRequest" ,0x60000400 | 0x140, 0x4000 | 0x01 ); + stubManager.Run("StubFpgaWriteRegRequest" ,0x60000800 | 0x140, 0x4000 | 0x01 ); + Thread.Sleep(100); + + + stubManager.Run("StubFpgaWriteRegRequest" ,0x60000000 | 0x160, 0x4000 | 0x01 ); + stubManager.Run("StubFpgaWriteRegRequest" ,0x60000400 | 0x140, 0x4000 | 0x01 ); + stubManager.Run("StubFpgaWriteRegRequest" ,0x60000800 | 0x140, 0x4000 | 0x01 ); + Thread.Sleep(100); + stubManager.Run("StubFpgaWriteRegRequest" ,0x60000000 | 0x160, 0x4000 | 0x01 ); + stubManager.Run("StubFpgaWriteRegRequest" ,0x60000400 | 0x140, 0x4000 | 0x01 ); + stubManager.Run("StubFpgaWriteRegRequest" ,0x60000800 | 0x140, 0x4000 | 0x01 ); + + + + + +} \ No newline at end of file -- cgit v1.3.1