/* * FirmwareUpgrade.c * * Created on: Dec 24, 2018 * Author: shlomo */ #include "include.h" #include "Communication/CommunicationTask.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" #include "drivers/FPGA/Full_Vme/FPGA_Programming_Up.h" #include "drivers/FPGA/Full_Vme/ispvme/vmopcode.h" #include "drivers/Flash_ram/FlashProgram.h" #include "Common/Utilities/Utils.h" #include "Common/SWUpdate/FileSystem.h" #include "Modules/Control/Control.h" #include "Modules/AlarmHandling/AlarmHandling.h" #include "modules/General/process.h" #include "Modules/heaters/heaters_ex.h" int NumberOfFiles = 0,CurrentRunningFile; int CurrentFileSize = 0; uint32_t ActivateVersionControlId = 0xFF; char activateString[100]; char ActivateToken[36+1]={0}; bool Reboot = false; bool SwUpgradeActive(void) { if (ActivateVersionControlId != 0xFF) { //Reboot = false; return true; } return false; } uint32_t ActivateVersionCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) { ActivateVersionResponse response = ACTIVATE_VERSION_RESPONSE__INIT; MessageContainer responseContainer; bool last = true; double file_progress = (double)vme_index/CurrentFileSize; if (CurrentRunningFiledata.len, requestContainer->data.data); 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}; ustrncpy (ActivateToken, requestContainer->token,36); strncpy (SWUpgradePath,request->path,99); SWUpgradePath[99] = NULL; strcat(SWUpgradePath,"/package.cfg"); Fresult = FileRead(SWUpgradePath, &Bytes, &buffer); if (Fresult == FR_OK) { VersionPackage = version_package_descriptor__unpack(NULL,Bytes,buffer); NumberOfFiles = VersionPackage->n_filedescriptors; Report("ActivateVersionRequestFunc",__FILE__,__LINE__,(int)NumberOfFiles,RpWarning,Bytes,0); if (NumberOfFiles) { CurrentRunningFile = 0; File_i = 0; //add control 1 second ActivateVersionControlId = AddControlCallback(NULL, ActivateVersionCallBackFunction, eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); } for (File_i = 0;File_in_filedescriptors;File_i++) { CurrentFileSize = -1; //vme_index = 0; switch(VersionPackage->filedescriptors[File_i]->destination) { case VERSION_FILE_DESTINATION__MCU: CurrentRunningFile++; break; case VERSION_FILE_DESTINATION__FPGA1: case VERSION_FILE_DESTINATION__FPGA2: case VERSION_FILE_DESTINATION__FPGA3: //validate //update usnprintf(FullPath, 50, "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename); Reboot = true; memset (fno,0,sizeof(FILINFO)); Fresult = f_stat(FullPath,fno); CurrentFileSize = fno->fsize; Fresult = FPGA_Programming_Request( FileDestinationToFPGAId[VersionPackage->filedescriptors[File_i]->destination], FullPath, false); break; case VERSION_FILE_DESTINATION__ConfigParams: usnprintf(FullPath, 50, "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename); FFresult = f_unlink("//SYSINFO//EMBPARAM.CFG"); FFresult |= f_rename (FullPath, "//SYSINFO//EMBPARAM.CFG"); FlashInit(); Reboot = true; LoadConfigurationParamsFromFile(true); Report("ConfigParams",__FILE__,FFresult,(int)NumberOfFiles,RpWarning,CurrentRunningFile,0); CurrentRunningFile++; break; case VERSION_FILE_DESTINATION__ProcessParams: usnprintf(FullPath, 50, "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename); FFresult = f_unlink("//SYSINFO//PROCESSP.CFG"); FFresult |= f_rename (FullPath, "//SYSINFO//PROCESSP.CFG"); //LoadProcessParamsFromFile(); FlashInit(); Reboot = true; Report("ProcessParams",__FILE__,FFresult,(int)NumberOfFiles,RpWarning,CurrentRunningFile,0); CurrentRunningFile++; break; case VERSION_FILE_DESTINATION__AlarmParams: usnprintf(FullPath, 50, "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename); FFresult = f_unlink("//SYSINFO//ALARM.CFG"); FFresult |= f_rename (FullPath, "//SYSINFO//ALARM.CFG"); Report("AlarmParams",__FILE__,FFresult,(int)NumberOfFiles,RpWarning,CurrentRunningFile,0); //AlarmHandlingLoadFile(); FlashInit(); Reboot = true; CurrentRunningFile++; break; case VERSION_FILE_DESTINATION__GeneralHWConfigParams: usnprintf(FullPath, 50, "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename); FFresult = f_unlink("//SYSINFO//GENHWCFG.CFG"); FFresult |= f_rename (FullPath, "//SYSINFO//GENHWCFG.CFG"); Report("GeneralHWConfigParams",__FILE__,FFresult,(int)NumberOfFiles,RpWarning,CurrentRunningFile,0); HWConfigurationLoadFile(); CurrentRunningFile++; break; default: LOG_ERROR (VersionPackage->filedescriptors[File_i]->destination,"wrong file update Destination"); Fresult = FR_INVALID_NAME; break; } } } response.has_progress = true; response.has_total = true; response.progress = CurrentRunningFile; response.total = NumberOfFiles; Report("Activate Version Request progress",__FILE__,__LINE__,(int)NumberOfFiles,RpWarning,CurrentRunningFile,0); responseContainer = createContainer(MESSAGE_TYPE__ActivateVersionResponse, requestContainer->token, false, &response, &activate_version_response__pack, &activate_version_response__get_packed_size); responseContainer.has_continuous = true; responseContainer.continuous = true; if (Fresult!= OK) { responseContainer.has_error = true; responseContainer.error = FileError_to_ErrorCode[Fresult]; responseContainer.errormessage = "Activate Version Request error"; responseContainer.continuous = false; Report("Activate Version Request error",__FILE__,__LINE__,(int)NumberOfFiles,RpWarning,Fresult,0); } 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); activate_version_request__free_unpacked(request,NULL); SendChars(container_buffer, container_size); return OK; } uint32_t ValidateVersionRequestFunc(MessageContainer* requestContainer) { uint32_t status = OK; MessageContainer responseContainer; ValidateVersionRequest* request = validate_version_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); ValidateVersionResponse response = VALIDATE_VERSION_RESPONSE__INIT; responseContainer = createContainer(MESSAGE_TYPE__ValidateVersionResponse, requestContainer->token, false, &response, &validate_version_response__pack, &validate_version_response__get_packed_size); if (status!= OK) { responseContainer.has_error = true; responseContainer.error = ERROR_CODE__INVALID_UPLOAD_ID; responseContainer.errormessage = "Validate Version Request 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); validate_version_request__free_unpacked(request,NULL); SendChars(container_buffer, container_size); return OK; }