aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2018-11-01 09:51:35 +0200
committerShlomo Hecht <shlomo@twine-s.com>2018-11-01 09:51:35 +0200
commit6870a8915e7dd9b1a9cf42c0f155ebbbbb11f11a (patch)
tree4066e424c2df4fa8b32579a874d49064de9a41fe /Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c
parenta6ab7a96762c8d70a325c0425af1b47f7a785bfc (diff)
parentf29cc9046f9e5bca367b7efafd3f2e0997c3cd04 (diff)
downloadTango-6870a8915e7dd9b1a9cf42c0f155ebbbbb11f11a.tar.gz
Tango-6870a8915e7dd9b1a9cf42c0f155ebbbbb11f11a.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.c235
1 files changed, 228 insertions, 7 deletions
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 <DataDef.h>
#include <Communication/PMR/IO/FileUploadRequest.pb-c.h>
#include <Communication/PMR/IO/FileUploadResponse.pb-c.h>
@@ -23,19 +24,57 @@
#include <Communication/PMR/IO/GetStorageInfoResponse.pb-c.h>
#include <Communication/PMR/IO/GetFilesRequest.pb-c.h>
#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 "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;