From d112956f7928812108ed90e547759fcceb2b7b5d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 10 Mar 2020 09:25:41 +0100 Subject: [PATCH] eiger server: vcal=0, rx_fifodepth to greater than 32 bit, trimval argument range check, activate to both control and stop server, end of eiger server (if detectorip normal) set activate to 1 (for future eiger firmware), added setflippeddatax to users, removing warnings and check of detector size before accessing detector[0], updating subexptime also updated subperiod in master file, remove keeprunning in rxr that keeps it busy to semaphore --- RELEASE.txt | 47 +++++++++--------- manual/manual-api/mainReceiver.cpp | 17 ++++--- slsDetectorGui/include/qDefs.h | 20 +++++--- .../bin/eigerDetectorServer_virtualMaster | Bin 98512 -> 98512 bytes .../bin/eigerDetectorServer_virtualSlave | Bin 98512 -> 98512 bytes ....0.24.5 => eigerDetectorServerv4.2.0.24.0} | Bin 310955 -> 310955 bytes .../eigerDetectorServer/gitInfo.txt | 12 ++--- .../eigerDetectorServer/gitInfoEiger.h | 10 ++-- .../slsDetectorFunctionList.c | 24 ++++++++- .../slsDetectorServer_defs.h | 3 +- .../multiSlsDetector/multiSlsDetector.cpp | 44 ++++++++-------- .../slsDetector/slsDetector.cpp | 27 ++++++++-- .../slsDetector/slsDetectorActions.cpp | 8 +++ .../slsDetector/slsDetectorCommand.cpp | 23 ++++++--- .../slsDetector/slsDetectorUsers.cpp | 4 ++ .../slsDetector/slsDetectorUsers.h | 6 +++ .../slsDetectorServer_funcs.c | 6 +-- slsReceiverSoftware/include/ZmqSocket.h | 9 ++-- slsReceiverSoftware/include/receiver_defs.h | 2 +- slsReceiverSoftware/src/Fifo.cpp | 4 +- .../src/UDPBaseImplementation.cpp | 6 ++- .../src/UDPStandardImplementation.cpp | 6 ++- slsReceiverSoftware/src/main.cpp | 12 ++--- .../src/slsReceiverTCPIPInterface.cpp | 5 +- 24 files changed, 190 insertions(+), 105 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv4.1.0.24.5 => eigerDetectorServerv4.2.0.24.0} (71%) 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 41dbf1b825108a695c03f4b57740a5970ba41605..d19dac346dd28c5e66ab67bb064897f0f0b4c5f6 100755 GIT binary patch delta 19337 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 delta 19635 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�=?J;EN9ff+;rey)l%!m&f32kEQpa0-*hsk-jv9+c%5&t`_?3~et9#TrRXfX~ z?Sa`x+FiJ;Lw5T+YW5;a_8?34Xda-0k#N2RT5#YHQtl3yRAsT!pukm&@(J!eO74w8 zF<}(kjNs=9UgANcQ9=4ewG8e^;N=FCHzA)Hr|3PmGp(xljC|w%TKhS_YTL z$i3Y?@d}83HEwprK2KK0@KMOtbTaW}W8@`r0e>_`-Yj3_8Drt~B)(&;Jks6umRc4Y zn)tmgylx@g=TDI>ALl{iU_$c=PZ}qWkf-qDL#%YL zatqgfs=wiF-f=wKr~g@leqw_IYH;45d>mrN%X2(VRR&V7M5hz_jkHAPd6(ZqaZK=* zp=iKR9ux|{IiD5^$MSd{QtrQ4IxvB@IsAUJn4ZC}Pl^lyW)4o!hgr}Cc(%detZ(T!TB!# zWs-bS{)iu%j23yuZ%;-yboick43l4x6ZzsWEFXS+M;Hdh4ohs)EEY$ihsiAyFAIak zGyG{72JOAK14Vv}rTw@?t1n+XMV_N+eD2uQDe`vNo&IMN`iZxPz}7fEkhPOMBOESZ zxLgRw_^9SBr^!p*oh{?FW>7t~XeaW#Y3P*@%c#c&D1NRO{$#A0UzvucistUqF}sHF z^yx?qjnO3x_r|;^j@GSGDtje`$U6L(Z6}w3`F%ae>ww2r}1es<%4n;F3&>I zPkF#BpMD~KY_iT7d|2+)-=31I(vL!oR6%=g1$*m{J4vD7)uahF)$YYdnA8 z>*r#W-{r^WVrs4B0rQX>dn|pP+}|DdizBbfy_?*(H0XU^@v7XvRh1=K^@Cbfl^=g$ eh1{!&^?x1XF)QT$j@2$fA|ET}J1gX_4*v(ng~jFo diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave index 3fb5134c02b71fed7b44d8af0ba9e7a6e7e9fc4e..3b1610308363dd2cb7d61ebde2e451e0b3a59a78 100755 GIT binary patch delta 19337 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 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());