aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2019-09-16 17:48:16 +0300
committerShlomo Hecht <shlomo@twine-s.com>2019-09-16 17:48:16 +0300
commit161fe6f6d2b29ba3deb641cdc049ad0d8f58004e (patch)
tree20318bb7ea4a243b8c2e9757e4635e8d5f5cb728 /Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
parent30fcfa4100a9d00e887c6e17e32e427b05296ce7 (diff)
parentb674a2e7751daa80c0d74207968bf8e3d18d7faf (diff)
downloadTango-161fe6f6d2b29ba3deb641cdc049ad0d8f58004e.tar.gz
Tango-161fe6f6d2b29ba3deb641cdc049ad0d8f58004e.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c')
-rw-r--r--Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c67
1 files changed, 53 insertions, 14 deletions
diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
index 5a77a013d..4396f6da1 100644
--- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
+++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
@@ -35,6 +35,7 @@
#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 "third_party/fatfs/src/ffconf.h"
@@ -52,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 4000
+#define MAX_CHUNK_LENGTH 5500
int32_t FileLength = 0;
int32_t FileReceivedLength = 0;
int32_t FileSentLength = 0;
@@ -61,6 +62,7 @@ uint32_t WrittenBytes = 0;
uint32_t ReadBytes = 0;
Task_Handle CommRxTaskHandle;
+extern Semaphore_Handle FFS_Sem;
ErrorCode getErrorCode(FRESULT Fresult)
{
@@ -72,6 +74,7 @@ bool isDirectory(FileAttribute FileAtt)
return true;
return false;
}
+bool FileDone = false;
uint32_t FileUploadRequestFunc(MessageContainer* requestContainer)
{
@@ -95,6 +98,7 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer)
Fresult = FR_DENIED;
else
{
+ 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)
{
@@ -105,17 +109,20 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer)
response.maxchunklength = MAX_CHUNK_LENGTH;
strcpy(FileHandleChar, "1234");
response.uploadid = FileHandleChar; //supporting only single file at each time.
+ FileDone = false;
}
else
{
- free (UploadFileHandle);
+ my_free (UploadFileHandle);
UploadFileHandle = 0;
+ Semaphore_post(FFS_Sem);
}
}
}
CommRxTaskHandle = Task_self();
Task_setPri(CommRxTaskHandle, 4);
+ // Report("Task_setPri", __FILE__, __LINE__, 4, RpWarning, (int)CommRxTaskHandle, 0);
responseContainer = createContainer(MESSAGE_TYPE__FileUploadResponse, requestContainer->token, false, &response, &file_upload_response__pack, &file_upload_response__get_packed_size);
@@ -133,11 +140,11 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer)
return OK;
}
+FRESULT lFresult = FR_OK;
uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer)
{
//uint32_t status = OK;
FRESULT Fresult = FR_OK;
- bool FileDone = false;
MessageContainer responseContainer;
@@ -153,8 +160,11 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer)
// memcpy (&ReceivedFileHandle,request->uploadid,sizeof(ReceivedFileHandle));
//if (ReceivedFileHandle == FileHandle)
//{
- KeepAliveOneSecondCounter = 0;
+ 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)
{
LOG_ERROR (Fresult,"f_write error");
@@ -168,7 +178,8 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer)
{
REPORT_MSG (FileReceivedLength,"file upload ended successfully");
f_close(ReceivedFileHandle);
- free (UploadFileHandle);
+ my_free (UploadFileHandle);
+ UploadFileHandle = 0;
FileReceivedLength = 0;
FileDone = true;
}
@@ -178,7 +189,8 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer)
{
REPORT_MSG (FileReceivedLength,"file upload too much data!");
f_close(ReceivedFileHandle);
- free (UploadFileHandle);
+ my_free (UploadFileHandle);
+ UploadFileHandle = 0;
FileReceivedLength = 0;
FileDone = true;
}
@@ -202,12 +214,17 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer)
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(request->buffer.data);
file_chunk_upload_request__free_unpacked(request,NULL);
my_free(responseContainer.data.data);
- SendChars(container_buffer, container_size);
+ SendCharsWithType(container_buffer, container_size,MESSAGE_TYPE__FileChunkUploadResponse);
if (FileDone == true)
+ {
Task_setPri(CommRxTaskHandle, 9);
-
+ GeneralHwReady = true;
+ Semaphore_post(FFS_Sem);
+ //Report("Task_setPri", __FILE__, __LINE__, 9, RpWarning, (int)CommRxTaskHandle, 0);
+ }
return OK;
}
uint32_t FileDownloadRequestFunc(MessageContainer* requestContainer)
@@ -239,6 +256,7 @@ uint32_t FileDownloadRequestFunc(MessageContainer* requestContainer)
Fresult = FR_DENIED;
else
{
+ Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER);
Fresult = f_open(DownloadFileHandle,request->filename,FA_READ );
if (Fresult == FR_OK)
{
@@ -277,7 +295,7 @@ uint32_t FileChunkDownloadRequestFunc(MessageContainer* requestContainer)
FIL *SentFileHandle; //the system supports a single active file
SentFileHandle = DownloadFileHandle;
- char *Buffer = 0;
+ uint8_t *Buffer = 0;
Buffer = my_malloc (MAX_CHUNK_LENGTH);
if (Buffer != NULL)
{
@@ -296,7 +314,8 @@ uint32_t FileChunkDownloadRequestFunc(MessageContainer* requestContainer)
{
REPORT_MSG (FileSentLength,"file download ended successfully");
f_close(SentFileHandle);
- free (DownloadFileHandle);
+ Semaphore_post(FFS_Sem);
+ my_free (DownloadFileHandle);
FileSentLength = 0;
}
else
@@ -305,7 +324,8 @@ uint32_t FileChunkDownloadRequestFunc(MessageContainer* requestContainer)
{
REPORT_MSG (FileSentLength,"file download too much data!");
f_close(SentFileHandle);
- free (DownloadFileHandle);
+ Semaphore_post(FFS_Sem);
+ my_free (DownloadFileHandle);
FileSentLength = 0;
}
}
@@ -401,6 +421,7 @@ uint32_t CreateRequestFunc(MessageContainer* requestContainer)
Fresult = FR_DENIED;
else
{
+ Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER);
Fresult = f_open(UploadFileHandle,request->path,FA_CREATE_NEW);
if (Fresult == FR_OK)
{
@@ -409,6 +430,7 @@ uint32_t CreateRequestFunc(MessageContainer* requestContainer)
Fresult = FR_LOCKED;
}
}
+ Semaphore_post(FFS_Sem);
}
}
if (Fresult != FR_OK)
@@ -448,7 +470,9 @@ 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);
@@ -523,16 +547,18 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer)
GetFilesResponse response = GET_FILES_RESPONSE__INIT;
- #define MAX_NUM_OF_FILES 10
+ #define MAX_NUM_OF_FILES 20
DIR dir;
FILINFO* fno[MAX_NUM_OF_FILES];
- char FullPath[MAX_NUM_OF_FILES][100];
+ char FullPath[MAX_NUM_OF_FILES][60];
int i,NumOfFiles = 0;
FRESULT Fresult = FR_OK;
+ Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER);
Fresult |= f_opendir(&dir, g_cCwdBuf);
if(Fresult != FR_OK)
{
+ Semaphore_post(FFS_Sem);
return(Fresult);
}
@@ -561,6 +587,7 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer)
}
}
}
+ Semaphore_post(FFS_Sem);
if ((Fresult == FR_OK)&&(NumOfFiles))
{
@@ -573,7 +600,9 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer)
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;
if (i==0)
usnprintf(&FullPath[i], 50, "%s", request->path);
@@ -617,7 +646,7 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer)
}
return Fresult;
}
-FRESULT FileWrite(void * buffer, uint16_t size,char *path)
+FRESULT FileWrite(void * buffer, uint16_t size,char *path, uint32_t timeout)
{
FRESULT Fresult = FR_OK;
FIL *FileHandle = 0; //the system supports a single active file
@@ -630,6 +659,12 @@ FRESULT FileWrite(void * buffer, uint16_t size,char *path)
Fresult = FR_DENIED;
else
{
+ 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)
{
@@ -644,6 +679,7 @@ FRESULT FileWrite(void * buffer, uint16_t size,char *path)
{
LOG_ERROR (Fresult,"fopen error");
}
+ Semaphore_post(FFS_Sem);
my_free(FileHandle);
}
}
@@ -673,6 +709,7 @@ FRESULT FileRead(char *path, uint32_t *Size, void **Buffer)
Fresult = FR_DENIED;
else
{
+ Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER);
Fresult = f_open(FileHandle,path,FA_READ);
if (Fresult == FR_OK)
{
@@ -688,6 +725,7 @@ FRESULT FileRead(char *path, uint32_t *Size, void **Buffer)
my_free (buffer);
}
f_close(FileHandle);
+ Semaphore_post(FFS_Sem);
}
else
{
@@ -726,6 +764,7 @@ FRESULT FileOpen(char *path, uint32_t *Size, FIL *FileHandle)
if (FileHandle == 0)
Fresult = FR_DENIED;
else
+ Semaphore_pend(FFS_Sem, BIOS_WAIT_FOREVER);
Fresult = f_open(FileHandle,path,FA_READ);
}
else