From 969551ae373167dcfc28466f19e53a349da70f67 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 29 Mar 2019 17:59:06 +0100 Subject: [PATCH 1/4] program fpga made parallel --- .../jungfrauDetectorServer/gitInfo.txt | 12 +- .../jungfrauDetectorServer/gitInfoJungfrau.h | 10 +- .../include/multiSlsDetector.h | 24 +- slsDetectorSoftware/include/slsDetector.h | 19 +- slsDetectorSoftware/src/multiSlsDetector.cpp | 115 ++++++- slsDetectorSoftware/src/slsDetector.cpp | 309 ++++++------------ 6 files changed, 242 insertions(+), 247 deletions(-) diff --git a/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt b/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt index 6e1688271..68e820fcd 100644 --- a/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt +++ b/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorPackage/slsDetectorServers/jungfrauDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 5a4122ae7c8dae1572e9db336de70183956e58c7 -Revision: 31 -Branch: refactor -Last Changed Author: Dhanya_Thattil -Last Changed Rev: 4481 -Last Changed Date: 2019-03-28 08:18:03.000000002 +0100 ../slsDetectorServer/slsDetectorFunctionList.h +Repsitory UUID: ed9dc3b386898603d74a489528292139d47aac1a +Revision: 32 +Branch: program +Last Changed Author: Erik_Frojdh +Last Changed Rev: 4488 +Last Changed Date: 2019-03-29 14:42:42.000000002 +0100 ../slsDetectorServer/slsDetectorServer_funcs.c diff --git a/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h b/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h index b7b7c4d4f..2f78fa4ac 100644 --- a/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h +++ b/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "5a4122ae7c8dae1572e9db336de70183956e58c7" -#define GITAUTH "Dhanya_Thattil" -#define GITREV 0x4481 -#define GITDATE 0x20190328 -#define GITBRANCH "refactor" +#define GITREPUUID "ed9dc3b386898603d74a489528292139d47aac1a" +#define GITAUTH "Erik_Frojdh" +#define GITREV 0x4488 +#define GITDATE 0x20190329 +#define GITBRANCH "program" diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h index 13e2ae1e2..ee860a66f 100644 --- a/slsDetectorSoftware/include/multiSlsDetector.h +++ b/slsDetectorSoftware/include/multiSlsDetector.h @@ -1,12 +1,5 @@ -#ifndef MULTI_SLS_DETECTOR_H -#define MULTI_SLS_DETECTOR_H +#pragma once -/** - @libdoc The multiSlsDetector class is used to operate several slsDetectors in - parallel. - * @short This is the base class for multi detector system functionalities - * @author Anna Bergamaschi - */ #include "SharedMemory.h" #include "error_defs.h" #include "gitInfoLib.h" @@ -2002,11 +1995,6 @@ class multiSlsDetector : public virtual slsDetectorDefs { */ void startProcessingThread(); - // /** - // * Static function to call processing thread - // */ - // static void* startProcessData(void *n); - /** * Check if processing thread is ready to join main thread * @returns true if ready, else false @@ -2025,6 +2013,15 @@ class multiSlsDetector : public virtual slsDetectorDefs { */ int kbhit(); + /** + * Convert raw file + * @param fname name of pof file + * @param fpgasrc pointer in memory to read pof to + * @returns file size + */ + std::vector readPofFile(const std::string &fname); + + /** Multi detector Id */ const int multiId; @@ -2083,4 +2080,3 @@ class multiSlsDetector : public virtual slsDetectorDefs { void *pCallbackArg{nullptr}; }; -#endif diff --git a/slsDetectorSoftware/include/slsDetector.h b/slsDetectorSoftware/include/slsDetector.h index 055454c41..9f32780a5 100644 --- a/slsDetectorSoftware/include/slsDetector.h +++ b/slsDetectorSoftware/include/slsDetector.h @@ -1,13 +1,4 @@ -#ifndef SLS_DETECTOR_H -#define SLS_DETECTOR_H - -/** - * - * @short complete detector functionalities for a single module detector. - * The slsDetector class takes care of the communication with the - * detector and all kind actions related with a single detector controller - * @author Anna Bergamaschi - */ +#pragma once #include "ClientSocket.h" #include "SharedMemory.h" @@ -17,6 +8,7 @@ class ClientInterface; #include +#include class multiSlsDetector; class ServerInterface; @@ -1286,11 +1278,11 @@ class slsDetector : public virtual slsDetectorDefs{ int setStoragecellStart(int pos = -1); /** - * Programs FPGA with pof file (Jungfrau) - * @param fname file name + * Programs FPGA with pof file (Jungfrau, CTB, Moench) + * @param buffer programming file in memory * @returns OK or FAIL */ - int programFPGA(const std::string &fname); + int programFPGA(std::vector buffer); /** * Resets FPGA (Jungfrau) @@ -1826,4 +1818,3 @@ class slsDetector : public virtual slsDetectorDefs{ }; -#endif diff --git a/slsDetectorSoftware/src/multiSlsDetector.cpp b/slsDetectorSoftware/src/multiSlsDetector.cpp index 11bc0c456..1b67f7fbd 100644 --- a/slsDetectorSoftware/src/multiSlsDetector.cpp +++ b/slsDetectorSoftware/src/multiSlsDetector.cpp @@ -2597,13 +2597,16 @@ int multiSlsDetector::setStoragecellStart(int pos, int detPos) { } int multiSlsDetector::programFPGA(const std::string &fname, int detPos) { + // read pof file + std::vector buffer = readPofFile(fname); + // single if (detPos >= 0) { - return detectors[detPos]->programFPGA(fname); + return detectors[detPos]->programFPGA(buffer); } // multi - auto r = serialCall(&slsDetector::programFPGA, fname); + auto r = parallelCall(&slsDetector::programFPGA, buffer); return sls::allEqualTo(r, static_cast(OK)) ? OK : FAIL; } @@ -3986,10 +3989,6 @@ void multiSlsDetector::startProcessingThread() { dataProcessingThread = std::thread(&multiSlsDetector::processData, this); } -// void* multiSlsDetector::startProcessData(void *n) { -// ((multiSlsDetector*)n)->processData(); -// return n; -// } void multiSlsDetector::processData() { if (setReceiverOnline() == OFFLINE_FLAG) { @@ -4050,3 +4049,107 @@ int multiSlsDetector::kbhit() { select(STDIN_FILENO + 1, &fds, nullptr, nullptr, &tv); return FD_ISSET(STDIN_FILENO, &fds); } + + + +std::vector multiSlsDetector::readPofFile(const std::string &fname) { + FILE_LOG(logDEBUG1) << "Programming FPGA with file name:" << fname; + size_t filesize = 0; + // check if it exists + + struct stat st; + if (stat(fname.c_str(), &st)) { + throw RuntimeError("Program FPGA: Programming file does not exist"); + } + + + + // open src + FILE *src = fopen(fname.c_str(), "rb"); + if (src == nullptr) { + throw RuntimeError("Program FPGA: Could not open source file for programming: " + + fname); + } + + // create temp destination file + char destfname[] = "/tmp/SLS_DET_MCB.XXXXXX"; + int dst = mkstemp(destfname); // create temporary file and open it in r/w + if (dst == -1) { + fclose(src); + throw RuntimeError( + std::string("Could not create destination file in /tmp for programming: ") + + destfname); + } + + // convert src to dst rawbin + FILE_LOG(logDEBUG1) << "Converting " << fname << " to " << destfname; + { + int filepos, x, y, i; + // Remove header (0...11C) + for (filepos = 0; filepos < 0x11C; ++filepos) { + fgetc(src); + } + // Write 0x80 times 0xFF (0...7F) + { + char c = 0xFF; + for (filepos = 0; filepos < 0x80; ++filepos) { + write(dst, &c, 1); + } + } + // Swap bits and write to file + for (filepos = 0x80; filepos < 0x1000000; ++filepos) { + x = fgetc(src); + if (x < 0) { + break; + } + y = 0; + for (i = 0; i < 8; ++i) { + y = y | (((x & (1 << i)) >> i) << (7 - i)); // This swaps the bits + } + write(dst, &y, 1); + } + if (filepos < 0x1000000) { + throw RuntimeError("Could not convert programming file. EOF before end of flash"); + } + } + if (fclose(src)) { + throw RuntimeError("Program FPGA: Could not close source file"); + } + if (close(dst)) { + throw RuntimeError("Program FPGA: Could not close destination file"); + } + FILE_LOG(logDEBUG1) << "File has been converted to " << destfname; + + // loading dst file to memory + FILE *fp = fopen(destfname, "r"); + if (fp == nullptr) { + throw RuntimeError("Program FPGA: Could not open rawbin file"); + } + if (fseek(fp, 0, SEEK_END)) { + throw RuntimeError("Program FPGA: Seek error in rawbin file"); + } + filesize = ftell(fp); + if (filesize <= 0) { + throw RuntimeError("Program FPGA: Could not get length of rawbin file"); + } + rewind(fp); + + std::vector buffer(filesize, 0); + if (fread(buffer.data(), sizeof(char), filesize, fp) != filesize) { + throw RuntimeError("Program FPGA: Could not read rawbin file"); + } + + if (fclose(fp)) { + throw RuntimeError("Program FPGA: Could not close destination file after converting"); + } + unlink(destfname); // delete temporary file + FILE_LOG(logDEBUG1) << "Successfully loaded the rawbin file to program memory"; + FILE_LOG(logINFO) << "Read file into memory"; + return buffer; +} + + + + + + diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index 01399d053..164833a83 100644 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -3386,221 +3386,126 @@ int slsDetector::setStoragecellStart(int pos) { return retval; } -int slsDetector::programFPGA(const std::string &fname) { - // TODO! make exception safe! - // now malloced memory can leak - // only jungfrau implemented (client processing, so check now) - if (detector_shm()->myDetectorType != JUNGFRAU && - detector_shm()->myDetectorType != CHIPTESTBOARD && - detector_shm()->myDetectorType != MOENCH) { - throw RuntimeError("Program FPGA is not implemented for this detector"); - } - FILE_LOG(logDEBUG1) << "Programming FPGA with file name:" << fname; - size_t filesize = 0; - char *fpgasrc = nullptr; +int slsDetector::programFPGA(std::vector buffer) { + // validate type + switch(detector_shm()->myDetectorType) { + case JUNGFRAU: + case CHIPTESTBOARD: + case MOENCH: + break; + default: + throw RuntimeError("Program FPGA is not implemented for this detector"); + } - // check if it exists - { - struct stat st; - if (stat(fname.c_str(), &st)) { - throw RuntimeError("Program FPGA: Programming file does not exist"); - } - } + size_t filesize = buffer.size(); - { - // open src - FILE *src = fopen(fname.c_str(), "rb"); - if (src == nullptr) { - throw RuntimeError("Program FPGA: Could not open source file for programming: " + - fname); - } + // send program from memory to detector + int fnum = F_PROGRAM_FPGA; + int ret = FAIL; + char mess[MAX_STR_LENGTH] = {0}; + FILE_LOG(logINFO) << "Sending programming binary to detector " << detector_shm()->hostname; - // create temp destination file - char destfname[] = "/tmp/SLS_DET_MCB.XXXXXX"; - int dst = mkstemp(destfname); // create temporary file and open it in r/w - if (dst == -1) { - fclose(src); - throw RuntimeError( - std::string("Could not create destination file in /tmp for programming: ") + - destfname); - } + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = DetectorSocket(detector_shm()->hostname, detector_shm()->controlPort); + client.sendData(&fnum, sizeof(fnum)); + client.sendData(&filesize, sizeof(filesize)); + client.receiveData(&ret, sizeof(ret)); + // opening error + if (ret == FAIL) { + client.receiveData(mess, sizeof(mess)); + throw RuntimeError("Detector " + std::to_string(detId) + + " returned error: " + std::string(mess)); + } - // convert src to dst rawbin - FILE_LOG(logDEBUG1) << "Converting " << fname << " to " << destfname; - { - int filepos, x, y, i; - // Remove header (0...11C) - for (filepos = 0; filepos < 0x11C; ++filepos) { - fgetc(src); - } - // Write 0x80 times 0xFF (0...7F) - { - char c = 0xFF; - for (filepos = 0; filepos < 0x80; ++filepos) { - write(dst, &c, 1); - } - } - // Swap bits and write to file - for (filepos = 0x80; filepos < 0x1000000; ++filepos) { - x = fgetc(src); - if (x < 0) { - break; - } - y = 0; - for (i = 0; i < 8; ++i) { - y = y | (((x & (1 << i)) >> i) << (7 - i)); // This swaps the bits - } - write(dst, &y, 1); - } - if (filepos < 0x1000000) { - throw RuntimeError("Could not convert programming file. EOF before end of flash"); - } - } - if (fclose(src)) { - throw RuntimeError("Program FPGA: Could not close source file"); - } - if (close(dst)) { - throw RuntimeError("Program FPGA: Could not close destination file"); - } - FILE_LOG(logDEBUG1) << "File has been converted to " << destfname; + // erasing flash + if (ret != FAIL) { + FILE_LOG(logINFO) << "This can take awhile. Please be patient..."; + FILE_LOG(logINFO) << detId << "Erasing Flash:"; + printf("%d%%\r", 0); + std::cout << std::flush; + // erasing takes 65 seconds, printing here (otherwise need threads + // in server-unnecessary) + const int ERASE_TIME = 65; + int count = ERASE_TIME + 1; + while (count > 0) { + usleep(1 * 1000 * 1000); + --count; + printf("%d%%\r", (int)(((double)(ERASE_TIME - count) / ERASE_TIME) * 100)); + std::cout << std::flush; + } + printf("\n"); + FILE_LOG(logINFO) << detId << "Writing to Flash:"; + printf("%d%%\r", 0); + std::cout << std::flush; + } - // loading dst file to memory - FILE *fp = fopen(destfname, "r"); - if (fp == nullptr) { - throw RuntimeError("Program FPGA: Could not open rawbin file"); - } - if (fseek(fp, 0, SEEK_END)) { - throw RuntimeError("Program FPGA: Seek error in rawbin file"); - } - filesize = ftell(fp); - if (filesize <= 0) { - throw RuntimeError("Program FPGA: Could not get length of rawbin file"); - } - rewind(fp); - fpgasrc = (char *)malloc(filesize + 1); //<------------------- MALLOC! - if (fpgasrc == nullptr) { - throw RuntimeError("Program FPGA: Could not allocate size of program"); - } - if (fread(fpgasrc, sizeof(char), filesize, fp) != filesize) { - free(fpgasrc); - throw RuntimeError("Program FPGA: Could not read rawbin file"); - } + // sending program in parts of 2mb each + size_t unitprogramsize = 0; + int currentPointer = 0; + size_t totalsize = filesize; + while (ret != FAIL && (filesize > 0)) { - if (fclose(fp)) { - free(fpgasrc); - throw RuntimeError("Program FPGA: Could not close destination file after converting"); - } - unlink(destfname); // delete temporary file - FILE_LOG(logDEBUG1) << "Successfully loaded the rawbin file to program memory"; - } + unitprogramsize = MAX_FPGAPROGRAMSIZE; // 2mb + if (unitprogramsize > filesize) { // less than 2mb + unitprogramsize = filesize; + } + FILE_LOG(logDEBUG1) << "unitprogramsize:" << unitprogramsize + << "\t filesize:" << filesize; - // send program from memory to detector - int fnum = F_PROGRAM_FPGA; - int ret = FAIL; - char mess[MAX_STR_LENGTH] = {0}; - FILE_LOG(logDEBUG1) << "Sending programming binary to detector"; + client.sendData(&buffer[currentPointer], unitprogramsize); + client.receiveData(&ret, sizeof(ret)); + if (ret != FAIL) { + filesize -= unitprogramsize; + currentPointer += unitprogramsize; - if (detector_shm()->onlineFlag == ONLINE_FLAG) { - auto client = DetectorSocket(detector_shm()->hostname, detector_shm()->controlPort); - client.sendData(&fnum, sizeof(fnum)); - client.sendData(&filesize, sizeof(filesize)); - client.receiveData(&ret, sizeof(ret)); - // opening error - if (ret == FAIL) { - client.receiveData(mess, sizeof(mess)); - free(fpgasrc); - throw RuntimeError("Detector " + std::to_string(detId) + - " returned error: " + std::string(mess)); - } + // print progress + printf("%d%%\r", (int)(((double)(totalsize - filesize) / totalsize) * 100)); + std::cout << std::flush; + } else { + printf("\n"); + client.receiveData(mess, sizeof(mess)); + throw RuntimeError("Detector " + std::to_string(detId) + + " returned error: " + std::string(mess)); + } + } + printf("\n"); - // erasing flash - if (ret != FAIL) { - FILE_LOG(logINFO) << "This can take awhile. Please be patient..."; - FILE_LOG(logINFO) << "Erasing Flash:"; - printf("%d%%\r", 0); - std::cout << std::flush; - // erasing takes 65 seconds, printing here (otherwise need threads - // in server-unnecessary) - const int ERASE_TIME = 65; - int count = ERASE_TIME + 1; - while (count > 0) { - usleep(1 * 1000 * 1000); - --count; - printf("%d%%\r", (int)(((double)(ERASE_TIME - count) / ERASE_TIME) * 100)); - std::cout << std::flush; - } - printf("\n"); - FILE_LOG(logINFO) << "Writing to Flash:"; - printf("%d%%\r", 0); - std::cout << std::flush; - } + // check ending error + if ((ret == FAIL) && (strstr(mess, "not implemented") == nullptr) && + (strstr(mess, "locked") == nullptr) && (strstr(mess, "-update") == nullptr)) { + client.receiveData(&ret, sizeof(ret)); + if (ret == FAIL) { + client.receiveData(mess, sizeof(mess)); + throw RuntimeError("Detector " + std::to_string(detId) + + " returned error: " + std::string(mess)); + } + } - // sending program in parts of 2mb each - size_t unitprogramsize = 0; - int currentPointer = 0; - size_t totalsize = filesize; - while (ret != FAIL && (filesize > 0)) { + if (ret == FORCE_UPDATE) { + updateDetector(); + } - unitprogramsize = MAX_FPGAPROGRAMSIZE; // 2mb - if (unitprogramsize > filesize) { // less than 2mb - unitprogramsize = filesize; - } - FILE_LOG(logDEBUG1) << "unitprogramsize:" << unitprogramsize - << "\t filesize:" << filesize; - - client.sendData(fpgasrc + currentPointer, unitprogramsize); - client.receiveData(&ret, sizeof(ret)); - if (ret != FAIL) { - filesize -= unitprogramsize; - currentPointer += unitprogramsize; - - // print progress - printf("%d%%\r", (int)(((double)(totalsize - filesize) / totalsize) * 100)); - std::cout << std::flush; - } else { - printf("\n"); - client.receiveData(mess, sizeof(mess)); - free(fpgasrc); - throw RuntimeError("Detector returned error: " + std::string(mess)); - } - } - printf("\n"); - - // check ending error - if ((ret == FAIL) && (strstr(mess, "not implemented") == nullptr) && - (strstr(mess, "locked") == nullptr) && (strstr(mess, "-update") == nullptr)) { - client.receiveData(&ret, sizeof(ret)); - if (ret == FAIL) { - client.receiveData(mess, sizeof(mess)); - free(fpgasrc); - throw RuntimeError("Detector returned error: " + std::string(mess)); - } - } - - if (ret == FORCE_UPDATE) { - updateDetector(); - } - - // remapping stop server - if ((ret == FAIL) && (strstr(mess, "not implemented") == nullptr) && - (strstr(mess, "locked") == nullptr) && (strstr(mess, "-update") == nullptr)) { - fnum = F_RESET_FPGA; - int stopret = FAIL; - auto stop = DetectorSocket(detector_shm()->hostname, detector_shm()->stopPort); - stop.sendData(&fnum, sizeof(fnum)); - stop.receiveData(&stopret, sizeof(stopret)); - if (stopret == FAIL) { - client.receiveData(mess, sizeof(mess)); - free(fpgasrc); - throw RuntimeError("Detector returned error: " + std::string(mess)); - } - } - } - FILE_LOG(logINFO) << "You can now restart the detector servers in normal mode."; - free(fpgasrc); - return ret; + // remapping stop server + if ((ret == FAIL) && (strstr(mess, "not implemented") == nullptr) && + (strstr(mess, "locked") == nullptr) && (strstr(mess, "-update") == nullptr)) { + fnum = F_RESET_FPGA; + int stopret = FAIL; + auto stop = DetectorSocket(detector_shm()->hostname, detector_shm()->stopPort); + stop.sendData(&fnum, sizeof(fnum)); + stop.receiveData(&stopret, sizeof(stopret)); + if (stopret == FAIL) { + client.receiveData(mess, sizeof(mess)); + throw RuntimeError("Detector " + std::to_string(detId) + + " returned error: " + std::string(mess)); + } + } + } + FILE_LOG(logINFO) << "You can now restart the detector " + std::to_string(detId) + + " in normal mode."; + return ret; } + int slsDetector::resetFPGA() { int fnum = F_RESET_FPGA; int ret = FAIL; From 45b837b42a9f190cb68688fd2b1a8d77c3050578 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 1 Apr 2019 10:22:50 +0200 Subject: [PATCH 2/4] program fpga printouts for errors --- .../jungfrauDetectorServer/gitInfo.txt | 10 +- .../jungfrauDetectorServer/gitInfoJungfrau.h | 8 +- .../slsDetectorServer_funcs.c | 159 +++++++++--------- slsDetectorSoftware/src/slsDetector.cpp | 30 ++-- 4 files changed, 105 insertions(+), 102 deletions(-) diff --git a/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt b/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt index 68e820fcd..73b8cb909 100644 --- a/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt +++ b/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorPackage/slsDetectorServers/jungfrauDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: ed9dc3b386898603d74a489528292139d47aac1a -Revision: 32 +Repsitory UUID: 969551ae373167dcfc28466f19e53a349da70f67 +Revision: 33 Branch: program -Last Changed Author: Erik_Frojdh -Last Changed Rev: 4488 -Last Changed Date: 2019-03-29 14:42:42.000000002 +0100 ../slsDetectorServer/slsDetectorServer_funcs.c +Last Changed Author: Dhanya_Thattil +Last Changed Rev: 4489 +Last Changed Date: 2019-04-01 09:39:27.000000002 +0200 ../slsDetectorServer/slsDetectorServer_funcs.c diff --git a/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h b/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h index 2f78fa4ac..f12356498 100644 --- a/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h +++ b/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "ed9dc3b386898603d74a489528292139d47aac1a" -#define GITAUTH "Erik_Frojdh" -#define GITREV 0x4488 -#define GITDATE 0x20190329 +#define GITREPUUID "969551ae373167dcfc28466f19e53a349da70f67" +#define GITAUTH "Dhanya_Thattil" +#define GITREV 0x4489 +#define GITDATE 0x20190401 #define GITBRANCH "program" diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index 54b304d61..4bc04c5d0 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -3279,106 +3279,101 @@ int program_fpga(int file_des) { // only set if (Server_VerifyLock() == OK) { + FILE_LOG(logINFOBLUE, ("Programming FPGA...\n")); + + size_t filesize = 0; + size_t totalsize = 0; + size_t unitprogramsize = 0; + char* fpgasrc = NULL; + FILE* fp = NULL; + + // filesize + if (receiveData(file_des,&filesize,sizeof(filesize),INT32) < 0) + return printSocketReadError(); + totalsize = filesize; + FILE_LOG(logDEBUG1, ("Total program size is: %d\n", totalsize)); + // not in programming mode - if (debugflag != PROGRAMMING_MODE) { - //to receive any arguments - int n = 1; - while (n > 0) - n = receiveData(file_des, mess, MAX_STR_LENGTH, OTHER); + /*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) { + ret = FAIL; + sprintf(mess,"Could not write to flash. Error at startup.\n"); + FILE_LOG(logERROR,(mess)); } - else { - FILE_LOG(logINFOBLUE, ("Programming FPGA...\n")); + //---------------- first ret ---------------- + Server_SendResult(file_des, INT32, NO_UPDATE, NULL, 0); - size_t filesize = 0; - size_t totalsize = 0; - size_t unitprogramsize = 0; - char* fpgasrc = NULL; - FILE* fp = NULL; + if (ret != FAIL) { + //erasing flash + eraseFlash(); + fpgasrc = (char*)malloc(MAX_FPGAPROGRAMSIZE); + } - // filesize - if (receiveData(file_des,&filesize,sizeof(filesize),INT32) < 0) + //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)); + + + //receive part of program + if (receiveData(file_des,fpgasrc,unitprogramsize,OTHER) < 0) return printSocketReadError(); - totalsize = filesize; - FILE_LOG(logDEBUG1, ("Total program size is: %d\n", totalsize)); - // 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"); - FILE_LOG(logERROR,(mess)); - } + if (!(unitprogramsize - filesize)) { + fpgasrc[unitprogramsize] = '\0'; + filesize -= unitprogramsize; + unitprogramsize++; + } else + filesize -= unitprogramsize; - //---------------- first ret ---------------- + // write part to flash + ret = writeFPGAProgram(fpgasrc, unitprogramsize, fp); + + //---------------- middle rets ---------------- Server_SendResult(file_des, INT32, NO_UPDATE, NULL, 0); - 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)); - //receive part of program - if (receiveData(file_des,fpgasrc,unitprogramsize,OTHER) < 0) - return printSocketReadError(); - - if (!(unitprogramsize - filesize)) { - fpgasrc[unitprogramsize] = '\0'; - filesize -= unitprogramsize; - unitprogramsize++; - } else - filesize -= unitprogramsize; - - // 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 { - //print progress - FILE_LOG(logINFO, ("Writing to Flash:%d%%\r", - (int) (((double)(totalsize-filesize)/totalsize)*100) )); - fflush(stdout); - } - } - printf("\n"); - FILE_LOG(logINFO, ("Done copying program or due to failure earlier\n")); - - // closing file pointer to flash and informing FPGA - stopWritingFPGAprogram(fp); - - //free resources - if (fpgasrc != NULL) - free(fpgasrc); - if (fp != NULL) - fclose(fp); - - FILE_LOG(logDEBUG1, ("Done with program receiving command\n")); - - if (ret != FAIL && isControlServer) { - basictests(); - initControlServer(); + if (ret == FAIL) { + FILE_LOG(logERROR, ("Failure: Breaking out of program receiving\n")); + } else { + //print progress + FILE_LOG(logINFO, ("Writing to Flash:%d%%\r", + (int) (((double)(totalsize-filesize)/totalsize)*100) )); + fflush(stdout); } } + printf("\n"); + FILE_LOG(logINFO, ("Done copying program or due to failure earlier\n")); + + // closing file pointer to flash and informing FPGA + stopWritingFPGAprogram(fp); + + //free resources + if (fpgasrc != NULL) + free(fpgasrc); + if (fp != NULL) + fclose(fp); + + FILE_LOG(logDEBUG1, ("Done with program receiving command\n")); + + if (ret != FAIL && isControlServer) { + basictests(); + initControlServer(); + } + } #endif #endif diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index 164833a83..2773e7ca7 100644 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -3403,7 +3403,7 @@ int slsDetector::programFPGA(std::vector buffer) { int fnum = F_PROGRAM_FPGA; int ret = FAIL; char mess[MAX_STR_LENGTH] = {0}; - FILE_LOG(logINFO) << "Sending programming binary to detector " << detector_shm()->hostname; + FILE_LOG(logINFO) << "Sending programming binary to detector " << detId << " (" << detector_shm()->hostname << ")"; if (detector_shm()->onlineFlag == ONLINE_FLAG) { auto client = DetectorSocket(detector_shm()->hostname, detector_shm()->controlPort); @@ -3413,14 +3413,16 @@ int slsDetector::programFPGA(std::vector buffer) { // opening error if (ret == FAIL) { client.receiveData(mess, sizeof(mess)); - throw RuntimeError("Detector " + std::to_string(detId) + - " returned error: " + std::string(mess)); + std::ostringstream os; + os << "Detector " << detId << " (" << detector_shm()->hostname << ")" << + " returned error: " << mess; + throw RuntimeError(os.str()); } // erasing flash if (ret != FAIL) { FILE_LOG(logINFO) << "This can take awhile. Please be patient..."; - FILE_LOG(logINFO) << detId << "Erasing Flash:"; + FILE_LOG(logINFO) << "Erasing Flash for detector " << detId << " (" << detector_shm()->hostname << ")"; printf("%d%%\r", 0); std::cout << std::flush; // erasing takes 65 seconds, printing here (otherwise need threads @@ -3434,7 +3436,7 @@ int slsDetector::programFPGA(std::vector buffer) { std::cout << std::flush; } printf("\n"); - FILE_LOG(logINFO) << detId << "Writing to Flash:"; + FILE_LOG(logINFO) << "Writing to Flash to detector " << detId << " (" << detector_shm()->hostname << ")"; printf("%d%%\r", 0); std::cout << std::flush; } @@ -3464,8 +3466,10 @@ int slsDetector::programFPGA(std::vector buffer) { } else { printf("\n"); client.receiveData(mess, sizeof(mess)); - throw RuntimeError("Detector " + std::to_string(detId) + - " returned error: " + std::string(mess)); + std::ostringstream os; + os << "Detector " << detId << " (" << detector_shm()->hostname << ")" << + " returned error: " << mess; + throw RuntimeError(os.str()); } } printf("\n"); @@ -3476,8 +3480,10 @@ int slsDetector::programFPGA(std::vector buffer) { client.receiveData(&ret, sizeof(ret)); if (ret == FAIL) { client.receiveData(mess, sizeof(mess)); - throw RuntimeError("Detector " + std::to_string(detId) + - " returned error: " + std::string(mess)); + std::ostringstream os; + os << "Detector " << detId << " (" << detector_shm()->hostname << ")" << + " returned error: " << mess; + throw RuntimeError(os.str()); } } @@ -3495,8 +3501,10 @@ int slsDetector::programFPGA(std::vector buffer) { stop.receiveData(&stopret, sizeof(stopret)); if (stopret == FAIL) { client.receiveData(mess, sizeof(mess)); - throw RuntimeError("Detector " + std::to_string(detId) + - " returned error: " + std::string(mess)); + std::ostringstream os; + os << "Detector " << detId << " (" << detector_shm()->hostname << ")" << + " returned error: " << mess; + throw RuntimeError(os.str()); } } } From 5131245f0ae80a0f3a3055ffc0f1088dd4914c39 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 2 Apr 2019 17:27:01 +0200 Subject: [PATCH 3/4] all servers except eiger: easier to update firmware and software using update or copydetectorserver, rebootcontroller, and programfpga --- .../ctbDetectorServer/gitInfo.txt | 10 +- .../ctbDetectorServer/gitInfoCtb.h | 8 +- .../slsDetectorServer_defs.h | 2 - .../bin/eigerDetectorServer_refactor | Bin 284569 -> 288760 bytes .../eigerDetectorServer/gitInfo.txt | 10 +- .../eigerDetectorServer/gitInfoEiger.h | 8 +- .../slsDetectorServer_defs.h | 1 - .../gotthardDetectorServer/gitInfo.txt | 10 +- .../gotthardDetectorServer/gitInfoGotthard.h | 8 +- .../slsDetectorServer_defs.h | 2 - .../bin/jungfrauDetectorServer_refactor | Bin 107360 -> 115588 bytes .../jungfrauDetectorServer/gitInfo.txt | 10 +- .../jungfrauDetectorServer/gitInfoJungfrau.h | 8 +- .../slsDetectorServer_defs.h | 2 - .../moenchDetectorServer/gitInfo.txt | 10 +- .../moenchDetectorServer/gitInfoMoench.h | 8 +- .../slsDetectorServer_defs.h | 2 - .../slsDetectorServer/communication_funcs.c | 3 +- .../slsDetectorServer/slsDetectorServer.c | 20 +- .../slsDetectorServer_funcs.c | 216 ++++++++++++------ .../slsDetectorServer_funcs.h | 8 + .../include/multiSlsDetector.h | 30 ++- slsDetectorSoftware/include/slsDetector.h | 14 ++ slsDetectorSoftware/src/multiSlsDetector.cpp | 44 +++- slsDetectorSoftware/src/slsDetector.cpp | 80 ++++--- .../src/slsDetectorCommand.cpp | 70 +++++- slsSupportLib/include/sls_detector_funcs.h | 2 + 27 files changed, 393 insertions(+), 193 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/gitInfo.txt b/slsDetectorServers/ctbDetectorServer/gitInfo.txt index 8b4e37cab..23624f0bb 100644 --- a/slsDetectorServers/ctbDetectorServer/gitInfo.txt +++ b/slsDetectorServers/ctbDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorPackage/slsDetectorServers/ctbDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 5a4122ae7c8dae1572e9db336de70183956e58c7 -Revision: 50 -Branch: refactor +Repsitory UUID: 45b837b42a9f190cb68688fd2b1a8d77c3050578 +Revision: 52 +Branch: program2 Last Changed Author: Dhanya_Thattil -Last Changed Rev: 4481 -Last Changed Date: 2019-03-28 08:18:03.000000002 +0100 ../slsDetectorServer/slsDetectorFunctionList.h +Last Changed Rev: 4490 +Last Changed Date: 2019-04-02 17:21:25.000000002 +0200 ./slsDetectorServer_defs.h diff --git a/slsDetectorServers/ctbDetectorServer/gitInfoCtb.h b/slsDetectorServers/ctbDetectorServer/gitInfoCtb.h index b7b7c4d4f..7cb23e08f 100644 --- a/slsDetectorServers/ctbDetectorServer/gitInfoCtb.h +++ b/slsDetectorServers/ctbDetectorServer/gitInfoCtb.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "5a4122ae7c8dae1572e9db336de70183956e58c7" +#define GITREPUUID "45b837b42a9f190cb68688fd2b1a8d77c3050578" #define GITAUTH "Dhanya_Thattil" -#define GITREV 0x4481 -#define GITDATE 0x20190328 -#define GITBRANCH "refactor" +#define GITREV 0x4490 +#define GITDATE 0x20190402 +#define GITBRANCH "program2" diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h index 3a2f65da0..82ba1a85e 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h @@ -3,11 +3,9 @@ #include "RegisterDefs.h" -#define GOODBYE (-200) #define MIN_REQRD_VRSN_T_RD_API 0x181130 #define REQRD_FRMWR_VRSN 0x190310 -#define PROGRAMMING_MODE (0x2) #define CTRL_SRVR_INIT_TIME_US (1 * 1000 * 1000) /* Struct Definitions */ diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor index 320b35969202a9efe3cc4fa4c38b71009975d9d6..bba1d168cd28373a187fa6cd2dc5f37f378c32ac 100755 GIT binary patch delta 63757 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 V<%+yDYnPcnR^Ym6q3v#;{{=L9C2Rly delta 62233 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 -#define GOODBYE (-200) - /* Enums */ enum ADCINDEX {TEMP_FPGA, TEMP_ADC}; enum DACINDEX {VREF_DS, VCASCN_PB, VCASCP_PB, VOUT_CM, VCASC_OUT, VIN_CM, VREF_COMP, IB_TESTC}; diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_refactor b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_refactor index b5d37dcd8afba67dba88f687a6aff9f6dd8e36a3..ab33ee12141a07fc122e4f0cda489f74cda48799 100755 GIT binary patch delta 63569 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 delta 55551 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

g``_Zx`lLLAsq<8QXyC>Bn_s+Q}8r= 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 fVh|N= 0) close(socketDescriptor); - FILE_LOG(logDEBUG3, ("Closing %s server\n", (isControlServer ? "control":"stop"))); + FILE_LOG(logINFO, ("Closing %s server\n", (isControlServer ? "control":"stop"))); FD_CLR(socketDescriptor, &readset); isock--; + fflush(stdout); } diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer.c index 4bd9e1233..e98af35a4 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer.c @@ -37,7 +37,6 @@ int main(int argc, char *argv[]){ // subsequent read/write to socket gives error - must handle locally signal(SIGPIPE, SIG_IGN); - // circumvent the basic tests { int i; @@ -63,16 +62,6 @@ int main(int argc, char *argv[]){ FILE_LOG(logINFO, ("Detected phase shift of %d\n", phaseShift)); } #endif -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) - else if(!strcasecmp(argv[i],"-update")){ - FILE_LOG(logINFO, ("Detected update mode\n")); - debugflag = PROGRAMMING_MODE; - } -#endif - else if(strchr(argv[i],'-') != NULL) { - FILE_LOG(logERROR, ("cannot scan program argument %s\n", argv[1])); - return -1; - } } } @@ -116,7 +105,7 @@ int main(int argc, char *argv[]){ } // waits for connection - while(retval != GOODBYE) { + while(retval != GOODBYE && retval != REBOOT) { fd = acceptConnection(sockfd); if (fd > 0) { retval = decode_function(fd); @@ -125,8 +114,13 @@ int main(int argc, char *argv[]){ } exitServer(sockfd); - FILE_LOG(logINFO,("Goodbye!\n")); + if (retval == REBOOT) { + FILE_LOG(logINFOBLUE,("Rebooting!\n")); + fflush(stdout); + system("reboot"); + } + FILE_LOG(logINFO,("Goodbye!\n")); return 0; } diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index 4bc04c5d0..f8c294343 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -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] = ©_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 +} diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h index c61a7c824..da2e28d66 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h @@ -1,12 +1,16 @@ #pragma once #include "sls_detector_defs.h" +#include "logger.h" enum numberMode {DEC, HEX}; +#define GOODBYE (-200) +#define REBOOT (-400) // initialization functions int printSocketReadError(); void init_detector(); int decode_function(int); +const char* getRetName(); const char* getTimerName(enum timerIndex ind); const char* getSpeedName(enum speedVariable ind); const char* getFunctionName(enum detFuncs func); @@ -15,6 +19,7 @@ void functionNotImplemented(); void modeNotImplemented(char* modename, int mode); void validate(int arg, int retval, char* modename, enum numberMode nummode); void validate64(int64_t arg, int64_t retval, char* modename, enum numberMode nummode); +int executeCommand(char* command, char* result, enum TLogLevel level); int M_nofunc(int); int M_nofuncMode(int); @@ -85,3 +90,6 @@ int check_version(int); int software_trigger(int); int led(int); int digital_io_delay(int); +int copy_detector_server(int); +int reboot_controller(int); + diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h index ee860a66f..120fb859a 100644 --- a/slsDetectorSoftware/include/multiSlsDetector.h +++ b/slsDetectorSoftware/include/multiSlsDetector.h @@ -1419,7 +1419,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { int setStoragecellStart(int pos = -1, int detPos = -1); /** - * Programs FPGA with pof file (Jungfrau) + * Programs FPGA with pof file (Not Eiger) * @param fname file name * @param detPos -1 for all detectors in list or specific detector position * @returns OK or FAIL @@ -1427,12 +1427,38 @@ class multiSlsDetector : public virtual slsDetectorDefs { int programFPGA(const std::string &fname, int detPos = -1); /** - * Resets FPGA (Jungfrau) + * Resets FPGA (Not Eiger) * @param detPos -1 for all detectors in list or specific detector position * @returns OK or FAIL */ int resetFPGA(int detPos = -1); + /** + * Copies detector server from tftp and changes respawn server (Not Eiger) + * @param fname name of detector server binary + * @param hostname name of pc to tftp from + * @param detPos -1 for all detectors in list or specific detector position + * @returns OK or FAIL + */ + int copyDetectorServer(const std::string &fname, const std::string &hostname, int detPos = -1); + + /** + * Reboot detector controller (Not Eiger) + * @param detPos -1 for all detectors in list or specific detector position + * @returns OK or FAIL + */ + int rebootController(int detPos = -1); + + /** + * Updates the firmware, detector server and then reboots detector controller blackfin. (Not Eiger) + * @param sname name of detector server binary + * @param hostname name of pc to tftp from + * @param fname programming file name + * @param detPos -1 for all detectors in list or specific detector position + * @returns OK or FAIL + */ + int update(const std::string &sname, const std::string &hostname, const std::string &fname, int detPos = -1); + /** * Power on/off Chip (Jungfrau) * @param ival on is 1, off is 0, -1 to get diff --git a/slsDetectorSoftware/include/slsDetector.h b/slsDetectorSoftware/include/slsDetector.h index 9f32780a5..342792e2c 100644 --- a/slsDetectorSoftware/include/slsDetector.h +++ b/slsDetectorSoftware/include/slsDetector.h @@ -1291,6 +1291,20 @@ class slsDetector : public virtual slsDetectorDefs{ int resetFPGA(); /** + * Copies detector server from tftp and changes respawn server (Not Eiger) + * @param fname name of detector server binary + * @param hostname name of pc to tftp from + * @returns OK or FAIL + */ + int copyDetectorServer(const std::string &fname, const std::string &hostname); + + /** + * Reboot detector controller (blackfin/ powerpc) + * @returns OK or FAIL + */ + int rebootController(); + + /** * Power on/off Chip (Jungfrau) * @param ival on is 1, off is 0, -1 to get * @returns OK or FAIL diff --git a/slsDetectorSoftware/src/multiSlsDetector.cpp b/slsDetectorSoftware/src/multiSlsDetector.cpp index 1b67f7fbd..4cd8fa706 100644 --- a/slsDetectorSoftware/src/multiSlsDetector.cpp +++ b/slsDetectorSoftware/src/multiSlsDetector.cpp @@ -2597,12 +2597,13 @@ int multiSlsDetector::setStoragecellStart(int pos, int detPos) { } int multiSlsDetector::programFPGA(const std::string &fname, int detPos) { + FILE_LOG(logINFO) << "This can take awhile. Please be patient..."; // read pof file std::vector buffer = readPofFile(fname); // single if (detPos >= 0) { - return detectors[detPos]->programFPGA(buffer); + return detectors[detPos]->programFPGA(buffer); } // multi @@ -2621,6 +2622,47 @@ int multiSlsDetector::resetFPGA(int detPos) { return sls::allEqualTo(r, static_cast(OK)) ? OK : FAIL; } +int multiSlsDetector::copyDetectorServer(const std::string &fname, const std::string &hostname, int detPos) { + // single + if (detPos >= 0) { + detectors[detPos]->copyDetectorServer(fname, hostname); + return detectors[detPos]->rebootController(); // reboot and copy should be independant for update command + } + + // multi + parallelCall(&slsDetector::copyDetectorServer,fname, hostname); + auto r = parallelCall(&slsDetector::rebootController); + return sls::allEqualTo(r, static_cast(OK)) ? OK : FAIL; +} + +int multiSlsDetector::rebootController(int detPos) { + // single + if (detPos >= 0) { + return detectors[detPos]->rebootController(); + } + + // multi + auto r = parallelCall(&slsDetector::rebootController); + return sls::allEqualTo(r, static_cast(OK)) ? OK : FAIL; +} + +int multiSlsDetector::update(const std::string &sname, const std::string &hostname, const std::string &fname, int detPos) { + FILE_LOG(logINFO) << "This can take awhile. Please be patient..."; + // read pof file + std::vector buffer = readPofFile(fname); + + // single + if (detPos >= 0) { + detectors[detPos]->copyDetectorServer(sname, hostname); + return detectors[detPos]->programFPGA(buffer); + } + + // multi + parallelCall(&slsDetector::copyDetectorServer,sname, hostname); + auto r = parallelCall(&slsDetector::programFPGA, buffer); + return sls::allEqualTo(r, static_cast(OK)) ? OK : FAIL; +} + int multiSlsDetector::powerChip(int ival, int detPos) { // single if (detPos >= 0) { diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index 2773e7ca7..49e334b86 100644 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -848,7 +848,9 @@ int slsDetector::execCommand(const std::string &cmd) { if (detector_shm()->onlineFlag == ONLINE_FLAG) { auto client = DetectorSocket(detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, arg, sizeof(arg), retval, sizeof(retval)); - FILE_LOG(logINFO) << "Detector " << detId << " returned:\n" << retval; + if (strlen(retval)) { + FILE_LOG(logINFO) << "Detector " << detId << " returned:\n" << retval; + } } return ret; } @@ -3410,7 +3412,7 @@ int slsDetector::programFPGA(std::vector buffer) { client.sendData(&fnum, sizeof(fnum)); client.sendData(&filesize, sizeof(filesize)); client.receiveData(&ret, sizeof(ret)); - // opening error + // error in detector at opening file pointer to flash if (ret == FAIL) { client.receiveData(mess, sizeof(mess)); std::ostringstream os; @@ -3421,12 +3423,10 @@ int slsDetector::programFPGA(std::vector buffer) { // erasing flash if (ret != FAIL) { - FILE_LOG(logINFO) << "This can take awhile. Please be patient..."; FILE_LOG(logINFO) << "Erasing Flash for detector " << detId << " (" << detector_shm()->hostname << ")"; printf("%d%%\r", 0); std::cout << std::flush; - // erasing takes 65 seconds, printing here (otherwise need threads - // in server-unnecessary) + // erasing takes 65 seconds, printing here (otherwise need threads in server-unnecessary) const int ERASE_TIME = 65; int count = ERASE_TIME + 1; while (count > 0) { @@ -3473,43 +3473,10 @@ int slsDetector::programFPGA(std::vector buffer) { } } printf("\n"); - - // check ending error - if ((ret == FAIL) && (strstr(mess, "not implemented") == nullptr) && - (strstr(mess, "locked") == nullptr) && (strstr(mess, "-update") == nullptr)) { - client.receiveData(&ret, sizeof(ret)); - if (ret == FAIL) { - client.receiveData(mess, sizeof(mess)); - std::ostringstream os; - os << "Detector " << detId << " (" << detector_shm()->hostname << ")" << - " returned error: " << mess; - throw RuntimeError(os.str()); - } - } - - if (ret == FORCE_UPDATE) { - updateDetector(); - } - - // remapping stop server - if ((ret == FAIL) && (strstr(mess, "not implemented") == nullptr) && - (strstr(mess, "locked") == nullptr) && (strstr(mess, "-update") == nullptr)) { - fnum = F_RESET_FPGA; - int stopret = FAIL; - auto stop = DetectorSocket(detector_shm()->hostname, detector_shm()->stopPort); - stop.sendData(&fnum, sizeof(fnum)); - stop.receiveData(&stopret, sizeof(stopret)); - if (stopret == FAIL) { - client.receiveData(mess, sizeof(mess)); - std::ostringstream os; - os << "Detector " << detId << " (" << detector_shm()->hostname << ")" << - " returned error: " << mess; - throw RuntimeError(os.str()); - } - } } - FILE_LOG(logINFO) << "You can now restart the detector " + std::to_string(detId) + - " in normal mode."; + if (ret != FAIL) { + ret = rebootController(); + } return ret; } @@ -3528,6 +3495,37 @@ int slsDetector::resetFPGA() { return ret; } +int slsDetector::copyDetectorServer(const std::string &fname, const std::string &hostname) { + int fnum = F_COPY_DET_SERVER; + int ret = FAIL; + char args[2][MAX_STR_LENGTH] = {}; + sls::strcpy_safe(args[0], fname.c_str()); + sls::strcpy_safe(args[1], hostname.c_str()); + FILE_LOG(logINFO) << "Sending detector server " << args[0] << " from host " << args[1]; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = DetectorSocket(detector_shm()->hostname, detector_shm()->controlPort); + ret = client.sendCommandThenRead(fnum, args, sizeof(args), nullptr, 0); + } + return ret; +} + +int slsDetector::rebootController() { + if (detector_shm()->myDetectorType == EIGER) { + throw RuntimeError("Reboot controller not implemented for this detector"); + } + + int fnum = F_REBOOT_CONTROLLER; + int ret = FAIL; + FILE_LOG(logINFO) << "Sending reboot controller to detector " << detId << " (" << detector_shm()->hostname << ")"; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = DetectorSocket(detector_shm()->hostname, detector_shm()->controlPort); + client.sendData(&fnum, sizeof(fnum)); + ret = OK; + } + return ret; +} + + int slsDetector::powerChip(int ival) { int fnum = F_POWER_CHIP; int ret = FAIL; diff --git a/slsDetectorSoftware/src/slsDetectorCommand.cpp b/slsDetectorSoftware/src/slsDetectorCommand.cpp index e6922e3cf..4cb797258 100644 --- a/slsDetectorSoftware/src/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/src/slsDetectorCommand.cpp @@ -405,6 +405,27 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) { descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdAdvanced; ++i; + /*! \page config + - copydetectorserver [sname] [phost] copies the detector server sname via tftp from pc with hostname phost and changes respawn server for all detector. Not for Eiger. Only put! \c Returns \c ("successful", "failed") + */ + descrToFuncMap[i].m_pFuncName = "copydetectorserver"; + descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdAdvanced; + ++i; + + /*! \page config + - rebootdetpc reboot detector controller blackfin. Only put! Not for Eiger. \c Returns \c ("successful", "failed") + */ + descrToFuncMap[i].m_pFuncName = "rebootcontroller"; + descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdAdvanced; + ++i; + + /*! \page config + - update [sname] [phost] [file] updates the firmware to file and detector server to sname from phost via tftp and then reboots controller (blackfin). Only put! Not for Eiger. \c Returns \c ("successful", "failed") + */ + descrToFuncMap[i].m_pFuncName = "update"; + descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdAdvanced; + ++i; + /* chip */ /*! \page config \section configchip Chip @@ -4753,9 +4774,6 @@ std::string slsDetectorCommand::cmdAdvanced(int narg, char *args[], int action, if (strstr(args[1], ".pof") == nullptr) return std::string("wrong usage: programming file should have .pof extension"); std::string sval = std::string(args[1]); -#ifdef VERBOSE - std::cout << " programming file " << sval << std::endl; -#endif myDet->setOnline(ONLINE_FLAG, detPos); if (myDet->programFPGA(sval, detPos) == OK) return std::string("successful"); @@ -4765,15 +4783,51 @@ std::string slsDetectorCommand::cmdAdvanced(int narg, char *args[], int action, else if (cmd == "resetfpga") { if (action == GET_ACTION) return std::string("cannot get"); -#ifdef VERBOSE - std::cout << " resetting fpga " << std::endl; -#endif myDet->setOnline(ONLINE_FLAG, detPos); if (myDet->resetFPGA(detPos) == OK) return std::string("successful"); return std::string("failed"); } + else if (cmd == "copydetectorserver") { + if (action == GET_ACTION) + return std::string("cannot get"); + if (narg < 3) + return ("wrong usage." + helpAdvanced(PUT_ACTION)); + std::string sval = std::string(args[1]); + std::string pval = std::string(args[2]); + myDet->setOnline(ONLINE_FLAG, detPos); + if (myDet->copyDetectorServer(sval, pval, detPos) == OK) + return std::string("successful"); + return std::string("failed"); + } + + else if (cmd == "rebootcontroller") { + if (action == GET_ACTION) + return std::string("cannot get"); + myDet->setOnline(ONLINE_FLAG, detPos); + if (myDet->rebootController(detPos) == OK) + return std::string("successful"); + return std::string("failed"); + } + + else if (cmd == "update") { + if (action == GET_ACTION) + return std::string("cannot get"); + if (narg < 4) + return ("wrong usage." + helpAdvanced(PUT_ACTION)); + // pof + if (strstr(args[3], ".pof") == nullptr) + return std::string("wrong usage: programming file should have .pof extension"); + std::string sval = std::string(args[1]); + std::string pval = std::string(args[2]); + std::string fval = std::string(args[3]); + myDet->setOnline(ONLINE_FLAG, detPos); + if (myDet->update(sval, pval, fval, detPos) == OK) + return std::string("successful"); + return std::string("failed"); + } + else if (cmd == "powerchip") { char ans[100]; myDet->setOnline(ONLINE_FLAG, detPos); @@ -4842,7 +4896,9 @@ std::string slsDetectorCommand::helpAdvanced(int action) { os << "programfpga f \t programs the fpga with file f (with .pof extension)." << std::endl; os << "resetfpga f \t resets fpga, f can be any value" << std::endl; - + os << "copydetectorserver s p \t copies the detector server s via tftp from pc with hostname p and changes respawn server. Not for Eiger. " << std::endl; + os << "rebootcontroller \t reboot controler blackfin of the detector. Not for Eiger." << std::endl; + os << "update s p f \t updates the firmware to f and detector server to f from host p via tftp and then reboots controller (blackfin). Not for Eiger. " << std::endl; os << "led s \t sets led status (0 off, 1 on)" << std::endl; os << "diodelay m v \tsets the delay for the digital IO pins selected by mask m and delay set by v. mask is upto 64 bits in hex, delay max is 775ps, and set in steps of 25 ps. Used for MOENCH/CTB only." << std::endl; os << "powerchip i \t powers on or off the chip. i = 1 for on, i = 0 for off" << std::endl; diff --git a/slsSupportLib/include/sls_detector_funcs.h b/slsSupportLib/include/sls_detector_funcs.h index e20f45371..4179a1536 100644 --- a/slsSupportLib/include/sls_detector_funcs.h +++ b/slsSupportLib/include/sls_detector_funcs.h @@ -74,6 +74,8 @@ enum detFuncs{ F_SOFTWARE_TRIGGER,/** < software trigger */ F_LED, /** < switch on/off led */ F_DIGITAL_IO_DELAY, /** < digital IO delay */ + F_COPY_DET_SERVER, /** < copy detector server & respawn */ + F_REBOOT_CONTROLLER, /** < reboot detector controller (blackfin/ powerpc) */ NUM_DET_FUNCTIONS, RECEIVER_ENUM_START = 128, /**< detector function should not exceed this (detector server should not compile anyway) */ From 09f1a8956e409a33afb5ddbd4b38d0cf34bf6540 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 3 Apr 2019 10:22:00 +0200 Subject: [PATCH 4/4] ignore .vscode --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ee1820741..fb8df8cb6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ bin/ *.out *.toc *.o +.* build docs/ RELEASE.txt