From 0c4b721e139875ca4014b73b28f1681e2bad0d06 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 3 Apr 2020 11:02:15 +0200 Subject: [PATCH] eiger server: transmitting (data) status --- RELEASE.txt | 12 +- serverBin/eigerDetectorServerv4.2.0.24.0 | 1 - serverBin/eigerDetectorServerv4.2.0.24.1 | 1 + slsDetectorSoftware/eigerDetectorServer/Beb.c | 184 ++++++++---------- slsDetectorSoftware/eigerDetectorServer/Beb.h | 2 +- .../bin/eigerDetectorServer_virtualMaster | Bin 98512 -> 98512 bytes .../bin/eigerDetectorServer_virtualSlave | Bin 98512 -> 98512 bytes ....0.24.0 => eigerDetectorServerv4.2.0.24.1} | Bin 310955 -> 310956 bytes .../eigerDetectorServer/gitInfo.txt | 12 +- .../eigerDetectorServer/gitInfoEiger.h | 10 +- .../slsDetectorFunctionList.c | 34 +++- 11 files changed, 125 insertions(+), 131 deletions(-) delete mode 120000 serverBin/eigerDetectorServerv4.2.0.24.0 create mode 120000 serverBin/eigerDetectorServerv4.2.0.24.1 rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv4.2.0.24.0 => eigerDetectorServerv4.2.0.24.1} (64%) diff --git a/RELEASE.txt b/RELEASE.txt index 403100d45..b691e3ea6 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -17,14 +17,15 @@ This document describes the differences between 4.2.0 and 4.1.1 releases. 1. Topics Concerning ==================== + - (Eiger) Additional status: Transmitting - (Eiger) Change in default vcal dac value - (Eiger) Deactivate a module - (Eiger) Setting all trimbits argument check - (Eiger client) Dynamic range change effect on clock divider - - (Eiger Receiver) Different rx_fifodepth defaults + - (Eiger) Different rx_fifodepth defaults + - (Receiver) performance (memory allocation and alignment, file buffering) - (Receiver) rx_fifodepth has a higher range - (Receiver) subperiod in master file - - (Receiver) performance (memory allocation and alignment, file buffering) - (Package) Removed warnings including memory overlap copy - (Users) Added setflippeddatax to users class - (Zmq) Client data streaming (Client data call back) @@ -57,6 +58,13 @@ This document describes the differences between 4.2.0 and 4.1.1 releases. to full speed, whereas dynamic range of 32 still changes the clock divider to quarter speed. + Detector Server (Eiger) + ----------------------- + 1. After acquiring, if the detector is still streaming out data, then the + status is Trasnmitting (command line: 'data'). Only after this process, + will it become idle. Previously, sls_detector_acquire waited for + end of data streaming before returning. It will continue to do so. + 3. Resolved Issues diff --git a/serverBin/eigerDetectorServerv4.2.0.24.0 b/serverBin/eigerDetectorServerv4.2.0.24.0 deleted file mode 120000 index eccd19372..000000000 --- a/serverBin/eigerDetectorServerv4.2.0.24.0 +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.2.0.24.0 \ No newline at end of file diff --git a/serverBin/eigerDetectorServerv4.2.0.24.1 b/serverBin/eigerDetectorServerv4.2.0.24.1 new file mode 120000 index 000000000..1ec86cbbf --- /dev/null +++ b/serverBin/eigerDetectorServerv4.2.0.24.1 @@ -0,0 +1 @@ +../slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.2.0.24.1 \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index 9319decf3..32c3775f7 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -180,131 +180,103 @@ void Beb_GetModuleConfiguration(int* master, int* top, int* normal){ } } - - -void Beb_EndofDataSend(int tengiga){ +int Beb_IsTransmitting(int* retval, int tengiga, int waitForDelay) { //mapping new memory - u_int32_t* csp0base=0; - int l_framepktLsbcounter, l_framepktMsbcounter, l_txndelaycounter, l_framedelaycounter; - int r_framepktLsbcounter, r_framepktMsbcounter, r_txndelaycounter, r_framedelaycounter; - int l_framepktLsbcounter_new, l_framepktMsbcounter_new, l_txndelaycounter_new, l_framedelaycounter_new; - int r_framepktLsbcounter_new, r_framepktMsbcounter_new, r_txndelaycounter_new, r_framedelaycounter_new; - int addr_l_framepktLsbcounter, addr_l_framepktMsbcounter, addr_l_txndelaycounter, addr_l_framedelaycounter; - int addr_r_framepktLsbcounter, addr_r_framepktMsbcounter, addr_r_txndelaycounter, addr_r_framedelaycounter; - - switch(tengiga){ - case 0: - addr_l_framepktLsbcounter = ONE_GIGA_LEFT_INDEX_LSB_COUNTER; - addr_l_framepktMsbcounter = ONE_GIGA_LEFT_INDEX_MSB_COUNTER; - addr_l_txndelaycounter = ONE_GIGA_LEFT_TXN_DELAY_COUNTER; - addr_l_framedelaycounter = ONE_GIGA_LEFT_FRAME_DELAY_COUNTER; - addr_r_framepktLsbcounter = ONE_GIGA_RIGHT_INDEX_LSB_COUNTER; - addr_r_framepktMsbcounter = ONE_GIGA_RIGHT_INDEX_MSB_COUNTER; - addr_r_txndelaycounter = ONE_GIGA_RIGHT_TXN_DELAY_COUNTER; - addr_r_framedelaycounter = ONE_GIGA_RIGHT_FRAME_DELAY_COUNTER; - break; - case 1: - addr_l_framepktLsbcounter = TEN_GIGA_LEFT_INDEX_LSB_COUNTER; - addr_l_framepktMsbcounter = TEN_GIGA_LEFT_INDEX_MSB_COUNTER; + u_int32_t* csp0base = 0; + int addr_l_txndelaycounter = 0, addr_l_framedelaycounter = 0; + int addr_r_txndelaycounter = 0, addr_r_framedelaycounter = 0; + int addr_l_framepktLsbcounter = 0, addr_l_framepktMsbcounter = 0; + int addr_r_framepktLsbcounter = 0, addr_r_framepktMsbcounter = 0; + if (tengiga) { addr_l_txndelaycounter = TEN_GIGA_LEFT_TXN_DELAY_COUNTER; addr_l_framedelaycounter = TEN_GIGA_LEFT_FRAME_DELAY_COUNTER; - addr_r_framepktLsbcounter = TEN_GIGA_RIGHT_INDEX_LSB_COUNTER; - addr_r_framepktMsbcounter = TEN_GIGA_RIGHT_INDEX_MSB_COUNTER; addr_r_txndelaycounter = TEN_GIGA_RIGHT_TXN_DELAY_COUNTER; addr_r_framedelaycounter = TEN_GIGA_RIGHT_FRAME_DELAY_COUNTER; - break; + addr_l_framepktLsbcounter = TEN_GIGA_LEFT_INDEX_LSB_COUNTER; + addr_l_framepktMsbcounter = TEN_GIGA_LEFT_INDEX_MSB_COUNTER; + addr_r_framepktLsbcounter = TEN_GIGA_RIGHT_INDEX_LSB_COUNTER; + addr_r_framepktMsbcounter = TEN_GIGA_RIGHT_INDEX_MSB_COUNTER; + } else { + addr_l_txndelaycounter = ONE_GIGA_LEFT_TXN_DELAY_COUNTER; + addr_l_framedelaycounter = ONE_GIGA_LEFT_FRAME_DELAY_COUNTER; + addr_r_txndelaycounter = ONE_GIGA_RIGHT_TXN_DELAY_COUNTER; + addr_r_framedelaycounter = ONE_GIGA_RIGHT_FRAME_DELAY_COUNTER; + addr_l_framepktLsbcounter = ONE_GIGA_LEFT_INDEX_LSB_COUNTER; + addr_l_framepktMsbcounter = ONE_GIGA_LEFT_INDEX_MSB_COUNTER; + addr_r_framepktLsbcounter = ONE_GIGA_RIGHT_INDEX_LSB_COUNTER; + addr_r_framepktMsbcounter = ONE_GIGA_RIGHT_INDEX_MSB_COUNTER; } - //open file pointer int fd = Beb_open(&csp0base,XPAR_COUNTER_BASEADDR); if(fd < 0){ - cprintf(BG_RED,"Delay read counter fail\n"); - return; - }else{ + cprintf(BG_RED,"Could not read Beb Delay read counter\n"); + return FAIL; + } else { //read data first time - l_framepktLsbcounter = Beb_Read32(csp0base, addr_l_framepktLsbcounter); - l_framepktMsbcounter = Beb_Read32(csp0base, addr_l_framepktMsbcounter); - l_txndelaycounter = Beb_Read32(csp0base, addr_l_txndelaycounter); - l_framedelaycounter = Beb_Read32(csp0base, addr_l_framedelaycounter); - r_framepktLsbcounter = Beb_Read32(csp0base, addr_r_framepktLsbcounter); - r_framepktMsbcounter = Beb_Read32(csp0base, addr_r_framepktMsbcounter); - r_txndelaycounter = Beb_Read32(csp0base, addr_r_txndelaycounter); - r_framedelaycounter = Beb_Read32(csp0base, addr_r_framedelaycounter); -//#ifdef VERBOSE - printf("\nLeft\n" - "FramepacketLsbcounter: %d\n" - "FramepacketMsbcounter: %d\n" - "Txndelaycounter:%d\n" - "Framedelaycounter:%d\n" - "\nRight\n" - "FramepacketLsbcounter: %d\n" - "FramepacketMsbcounter: %d\n" - "Txndelaycounter:%d\n" - "Framedelaycounter:%d\n\n", - l_framepktLsbcounter,l_framepktMsbcounter,l_txndelaycounter,l_framedelaycounter, - r_framepktLsbcounter,r_framepktMsbcounter,r_txndelaycounter,r_framedelaycounter); -//#endif - - //keep comparing with previous values - int maxtimer; - while(1){ - maxtimer = MAX(MAX(l_txndelaycounter,l_framedelaycounter),MAX(r_txndelaycounter,r_framedelaycounter)); - maxtimer /= 100; - printf("Will wait for %d us\n",maxtimer); - usleep(maxtimer); - - //read new values - l_framepktLsbcounter_new = Beb_Read32(csp0base, addr_l_framepktLsbcounter); - l_framepktMsbcounter_new = Beb_Read32(csp0base, addr_l_framepktMsbcounter); - l_txndelaycounter_new = Beb_Read32(csp0base, addr_l_txndelaycounter); - l_framedelaycounter_new = Beb_Read32(csp0base, addr_l_framedelaycounter); - r_framepktLsbcounter_new = Beb_Read32(csp0base, addr_r_framepktLsbcounter); - r_framepktMsbcounter_new = Beb_Read32(csp0base, addr_r_framepktMsbcounter); - r_txndelaycounter_new = Beb_Read32(csp0base, addr_r_txndelaycounter); - r_framedelaycounter_new = Beb_Read32(csp0base, addr_r_framedelaycounter); -//#ifdef VERBOSE - printf("\nLeft\n" - "FramepacketLsbcounter: %d\n" - "FramepacketMsbcounter: %d\n" - "Txndelaycounter:%d\n" - "Framedelaycounter:%d\n" - "\nRight\n" - "FramepacketLsbcounter: %d\n" - "FramepacketMsbcounter: %d\n" - "Txndelaycounter:%d\n" - "Framedelaycounter:%d\n\n", - l_framepktLsbcounter_new,l_framepktMsbcounter_new,l_txndelaycounter_new,l_framedelaycounter_new, - r_framepktLsbcounter_new,r_framepktMsbcounter_new,r_txndelaycounter_new,r_framedelaycounter_new); -//#endif - - if ((l_framepktLsbcounter == l_framepktLsbcounter_new) && - (l_framepktMsbcounter == l_framepktMsbcounter_new) && - (r_framepktLsbcounter == r_framepktLsbcounter_new) && - (r_framepktMsbcounter == r_framepktMsbcounter_new)) - break; - - //update old values - l_framepktLsbcounter = l_framepktLsbcounter_new; - l_framepktMsbcounter = l_framepktMsbcounter_new; - l_txndelaycounter = l_txndelaycounter_new; - l_framedelaycounter = l_framedelaycounter_new; - r_framepktLsbcounter = r_framepktLsbcounter_new; - r_framepktMsbcounter = r_framepktMsbcounter_new; - r_txndelaycounter = r_txndelaycounter_new; - r_framedelaycounter = r_framedelaycounter_new; - + int l_txndelaycounter = Beb_Read32(csp0base, addr_l_txndelaycounter); + int l_framedelaycounter = Beb_Read32(csp0base, addr_l_framedelaycounter); + int r_txndelaycounter = Beb_Read32(csp0base, addr_r_txndelaycounter); + int r_framedelaycounter = Beb_Read32(csp0base, addr_r_framedelaycounter); + int l_framepktLsbcounter = Beb_Read32(csp0base, addr_l_framepktLsbcounter); + int l_framepktMsbcounter = Beb_Read32(csp0base, addr_l_framepktMsbcounter); + int r_framepktLsbcounter = Beb_Read32(csp0base, addr_r_framepktLsbcounter); + int r_framepktMsbcounter = Beb_Read32(csp0base, addr_r_framepktMsbcounter); +#ifdef VERBOSE + printf("\nFirst Read:\n" + "\tLeft [Txndelaycounter:%d, Framedelaycounter:%d]\n" + "\tRight [Txndelaycounter:%d, Framedelaycounter:%d]\n", + "\tLeft [FramepacketLsbcounter:%d, FramepacketMsbcounter:%d]\n" + "\tRight [FramepacketLsbcounter:%d, FramepacketMsbcounter:%d]\n", + l_txndelaycounter,l_framedelaycounter, r_txndelaycounter,r_framedelaycounter, + l_framepktLsbcounter, l_framepktMsbcounter, r_framepktLsbcounter, r_framepktMsbcounter); +#endif + // wait for max counter delay + if (waitForDelay) { + int maxtimer = (MAX(MAX(l_txndelaycounter,l_framedelaycounter),MAX(r_txndelaycounter,r_framedelaycounter))) / 100; // counter values in 10 ns + printf("Will wait for %d us\n", maxtimer); + usleep (maxtimer); + } + // wait for 1 ms + else { + printf("Will wait for 1 ms\n"); + usleep (1 * 1000); } - printf("Detector has send all data\n"); + // read values again + int l_txndelaycounter2 = Beb_Read32(csp0base, addr_l_txndelaycounter); + int l_framedelaycounter2 = Beb_Read32(csp0base, addr_l_framedelaycounter); + int r_txndelaycounter2 = Beb_Read32(csp0base, addr_r_txndelaycounter); + int r_framedelaycounter2 = Beb_Read32(csp0base, addr_r_framedelaycounter); + int l_framepktLsbcounter2 = Beb_Read32(csp0base, addr_l_framepktLsbcounter); + int l_framepktMsbcounter2 = Beb_Read32(csp0base, addr_l_framepktMsbcounter); + int r_framepktLsbcounter2 = Beb_Read32(csp0base, addr_r_framepktLsbcounter); + int r_framepktMsbcounter2 = Beb_Read32(csp0base, addr_r_framepktMsbcounter); +#ifdef VERBOSE + printf("\nSecond Read:\n" + "\tLeft [Txndelaycounter:%d, Framedelaycounter:%d]\n" + "\tRight [Txndelaycounter:%d, Framedelaycounter:%d]\n", + "\tLeft [FramepacketLsbcounter:%d, FramepacketMsbcounter:%d]\n" + "\tRight [FramepacketLsbcounter:%d, FramepacketMsbcounter:%d]\n", + l_txndelaycounter2,l_framedelaycounter2, r_txndelaycounter2,r_framedelaycounter2, + l_framepktLsbcounter2, l_framepktMsbcounter2, r_framepktLsbcounter2, r_framepktMsbcounter2); +#endif + // any change in values, it is still transmitting + if (l_txndelaycounter != l_txndelaycounter2 || l_framedelaycounter != l_framedelaycounter2 || + r_txndelaycounter != r_txndelaycounter2 || r_framedelaycounter != r_framedelaycounter2 || + l_framepktLsbcounter != l_framepktLsbcounter2 || l_framepktMsbcounter != l_framepktMsbcounter2 || + r_framepktLsbcounter != r_framepktLsbcounter2 || r_framepktMsbcounter != r_framepktMsbcounter2) { + *retval = 1; + } else { + *retval = 0; + } //close file pointer Beb_close(fd,csp0base); } + return OK; } - - /* do not work at the moment */ int Beb_SetMasterViaSoftware(){ diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.h b/slsDetectorSoftware/eigerDetectorServer/Beb.h index 1fae132b7..69e63b2d9 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.h +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.h @@ -46,7 +46,7 @@ struct BebInfo{ void Beb_GetModuleConfiguration(int* master, int* top, int* normal); - void Beb_EndofDataSend(int tengiga); + int Beb_IsTransmitting(int* retval, int tengiga, int waitForDelay); int Beb_SetMasterViaSoftware(); int Beb_SetSlaveViaSoftware(); diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster index d19dac346dd28c5e66ab67bb064897f0f0b4c5f6..62616b96310c901c2b4e87307763c2d59292d9a2 100755 GIT binary patch delta 43 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 delta 32007 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 YSv=>3d6D?O>PdWTWj$A-|JvdI1Ba$N3;+NC diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt index 8d7c4e74e..708cb6d47 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: 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 +Repsitory UUID: fae884e65851d15bd0ca541956b3263cf79bc1b2 +Revision: 362 +Branch: 4.2.0-rc +Last Changed Author: Dhanya_Thattil +Last Changed Rev: 4166 +Last Changed Date: 2020-04-03 10:42:36.000000001 +0200 ./Beb.h diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h index 3bfcd5294..bcc57e402 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 "9649982932b2db75b9bf720ce4a13e7cdb059430" -#define GITAUTH "Gemma_Tinti" -#define GITREV 0x4157 -#define GITDATE 0x20200309 -#define GITBRANCH "4.1.2-rc" +#define GITREPUUID "fae884e65851d15bd0ca541956b3263cf79bc1b2" +#define GITAUTH "Dhanya_Thattil" +#define GITREV 0x4166 +#define GITDATE 0x20200403 +#define GITBRANCH "4.2.0-rc" diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index be664eea3..c67d5564c 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -1737,19 +1737,23 @@ enum runStatus getRunStatus(){ #else int i = Feb_Control_AcquisitionInProgress(); - switch (i) { - case STATUS_ERROR: + if (i == STATUS_ERROR) { printf("Status: ERROR reading status register\n"); return ERROR; - case STATUS_IDLE: + } else if (i == STATUS_IDLE) { + int isTransmitting = 0; + if (Beb_IsTransmitting(&isTransmitting, send_to_ten_gig, 0) == FAIL) { + return ERROR; + } + if (isTransmitting) { + printf("Status: TRANSMITTING\n"); + return TRANSMITTING; + } printf("Status: IDLE\n"); return IDLE; - default: - printf("Status: RUNNING...\n"); - return RUNNING; } - - return IDLE; + printf("Status: RUNNING...\n"); + return RUNNING; #endif } @@ -1783,8 +1787,18 @@ void readFrame(int *ret, char *mess){ } //wait for detector to send - Beb_EndofDataSend(send_to_ten_gig); - + int isTransmitting = 1; + while (isTransmitting) { + if (Beb_IsTransmitting(&isTransmitting, send_to_ten_gig, 1) == FAIL) { + strcpy(mess,"Could not read delay counters\n"); + *ret = (int)FAIL; + return; + } + if (isTransmitting) { + printf("Transmitting...\n"); + } + } + printf("Detector has sent all data\n"); printf("*****Done Waiting...\n"); *ret = (int)FINISHED;