diff --git a/RELEASE.txt b/RELEASE.txt index 07a3066c4..ff46ed073 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -1,8 +1,8 @@ -SLS Detector Package 4.1.1 released on 15.01.2020 (Bug Fix Release) +SLS Detector Package 4.2.0 released on 10.03.2020 (Minor Release) =================================================================== -This document describes the differences between 4.1.0 and 4.1.1 releases. +This document describes the differences between 4.2.0 and 4.1.1 releases. CONTENTS -------- @@ -17,37 +17,38 @@ This document describes the differences between 4.1.0 and 4.1.1 releases. 1. Topics Concerning ==================== - - detangled receiver streaming from data call back in client - and allow for unregister data call back in client - - (eiger) software trigger made to work along with blocking acquire - - bug fix for locks in blocking acquire - - parameter file allows for modular commands + - (Eiger) detector server startup with vcal = 0 to reduce noise + - Deactivate will deactivate a module even if FEB does not work. + - trimbits check + - zmqsocket + - fifo size (memory allocation print to mb) + - subexptime also sets subperiod in master fle + - minor check if no detectors ()xxxxxxxxxxxxxxxxxxxxxxx + - setflippeddatax in users xxxxx + - memory alignment in receiver - Compared to 4.1.0, - no firmware or on-board detector server update required for this release. 2. Resolved Issues ================== - Client - ------ + Detector Server (Eiger) + ----------------------- - 1. Registering data call back (registerDataCallback) used to enable data streaming - via zmq in both receiver and client. Sending NULL unregistered call back, - but did not disable streaming. - Now, registering/unregistering this call back will only enable data streaming - in client. Data streaming in receiver will have to be explicitly enabled. + 1. Vcal dac set to 0 at on-board detector server start up to + reduce noise. - 2. (Eiger) - Software trigger triggered via the stop server and hence, can be triggered - also during blocking acquire. + 2. Deactivate will deactivate a module even if FEB does not work. - 3. If stop acquisition command was given immediately after starting a blocking acquire, - it might have hanged the process. This bug is fixed now. + 3. Trimbits values checked for values 0 - 63. - 4. Parameter file now allows modular commands (using ':'). They are not ignored anymore. - + Receiver + -------- + + 1. zmq socket send memory not overlapping + 2. fifo size not be large (and memory allocated print to mb) + + - subexptime also sets subperiod in master fle 3. Known Issues =============== diff --git a/manual/manual-api/mainReceiver.cpp b/manual/manual-api/mainReceiver.cpp index 469eb8a4c..2d2a39e5b 100644 --- a/manual/manual-api/mainReceiver.cpp +++ b/manual/manual-api/mainReceiver.cpp @@ -31,6 +31,7 @@ It is linked in manual/manual-api from slsReceiverSoftware/include ] #include //usleep #include #include //tid +#include using namespace std; @@ -38,15 +39,15 @@ using namespace std; #define PRINT_IN_COLOR(c,f, ...) printf ("\033[%dm" f RESET, 30 + c+1, ##__VA_ARGS__) -/** Variable is true to continue running, set to false upon interrupt */ -bool keeprunning; +/** Semaphore that waits, interrupted upon end */ +sem_t semaphore; /** * Control+C Interrupt Handler - * Sets the variable keeprunning to false, to let all the processes know to exit properly + * pushes semaphore to stop waiting, to let all the processes know to exit properly */ void sigInterruptHandler(int p){ - keeprunning = false; + sem_post(&semaphore); } /** @@ -170,7 +171,7 @@ int main(int argc, char *argv[]) { int numReceivers = 1; int startTCPPort = 1954; int withCallback = 0; - keeprunning = true; + sem_init(&semaphore,1,0); /** - get number of receivers and start tcp port from command line arguments */ if ( (argc != 4) || (!sscanf(argv[1],"%d", &startTCPPort)) || (!sscanf(argv[2],"%d", &numReceivers)) || (!sscanf(argv[3],"%d", &withCallback)) ) @@ -257,9 +258,9 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } - /** - as long as keeprunning is true (changes with Ctrl+C) */ - while(keeprunning) - pause(); + /** - as long as semaphore waits (changes with Ctrl+C) */ + sem_wait(&semaphore); + sem_destroy(&semaphore); /** - interrupt caught, delete slsReceiverUsers object and exit */ delete receiver; cprintf(BLUE,"Exiting Child Process [ Tid: %ld ]\n", (long)syscall(SYS_gettid)); diff --git a/slsDetectorGui/include/qDefs.h b/slsDetectorGui/include/qDefs.h index f1b7d2b51..a631ca965 100644 --- a/slsDetectorGui/include/qDefs.h +++ b/slsDetectorGui/include/qDefs.h @@ -85,15 +85,21 @@ public: static double getNSTime(timeUnit unit, double value){ double valueNS=value; switch(unit){ - case HOURS: valueNS*=60; - case MINUTES: valueNS*=60; - case SECONDS: valueNS*=1000; - case MILLISECONDS: valueNS*=1000; - case MICROSECONDS: valueNS*=1000; + case HOURS: + return valueNS * 60 * 60 * 1000 * 1000 * 1000; + case MINUTES: + return valueNS * 60 * 1000 * 1000 * 1000; + case SECONDS: + return valueNS * 1000 * 1000 * 1000; + case MILLISECONDS: + return valueNS * 1000 * 1000; + case MICROSECONDS: + return valueNS * 1000; case NANOSECONDS: - default:; + return valueNS; + default: + return 0; } - return valueNS; }; //------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster index 41dbf1b82..d19dac346 100755 Binary files a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster and b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster differ diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave index 3fb5134c0..3b1610308 100755 Binary files a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave and b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave differ diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.1.0.24.5 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.2.0.24.0 similarity index 71% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.1.0.24.5 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.2.0.24.0 index 21e315387..0bf78a6e4 100755 Binary files a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.1.0.24.5 and b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.2.0.24.0 differ diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt index 2a268b487..8d7c4e74e 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: e4645a8273c8265bc584579d5f7f8eb6dc4379f7 -Revision: 360 -Branch: 4.1.0-rc -Last Changed Author: GitHub_GitHub -Last Changed Rev: 4138 -Last Changed Date: 2019-10-04 09:28:27.000000001 +0200 ./xparameters.h +Repsitory UUID: 9649982932b2db75b9bf720ce4a13e7cdb059430 +Revision: 361 +Branch: 4.1.2-rc +Last Changed Author: Gemma_Tinti +Last Changed Rev: 4157 +Last Changed Date: 2020-03-09 18:18:12.000000001 +0100 ./xparameters.h diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h index c6790c62b..3bfcd5294 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "e4645a8273c8265bc584579d5f7f8eb6dc4379f7" -#define GITAUTH "GitHub_GitHub" -#define GITREV 0x4138 -#define GITDATE 0x20191004 -#define GITBRANCH "4.1.0-rc" +#define GITREPUUID "9649982932b2db75b9bf720ce4a13e7cdb059430" +#define GITAUTH "Gemma_Tinti" +#define GITREV 0x4157 +#define GITDATE 0x20200309 +#define GITBRANCH "4.1.2-rc" diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index b45a906c5..be664eea3 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -284,6 +284,9 @@ u_int32_t getDetectorIP(){ FILE* sysFile = popen("ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2", "r"); fgets(output, sizeof(output), sysFile); pclose(sysFile); + if (strlen(output) <= 1) { + return 0; + } //converting IPaddress to hex. char* pcword = strtok (output,"."); @@ -329,7 +332,16 @@ void initControlServer(){ setupDetector(); -#endif + + // activate (if it gets ip) (later FW will deactivate at startup) + if (getDetectorIP() != 0) { + Beb_Activate(1); + Feb_Control_activate(1); + } else { + Beb_Activate(0); + Feb_Control_activate(0); + } +#endif printf("\n"); } @@ -344,6 +356,16 @@ void initStopServer(){ Feb_Control_FebControl(); Feb_Control_Init(master,top,normal,getDetectorNumber()); printf("FEB Initialization done\n"); + + // activate (if it gets ip) (later FW will deactivate at startup) + // also needed for stop server for status + if (getDetectorIP() != 0) { + Beb_Activate(1); + Feb_Control_activate(1); + } else { + Beb_Activate(0); + Feb_Control_activate(0); + } #endif printf("\n"); } diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h index 1f9382f20..b0d858827 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h @@ -31,7 +31,7 @@ enum DACINDEX {SVP,VTR,VRF,VRS,SVN,VTGSTV,VCMP_LL,VCMP_LR,CAL,VCMP_RL,RX 2556, /* Vtgstv */ \ 1000, /* Vcmp_ll */ \ 1000, /* Vcmp_lr */ \ - 4000, /* cal */ \ + 0, /* cal */ \ 1000, /* Vcmp_rl */ \ 1100, /* rxb_rb */ \ 1100, /* rxb_lb */ \ @@ -90,6 +90,7 @@ enum NETWORKINDEX {TXN_LEFT, TXN_RIGHT, TXN_FRAME,FLOWCTRL_10G}; #define DEFAULT_TEST_MODE (0) #define DEFAULT_HIGH_VOLTAGE (0) +#define MAX_TRIMBITS_VALUE (63) #define MAX_SUBFRAME_EXPOSURE_VAL_IN_10NS (0x1FFFFFFF) /** 29 bit register for max subframe exposure value */ diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 0425e3f60..c81bac615 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -2670,7 +2670,7 @@ int* multiSlsDetector::getDataFromDetector() { int nodatadet = -1; int nodatadetectortype = false; detectorType types = getDetectorsType(); - if (types == EIGER || types == JUNGFRAU || GOTTHARD || PROPIX) { + if (types == EIGER || types == JUNGFRAU || types == GOTTHARD || types == PROPIX) { nodatadetectortype = true; } @@ -3108,17 +3108,18 @@ slsDetectorDefs::externalCommunicationMode multiSlsDetector::setExternalCommunic externalCommunicationMode pol) { externalCommunicationMode ret, ret1; //(Dhanya) FIXME: why first detector or is it the master one? - if (detectors.size()) + if (detectors.size()) { ret = detectors[0]->setExternalCommunicationMode(pol); - if (detectors[0]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << 0)); + if (detectors[0]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << 0)); - for (unsigned int idet = 1; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->setExternalCommunicationMode(pol); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret != ret1) - ret = GET_EXTERNAL_COMMUNICATION_MODE; + for (unsigned int idet = 1; idet < detectors.size(); ++idet) { + ret1 = detectors[idet]->setExternalCommunicationMode(pol); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret != ret1) + ret = GET_EXTERNAL_COMMUNICATION_MODE; + } } setMaster(); setSynchronization(); @@ -3129,17 +3130,18 @@ slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags( externalSignalFlag pol, int signalindex) { externalSignalFlag ret, ret1; //(Dhanya) FIXME: why first detector or is it the master one? - if (detectors.size()) + if (detectors.size()) { ret = detectors[0]->setExternalSignalFlags(pol, signalindex); - if (detectors[0]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << 0)); + if (detectors[0]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << 0)); - for (unsigned int idet = 1; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->setExternalSignalFlags(pol, signalindex); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret != ret1) - ret = GET_EXTERNAL_SIGNAL_FLAG; + for (unsigned int idet = 1; idet < detectors.size(); ++idet) { + ret1 = detectors[idet]->setExternalSignalFlags(pol, signalindex); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret != ret1) + ret = GET_EXTERNAL_SIGNAL_FLAG; + } } setMaster(); setSynchronization(); @@ -5592,8 +5594,10 @@ int multiSlsDetector::enableDataStreamingToClient(int enable) { std::cout << "Could not create data threads in client." << std::endl; //only for the first det as theres no general one setErrorMask(getErrorMask() | (1 << 0)); - detectors[0]->setErrorMask((detectors[0]->getErrorMask()) | + if (detectors.size()) { + detectors[0]->setErrorMask((detectors[0]->getErrorMask()) | (DATA_STREAMING)); + } } } } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 754072126..c325014e1 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -3689,7 +3689,7 @@ int* slsDetector::getDataFromDetector(int *retval) { int nodatadetectortype = false; detectorType types = getDetectorsType(); - if(types == EIGER || types == JUNGFRAU || GOTTHARD || PROPIX){ + if(types == EIGER || types == JUNGFRAU || types == GOTTHARD || types == PROPIX){ nodatadetectortype = true; } @@ -3906,7 +3906,9 @@ int slsDetector::configureMAC() { bzero(cword, 50); string s; while (getline(ss, s, '.')) { - sprintf(cword,"%s%02x",cword,atoi(s.c_str())); + char cnum[50]=""; + sprintf(cnum, "%02x", atoi(s.c_str())); + strcat(cword, cnum); } bzero(arg[0], 50); strcpy(arg[0],cword); @@ -3922,7 +3924,7 @@ int slsDetector::configureMAC() { bzero(cword, 50); string s; while (getline(ss, s, ':')) { - sprintf(cword,"%s%s",cword,s.c_str()); + strcat(cword, s.c_str()); } bzero(arg[1], 50); strcpy(arg[1],cword); @@ -3941,7 +3943,7 @@ int slsDetector::configureMAC() { bzero(cword, 50); string s; while (getline(ss, s, ':')) { - sprintf(cword,"%s%s",cword,s.c_str()); + strcat(cword, s.c_str()); } bzero(arg[3], 50); strcpy(arg[3],cword); @@ -3957,7 +3959,9 @@ int slsDetector::configureMAC() { bzero(cword, 50); string s; while (getline(ss, s, '.')) { - sprintf(cword,"%s%02x",cword,atoi(s.c_str())); + char cnum[50]=""; + sprintf(cnum, "%02x", atoi(s.c_str())); + strcat(cword, cnum); } bzero(arg[4], 50); strcpy(arg[4],cword); @@ -6122,6 +6126,19 @@ int slsDetector::activate(int const enable) { if (ret==FORCE_UPDATE) updateDetector(); } + if (connectStop() == OK){ + stopSocket->SendDataOnly(&fnum,sizeof(fnum)); + stopSocket->SendDataOnly(&arg,sizeof(arg)); + stopSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL) { + stopSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector (Stop server) returned error: " << mess << std::endl; + setErrorMask((getErrorMask())|(DETECTOR_ACTIVATE)); + } else { + stopSocket->ReceiveDataOnly(&retval,sizeof(retval)); + } + disconnectStop(); + } } #ifdef VERBOSE if(retval==1) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp index bdcc6cebd..da3cd85fc 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp @@ -471,6 +471,14 @@ int slsDetectorActions::executeAction(int level) { case headerBefore: fName=getCurrentFileName(); nowIndex=getFileIndexFromFileName(getCurrentFileName()); +// all other parameters should be taken using text client calls in the header scripts! + + sprintf(cmd,"%s nrun=%d fn=%s par=%s", \ + getActionScript(level).c_str(), \ + nowIndex, \ + fName.c_str(), \ + getActionParameter(level).c_str()); + break; case headerAfter: // all other parameters should be taken using text client calls in the header scripts! diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index d9051519b..2d31a6de6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -3066,7 +3066,9 @@ string slsDetectorCommand::cmdTrimEn(int narg, char *args[], int action){ npos = myDet->getTrimEn(opos); if (npos != -1) { for (int ip=0; ipgetPositions(opos); for (int ip=0; ipgetScanSteps(is, values); int p=myDet->getScanPrecision(is); char format[1000]; - sprintf(format, "%%s %%0.%df",p); + sprintf(format, " %%0.%df",p); for (int i=0; igetScanSteps(is, values); int p=myDet->getScanPrecision(is); char format[1000]; - sprintf(format, "%%s %%0.%df",p); - sprintf(answer,"%d ",ns); + sprintf(format, " %%0.%df",p); for (int i=0; ienableGapPixels(enable); } +int slsDetectorUsers::setFlippedDataX(int value) { + return myDetector->setFlippedData(slsDetectorDefs::X, value); +} + std::string slsDetectorUsers::setReceiverFramesDiscardPolicy(std::string f) { return myDetector->getReceiverFrameDiscardPolicy( myDetector->setReceiverFramesDiscardPolicy( diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index 8cc8ae7b9..54c192dff 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -553,6 +553,12 @@ class slsDetectorUsers */ int enableGapPixels(int enable=-1); + /** sets the enable which determines if data will be flipped across x axis + * @param value 0 or 1 to reset/set or -1 to get value + * @return enable flipped data across x axis + */ + int setFlippedDataX(int value=-1); + /** * Sets the frames discard policy in receiver * frame discard policy options: diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 8f575373c..dbd8bed3c 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -4361,11 +4361,11 @@ int set_all_trimbits(int file_des){ #ifdef VERBOSE printf("setting all trimbits to %d\n",arg); #endif - if(arg < -1){ + if(arg < -1 || arg > MAX_TRIMBITS_VALUE){ ret = FAIL; - strcpy(mess,"Cant set trimbits to this value\n"); + sprintf(mess,"Cant set all trimbits to %d. Range 0 - %d\n", arg, MAX_TRIMBITS_VALUE); cprintf(RED, "Warning: %s", mess); - }else { + } else { if(arg >= 0){ ret = setAllTrimbits(arg); //changes settings to undefined diff --git a/slsReceiverSoftware/include/ZmqSocket.h b/slsReceiverSoftware/include/ZmqSocket.h index 4addb0878..3618a0408 100644 --- a/slsReceiverSoftware/include/ZmqSocket.h +++ b/slsReceiverSoftware/include/ZmqSocket.h @@ -312,7 +312,7 @@ public: "\"quad\":%u" ;//"}\n"; - int length = sprintf(buf, jsonHeaderFormat, + sprintf(buf, jsonHeaderFormat, jsonversion, dynamicrange, fileIndex, ndetx, ndety, npixelsx, npixelsy, imageSize, acqIndex, fIndex, (fname == NULL)? "":fname, dummy?0:1, @@ -326,10 +326,11 @@ public: quadEnable ); if (additionalJsonHeader && strlen(additionalJsonHeader)) { - length = sprintf(buf, "%s, %s}\n", buf, additionalJsonHeader); - } else { - length = sprintf(buf, "%s}\n", buf); + strcat(buf, ", "); + strcat(buf, additionalJsonHeader); } + strcat(buf,"}\n"); + int length = strlen(buf); #ifdef VERBOSE if(!index) diff --git a/slsReceiverSoftware/include/receiver_defs.h b/slsReceiverSoftware/include/receiver_defs.h index e5a61d972..60bdcf877 100755 --- a/slsReceiverSoftware/include/receiver_defs.h +++ b/slsReceiverSoftware/include/receiver_defs.h @@ -21,7 +21,7 @@ #define FILE_BUFFER_SIZE (16*1024*1024) //16mb //fifo -#define FIFO_HEADER_NUMBYTES 4 +#define FIFO_HEADER_NUMBYTES 8 //hdf5 diff --git a/slsReceiverSoftware/src/Fifo.cpp b/slsReceiverSoftware/src/Fifo.cpp index a39be358a..8c4c9b93f 100644 --- a/slsReceiverSoftware/src/Fifo.cpp +++ b/slsReceiverSoftware/src/Fifo.cpp @@ -46,14 +46,14 @@ int Fifo::CreateFifos(uint32_t fifoItemSize) { fifoFree = new CircularFifo(fifoDepth); fifoStream = new CircularFifo(fifoDepth); //allocate memory - size_t mem_len = fifoItemSize * fifoDepth * sizeof(char); + size_t mem_len = (size_t)fifoItemSize * (size_t)fifoDepth * sizeof(char); memory = (char*) malloc (mem_len); if (memory == NULL){ FILE_LOG(logERROR) << "Could not allocate memory for fifos"; return FAIL; } memset(memory, 0, mem_len); - FILE_LOG(logDEBUG) << "Memory Allocated " << index << ": " << mem_len << " bytes"; + FILE_LOG(logDEBUG) << "Memory Allocated " << index << ": " << (double)mem_len/(double)(1024 * 1024) << " MB"; { //push free addresses into fifoFree fifo char* buffer = memory; diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index 2d75f15c6..c0f99c1d6 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -397,7 +397,9 @@ void UDPBaseImplementation::setMultiDetectorSize(const int* size) { numDet[i] = size[i]*2; else numDet[i] = size[i]; - sprintf(message,"%s%d",message,numDet[i]); + char cnum[20]=""; + sprintf(cnum, "%d", numDet[i]); + strcat(message, cnum); if (i < MAX_DIMENSIONS-1 ) strcat(message,","); } @@ -650,7 +652,7 @@ void UDPBaseImplementation::setSubPeriod(const uint64_t i){ FILE_LOG(logDEBUG) << __AT__ << " starting"; subPeriod = i; - FILE_LOG(logINFO) << "Sub Exposure Time: " << (double)subPeriod/(1E9) << "s"; + FILE_LOG(logINFO) << "Sub Period: " << (double)subPeriod/(1E9) << "s"; } int UDPBaseImplementation::setNumberOfFrames(const uint64_t i){ diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 9ea3bffff..6b7600983 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -119,7 +119,9 @@ void UDPStandardImplementation::setMultiDetectorSize(const int* size) { numDet[i] = size[i]*2; else numDet[i] = size[i]; - sprintf(message,"%s%d",message,numDet[i]); + char cnum[20]=""; + sprintf(cnum, "%d", numDet[i]); + strcat(message, cnum); if (i < MAX_DIMENSIONS-1 ) strcat(message,","); } @@ -834,7 +836,7 @@ int UDPStandardImplementation::SetupFifoStructure() { if(dataStreamer.size())dataStreamer[i]->SetFifo(fifo[i]); } - FILE_LOG(logINFO) << "Memory Allocated Per Fifo: " << ( ((generalData->imageSize) * numberofJobs + (generalData->fifoBufferHeaderSize)) * fifoDepth) << " bytes" ; + FILE_LOG(logINFO) << "Memory Allocated Per Fifo: " << (double)( ((generalData->imageSize) * numberofJobs + (generalData->fifoBufferHeaderSize)) * fifoDepth)/ (double)(1024 * 1024) << " MB" ; FILE_LOG(logINFO) << numThreads << " Fifo structure(s) reconstructed"; return OK; } diff --git a/slsReceiverSoftware/src/main.cpp b/slsReceiverSoftware/src/main.cpp index 2b2166d83..18d9ea933 100644 --- a/slsReceiverSoftware/src/main.cpp +++ b/slsReceiverSoftware/src/main.cpp @@ -16,12 +16,12 @@ #include //wait #include //usleep #include +#include - -bool keeprunning; +sem_t semaphore; void sigInterruptHandler(int p){ - keeprunning = false; + sem_post(&semaphore); } /* @@ -65,7 +65,7 @@ void GetData(char* metadata, char* datapointer, uint32_t datasize, void* p){ int main(int argc, char *argv[]) { - keeprunning = true; + sem_init(&semaphore,1,0); cprintf(BLUE,"Created [ Tid: %ld ]\n", (long)syscall(SYS_gettid)); // Catch signal SIGINT to close files and call destructors properly @@ -148,8 +148,8 @@ int main(int argc, char *argv[]) { FILE_LOG(logINFO) << "Ready ... "; cprintf(RESET, "\n[ Press \'Ctrl+c\' to exit ]\n"); - while(keeprunning) - pause(); + sem_wait(&semaphore); + sem_destroy(&semaphore); delete receiver; cprintf(BLUE,"Exiting [ Tid: %ld ]\n", (long)syscall(SYS_gettid)); diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 8f1626643..4617b9c55 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -542,7 +542,7 @@ int slsReceiverTCPIPInterface::set_port() { try { mySocket = new MySocketTCP(p_number); strcpy(mySock->lastClientIP,oldLastClientIP); - } catch(SamePortSocketException e) { + } catch(SamePortSocketException& e) { ret = FAIL; sprintf(mess, "Could not bind port %d. It is already set\n", p_number); FILE_LOG(logERROR) << mess; @@ -1039,6 +1039,7 @@ int slsReceiverTCPIPInterface::set_timer() { // else if (receiverBase->getStatus() != IDLE) // receiverNotIdle(); else { + uint64_t subdeadtime = 0; switch (index[0]) { case ACQUISITION_TIME: ret = receiverBase->setAcquisitionTime(index[1]); @@ -1052,7 +1053,9 @@ int slsReceiverTCPIPInterface::set_timer() { receiverBase->setNumberOfFrames(index[1]); break; case SUBFRAME_ACQUISITION_TIME: + subdeadtime = receiverBase->getSubPeriod() - receiverBase->getSubExpTime(); receiverBase->setSubExpTime(index[1]); + receiverBase->setSubPeriod(receiverBase->getSubExpTime() + subdeadtime); break; case SUBFRAME_DEADTIME: receiverBase->setSubPeriod(index[1] + receiverBase->getSubExpTime());