jungfrau server: programming allowed only in -update or -dev mode, -dev strictly for Carlos, in update mode one can only do programming

This commit is contained in:
maliakal_d 2018-05-11 13:42:46 +02:00
parent 8986b008dd
commit 23d73ae5ae
5 changed files with 132 additions and 107 deletions

View File

@ -7847,11 +7847,16 @@ int slsDetector::programFPGA(string fname){
std::cout<<std::endl; std::cout<<std::endl;
//check ending error //check ending error
controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if ((ret == FAIL) &&
if (ret==FAIL) { (strstr(mess,"not implemented") == NULL) &&
controlSocket->ReceiveDataOnly(mess,sizeof(mess)); (strstr(mess,"locked") == NULL) &&
std::cout<< "Detector returned error: " << mess << std::endl; (strstr(mess,"-update") == NULL)) {
setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret));
if (ret==FAIL) {
controlSocket->ReceiveDataOnly(mess,sizeof(mess));
std::cout<< "Detector returned error: " << mess << std::endl;
setErrorMask((getErrorMask())|(PROGRAMMING_ERROR));
}
} }
disconnectControl(); disconnectControl();
if (ret==FORCE_UPDATE) if (ret==FORCE_UPDATE)
@ -7860,12 +7865,22 @@ int slsDetector::programFPGA(string fname){
//remapping stop server //remapping stop server
fnum=F_RESET_FPGA; if ((ret == FAIL) &&
int stopret; (strstr(mess,"not implemented") == NULL) &&
if (connectStop() == OK){ (strstr(mess,"locked") == NULL) &&
stopSocket->SendDataOnly(&fnum,sizeof(fnum)); (strstr(mess,"-update") == NULL)) {
stopSocket->ReceiveDataOnly(&stopret,sizeof(stopret)); fnum=F_RESET_FPGA;
disconnectControl(); int stopret;
if (connectStop() == OK){
stopSocket->SendDataOnly(&fnum,sizeof(fnum));
stopSocket->ReceiveDataOnly(&stopret,sizeof(stopret));
if (stopret==FAIL) {
controlSocket->ReceiveDataOnly(mess,sizeof(mess));
std::cout<< "Detector returned error: " << mess << std::endl;
setErrorMask((getErrorMask())|(PROGRAMMING_ERROR));
}
disconnectControl();
}
} }
} }
if (ret != FAIL) { if (ret != FAIL) {

View File

@ -35,16 +35,16 @@ int main(int argc, char *argv[]){
int i; int i;
for (i = 1; i < argc; ++i) { for (i = 1; i < argc; ++i) {
if(!strcasecmp(argv[i],"-stopserver")) { if(!strcasecmp(argv[i],"-stopserver")) {
cprintf(BLUE,"detected stop server\n"); cprintf(BLUE,"Detected stop server\n");
controlserver = 0; controlserver = 0;
} }
else if(!strcasecmp(argv[i],"-debug")){ else if(!strcasecmp(argv[i],"-devel")){
cprintf(BLUE,"detected debug mode\n"); cprintf(BLUE,"Detected developer mode\n");
debugflag = 1; debugflag = 1;
} }
#ifdef JUNGFRAUD #ifdef JUNGFRAUD
else if(!strcasecmp(argv[i],"-programming")){ else if(!strcasecmp(argv[i],"-update")){
cprintf(BLUE,"detected programming mode\n"); cprintf(BLUE,"Detected update mode\n");
debugflag = PROGRAMMING_MODE; debugflag = PROGRAMMING_MODE;
} }
#endif #endif

View File

@ -337,7 +337,7 @@ int M_nofuncMode(int file_des){
while (n > 0) while (n > 0)
n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER);
strcat(mess, "On-board detector server in programming mode. Restart detector server in normal mode (without any arguments).\n"); strcat(mess, "On-board detector server in update mode. Restart detector server in normal mode (without any arguments) to continue.\n");
cprintf(BG_RED,"Error: %s",mess); cprintf(BG_RED,"Error: %s",mess);
n = sendData(file_des,&ret1,sizeof(ret1),INT32); n = sendData(file_des,&ret1,sizeof(ret1),INT32);
n = sendData(file_des,mess,sizeof(mess),OTHER); // mess is defined at function call n = sendData(file_des,mess,sizeof(mess),OTHER); // mess is defined at function call
@ -4954,7 +4954,6 @@ int program_fpga(int file_des) {
int ret=OK,ret1=OK; int ret=OK,ret1=OK;
int n=0; int n=0;
sprintf(mess,"program FPGA failed\n"); sprintf(mess,"program FPGA failed\n");
printf("Programming FPGA...");
#ifndef JUNGFRAUD #ifndef JUNGFRAUD
//to receive any arguments //to receive any arguments
@ -4964,78 +4963,48 @@ int program_fpga(int file_des) {
sprintf(mess,"Function (Program FPGA) is not implemented for this detector\n"); sprintf(mess,"Function (Program FPGA) is not implemented for this detector\n");
cprintf(RED, "Warning: %s", mess); cprintf(RED, "Warning: %s", mess);
#else #else
if (!debugflag) {
size_t filesize = 0; //to receive any arguments
size_t totalsize = 0; while (n > 0)
size_t unitprogramsize = 0; n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER);
char* fpgasrc = NULL; ret=FAIL;
FILE* fp = NULL; sprintf(mess,"FPGA cannot be programmed in this mode. "
"Restart on-board detector server with -update for update mode to continue.\n");
// receive arguments - filesize
n = receiveData(file_des,&filesize,sizeof(filesize),INT32);
if (n < 0) return printSocketReadError();
totalsize = filesize;
#ifdef VERY_VERBOSE
printf("\n\n Total size is:%d\n",totalsize);
#endif
// execute action
if (differentClients && lockStatus) {
ret = FAIL;
sprintf(mess,"Detector locked by %s\n",lastClientIP);
cprintf(RED, "Warning: %s", mess); cprintf(RED, "Warning: %s", mess);
} }
#ifdef SLS_DETECTOR_FUNCTION_LIST
else { else {
//opening file pointer to flash and telling FPGA to not touch flash printf("Programming FPGA...");
if(startWritingFPGAprogram(&fp) != OK) { size_t filesize = 0;
ret=FAIL; size_t totalsize = 0;
sprintf(mess,"Could not write to flash. Error at startup.\n"); size_t unitprogramsize = 0;
cprintf(RED,"%s",mess); char* fpgasrc = NULL;
} FILE* fp = NULL;
//---------------- first ret ---------------- // receive arguments - filesize
// ret could be swapped during sendData n = receiveData(file_des,&filesize,sizeof(filesize),INT32);
ret1 = ret; if (n < 0) return printSocketReadError();
// send ok / fail totalsize = filesize;
n = sendData(file_des,&ret1,sizeof(ret),INT32);
// send return argument
if (ret==FAIL) {
n += sendData(file_des,mess,sizeof(mess),OTHER);
}
//---------------- first ret ----------------
if(ret!=FAIL) {
//erasing flash
eraseFlash();
fpgasrc = (char*)malloc(MAX_FPGAPROGRAMSIZE);
}
//writing to flash part by part
while(ret != FAIL && filesize){
unitprogramsize = MAX_FPGAPROGRAMSIZE; //2mb
if(unitprogramsize > filesize) //less than 2mb
unitprogramsize = filesize;
#ifdef VERY_VERBOSE #ifdef VERY_VERBOSE
printf("unit size to receive is:%d\n",unitprogramsize); printf("\n\n Total size is:%d\n",totalsize);
printf("filesize:%d currentpointer:%d\n",filesize,currentPointer);
#endif #endif
//receive // execute action
n = receiveData(file_des,fpgasrc,unitprogramsize,OTHER); if (differentClients && lockStatus) {
if (n < 0) return printSocketReadError(); ret = FAIL;
sprintf(mess,"Detector locked by %s\n",lastClientIP);
cprintf(RED, "Warning: %s", mess);
}
#ifdef SLS_DETECTOR_FUNCTION_LIST
else {
//opening file pointer to flash and telling FPGA to not touch flash
if(startWritingFPGAprogram(&fp) != OK) {
ret=FAIL;
sprintf(mess,"Could not write to flash. Error at startup.\n");
cprintf(RED,"%s",mess);
}
if(!(unitprogramsize - filesize)){ //---------------- first ret ----------------
fpgasrc[unitprogramsize]='\0';
filesize-=unitprogramsize;
unitprogramsize++;
}else
filesize-=unitprogramsize;
ret = writeFPGAProgram(fpgasrc,unitprogramsize,fp);
//---------------- middle rets ----------------
// ret could be swapped during sendData // ret could be swapped during sendData
ret1 = ret; ret1 = ret;
// send ok / fail // send ok / fail
@ -5043,38 +5012,80 @@ int program_fpga(int file_des) {
// send return argument // send return argument
if (ret==FAIL) { if (ret==FAIL) {
n += sendData(file_des,mess,sizeof(mess),OTHER); n += sendData(file_des,mess,sizeof(mess),OTHER);
cprintf(RED,"Failure: Breaking out of program receiving\n");
} }
//---------------- middle rets ---------------- //---------------- first ret ----------------
if(ret != FAIL){ if(ret!=FAIL) {
//print progress //erasing flash
printf("Writing to Flash:%d%%\r",(int) (((double)(totalsize-filesize)/totalsize)*100) ); eraseFlash();
fflush(stdout); fpgasrc = (char*)malloc(MAX_FPGAPROGRAMSIZE);
} }
}
printf("\n"); //writing to flash part by part
while(ret != FAIL && filesize){
//closing file pointer to flash and informing FPGA unitprogramsize = MAX_FPGAPROGRAMSIZE; //2mb
stopWritingFPGAprogram(fp); if(unitprogramsize > filesize) //less than 2mb
unitprogramsize = filesize;
//free resources
if(fpgasrc != NULL)
free(fpgasrc);
if(fp!=NULL)
fclose(fp);
#ifdef VERY_VERBOSE #ifdef VERY_VERBOSE
printf("Done with program receiving command\n"); printf("unit size to receive is:%d\n",unitprogramsize);
printf("filesize:%d currentpointer:%d\n",filesize,currentPointer);
#endif #endif
if (isControlServer) //receive
basictests(debugflag); n = receiveData(file_des,fpgasrc,unitprogramsize,OTHER);
init_detector(isControlServer); if (n < 0) return printSocketReadError();
}
if(!(unitprogramsize - filesize)){
fpgasrc[unitprogramsize]='\0';
filesize-=unitprogramsize;
unitprogramsize++;
}else
filesize-=unitprogramsize;
ret = writeFPGAProgram(fpgasrc,unitprogramsize,fp);
//---------------- middle rets ----------------
// ret could be swapped during sendData
ret1 = ret;
// send ok / fail
n = sendData(file_des,&ret1,sizeof(ret),INT32);
// send return argument
if (ret==FAIL) {
n += sendData(file_des,mess,sizeof(mess),OTHER);
cprintf(RED,"Failure: Breaking out of program receiving\n");
}
//---------------- middle rets ----------------
if(ret != FAIL){
//print progress
printf("Writing to Flash:%d%%\r",(int) (((double)(totalsize-filesize)/totalsize)*100) );
fflush(stdout);
}
}
printf("\n");
//closing file pointer to flash and informing FPGA
stopWritingFPGAprogram(fp);
//free resources
if(fpgasrc != NULL)
free(fpgasrc);
if(fp!=NULL)
fclose(fp);
#ifdef VERY_VERBOSE
printf("Done with program receiving command\n");
#endif #endif
if (ret==OK)
ret=FORCE_UPDATE; if (isControlServer)
basictests(debugflag);
init_detector(isControlServer);
}
#endif
if (ret==OK)
ret=FORCE_UPDATE;
}
#endif #endif
// ret could be swapped during sendData // ret could be swapped during sendData
@ -5104,8 +5115,7 @@ int reset_fpga(int file_des) {
while (n > 0) while (n > 0)
n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER);
ret = FAIL; ret = FAIL;
sprintf(mess,"Function (Start Readout) is not implemented for this detector\n"); sprintf(mess,"Function (Reset FPGA) is not implemented for this detector\n"); cprintf(RED, "%s", mess);
cprintf(RED, "%s", mess);
#else #else
// execute action // execute action