all servers except eiger: easier to update firmware and software using update or copydetectorserver, rebootcontroller, and programfpga

This commit is contained in:
2019-04-02 17:27:01 +02:00
parent 45b837b42a
commit 5131245f0a
27 changed files with 393 additions and 193 deletions

View File

@ -58,9 +58,6 @@ void init_detector() {
#endif
if (isControlServer) {
basictests();
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
if (debugflag != PROGRAMMING_MODE)
#endif
initControlServer();
#ifdef EIGERD
dhcpipad = getDetectorIP();
@ -85,18 +82,6 @@ int decode_function(int file_des) {
} else
FILE_LOG(logDEBUG3, ("Received %d bytes\n", n ));
// jungfrau in programming mode
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
if ((debugflag == PROGRAMMING_MODE) &&
(fnum != F_PROGRAM_FPGA) &&
(fnum != F_GET_DETECTOR_TYPE) &&
(fnum != F_RESET_FPGA) &&
(fnum != F_UPDATE_CLIENT) &&
(fnum != F_CHECK_VERSION)) {
ret = (M_nofuncMode)(file_des);
}
else
#endif
if (fnum < 0 || fnum >= NUM_DET_FUNCTIONS) {
FILE_LOG(logERROR, ("Unknown function enum %d\n", fnum));
ret=(M_nofunc)(file_des);
@ -109,11 +94,22 @@ int decode_function(int file_des) {
FILE_LOG(logDEBUG1, ("Error executing the function = %d (%s)\n",
fnum, getFunctionName((enum detFuncs)fnum)));
} else FILE_LOG(logDEBUG1, ("Function (%s) executed %s\n",
getFunctionName((enum detFuncs)fnum), (ret == OK)?"OK":"FORCE_UPDATE"));
getFunctionName((enum detFuncs)fnum), getRetName()));
}
return ret;
}
const char* getRetName() {
switch(ret) {
case OK: return "OK";
case FAIL: return "FAIL";
case FORCE_UPDATE: return "FORCE_UPDATE";
case GOODBYE: return "GOODBYE";
case REBOOT: return "REBOOT";
default: return "unknown";
}
}
const char* getTimerName(enum timerIndex ind) {
switch (ind) {
case FRAME_NUMBER: return "frame_number";
@ -137,6 +133,7 @@ const char* getTimerName(enum timerIndex ind) {
}
}
const char* getSpeedName(enum speedVariable ind) {
switch (ind) {
case CLOCK_DIVIDER: return "clock_divider";
@ -231,6 +228,8 @@ const char* getFunctionName(enum detFuncs func) {
case F_SOFTWARE_TRIGGER: return "F_SOFTWARE_TRIGGER";
case F_LED: return "F_LED";
case F_DIGITAL_IO_DELAY: return "F_DIGITAL_IO_DELAY";
case F_COPY_DET_SERVER: return "F_COPY_DET_SERVER";
case F_REBOOT_CONTROLLER: return "F_REBOOT_CONTROLLER";
default: return "Unknown Function";
}
@ -301,6 +300,8 @@ void function_table() {
flist[F_SOFTWARE_TRIGGER] = &software_trigger;
flist[F_LED] = &led;
flist[F_DIGITAL_IO_DELAY] = &digital_io_delay;
flist[F_COPY_DET_SERVER] = &copy_detector_server;
flist[F_REBOOT_CONTROLLER] = &reboot_controller;
// check
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
@ -354,6 +355,39 @@ void validate64(int64_t arg, int64_t retval, char* modename, enum numberMode num
}
}
int executeCommand(char* command, char* result, enum TLogLevel level) {
const size_t tempsize = 256;
char temp[tempsize];
memset(temp, 0, tempsize);
memset(result, 0, MAX_STR_LENGTH);
FILE_LOG(level, ("Executing command:\n[%s]\n", command));
strcat(command, " 2>&1");
fflush(stdout);
FILE* sysFile = popen(command, "r");
while(fgets(temp, tempsize, sysFile) != NULL) {
// size left excludes terminating character
size_t sizeleft = MAX_STR_LENGTH - strlen(result) - 1;
// more than the command
if (tempsize > sizeleft) {
strncat(result, temp, sizeleft);
break;
}
strncat(result, temp, tempsize);
memset(temp, 0, tempsize);
}
int sucess = pclose(sysFile);
if (strlen(result)) {
if (sucess) {
sucess = FAIL;
FILE_LOG(logERROR, ("%s\n", result));
} else {
FILE_LOG(level, ("Result:\n[%s]\n", result));
}
}
return sucess;
}
int M_nofunc(int file_des) {
ret = FAIL;
@ -399,27 +433,10 @@ int exec_command(int file_des) {
if (receiveData(file_des, cmd, MAX_STR_LENGTH, OTHER) < 0)
return printSocketReadError();
FILE_LOG(logINFO, ("Executing command (%s)\n", cmd));
// set
if (Server_VerifyLock() == OK) {
FILE* sysFile = popen(cmd, "r");
const size_t tempsize = 256;
char temp[tempsize];
memset(temp, 0, tempsize);
while(fgets(temp, tempsize, sysFile) != NULL) {
// size left excludes terminating character
size_t sizeleft = MAX_STR_LENGTH - strlen(retval) - 1;
// more than the command
if (tempsize > sizeleft) {
strncat(retval, temp, sizeleft);
break;
}
strncat(retval, temp, tempsize);
memset(temp, 0, tempsize);
}
pclose(sysFile);
FILE_LOG(logINFO, ("Result of cmd (%s):\n%s\n", cmd, retval));
ret = executeCommand(cmd, retval, logINFO);
}
return Server_SendResult(file_des, OTHER, NO_UPDATE, retval, sizeof(retval));
}
@ -2017,14 +2034,14 @@ int set_speed(int file_des) {
sprintf(validateName, "set %s", speedName);
#ifndef GOTTHARDD
#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(JUNGFRAUD)
if (ind == ADC_PHASE || ind == DBIT_PHASE && mode == 1) {
if ((ind == ADC_PHASE || ind == DBIT_PHASE) && mode == 1) {
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
ret = validatePhaseinDegrees(ind, val, retval);
#else
ret = validatePhaseinDegrees(val, retval);
#endif
if (ret == FAIL) {
sprintf(mess, "Could not set %s. Set %s, got %s\n", validateName);
sprintf(mess, "Could not set %s. Set %d, got %d\n", validateName, val, retval);
FILE_LOG(logERROR,(mess));
}
} else
@ -2138,14 +2155,7 @@ int set_port(int file_des) {
int update_client(int file_des) {
ret = FORCE_UPDATE;
memset(mess, 0, sizeof(mess));
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
if (debugflag == PROGRAMMING_MODE) {
ret = OK;
}
#endif
Server_SendResult(file_des, INT32, NO_UPDATE, NULL, 0);
if (ret == OK)
return ret;
return send_update(file_des);
}
@ -3293,39 +3303,30 @@ int program_fpga(int file_des) {
totalsize = filesize;
FILE_LOG(logDEBUG1, ("Total program size is: %d\n", totalsize));
// not in programming mode
/*if (debugflag != PROGRAMMING_MODE) {
ret = FAIL;
sprintf(mess,"FPGA cannot be programmed in this mode. "
"Restart on-board detector server with -update for programming mode.\n");
FILE_LOG(logERROR,(mess));
}*/
// opening file pointer to flash and telling FPGA to not touch flash
if (ret != FAIL && startWritingFPGAprogram(&fp) != OK) {
if (startWritingFPGAprogram(&fp) != OK) {
ret = FAIL;
sprintf(mess,"Could not write to flash. Error at startup.\n");
FILE_LOG(logERROR,(mess));
}
//---------------- first ret ----------------
Server_SendResult(file_des, INT32, NO_UPDATE, NULL, 0);
//erasing flash
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;
FILE_LOG(logDEBUG1, ("unit size to receive is:%d\n"
"filesize:%d\n", unitprogramsize, filesize));
FILE_LOG(logDEBUG1, ("unit size to receive is:%d\nfilesize:%d\n", unitprogramsize, filesize));
//receive part of program
if (receiveData(file_des,fpgasrc,unitprogramsize,OTHER) < 0)
@ -3340,12 +3341,7 @@ int program_fpga(int file_des) {
// write part to flash
ret = writeFPGAProgram(fpgasrc, unitprogramsize, fp);
//---------------- middle rets ----------------
Server_SendResult(file_des, INT32, NO_UPDATE, NULL, 0);
if (ret == FAIL) {
FILE_LOG(logERROR, ("Failure: Breaking out of program receiving\n"));
} else {
@ -3356,7 +3352,9 @@ int program_fpga(int file_des) {
}
}
printf("\n");
FILE_LOG(logINFO, ("Done copying program or due to failure earlier\n"));
if (ret == OK) {
FILE_LOG(logINFO, ("Done copying program\n"));
}
// closing file pointer to flash and informing FPGA
stopWritingFPGAprogram(fp);
@ -3367,17 +3365,11 @@ int program_fpga(int file_des) {
if (fp != NULL)
fclose(fp);
FILE_LOG(logDEBUG1, ("Done with program receiving command\n"));
if (ret != FAIL && isControlServer) {
basictests();
initControlServer();
}
FILE_LOG(logINFO, ("Completed program fpga command with %s\n", (ret == OK ? "success" : "fail")));
}
#endif
#endif
return Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
return ret;
}
@ -3396,8 +3388,7 @@ int reset_fpga(int file_des) {
if (Server_VerifyLock() == OK) {
if (isControlServer) {
basictests(); // mapping of control server at least
if (debugflag != PROGRAMMING_MODE)
initControlServer();
initControlServer();
}
else initStopServer(); //remapping of stop server
ret = FORCE_UPDATE;
@ -3781,6 +3772,83 @@ int digital_io_delay(int file_des) {
return Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
}
int copy_detector_server(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
char args[2][MAX_STR_LENGTH];
char retvals[MAX_STR_LENGTH] = {0};
memset(args, 0, sizeof(args));
memset(retvals, 0, sizeof(retvals));
if (receiveData(file_des, args, sizeof(args), OTHER) < 0)
return printSocketReadError();
#ifdef EIGERD
functionNotImplemented();
#else
// only set
if (Server_VerifyLock() == OK) {
char* sname = args[0];
char* hostname = args[1];
FILE_LOG(logINFOBLUE, ("Copying server %s from host %s\n", sname, hostname));
char cmd[MAX_STR_LENGTH];
memset(cmd, 0, MAX_STR_LENGTH);
// copy server
sprintf(cmd, "tftp %s -r %s -g", hostname, sname);
int success = executeCommand(cmd, retvals, logDEBUG1);
if (success == FAIL) {
ret = FAIL;
strcpy(mess, retvals);
//FILE_LOG(logERROR, (mess)); already printed in executecommand
}
// success
else {
FILE_LOG(logINFO, ("Server copied successfully\n"));
// give permissions
sprintf(cmd, "chmod 777 %s", sname);
executeCommand(cmd, retvals, logDEBUG1);
// edit /etc/inittab
// find line numbers in /etc/inittab where DetectorServer
strcpy(cmd, "sed -n '/DetectorServer/=' /etc/inittab");
executeCommand(cmd, retvals, logDEBUG1);
while (strlen(retvals)) {
// get first linen number
int lineNumber = atoi(retvals);
// delete that line
sprintf(cmd, "sed -i \'%dd\' /etc/inittab", lineNumber);
executeCommand(cmd, retvals, logDEBUG1);
// find line numbers again
strcpy(cmd, "sed -n '/DetectorServer/=' /etc/inittab");
executeCommand(cmd, retvals, logDEBUG1);
}
FILE_LOG(logINFO, ("Deleted all lines containing DetectorServer in /etc/inittab\n"));
// append line
sprintf(cmd, "echo \"ttyS0::respawn:/./%s\" >> /etc/inittab", sname);
executeCommand(cmd, retvals, logDEBUG1);
FILE_LOG(logINFO, ("/etc/inittab modified to have %s\n", sname));
}
}
#endif
return Server_SendResult(file_des, OTHER, NO_UPDATE, retvals, sizeof(retvals));
}
int reboot_controller(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
#ifdef EIGERD
functionNotImplemented();
return ret;
#else
FILE_LOG(logINFORED, ("Rebooting controller\n"));
return REBOOT;
#endif
}