aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Common/SWUpdate
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Embedded_SW/Embedded/Common/SWUpdate')
-rw-r--r--Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c280
-rw-r--r--Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c16
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";