From 172fa66b1f64dca73de99cc088a36f4eb2af0ef1 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 18 Aug 2016 11:57:36 +0200 Subject: [PATCH 01/41] hotfix for memory leak in server --- slsDetectorSoftware/eigerDetectorServer/Beb.c | 243 +++++++++--------- slsDetectorSoftware/eigerDetectorServer/Beb.h | 9 +- .../eigerDetectorServer/FebRegisterDefs.h | 1 + ...eigerDetectorServerv2.0.5.14.0.1-beamline} | Bin 277374 -> 277442 bytes .../slsDetectorServer_funcs.c | 7 +- 5 files changed, 126 insertions(+), 134 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv2.0.5.14.0 => eigerDetectorServerv2.0.5.14.0.1-beamline} (59%) diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index 106e72730b..a2a8824d6b 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -44,7 +44,7 @@ unsigned int* Beb_recv_data; short Beb_bit_mode; - + int BEB_MMAP_SIZE = 0x1000; void BebInfo_BebInfo(struct BebInfo* bebInfo, unsigned int beb_num){ @@ -144,20 +144,19 @@ void Beb_Beb(){ } - void Beb_GetModuleCopnfiguration(int* master, int* top){ *top = 0; *master = 0; //mapping new memory to read master top module configuration - u_int32_t baseaddr; + u_int32_t* csp0base=0; int ret; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0){ cprintf(BG_RED,"Module Configuration FAIL\n"); }else{ //read data - ret = Beb_Read32(baseaddr, MODULE_CONFIGURATION_MASK); + ret = Beb_Read32(csp0base, MODULE_CONFIGURATION_MASK); printf("Module Configuration OK\n"); printf("Beb: value =0x%x\n",ret); if(ret&TOP_BIT_MASK) @@ -165,24 +164,25 @@ void Beb_GetModuleCopnfiguration(int* master, int* top){ if(ret&MASTER_BIT_MASK) *master = 1; //close file pointer - Beb_close(fd); + Beb_close(fd,csp0base); } } /* do not work at the moment */ int Beb_SetMasterViaSoftware(){ //mapping new memory - u_int32_t baseaddr, value = 0, ret = 1; + u_int32_t* csp0base=0; + u_int32_t value = 0, ret = 1; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0) cprintf(BG_RED,"Set Master FAIL\n"); else{ - value = Beb_Read32(baseaddr, MASTERCONFIG_OFFSET); + value = Beb_Read32(csp0base, MASTERCONFIG_OFFSET); value|=MASTER_BIT; value|=OVERWRITE_HARDWARE_BIT; - int newval = Beb_Write32(baseaddr, MASTERCONFIG_OFFSET,value); + int newval = Beb_Write32(csp0base, MASTERCONFIG_OFFSET,value); if(newval!=value) cprintf(BG_RED,"Could not set Master via Software\n"); else @@ -191,7 +191,7 @@ int Beb_SetMasterViaSoftware(){ //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return ret; } @@ -199,17 +199,18 @@ int Beb_SetMasterViaSoftware(){ /* do not work at the moment */ int Beb_SetSlaveViaSoftware(){ //mapping new memory - u_int32_t baseaddr, value = 0, ret = 1; + u_int32_t* csp0base=0; + u_int32_t value = 0, ret = 1; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0) cprintf(BG_RED,"Set Slave FAIL\n"); else{ - value = Beb_Read32(baseaddr, MASTERCONFIG_OFFSET); + value = Beb_Read32(csp0base, MASTERCONFIG_OFFSET); value&=~MASTER_BIT; value|=OVERWRITE_HARDWARE_BIT; - int newval = Beb_Write32(baseaddr, MASTERCONFIG_OFFSET,value); + int newval = Beb_Write32(csp0base, MASTERCONFIG_OFFSET,value); if(newval!=value) cprintf(BG_RED,"Could not set Slave via Software\n"); else @@ -218,29 +219,30 @@ int Beb_SetSlaveViaSoftware(){ //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return ret; } int Beb_Activate(int enable){ //mapping new memory - u_int32_t baseaddr, value = 0, ret = -1; + u_int32_t* csp0base=0; + u_int32_t value = 0, ret = -1; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0) cprintf(BG_RED,"Deactivate FAIL\n"); else{ if(enable > -1){ - value = Beb_Read32(baseaddr, MASTERCONFIG_OFFSET); + value = Beb_Read32(csp0base, MASTERCONFIG_OFFSET); printf("Deactivate register value before:%d\n",value); if(enable) value&=~DEACTIVATE_BIT; else value|=DEACTIVATE_BIT; - int newval = Beb_Write32(baseaddr, MASTERCONFIG_OFFSET,value); + int newval = Beb_Write32(csp0base, MASTERCONFIG_OFFSET,value); if(newval!=value){ if(enable) cprintf(BG_RED,"Could not activate via Software\n"); @@ -249,7 +251,7 @@ int Beb_Activate(int enable){ } } - value = Beb_Read32(baseaddr, MASTERCONFIG_OFFSET); + value = Beb_Read32(csp0base, MASTERCONFIG_OFFSET); if(value&DEACTIVATE_BIT) ret = 0; else ret = 1; if(enable == -1){ @@ -262,7 +264,7 @@ int Beb_Activate(int enable){ } //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return ret; } @@ -270,7 +272,8 @@ int Beb_Activate(int enable){ int Beb_SetNetworkParameter(enum detNetworkParameter mode, int val){ //mapping new memory - u_int32_t baseaddr, valueread = 0; + u_int32_t* csp0base=0; + u_int32_t valueread = 0; u_int32_t offset = TXM_DELAY_LEFT_OFFSET; char modename[100] = ""; @@ -295,40 +298,40 @@ int Beb_SetNetworkParameter(enum detNetworkParameter mode, int val){ default: cprintf(BG_RED,"Unrecognized mode in network parameter: %d\n",mode); return -1; } //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0){ cprintf(BG_RED,"Could not read register to set network parameter. FAIL\n"); return -1; } else{ if(val > -1){ - valueread = Beb_Read32(baseaddr, offset); + valueread = Beb_Read32(csp0base, offset); //cprintf(BLUE, "%s value before:%d\n",modename,valueread); - Beb_Write32(baseaddr, offset,val); + Beb_Write32(csp0base, offset,val); cprintf(BLUE,"%s value:%d\n", modename,valueread); } - valueread = Beb_Read32(baseaddr, offset); + valueread = Beb_Read32(csp0base, offset); //cprintf(BLUE,"%s value:%d\n", modename,valueread); } //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return valueread; } - int Beb_ResetToHardwareSettings(){ //mapping new memory - u_int32_t baseaddr, value = 0, ret = 1; + u_int32_t* csp0base=0; + u_int32_t value = 0, ret = 1; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0) cprintf(BG_RED,"Reset to Hardware Settings FAIL\n"); else{ - value = Beb_Write32(baseaddr, MASTERCONFIG_OFFSET,0); + value = Beb_Write32(csp0base, MASTERCONFIG_OFFSET,0); if(value) cprintf(BG_RED,"Could not reset to hardware settings\n"); else @@ -337,7 +340,7 @@ int Beb_ResetToHardwareSettings(){ //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return ret; } @@ -346,21 +349,22 @@ int Beb_ResetToHardwareSettings(){ u_int32_t Beb_GetFirmwareRevision(){ //mapping new memory - u_int32_t baseaddr, value = 0; + u_int32_t* csp0base=0; + u_int32_t value = 0; //open file pointer - int fd = Beb_open(XPAR_VERSION,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_VERSION); if(fd < 0) cprintf(BG_RED,"Firmware Revision Read FAIL\n"); else{ - value = Beb_Read32(baseaddr, FIRMWARE_VERSION_OFFSET); + value = Beb_Read32(csp0base, FIRMWARE_VERSION_OFFSET); if(!value) cprintf(BG_RED,"Firmware Revision Number does not exist in this version\n"); } //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return value; } @@ -368,41 +372,42 @@ u_int32_t Beb_GetFirmwareRevision(){ u_int32_t Beb_GetFirmwareSoftwareAPIVersion(){ //mapping new memory - u_int32_t baseaddr, value = 0; + u_int32_t* csp0base=0; + u_int32_t value = 0; //open file pointer - int fd = Beb_open(XPAR_VERSION,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_VERSION); if(fd < 0) cprintf(BG_RED,"Firmware Software API Version Read FAIL\n"); else{ - value = Beb_Read32(baseaddr, FIRMWARESOFTWARE_API_OFFSET); + value = Beb_Read32(csp0base, FIRMWARESOFTWARE_API_OFFSET); if(!value) cprintf(BG_RED,"Firmware Software API Version does not exist in this version\n"); } //close file pointer if(fd > 0) - Beb_close(fd); + Beb_close(fd,csp0base); return value; } void Beb_ResetFrameNumber(){ //mapping new memory to read master top module configuration - u_int32_t baseaddr; + u_int32_t* csp0base=0; //open file pointer - int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_PLB_GPIO_SYS_BASEADDR); if(fd < 0){ cprintf(BG_RED,"Reset Frame Number FAIL\n"); }else{ //write a 1 - Beb_Write32(baseaddr, FRAME_NUM_RESET_OFFSET, 1); + Beb_Write32(csp0base, FRAME_NUM_RESET_OFFSET, 1); usleep(100000); //100ms //write a 0 - Beb_Write32(baseaddr, FRAME_NUM_RESET_OFFSET, 0); + Beb_Write32(csp0base, FRAME_NUM_RESET_OFFSET, 0); printf("Frame Number Reset OK\n"); //close file pointer - Beb_close(fd); + Beb_close(fd,csp0base); } } @@ -583,8 +588,7 @@ int Beb_SetByteOrder(){ int Beb_SetUpUDPHeader(unsigned int beb_number, int ten_gig, unsigned int header_number, char* dst_mac, char* dst_ip, unsigned int dst_port){ u_int32_t bram_phy_addr; - volatile u_int32_t* bram_ptr; - bram_ptr = NULL; + u_int32_t* csp0base=0; if (ten_gig) bram_phy_addr = 0xC6002000; else @@ -592,29 +596,22 @@ int Beb_SetUpUDPHeader(unsigned int beb_number, int ten_gig, unsigned int header if(!Beb_SetHeaderData(beb_number,ten_gig,dst_mac,dst_ip,dst_port)) return 0; - int fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) - cprintf(BG_RED,"\nCan't find /dev/mem!\n"); - else{ -#ifdef VERBOSE - printf("/dev/mem opened\n"); -#endif - bram_ptr = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, bram_phy_addr); - if (bram_ptr == MAP_FAILED) { - cprintf(BG_RED,"\nCan't map memmory area!!\n"); - fd = -1; - } -#ifdef VERBOSE - else printf("CSP0 mapped\n"); -#endif - } - memcpy(bram_ptr+header_number*16, &udp_header, sizeof(udp_header)); - close(fd); + + int fd = Beb_open(&csp0base,bram_phy_addr); + if(fd < 0){ + cprintf(BG_RED,"Set up UDP Header FAIL\n"); + }else{ + //read data + memcpy(csp0base+header_number*16, &udp_header, sizeof(udp_header)); + //close file pointer + Beb_close(fd,csp0base); + } return 1; } + //int Beb_SetUpUDPHeader(unsigned int beb_number, int ten_gig, unsigned int header_number, char* dst_mac, char* dst_ip, unsigned int dst_port){ // unsigned int i = 1;/*Beb_GetBebInfoIndex(beb_number);*/ // @@ -814,27 +811,27 @@ int Beb_SetUpTransferParameters(short the_bit_mode){ int Beb_StopAcquisition() { - u_int32_t baseaddr; + u_int32_t* csp0base=0; volatile u_int32_t valuel,valuer; //open file pointer - int fd = Beb_open(XPAR_CMD_GENERATOR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_CMD_GENERATOR); if(fd < 0){ cprintf(BG_RED,"Beb Stop Acquisition FAIL\n"); return 0; }else{ //find value - valuel = Beb_Read32(baseaddr, (LEFT_OFFSET+STOP_ACQ_OFFSET)); - valuer = Beb_Read32(baseaddr, (RIGHT_OFFSET+STOP_ACQ_OFFSET)); + valuel = Beb_Read32(csp0base, (LEFT_OFFSET+STOP_ACQ_OFFSET)); + valuer = Beb_Read32(csp0base, (RIGHT_OFFSET+STOP_ACQ_OFFSET)); //high - Beb_Write32(baseaddr, (LEFT_OFFSET + STOP_ACQ_OFFSET),(valuel|STOP_ACQ_BIT)); - Beb_Write32(baseaddr, (RIGHT_OFFSET + STOP_ACQ_OFFSET),(valuer|STOP_ACQ_BIT)); + Beb_Write32(csp0base, (LEFT_OFFSET + STOP_ACQ_OFFSET),(valuel|STOP_ACQ_BIT)); + Beb_Write32(csp0base, (RIGHT_OFFSET + STOP_ACQ_OFFSET),(valuer|STOP_ACQ_BIT)); //low - Beb_Write32(baseaddr, (LEFT_OFFSET + STOP_ACQ_OFFSET),(valuel&(~STOP_ACQ_BIT))); - Beb_Write32(baseaddr, (RIGHT_OFFSET + STOP_ACQ_OFFSET),(valuer&(~STOP_ACQ_BIT))); + Beb_Write32(csp0base, (LEFT_OFFSET + STOP_ACQ_OFFSET),(valuel&(~STOP_ACQ_BIT))); + Beb_Write32(csp0base, (RIGHT_OFFSET + STOP_ACQ_OFFSET),(valuer&(~STOP_ACQ_BIT))); printf("Beb Stop Acquisition OK\n"); //close file pointer - Beb_close(fd); + Beb_close(fd,csp0base); } return 1; } @@ -889,10 +886,10 @@ int Beb_RequestNImages(unsigned int beb_number, int ten_gig, unsigned int dst_nu u_int32_t right_port_value = 0x2000; - u_int32_t baseaddr; + u_int32_t* csp0base=0; volatile u_int32_t value; //open file pointer - int fd = Beb_open(XPAR_CMD_GENERATOR,&baseaddr); + int fd = Beb_open(&csp0base,XPAR_CMD_GENERATOR); if(fd < 0){ cprintf(BG_RED,"Beb Request N Images FAIL\n"); return 0; @@ -915,27 +912,27 @@ int Beb_RequestNImages(unsigned int beb_number, int ten_gig, unsigned int dst_nu //"0x20 << 8" is dst_number (0x00 for left, 0x20 for right) //Left - Beb_Write32(baseaddr, (LEFT_OFFSET + FIRST_CMD_PART1_OFFSET),0); - Beb_Write32(baseaddr, (LEFT_OFFSET + FIRST_CMD_PART2_OFFSET),send_header_command); - Beb_Write32(baseaddr, (LEFT_OFFSET + SECOND_CMD_PART1_OFFSET),0); - Beb_Write32(baseaddr, (LEFT_OFFSET + SECOND_CMD_PART2_OFFSET),send_frame_command); - value = Beb_Read32(baseaddr,(LEFT_OFFSET + TWO_REQUESTS_OFFSET)); - if(in_two_requests) Beb_Write32(baseaddr, (LEFT_OFFSET + TWO_REQUESTS_OFFSET),(value | TWO_REQUESTS_BIT)); - else Beb_Write32(baseaddr, (LEFT_OFFSET + TWO_REQUESTS_OFFSET),(value &~(TWO_REQUESTS_BIT))); + Beb_Write32(csp0base, (LEFT_OFFSET + FIRST_CMD_PART1_OFFSET),0); + Beb_Write32(csp0base, (LEFT_OFFSET + FIRST_CMD_PART2_OFFSET),send_header_command); + Beb_Write32(csp0base, (LEFT_OFFSET + SECOND_CMD_PART1_OFFSET),0); + Beb_Write32(csp0base, (LEFT_OFFSET + SECOND_CMD_PART2_OFFSET),send_frame_command); + value = Beb_Read32(csp0base,(LEFT_OFFSET + TWO_REQUESTS_OFFSET)); + if(in_two_requests) Beb_Write32(csp0base, (LEFT_OFFSET + TWO_REQUESTS_OFFSET),(value | TWO_REQUESTS_BIT)); + else Beb_Write32(csp0base, (LEFT_OFFSET + TWO_REQUESTS_OFFSET),(value &~(TWO_REQUESTS_BIT))); // Right - Beb_Write32(baseaddr, (RIGHT_OFFSET + FIRST_CMD_PART1_OFFSET),0); - Beb_Write32(baseaddr, (RIGHT_OFFSET + FIRST_CMD_PART2_OFFSET),send_header_command | right_port_value); - Beb_Write32(baseaddr, (RIGHT_OFFSET + SECOND_CMD_PART1_OFFSET),0); - Beb_Write32(baseaddr, (RIGHT_OFFSET + SECOND_CMD_PART2_OFFSET),send_frame_command | right_port_value); - value = Beb_Read32(baseaddr,(RIGHT_OFFSET + TWO_REQUESTS_OFFSET)); - if(in_two_requests) Beb_Write32(baseaddr, (RIGHT_OFFSET + TWO_REQUESTS_OFFSET),(value | TWO_REQUESTS_BIT)); - else Beb_Write32(baseaddr, (RIGHT_OFFSET + TWO_REQUESTS_OFFSET),(value &~(TWO_REQUESTS_BIT))); + Beb_Write32(csp0base, (RIGHT_OFFSET + FIRST_CMD_PART1_OFFSET),0); + Beb_Write32(csp0base, (RIGHT_OFFSET + FIRST_CMD_PART2_OFFSET),send_header_command | right_port_value); + Beb_Write32(csp0base, (RIGHT_OFFSET + SECOND_CMD_PART1_OFFSET),0); + Beb_Write32(csp0base, (RIGHT_OFFSET + SECOND_CMD_PART2_OFFSET),send_frame_command | right_port_value); + value = Beb_Read32(csp0base,(RIGHT_OFFSET + TWO_REQUESTS_OFFSET)); + if(in_two_requests) Beb_Write32(csp0base, (RIGHT_OFFSET + TWO_REQUESTS_OFFSET),(value | TWO_REQUESTS_BIT)); + else Beb_Write32(csp0base, (RIGHT_OFFSET + TWO_REQUESTS_OFFSET),(value &~(TWO_REQUESTS_BIT))); // Set number of frames - Beb_Write32(baseaddr, (LEFT_OFFSET + COMMAND_COUNTER_OFFSET), nimages*(2+in_two_requests)); - Beb_Write32(baseaddr, (RIGHT_OFFSET + COMMAND_COUNTER_OFFSET), nimages*(2+in_two_requests)); + Beb_Write32(csp0base, (LEFT_OFFSET + COMMAND_COUNTER_OFFSET), nimages*(2+in_two_requests)); + Beb_Write32(csp0base, (RIGHT_OFFSET + COMMAND_COUNTER_OFFSET), nimages*(2+in_two_requests)); #ifdef MARTIN for (i=0; i < 10; i++) @@ -943,7 +940,7 @@ int Beb_RequestNImages(unsigned int beb_number, int ten_gig, unsigned int dst_nu printf("%d\n",in_two_requests); #endif - Beb_close(fd); + Beb_close(fd,csp0base); #ifdef MARTIN printf("----Beb_RequestNImages----\n"); @@ -991,31 +988,22 @@ int Beb_Test(unsigned int beb_number){ // Temperature value is cropped and not well rounded int Beb_GetBebFPGATemp() { - int temperature=0; - volatile u_int32_t *ptr1; - int fd; - - fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) - { - printf("\nCan't find /dev/mem!\n"); - return 0; - } - - u_int32_t CSP0BASE = (u_int32_t)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, XPAR_SYSMON_0_BASEADDR ); - if (CSP0BASE == (u_int32_t)MAP_FAILED) - { - printf("\nCan't map memmory area!!\n"); - return 0; + u_int32_t* csp0base=0; + int temperature=0; + int ret; + //open file pointer + int fd = Beb_open(&csp0base,XPAR_SYSMON_0_BASEADDR); + if(fd < 0){ + cprintf(BG_RED,"Module Configuration FAIL\n"); + }else{ + //read data + ret = Beb_Read32(csp0base, FPGA_TEMP_OFFSET); + temperature = ((((float)(ret)/65536.0f)/0.00198421639f ) - 273.15f); // Static conversation, copied from xps sysmon standalone driver + //close file pointer + Beb_close(fd,csp0base); } - ptr1=(u_int32_t*)(CSP0BASE + 0x200); // temperature register in xps sysmon core is at 0x200 - close(fd); - - temperature = ((((float)(*ptr1)/65536.0f)/0.00198421639f ) - 273.15f); // Static conversation, copied from xps sysmon standalone driver - - return temperature; } @@ -1023,7 +1011,7 @@ int Beb_GetBebFPGATemp() -int Beb_open(u_int32_t baseaddr, u_int32_t* csp0base){ +int Beb_open(u_int32_t** csp0base, u_int32_t offset){ int fd = open("/dev/mem", O_RDWR | O_SYNC, 0); if (fd == -1) @@ -1032,33 +1020,34 @@ int Beb_open(u_int32_t baseaddr, u_int32_t* csp0base){ #ifdef VERBOSE printf("/dev/mem opened\n"); #endif - *csp0base = (u_int32_t)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, baseaddr); - if (*csp0base == (u_int32_t)MAP_FAILED) { + *csp0base = (u_int32_t*)mmap(0, BEB_MMAP_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, offset); + if (*csp0base == MAP_FAILED) { cprintf(BG_RED,"\nCan't map memmory area!!\n"); fd = -1; } #ifdef VERBOSE - else printf("CSP0 mapped\n"); + else printf("CSP0 mapped %p\n",(void*)*csp0base); #endif } return fd; } -u_int32_t Beb_Read32 (u_int32_t baseaddr, u_int32_t offset){ - volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(baseaddr + offset); - return *ptr1; +u_int32_t Beb_Read32 (u_int32_t* baseaddr, u_int32_t offset){ + volatile u_int32_t value; + value=* (u_int32_t*)(baseaddr + offset/(sizeof(u_int32_t))); + return value; } -u_int32_t Beb_Write32 (u_int32_t baseaddr, u_int32_t offset, u_int32_t data){ +u_int32_t Beb_Write32 (u_int32_t* baseaddr, u_int32_t offset, u_int32_t data){ volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(baseaddr + offset); + ptr1=(u_int32_t*)(baseaddr + offset/(sizeof(u_int32_t))); *ptr1 = data; return *ptr1; } -void Beb_close(int fd){ +void Beb_close(int fd,u_int32_t* csp0base){ if(fd >= 0) close(fd); + munmap(csp0base,BEB_MMAP_SIZE); } diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.h b/slsDetectorSoftware/eigerDetectorServer/Beb.h index e5ddedeb08..1c8efa5188 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.h +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.h @@ -88,10 +88,11 @@ struct BebInfo{ int Beb_GetBebFPGATemp(); - int Beb_open(u_int32_t baseaddr, u_int32_t* csp0base); - u_int32_t Beb_Read32 (u_int32_t baseaddr, u_int32_t offset); - u_int32_t Beb_Write32 (u_int32_t baseaddr, u_int32_t offset, u_int32_t data); - void Beb_close(int fd); + int Beb_open(u_int32_t** csp0base, u_int32_t offset); + u_int32_t Beb_Read32 (u_int32_t* baseaddr, u_int32_t offset); + u_int32_t Beb_Write32 (u_int32_t* baseaddr, u_int32_t offset, u_int32_t data); + void Beb_close(int fd,u_int32_t* csp0base); + #endif diff --git a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h index f1cc52140a..7bfd919ff9 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h @@ -121,6 +121,7 @@ #define MASTER_BIT 0x1 #define OVERWRITE_HARDWARE_BIT 0x2 #define DEACTIVATE_BIT 0x4 +#define FPGA_TEMP_OFFSET 0x200 #define TXM_DELAY_LEFT_OFFSET 0x180 #define TXM_DELAY_RIGHT_OFFSET 0x1A0 diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.5.14.0 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.5.14.0.1-beamline similarity index 59% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.5.14.0 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.5.14.0.1-beamline index b9b7cebb8a95d1e6ca063b8cb2e32d99afbbf564..71d0facee9f25665c67b01983c4b4c3d7e3d933f 100755 GIT binary patch delta 43795 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 RPse#n8~0~ikiLE4{{vO>ZyW#s delta 43103 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 Date: Mon, 10 Oct 2016 08:17:34 +0200 Subject: [PATCH 02/41] fixed bug in gui that overwrites the individual sls file path values with the multi value --- slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index f902e24d70..d33ba18a56 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -4674,7 +4674,8 @@ string multiSlsDetector::checkReceiverOnline() { string multiSlsDetector::setFilePath(string s) { string ret="errorerror", ret1; - if(!s.empty()){ + //if the sls file paths are different, it should be realized by always using setfilepath even if string empty + //if(!s.empty()){ for (int idet=0; idetnumberOfDetectors; idet++) { if (detectors[idet]) { @@ -4688,7 +4689,7 @@ string multiSlsDetector::setFilePath(string s) { } } fileIO::setFilePath(ret); - } + //} return fileIO::getFilePath(); } From 64fd82f92c91eb19e981e644a22bdc3049c9192c Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 10 Oct 2016 08:39:46 +0200 Subject: [PATCH 03/41] fixed bug in gui that overwrites the individual sls file path values with the multi value, included a febl and febr temp read --- .../commonFiles/sls_detector_defs.h | 2 ++ .../commonFiles/sls_detector_funcs.h | 1 - .../eigerDetectorServer/FebControl.c | 19 ++++++++++++++++++ .../eigerDetectorServer/FebControl.h | 5 ++++- .../eigerDetectorServer/FebRegisterDefs.h | 2 ++ ....0.14.0 => eigerDetectorServerv2.1.0.14.1} | Bin 277482 -> 277923 bytes .../slsDetectorFunctionList.c | 6 ++++++ .../slsDetectorServer_defs.h | 2 +- .../slsDetector/slsDetectorCommand.cpp | 17 ++++++++++++++++ .../slsDetectorServer_funcs.c | 12 ++++++++--- 10 files changed, 60 insertions(+), 6 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv2.1.0.14.0 => eigerDetectorServerv2.1.0.14.1} (56%) diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index d4fce83e81..ddc7d62c6f 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -362,6 +362,8 @@ enum dacIndex { TEMPERATURE_DCDC, /**< temperature sensor (close to DCDC) */ TEMPERATURE_SODL, /**< temperature sensor (close to SODL) */ TEMPERATURE_SODR, /**< temperature sensor (close to SODR) */ + TEMPERATURE_FPGA2, /**< temperature sensor (fpga2 (eiger:febl) */ + TEMPERATURE_FPGA3, /**< temperature sensor (fpga3 (eiger:febr) */ V_POWER_A = 100, /**new chiptest board */ V_POWER_B = 101, /**new chiptest board */ V_POWER_C = 102, /**new chiptest board */ diff --git a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h index 047f0c10b0..c4fa4cb66e 100644 --- a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h @@ -103,7 +103,6 @@ enum { F_SET_RATE_CORRECT, /** < set/reset rate correction tau */ F_GET_RATE_CORRECT, /** < get rate correction tau */ - F_ACTIVATE, /** < activate/deactivate readout */ F_SET_NETWORK_PARAMETER /**< set network parameters such as transmission delay, flow control */ /* Always append functions hereafter!!! */ diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index a07d6b2fbb..e9ee781f35 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -1968,3 +1968,22 @@ int Feb_Control_PrintCorrectedValues(){ return 1; } + +int Feb_Control_GetLeftFPGATemp(){ + unsigned int temperature=0; + Feb_Interface_ReadRegister(Module_GetTopLeftAddress (&modules[1]),FEB_REG_STATUS, &temperature); + temperature = temperature >> 16; + //division done in client to send int over network + return temperature; +} + +int Feb_Control_GetRightFPGATemp(){ + unsigned int temperature=0; + Feb_Interface_ReadRegister(Module_GetTopRightAddress (&modules[1]),FEB_REG_STATUS, &temperature); + temperature = temperature >> 16; + //division done in client to send int over network + return (int)temperature; +} + + + diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.h b/slsDetectorSoftware/eigerDetectorServer/FebControl.h index cb87558ad5..62ba70a174 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.h @@ -192,4 +192,7 @@ int Feb_Control_GetModuleNumber(); void Feb_Control_SetRateCorrectionVariable(int activate_rate_correction); int Feb_Control_PrintCorrectedValues(); -#endif + int Feb_Control_GetLeftFPGATemp(); + int Feb_Control_GetRightFPGATemp(); + + #endif diff --git a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h index 1dbd97b599..dc88de3a10 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h @@ -149,3 +149,5 @@ #define FRAME_NUM_RESET_OFFSET 0xA0 +//temp so far +#define FEB_REG_STATUS 0xa diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.1.0.14.0 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.1.0.14.1 similarity index 56% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.1.0.14.0 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.1.0.14.1 index 2060a26d530118f4b6ffac9926d498b52b516cda..6dce1aa1da668603efd332f21d15315d34710ff2 100755 GIT binary patch delta 52563 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 aztJxDr$;+F6Z~eb Date: Mon, 10 Oct 2016 08:41:03 +0200 Subject: [PATCH 04/41] ask only 1 for frames caught for 9m --- .../multiSlsDetector/multiSlsDetector.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index d33ba18a56..5d6ef18f47 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -4932,6 +4932,16 @@ int multiSlsDetector::getReceiverCurrentFrameIndex() { int multiSlsDetector::resetFramesCaught() { int ret=-100, ret1; + + if(thisMultiDetector->numberOfDetectors>10) { + if (detectors[0]){ + ret =detectors[0]->getFramesCaughtByReceiver(); + if(detectors[0]->getErrorMask()) + setErrorMask(getErrorMask()|(1<<0)); + } + return ret; + } + for (int i=0; inumberOfDetectors; i++){ if (detectors[i]){ ret1=detectors[i]->resetFramesCaught(); From 7f293115c4710c9e5e0160df9b0eaf8873ae6aa8 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 10 Oct 2016 08:43:18 +0200 Subject: [PATCH 05/41] moved f_activate to receiver funcs from detectors funcs --- slsReceiverSoftware/include/sls_receiver_funcs.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/slsReceiverSoftware/include/sls_receiver_funcs.h b/slsReceiverSoftware/include/sls_receiver_funcs.h index e1ef930402..c5e99c1b96 100644 --- a/slsReceiverSoftware/include/sls_receiver_funcs.h +++ b/slsReceiverSoftware/include/sls_receiver_funcs.h @@ -49,7 +49,9 @@ enum { F_ENABLE_RECEIVER_OVERWRITE, /**< set overwrite flag in receiver */ F_ENABLE_RECEIVER_TEN_GIGA, /**< enable 10Gbe in receiver */ - F_SET_RECEIVER_FIFO_DEPTH /**< set receiver fifo depth */ + F_SET_RECEIVER_FIFO_DEPTH, /**< set receiver fifo depth */ + + F_ACTIVATE /** < activate/deactivate readout */ /* Always append functions hereafter!!! */ }; From 4a7e2466040542d164b037f6cd2f6aee3aeadec7 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 19 Oct 2016 10:21:29 +0200 Subject: [PATCH 06/41] removed asking only 1 for framescaugh --- .../multiSlsDetector/multiSlsDetector.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 5d6ef18f47..aea44e42f8 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -4933,15 +4933,6 @@ int multiSlsDetector::getReceiverCurrentFrameIndex() { int multiSlsDetector::resetFramesCaught() { int ret=-100, ret1; - if(thisMultiDetector->numberOfDetectors>10) { - if (detectors[0]){ - ret =detectors[0]->getFramesCaughtByReceiver(); - if(detectors[0]->getErrorMask()) - setErrorMask(getErrorMask()|(1<<0)); - } - return ret; - } - for (int i=0; inumberOfDetectors; i++){ if (detectors[i]){ ret1=detectors[i]->resetFramesCaught(); From 839896c7e688f6c3fdd49593e4aa71fe65ade383 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 19 Oct 2016 15:53:26 +0200 Subject: [PATCH 07/41] fixed the print file packet loss progress bug --- .../src/UDPStandardImplementation.cpp | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index d64692b658..bb758f6792 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -1359,9 +1359,12 @@ int UDPStandardImplementation::setupWriter(){ int UDPStandardImplementation::createNewFile(){ FILE_LOG(logDEBUG) << __AT__ << " called"; + int index = 0; - if(packetsCaught) + if(packetsCaught){ index = frameIndex; + cout << endl << "File:" << completeFileName < Date: Thu, 6 Apr 2017 15:04:33 +0200 Subject: [PATCH 08/41] strtok is not thread safe..used to set receiver udp ip etc to detector, fixed --- .../slsDetector/slsDetector.cpp | 258 ++++++++++-------- 1 file changed, 141 insertions(+), 117 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 1e5a87d9da..f54f7f5db2 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -6041,151 +6041,175 @@ int slsDetector::setUDPConnection(){ int slsDetector::configureMAC(){ - int i; - int ret=FAIL; - int fnum=F_CONFIGURE_MAC,fnum2=F_RECEIVER_SHORT_FRAME; - char mess[MAX_STR_LENGTH]=""; - char arg[6][50]={"","","","","",""}; - char cword[50]="", *pcword; - string sword; - int retval=-1; + int i; + int ret=FAIL; + int fnum=F_CONFIGURE_MAC,fnum2=F_RECEIVER_SHORT_FRAME; + char mess[MAX_STR_LENGTH]=""; + char arg[6][50]={"","","","","",""}; + int retval=-1; - //if udpip wasnt initialized in config file - if(!(strcmp(thisDetector->receiverUDPIP,"none"))){ - //hostname is an ip address - if(strchr(thisDetector->receiver_hostname,'.')!=NULL) - strcpy(thisDetector->receiverUDPIP,thisDetector->receiver_hostname); - //if hostname not ip, convert it to ip - else{ - struct hostent *he = gethostbyname(thisDetector->receiver_hostname); - if (he != NULL) - strcpy(thisDetector->receiverUDPIP,inet_ntoa(*(struct in_addr*)he->h_addr)); - else{ - std::cout << "configure mac failed. no rx_udpip given and invalid receiver hostname" << endl; - setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); - return FAIL; - } - } - } - strcpy(arg[0],thisDetector->receiverUDPIP); - strcpy(arg[1],thisDetector->receiverUDPMAC); - sprintf(arg[2],"%x",thisDetector->receiverUDPPort); - strcpy(arg[3],thisDetector->detectorMAC); - strcpy(arg[4],thisDetector->detectorIP); - sprintf(arg[5],"%x",thisDetector->receiverUDPPort2); + //if udpip wasnt initialized in config file + if(!(strcmp(thisDetector->receiverUDPIP,"none"))){ + //hostname is an ip address + if(strchr(thisDetector->receiver_hostname,'.')!=NULL) + strcpy(thisDetector->receiverUDPIP,thisDetector->receiver_hostname); + //if hostname not ip, convert it to ip + else{ + struct hostent *he = gethostbyname(thisDetector->receiver_hostname); + if (he != NULL) + strcpy(thisDetector->receiverUDPIP,inet_ntoa(*(struct in_addr*)he->h_addr)); + else{ + std::cout << "configure mac failed. no rx_udpip given and invalid receiver hostname" << endl; + setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); + return FAIL; + } + } + } + strcpy(arg[0],thisDetector->receiverUDPIP); + strcpy(arg[1],thisDetector->receiverUDPMAC); + sprintf(arg[2],"%x",thisDetector->receiverUDPPort); + strcpy(arg[3],thisDetector->detectorMAC); + strcpy(arg[4],thisDetector->detectorIP); + sprintf(arg[5],"%x",thisDetector->receiverUDPPort2); #ifdef VERBOSE - std::cout<< "Configuring MAC"<< std::endl; + std::cout<< "Configuring MAC"<< std::endl; #endif - for(i=0;i<2;i++){ - if(!strcmp(arg[i],"none")){ - std::cout<< "Configure MAC Error. IP/MAC Addresses not set"<< std::endl; - setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); - return FAIL; - } - } + for(i=0;i<2;i++){ + if(!strcmp(arg[i],"none")){ + std::cout<< "Configure MAC Error. IP/MAC Addresses not set"<< std::endl; + setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); + return FAIL; + } + } #ifdef VERBOSE - std::cout<< "IP/MAC Addresses valid "<< std::endl; + std::cout<< "IP/MAC Addresses valid "<< std::endl; #endif - //converting IPaddress to hex. - pcword = strtok (arg[0],"."); - while (pcword != NULL) { - sprintf(arg[0],"%02x",atoi(pcword)); - strcat(cword,arg[0]); - pcword = strtok (NULL, "."); - } - strcpy(arg[0],cword); + + { + //converting IPaddress to hex + stringstream ss(arg[0]); + char cword[50]=""; + bzero(cword, 50); + string s; + while (getline(ss, s, '.')) { + sprintf(cword,"%s%02x",cword,atoi(s.c_str())); + } + bzero(arg[0], 50); + strcpy(arg[0],cword); #ifdef VERBOSE - std::cout<<"receiver udp ip:"<onlineFlag==ONLINE_FLAG) { - if (connectControl() == OK){ - controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - controlSocket->SendDataOnly(arg,sizeof(arg)); - controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==FAIL){ - controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; - setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); - } - else - controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); - disconnectControl(); - if (ret==FORCE_UPDATE) - updateDetector(); - } - } - if (ret==FAIL) { - ret=FAIL; - std::cout<< "Configuring MAC failed " << std::endl; - setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); - } - else if (thisDetector->myDetectorType==GOTTHARD){ - //set frames per file - only for gotthard - pthread_mutex_lock(&ms); - if(retval==-1) - setFramesPerFile(MAX_FRAMES_PER_FILE); - else - setFramesPerFile(SHORT_MAX_FRAMES_PER_FILE); - pthread_mutex_unlock(&ms); - //connect to receiver - if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ + //send to server + if (thisDetector->onlineFlag==ONLINE_FLAG) { + if (connectControl() == OK){ + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(arg,sizeof(arg)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL){ + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); + } + else + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + disconnectControl(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + } + if (ret==FAIL) { + ret=FAIL; + std::cout<< "Configuring MAC failed " << std::endl; + setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); + } + else if (thisDetector->myDetectorType==GOTTHARD){ + //set frames per file - only for gotthard + pthread_mutex_lock(&ms); + if(retval==-1) + setFramesPerFile(MAX_FRAMES_PER_FILE); + else + setFramesPerFile(SHORT_MAX_FRAMES_PER_FILE); + pthread_mutex_unlock(&ms); + //connect to receiver + if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending adc val to receiver " << retval << std::endl; + std::cout << "Sending adc val to receiver " << retval << std::endl; #endif - if (connectData() == OK){ - ret=thisReceiver->sendInt(fnum2,retval,retval); - disconnectData(); + if (connectData() == OK){ + ret=thisReceiver->sendInt(fnum2,retval,retval); + disconnectData(); + } + if(ret==FAIL) + setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); + } } - if(ret==FAIL) - setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); - } - } - return ret; + return ret; } From 5b3a911e8d44fef40d81797b2566990ff771ebb5 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:11:34 +0200 Subject: [PATCH 09/41] solved warnings except sscanf for uint64_t --- slsDetectorSoftware/Makefile | 2 +- .../multiSlsDetector/multiSlsDetector.cpp | 60 +- .../multiSlsDetector/multiSlsDetector.h | 2 +- .../slsDetector/slsDetector.cpp | 1052 ++++++++--------- .../slsDetector/slsDetectorCommand.cpp | 45 +- .../slsDetector/slsDetectorUtils.cpp | 8 +- .../angularConversionStatic.cpp | 4 +- .../slsDetectorAnalysis/energyConversion.cpp | 84 +- .../slsDetectorAnalysis/postProcessing.cpp | 9 +- slsDetectorSoftware/threadFiles/Task.h | 12 +- .../threadFiles/ThreadPool.cpp | 3 +- 11 files changed, 654 insertions(+), 627 deletions(-) diff --git a/slsDetectorSoftware/Makefile b/slsDetectorSoftware/Makefile index 36eda6c4cf..e28fae7905 100644 --- a/slsDetectorSoftware/Makefile +++ b/slsDetectorSoftware/Makefile @@ -69,7 +69,7 @@ gotthardVirtualServer: $(SRC_MYTHEN_SVC) %.o : %.cpp %.h Makefile - $(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) -lpthread -lrt $(LIBZMQ) #$(FLAGS) + $(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) -lpthread -lrt $(LIBZMQ) $(FLAGS) package: $(OBJS) $(DESTDIR)/libSlsDetector.so $(DESTDIR)/libSlsDetector.a diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 6a838656dd..fb1ae4bda2 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1173,11 +1173,11 @@ int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings ise if (ret==-100) ret=*iret[idet]; else if (ret<(*iret[idet]-200) || ret>(*iret[idet]+200)) - ret=-1; - delete iret[idet]; + ret=-1; }else ret=-1; if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<flatFieldFile); @@ -3334,8 +3334,6 @@ char* multiSlsDetector::setNetworkParameter(networkParameter p, string s){ if (s.find('+')==string::npos) { - int posmin=0, posmax=thisMultiDetector->numberOfDetectors; - if(!threadpool){ cout << "Error in creating threadpool. Exiting" << endl; return getNetworkParameter(p); @@ -3356,6 +3354,7 @@ char* multiSlsDetector::setNetworkParameter(networkParameter p, string s){ //doing nothing with the return values if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<executeLine(1,args,GET_ACTION) << std::endl; - + iline++; // single detector configuration for (int i=0; inumberOfDetectors; i++) { // sprintf(ext,".det%d",i); @@ -4544,6 +4541,7 @@ int multiSlsDetector::writeConfigurationFile(string const fname){ cout << iv << " " << names[iv] << endl; strcpy(args[0],names[iv].c_str()); outfile << names[iv] << " " << cmd->executeLine(1,args,GET_ACTION) << std::endl; + iline++; } @@ -4555,7 +4553,7 @@ int multiSlsDetector::writeConfigurationFile(string const fname){ return FAIL; } #ifdef VERBOSE - std::cout<< "wrote " <getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask(); #ifdef VERYVERBOSE //append sls det error mask - sprintf(sNumber,"0x%x",slsMask); + sprintf(sNumber,"0x%lx",slsMask); retval.append("Error Mask " + string(sNumber)+string("\n")); #endif //get the error critical level @@ -5804,10 +5802,10 @@ uint64_t multiSlsDetector::setCTBWord(int addr,uint64_t word) { ret1=detectors[idet]->setCTBWord(addr, word); if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<getErrorMask()) setErrorMask(getErrorMask()|(1<Connect()>=0) { s->SendDataOnly(&fnum,sizeof(fnum)); @@ -333,16 +333,16 @@ slsDetectorDefs::detectorType slsDetector::getDetectorType(const char *name, int s->ReceiveDataOnly(&t,sizeof(t)); #ifdef VERBOSE - cout << "Detector type is "<< t << endl; + printf( "Detector type is %d \n", t ); #endif } else { s->ReceiveDataOnly(m,sizeof(m)); - std::cout<< "Detector returned error: " << m << std::endl; + printf( "Detector returned error: %s \n", m ); } s->Disconnect(); } else { - cout << "Cannot connect to server " << name << " over port " << cport << endl; + printf( "Cannot connect to server %s over port %d \n", name, cport ); } @@ -353,13 +353,13 @@ slsDetectorDefs::detectorType slsDetector::getDetectorType(const char *name, int retval = FAIL; if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending detector type to Receiver " << (int)thisDetector->myDetectorType << std::endl; + printf( "Sending detector type to Receiver %d \n", (int)thisDetector->myDetectorType ); #endif if (connectData() == OK) retval=thisReceiver->sendInt(fnum2,k,(int)t); disconnectData(); if(retval==FAIL){ - cout << "ERROR: Could not send detector type to receiver" << endl; + printf( "ERROR: Could not send detector type to receiver \n" ); setErrorMask((getErrorMask())|(RECEIVER_DET_HOSTTYPE_NOT_SET)); } } @@ -387,12 +387,12 @@ int slsDetector::exists(int id) { #ifdef VERBOSE - cout << "getDetectorType: generic shared memory of size " << sz << endl; + printf( "getDetectorType: generic shared memory of size %d \n", sz ); #endif shm_id = shmget(mem_key,sz,IPC_CREAT | 0666); // allocate shared memory if (shm_id < 0) { - std::cout<<"*** shmget error (server) ***"<< shm_id << std::endl; + printf( "*** shmget error (server) ***%d \n", shm_id ); return -1; } @@ -403,7 +403,7 @@ int slsDetector::exists(int id) { sharedSlsDetector* det = (sharedSlsDetector*) shmat(shm_id, NULL, 0); /* attach */ if (det == (void*)-1) { - std::cout<<"*** shmat error (server) ***" << std::endl; + printf( "*** shmat error (server) *** \n" ); return -1; } /** @@ -457,12 +457,12 @@ slsDetectorDefs::detectorType slsDetector::getDetectorType(int id) { #ifdef VERBOSE - cout << "getDetectorType: generic shared memory of size " << sz << endl; + printf( "getDetectorType: generic shared memory of size %d \n", sz ); #endif shm_id = shmget(mem_key,sz,IPC_CREAT | 0666); // allocate shared memory if (shm_id < 0) { - std::cout<<"*** shmget error (server) ***"<< shm_id << std::endl; + printf( "*** shmget error (server) ***%d \n", shm_id ); return t; } @@ -473,7 +473,7 @@ slsDetectorDefs::detectorType slsDetector::getDetectorType(int id) { sharedSlsDetector* det = (sharedSlsDetector*) shmat(shm_id, NULL, 0); /* attach */ if (det == (void*)-1) { - std::cout<<"*** shmat error (server) ***" << std::endl; + printf( "*** shmat error (server) *** \n" ); return t; } /** @@ -504,7 +504,7 @@ slsDetectorDefs::detectorType slsDetector::getDetectorType(int id) { } #ifdef VERBOSE - cout << "Detector type is " << t << endl; + printf( "Detector type is %d \n", t ); #endif return t; @@ -517,12 +517,12 @@ int slsDetector::initializeDetectorSize(detectorType type) { char *goff; goff=(char*)thisDetector; - // cout << "init detector size" << endl; + // printf( "init detector size \n" ); /** if the shared memory has newly be created, initialize the detector variables */ if (thisDetector->alreadyExisting==0) { - // cout << "detector not existing " << endl; + // printf( "detector not existing \n" ); /** set hostname to default */ strcpy(thisDetector->hostname,DEFAULT_HOSTNAME); @@ -567,7 +567,7 @@ int slsDetector::initializeDetectorSize(detectorType type) { thisDetector->dynamicRange=24; thisDetector->moveFlag=1; #ifdef VERBOSE - cout << "move flag" << thisDetector->moveFlag<< endl; + printf( "move flag %d \n", thisDetector->moveFlag ); #endif break; case PICASSO: @@ -803,7 +803,7 @@ int slsDetector::initializeDetectorSize(detectorType type) { detectorModules=(sls_detector_module*)(goff+ thisDetector->modoff); #ifdef VERBOSE // for (int imod=0; imod< thisDetector->nModsMax; imod++) - // std::cout<< hex << detectorModules+imod << dec <nBadChans; @@ -826,7 +826,7 @@ int slsDetector::initializeDetectorSize(detectorType type) { } #ifdef VERBOSE - cout << "passing pointers" << endl; + printf( "passing pointers \n" ); #endif @@ -875,12 +875,14 @@ int slsDetector::initializeDetectorSize(detectorType type) { if (thisDetector->myDetectorType==JUNGFRAUCTB) setFramesPerFile(JFCTB_MAX_FRAMES_PER_FILE); pthread_mutex_unlock(&ms); + if (thisReceiver != NULL) + delete thisReceiver; thisReceiver = new receiverInterface(dataSocket); // setAngularConversionPointer(thisDetector->angOff,&thisDetector->nMods, thisDetector->nChans*thisDetector->nChips); #ifdef VERBOSE - cout << "done" << endl; + printf( "done \n" ); #endif @@ -888,7 +890,7 @@ int slsDetector::initializeDetectorSize(detectorType type) { thisDetector->lastPID=getpid(); #ifdef VERBOSE - cout << "Det size initialized " << endl; + printf( "Det size initialized \n" ); #endif return OK; @@ -1075,12 +1077,12 @@ int slsDetector::sendChip(sls_detector_chip *myChip) { ts+=controlSocket->SendDataOnly(&(myChip->reg),sizeof(myChip->reg)); ts+=controlSocket->SendDataOnly(myChip->chanregs,sizeof(myChip->chanregs)); #ifdef VERY_VERBOSE - std::cout<< "chip structure sent" << std::endl; - std::cout<< "now sending " << myChip->nchan << " channles" << std::endl; + printf( "chip structure sent \n" ); + printf( "now sending %d channels \n", myChip->nchan ); #endif ts=controlSocket->SendDataOnly(myChip->chanregs,sizeof(int)*myChip->nchan ); #ifdef VERBOSE - std::cout<< "chip's channels sent " <chanregs=chanptr; #ifdef VERBOSE - std::cout<< "received module " << myMod->module << " of size "<< ts << " register " << myMod->reg << std::endl; + printf( "received module %d of size %d register %d \n", myMod->module, ts, myMod->reg ); #endif ts+=controlSocket->ReceiveDataOnly(myMod->dacs,sizeof(dacs_t)*(myMod->ndac)); #ifdef VERBOSE - std::cout<< "received dacs " << myMod->module << " of size "<< ts << std::endl; + printf( "received dacs %d of size %d \n", myMod->module, ts ); #endif ts+=controlSocket->ReceiveDataOnly(myMod->adcs,sizeof(dacs_t)*(myMod->nadc)); #ifdef VERBOSE - std::cout<< "received adcs " << myMod->module << " of size "<< ts << std::endl; + printf( "received adcs %d of size %d \n", myMod->module, ts ); #endif if(thisDetector->myDetectorType != JUNGFRAU){ ts+=controlSocket->ReceiveDataOnly(myMod->chipregs,sizeof(int)*(myMod->nchip)); #ifdef VERBOSE - std::cout<< "received chips " << myMod->module << " of size "<< ts << std::endl; + printf( "received chips %d of size %d \n", myMod->module, ts ); #endif ts+=controlSocket->ReceiveDataOnly(myMod->chanregs,sizeof(int)*(myMod->nchan)); #ifdef VERBOSE - std::cout<< "nchans= " << thisDetector->nChans << " nchips= " << thisDetector->nChips; - std::cout<< "mod - nchans= " << myMod->nchan << " nchips= " <nchip; - std::cout<< "received chans " << myMod->module << " of size "<< ts << std::endl; + printf( "nchans= %d nchips= %d\n", thisDetector->nChans, thisDetector->nChips ); + printf( "mod - nchans= %d nchips= %d \n", myMod->nchan, myMod->nchip ); + printf( "received chans %d of size %d \n", myMod->module, ts ); #endif } #ifdef VERBOSE - std::cout<< "received module " << myMod->module << " of size "<< ts << " register " << myMod->reg << std::endl; + printf( "received module %d of size %d register %d \n", myMod->module, ts, myMod->reg ); #endif return ts; @@ -1219,11 +1221,11 @@ int slsDetector::setOnline(int off) { if (thisDetector->onlineFlag==ONLINE_FLAG) { setTCPSocket(); if (thisDetector->onlineFlag==ONLINE_FLAG && old==OFFLINE_FLAG) { - cout << "Detector connecting for the first time - updating!" << endl; + printf( "Detector connecting for the first time - updating! \n" ); updateDetector(); } else if(thisDetector->onlineFlag==OFFLINE_FLAG){ - std::cout << "cannot connect to detector" << endl; + printf( "cannot connect to detector \n" ); setErrorMask((getErrorMask())|(CANNOT_CONNECT_TO_DETECTOR)); } } @@ -1252,14 +1254,14 @@ string slsDetector::checkOnline() { controlSocket=NULL; retval = string(thisDetector->hostname); #ifdef VERBOSE - std::cout<< "offline!" << std::endl; + printf( "offline! \n" ); #endif } else { thisDetector->onlineFlag=ONLINE_FLAG; controlSocket->SetTimeOut(100); disconnectControl(); #ifdef VERBOSE - std::cout<< "online!" << std::endl; + printf( "online! \n" ); #endif } } @@ -1276,18 +1278,18 @@ int slsDetector::activate(int const enable){ int ret = OK; if(thisDetector->myDetectorType != EIGER){ - std::cout<< "Not implemented for this detector" << std::endl; + printf( "Not implemented for this detector \n" ); setErrorMask((getErrorMask())|(DETECTOR_ACTIVATE)); return -1; } #ifdef VERBOSE if(!enable) - std::cout<< "Deactivating Detector" << std::endl; + printf( "Deactivating Detector \n" ); else if(enable == -1) - std::cout<< "Getting Detector activate mode" << std::endl; + printf( "Getting Detector activate mode \n" ); else - std::cout<< "Activating Detector" << std::endl; + printf( "Activating Detector \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -1296,7 +1298,7 @@ int slsDetector::activate(int const enable){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(DETECTOR_ACTIVATE)); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -1308,17 +1310,17 @@ int slsDetector::activate(int const enable){ } #ifdef VERBOSE if(retval==1) - std::cout << "Detector Activated" << std::endl; + printf( "Detector Activated \n" ); else if(retval==0) - std::cout << "Detector Deactivated" << std::endl; + printf( "Detector Deactivated \n" ); else - std::cout << "Detector Activation unknown:" << retval << std::endl; + printf( "Detector Activation unknown: %d", retval ); #endif if(ret!=FAIL){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Activating/Deactivating Receiver: " << retval << std::endl; + printf( "Activating/Deactivating Receiver: %d", retval ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,retval); @@ -1330,11 +1332,11 @@ int slsDetector::activate(int const enable){ } #ifdef VERBOSE if(retval==1) - std::cout << "Receiver Activated" << std::endl; + printf( "Receiver Activated \n" ); else if(retval==0) - std::cout << "Receiver Deactivated" << std::endl; + printf( "Receiver Deactivated \n" ); else - std::cout << "Receiver Activation unknown:" << retval << std::endl; + printf( "Receiver Activation unknown:%d", retval ); #endif @@ -1360,7 +1362,7 @@ int slsDetector::setTCPSocket(string const name, int const control_port, int con if (strcmp(name.c_str(),"")!=0) { #ifdef VERBOSE - std::cout<< "setting hostname" << std::endl; + printf( "setting hostname \n" ); #endif strcpy(thisName,name.c_str()); strcpy(thisDetector->hostname,thisName); @@ -1377,7 +1379,7 @@ int slsDetector::setTCPSocket(string const name, int const control_port, int con if (control_port>0) { #ifdef VERBOSE - std::cout<< "setting control port" << std::endl; + printf( "setting control port \n" ); #endif thisCP=control_port; thisDetector->controlPort=thisCP; @@ -1390,7 +1392,7 @@ int slsDetector::setTCPSocket(string const name, int const control_port, int con if (stop_port>0) { #ifdef VERBOSE - std::cout<< "setting stop port" << std::endl; + printf( "setting stop port \n" ); #endif thisSP=stop_port; thisDetector->stopPort=thisSP; @@ -1406,7 +1408,7 @@ int slsDetector::setTCPSocket(string const name, int const control_port, int con controlSocket= new MySocketTCP(thisName, thisCP); if (controlSocket->getErrorStatus()){ #ifdef VERBOSE - std::cout<< "Could not connect Control socket " << thisName << " " << thisCP << std::endl; + printf( "Could not connect Control socket %s %d \n", thisName, thisCP ); #endif delete controlSocket; controlSocket=NULL; @@ -1414,14 +1416,14 @@ int slsDetector::setTCPSocket(string const name, int const control_port, int con } #ifdef VERYVERBOSE else - std::cout<< "Control socket connected " <getErrorStatus()){ #ifdef VERBOSE - std::cout<< "Could not connect Stop socket "<onlineFlag=OFFLINE_FLAG; #ifdef VERBOSE - std::cout<< "offline!" << std::endl; + printf( "offline! \n" ); #endif } return retval; @@ -1450,7 +1452,7 @@ int slsDetector::connectControl() { if (controlSocket->Connect() >= 0) return OK; else{ - std::cout << "cannot connect to detector" << endl; + printf( "cannot connect to detector \n" ); setErrorMask((getErrorMask())|(CANNOT_CONNECT_TO_DETECTOR)); return FAIL; } @@ -1472,7 +1474,7 @@ int slsDetector::connectData() { if (dataSocket->Connect() >= 0) return OK; else{ - std::cout << "cannot connect to receiver" << endl; + printf( "cannot connect to receiver \n" ); setErrorMask((getErrorMask())|(CANNOT_CONNECT_TO_RECEIVER)); return FAIL;} } @@ -1492,7 +1494,7 @@ int slsDetector::connectStop() { if (stopSocket->Connect() >= 0) return OK; else{ - std::cout << "cannot connect to stop server" << endl; + printf( "cannot connect to stop server \n" ); return FAIL; } } @@ -1540,8 +1542,8 @@ int slsDetector::execCommand(string cmd, string answer){ strcpy(arg,cmd.c_str()); #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Sending command " << arg << std::endl; + printf( "\n" ); + printf( "Sending command %s \n", arg ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -1556,7 +1558,7 @@ int slsDetector::execCommand(string cmd, string answer){ disconnectControl(); } #ifdef VERBOSE - std::cout<< "Detector answer is " << answer << std::endl; + printf( "Detector answer is %s \n", answer.c_str() ); #endif } return ret; @@ -1590,8 +1592,8 @@ int slsDetector::setDetectorType(detectorType const type){ #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Setting detector type to " << arg << std::endl; + printf( "\n" ); + printf( "Setting detector type to %d \n", arg ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -1601,7 +1603,7 @@ int slsDetector::setDetectorType(detectorType const type){ controlSocket->ReceiveDataOnly(&retType,sizeof(retType)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s\n", mess ); } disconnectControl(); if (retval==FORCE_UPDATE) @@ -1617,10 +1619,10 @@ int slsDetector::setDetectorType(detectorType const type){ retval=OK; } #ifdef VERBOSE - std::cout<< "Detector type set to " << retType << std::endl; + printf( "Detector type set to %d \n", retType ); #endif if (retval==FAIL) { - std::cout<< "Set detector type failed " << std::endl; + printf( "Set detector type failed \n" ); retType=GENERIC; } else @@ -1632,14 +1634,14 @@ int slsDetector::setDetectorType(detectorType const type){ retval = FAIL; if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending detector type to Receiver " << (int)thisDetector->myDetectorType << std::endl; + printf( "Sending detector type to Receiver %d \n", (int)thisDetector->myDetectorType ); #endif if (connectData() == OK){ retval=thisReceiver->sendInt(fnum2,arg,(int)thisDetector->myDetectorType); disconnectData(); } if(retval==FAIL){ - cout << "ERROR: Could not send detector type to receiver" << endl; + printf( "ERROR: Could not send detector type to receiver \n" ); setErrorMask((getErrorMask())|(RECEIVER_DET_HOSTTYPE_NOT_SET)); } } @@ -1677,19 +1679,19 @@ int slsDetector::setNumberOfModules(int n, dimension d){ if (dY) { - std::cout<< "Set number of modules in wrong dimension " << d << std::endl; + printf( "Set number of modules in wrong dimension %d \n", d ); return ret; } #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Setting number of modules of dimension "<< d << " to " << n << std::endl; + printf( "\n" ); + printf( "Setting number of modules of dimension %d to %d \n", d, n ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { connect = connectControl(); if (connect == UNDEFINED) - cout << "no control socket?" << endl; + printf( "no control socket? \n" ); else if (connect == OK){ num = controlSocket->SendDataOnly(&fnum,sizeof(fnum)); num = controlSocket->SendDataOnly(&arg,sizeof(arg)); @@ -1698,14 +1700,14 @@ int slsDetector::setNumberOfModules(int n, dimension d){ num = controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) updateDetector(); } } else { - cout << "offline" << endl; + printf( "offline \n" ); ret=OK; if (n==GET_FLAG) ; @@ -1719,10 +1721,10 @@ int slsDetector::setNumberOfModules(int n, dimension d){ retval=thisDetector->nMod[d]; } #ifdef VERBOSE - std::cout<< "Number of modules in dimension "<< d <<" is " << retval << std::endl; + printf( "Number of modules in dimension %d is %d \n", d, retval ); #endif if (ret==FAIL) { - std::cout<< "Set number of modules failed " << std::endl; + printf( "Set number of modules failed \n" ); } else { thisDetector->nMod[d]=retval; thisDetector->nMods=thisDetector->nMod[X]*thisDetector->nMod[Y]; @@ -1763,8 +1765,8 @@ int slsDetector::setNumberOfModules(int n, dimension d){ } #ifdef VERBOSE - std::cout<< "Data size is " << thisDetector->dataBytes << std::endl; - std::cout<< "nModX " << thisDetector->nMod[X] << " nModY " << thisDetector->nMod[Y] << " nChips " << thisDetector->nChips << " nChans " << thisDetector->nChans<< " dr " << dr << std::endl; + printf( "Data size is %d \n", thisDetector->dataBytes ); + printf( "nModX %d nModY %d nChips %d nChans %d dr %d \n", thisDetector->nMod[X], thisDetector->nMod[Y], thisDetector->nChips, thisDetector->nChans, dr ); #endif } @@ -1787,12 +1789,12 @@ int slsDetector::getMaxNumberOfModules(dimension d){ char mess[MAX_STR_LENGTH]=""; if (dY) { - std::cout<< "Get max number of modules in wrong dimension " << d << std::endl; + printf( "Get max number of modules in wrong dimension %d \n", d ); return ret; } #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Getting max number of modules in dimension "<< d <onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -1803,7 +1805,7 @@ int slsDetector::getMaxNumberOfModules(dimension d){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -1814,10 +1816,10 @@ int slsDetector::getMaxNumberOfModules(dimension d){ retval=thisDetector->nModMax[d]; } #ifdef VERBOSE - std::cout<< "Max number of modules in dimension "<< d <<" is " << retval << std::endl; + printf( "Max number of modules in dimension %d is %d \n", d, retval ); #endif if (ret==FAIL) { - std::cout<< "Get max number of modules failed " << retval << std::endl; + printf( "Get max number of modules failed %d\n", retval ); return retval; } else { thisDetector->nModMax[d]=retval; @@ -1837,19 +1839,18 @@ int slsDetector::setFlippedData(dimension d, int value){ int retval=-1; int fnum=F_SET_FLIPPED_DATA_RECEIVER; int ret=FAIL; - char mess[MAX_STR_LENGTH]=""; int args[2]={X,-1}; if(thisDetector->myDetectorType!= EIGER){ - std::cout << "Flipped Data is not implemented in this detector" << std::endl; + printf( "Flipped Data is not implemented in this detector \n" ); setErrorMask((getErrorMask())|(RECEIVER_FLIPPED_DATA_NOT_SET)); return -1; } #ifdef VERBOSE - std::cout << std::endl; - std::cout << "Setting/Getting flipped data across axis " << d <<" with value " << value << std::endl; + printf( " \n" ); + printf( "Setting/Getting flipped data across axis %d with value %d \n", d, value ); #endif if(value > -1){ thisDetector->flippedData[d] = value; @@ -1862,7 +1863,6 @@ int slsDetector::setFlippedData(dimension d, int value){ if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { if (connectData() == OK){ ret=thisReceiver->sendIntArray(fnum,retval,args); - disconnectData(); } @@ -1912,8 +1912,8 @@ slsDetectorDefs::externalSignalFlag slsDetector::setExternalSignalFlags(external retval=GET_EXTERNAL_SIGNAL_FLAG; #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Setting signal "<< signalindex << " to flag" << pol << std::endl; + printf( "\n" ); + printf( "Setting signal %d to flag %d \n", signalindex, pol ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -1924,7 +1924,7 @@ slsDetectorDefs::externalSignalFlag slsDetector::setExternalSignalFlags(external controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -1935,9 +1935,9 @@ slsDetectorDefs::externalSignalFlag slsDetector::setExternalSignalFlags(external ret=FAIL; } #ifdef VERBOSE - std::cout<< "Signal "<< signalindex << " flag set to" << retval << std::endl; + printf( "Signal %d flag set to %d \n", signalindex, retval ); if (ret==FAIL) { - std::cout<< "Set signal flag failed " << std::endl; + printf( "Set signal flag failed \n" ); } #endif return retval; @@ -1982,8 +1982,8 @@ slsDetectorDefs::externalCommunicationMode slsDetector::setExternalCommunication retval=GET_EXTERNAL_COMMUNICATION_MODE; #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Setting communication to mode " << pol << std::endl; + printf( "\n" ); + printf( "Setting communication to mode %d \n", pol ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -1994,7 +1994,7 @@ slsDetectorDefs::externalCommunicationMode slsDetector::setExternalCommunication controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2005,10 +2005,10 @@ slsDetectorDefs::externalCommunicationMode slsDetector::setExternalCommunication ret=FAIL; } #ifdef VERBOSE - std::cout<< "Communication mode "<< " set to" << retval << std::endl; + printf( "Communication mode se to %d \n", retval ); #endif if (ret==FAIL) { - std::cout<< "Setting communication mode failed" << std::endl; + printf( "Setting communication mode failed \n" ); } return retval; @@ -2042,11 +2042,11 @@ int64_t slsDetector::getId( idMode mode, int imod){ char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<< std::endl; + printf( "\n" ); if (mode==MODULE_SERIAL_NUMBER) - std::cout<< "Getting id of "<< imod << std::endl; + printf( "Getting id of %d \n", imod ); else - std::cout<< "Getting id type "<< mode << std::endl; + printf( "Getting id type %d \n", mode ); #endif if (mode==THIS_SOFTWARE_VERSION) { ret=OK; @@ -2075,7 +2075,7 @@ int64_t slsDetector::getId( idMode mode, int imod){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2084,14 +2084,14 @@ int64_t slsDetector::getId( idMode mode, int imod){ } } if (ret==FAIL) { - std::cout<< "Get id failed " << std::endl; + printf( "Get id failed \n" ); return ret; } else { #ifdef VERBOSE if (mode==MODULE_SERIAL_NUMBER) - std::cout<< "Id of "<< imod <<" is " << hex <onlineFlag==ONLINE_FLAG) { @@ -2137,7 +2137,7 @@ int slsDetector::digitalTest( digitalTestMode mode, int imod){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2147,10 +2147,10 @@ int slsDetector::digitalTest( digitalTestMode mode, int imod){ ret=FAIL; } #ifdef VERBOSE - std::cout<< "Id "<< mode <<" is " << retval << std::endl; + printf( "Id %d is %d \n", mode, retval ); #endif if (ret==FAIL) { - std::cout<< "Get id failed " << std::endl; + printf( "Get id failed \n" ); return ret; } else return retval; @@ -2168,7 +2168,7 @@ int slsDetector::digitalTest( digitalTestMode mode, int imod){ */ /* int* slsDetector::analogTest(analogTestMode mode){ - std::cout<< "function not yet implemented " << std::endl; + printf( "function not yet implemented \n" ); }; */ /* @@ -2184,7 +2184,7 @@ int slsDetector::digitalTest( digitalTestMode mode, int imod){ }; int slsDetector::enableAnalogOutput(int imod, int ichip, int ichan){ - std::cout<< "function not yet implemented " << std::endl; + printf( "function not yet implemented \n" ); }; */ /* @@ -2192,7 +2192,7 @@ int slsDetector::digitalTest( digitalTestMode mode, int imod){ */ /* int slsDetector::giveCalibrationPulse(double vcal, int npulses){ - std::cout<< "function not yet implemented " << std::endl; + printf( "function not yet implemented \n" ); }; */ // Expert low level functions @@ -2216,8 +2216,8 @@ int slsDetector::writeRegister(int addr, int val){ #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Writing to register "<< hex<onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -2228,7 +2228,7 @@ int slsDetector::writeRegister(int addr, int val){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2236,10 +2236,10 @@ int slsDetector::writeRegister(int addr, int val){ } } #ifdef VERBOSE - std::cout<< "Register returned "<< retval << std::endl; + printf( "Register returned %d \n", retval ); #endif if (ret==FAIL) { - std::cout<< "Write to register failed " << std::endl; + printf( "Write to register failed \n" ); } return retval; @@ -2261,8 +2261,8 @@ int slsDetector::writeAdcRegister(int addr, int val){ #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Writing to adc register "<< hex<onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -2273,7 +2273,7 @@ int slsDetector::writeAdcRegister(int addr, int val){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2281,10 +2281,10 @@ int slsDetector::writeAdcRegister(int addr, int val){ } } #ifdef VERBOSE - std::cout<< "ADC Register returned "<< retval << std::endl; + printf( "ADC Register returned %d \n", retval ); #endif if (ret==FAIL) { - std::cout<< "Write ADC to register failed " << std::endl; + printf( "Write ADC to register failed \n" ); } return retval; @@ -2307,8 +2307,8 @@ int slsDetector::readRegister(int addr){ #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Reading register "<< hex<onlineFlag==ONLINE_FLAG) { // if (connectControl() == OK){ @@ -2321,7 +2321,7 @@ int slsDetector::readRegister(int addr){ stopSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { stopSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectStop(); // if (ret==FORCE_UPDATE) @@ -2330,10 +2330,10 @@ int slsDetector::readRegister(int addr){ } } #ifdef VERBOSE - std::cout<< "Register returned "<< retval << std::endl; + printf( "Register returned %d \n", retval ); #endif if (ret==FAIL) { - std::cout<< "Read register failed " << std::endl; + printf( "Read register failed \n" ); } return retval; @@ -2367,7 +2367,7 @@ dacs_t slsDetector::setDAC(dacs_t val, dacIndex index, int mV, int imod){ int arg[3]; - if ( (thisDetector->myDetectorType == GOTTHARD) || (thisDetector->myDetectorType == PROPIX) && index==HV_NEW) + if ( ((thisDetector->myDetectorType == GOTTHARD) || (thisDetector->myDetectorType == PROPIX)) && (index == HV_NEW)) index=HV_POT; arg[0]=index; @@ -2376,8 +2376,8 @@ dacs_t slsDetector::setDAC(dacs_t val, dacIndex index, int mV, int imod){ #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Setting DAC "<< index << " of module " << imod << " to " << val << std::endl; + printf( "\n" ); + printf( "Setting DAC %d of module %d to %d \n", index, imod, val ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -2401,7 +2401,7 @@ dacs_t slsDetector::setDAC(dacs_t val, dacIndex index, int mV, int imod){ } } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2410,10 +2410,10 @@ dacs_t slsDetector::setDAC(dacs_t val, dacIndex index, int mV, int imod){ } } #ifdef VERBOSE - std::cout<< "Dac set to "<< retval[0] << " dac units (" << retval[1] << "mV)" << std::endl; + printf( "Dac set to %d dac units (%dmV) \n", retval[0], retval[1] ); #endif if (ret==FAIL) { - std::cout<< "Set dac " << index << " of module " << imod << " to " << val << " failed." << std::endl; + printf( "Set dac %d of module %d to %d failed. \n", index, imod, val ); } if(mV) return retval[1]; @@ -2436,8 +2436,8 @@ dacs_t slsDetector::getADC(dacIndex index, int imod){ #ifdef VERBOSE - std::cout<< std::endl; - std::cout<< "Getting ADC "<< index << " of module " << imod << std::endl; + printf( "\n" ); + printf( "Getting ADC %d of module %d \n", index, imod ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -2451,7 +2451,7 @@ dacs_t slsDetector::getADC(dacIndex index, int imod){ } } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2459,10 +2459,10 @@ dacs_t slsDetector::getADC(dacIndex index, int imod){ } } #ifdef VERBOSE - std::cout<< "ADC returned "<< retval << std::endl; + printf( "ADC returned %d", retval ); #endif if (ret==FAIL) { - std::cout<< "Get ADC failed " << std::endl; + printf( "Get ADC failed \n" ); } return retval; @@ -2485,7 +2485,7 @@ dacs_t slsDetector::getADC(dacIndex index, int imod){ int slsDetector::setChannel(int64_t reg, int ichan, int ichip, int imod){ sls_detector_channel myChan; #ifdef VERBOSE - std::cout<< "Setting channel "<< ichan << " " << ichip << " " << imod << " to " << reg << std::endl; + printf( "Setting channel %d %d %d to %ld \n", ichan, ichip, imod, reg ); #endif //int mmin=imod, mmax=imod+1, chimin=ichip, chimax=ichip+1, chamin=ichan, chamax=ichan+1; @@ -2542,7 +2542,7 @@ int slsDetector::setChannel(sls_detector_channel chan){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2589,7 +2589,7 @@ int slsDetector::setChannel(sls_detector_channel chan){ } } #ifdef VERBOSE - std::cout<< "Channel register returned "<< retval << std::endl; + printf( "Channel register returned %d \n", retval ); #endif return retval; @@ -2633,7 +2633,7 @@ slsDetectorDefs::sls_detector_channel slsDetector::getChannel(int ichan, int ic receiveChannel(&myChan); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2649,7 +2649,7 @@ slsDetectorDefs::sls_detector_channel slsDetector::getChannel(int ichan, int ic } #ifdef VERBOSE - std::cout<< "Returned channel "<< ichan << " " << ichip << " " << imod << " " << myChan.reg << std::endl; + printf( "Returned channel %d %d %d %ld \n", ichan, ichip, imod, myChan.reg ); #endif return myChan; } @@ -2665,7 +2665,7 @@ int slsDetector::setChip(int reg, int ichip, int imod){ sls_detector_chip myChip; #ifdef VERBOSE - std::cout<< "Setting chip "<< ichip << " " << imod << " to " << reg << std::endl; + printf( "Setting chip %d %d to %d \n", ichip, imod, reg ); #endif @@ -2724,7 +2724,7 @@ int slsDetector::setChip(sls_detector_chip chip){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2739,7 +2739,7 @@ int slsDetector::setChip(sls_detector_chip chip){ } #ifdef VERBOSE - std::cout<< "Chip register returned "<< retval << std::endl; + printf( "Chip register returned %d \n", retval ); #endif return retval; }; @@ -2777,7 +2777,7 @@ slsDetectorDefs::sls_detector_chip slsDetector::getChip(int ichip, int imod){ receiveChip(&myChip); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -2795,7 +2795,7 @@ slsDetectorDefs::sls_detector_chip slsDetector::getChip(int ichip, int imod){ } } #ifdef VERBOSE - std::cout<< "Returned chip "<< ichip << " " << imod << " " << myChip.reg << std::endl; + printf( "Returned chip %d %d %d \n", ichip, imod, myChip.reg ); #endif return myChip; @@ -2813,7 +2813,7 @@ int slsDetector::setModule(int reg, int imod){ sls_detector_module myModule; #ifdef VERBOSE - std::cout << "slsDetector set module " << std::endl; + printf( "slsDetector set module \n" ); #endif int charegs[thisDetector->nChans*thisDetector->nChips]; int chiregs[thisDetector->nChips]; @@ -2897,7 +2897,7 @@ int slsDetector::setModule(sls_detector_module module, int iodelay, int tau, int #ifdef VERBOSE - std::cout << "slsDetector set module " << std::endl; + printf( "slsDetector set module \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -2922,7 +2922,7 @@ int slsDetector::setModule(sls_detector_module module, int iodelay, int tau, int controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); if(strstr(mess,"default tau")!=NULL) setErrorMask((getErrorMask())|(RATE_CORRECTION_NO_TAU_PROVIDED)); } @@ -2987,7 +2987,7 @@ int slsDetector::setModule(sls_detector_module module, int iodelay, int tau, int } #ifdef VERBOSE - std::cout<< "Module register returned "<< retval << std::endl; + printf( "Module register returned %d \n", retval ); #endif return retval; @@ -3000,7 +3000,7 @@ int slsDetector::setModule(sls_detector_module module, int iodelay, int tau, int slsDetectorDefs::sls_detector_module *slsDetector::getModule(int imod){ #ifdef VERBOSE - std::cout << "slsDetector get module " << std::endl; + printf( "slsDetector get module \n" ); #endif int fnum=F_GET_MODULE; @@ -3023,7 +3023,7 @@ slsDetectorDefs::sls_detector_module *slsDetector::getModule(int imod){ // int n; #ifdef VERBOSE - std::cout<< "getting module " << imod << std::endl; + printf( "getting module %d \n", imod ); #endif myMod->module=imod; @@ -3053,7 +3053,7 @@ slsDetectorDefs::sls_detector_module *slsDetector::getModule(int imod){ controlSocket->ReceiveDataOnly(offsetval,sizeof(int)*thisDetector->nOffset); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -3132,7 +3132,7 @@ slsDetectorDefs::sls_detector_module *slsDetector::getModule(int imod){ really needed? int slsDetector::setCalibration(int imod, detectorSettings isettings, double gain, double offset){ - std::cout<< "function not yet implemented " << std::endl; + printf( "function not yet implemented \n" ); @@ -3141,7 +3141,7 @@ slsDetectorDefs::sls_detector_module *slsDetector::getModule(int imod){ } int slsDetector::getCalibration(int imod, detectorSettings isettings, double &gain, double &offset){ - std::cout<< "function not yet implemented " << std::endl; + printf( "function not yet implemented \n" ); @@ -3159,7 +3159,7 @@ int slsDetector::getThresholdEnergy(int imod){ int ret=FAIL; char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<< "Getting threshold energy "<< std::endl; + printf( "Getting threshold energy \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -3168,9 +3168,8 @@ int slsDetector::getThresholdEnergy(int imod){ controlSocket->SendDataOnly(&imod,sizeof(imod)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { - std::cout<< "Detector returned error: "<< std::endl; controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< mess << std::endl; + printf( "Detector returned error:%s \n", mess ); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); thisDetector->currentThresholdEV=retval; @@ -3196,7 +3195,7 @@ int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isetti int ret=FAIL; char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<< "Setting threshold energy "<< std::endl; + printf( "Setting threshold energy \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -3206,12 +3205,11 @@ int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isetti controlSocket->SendDataOnly(&isettings,sizeof(isettings)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { - std::cout<< "Detector returned error: "<< std::endl; controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { #ifdef VERBOSE - std::cout<< "Detector returned OK "<< std::endl; + printf( "Detector returned OK \n" ); #endif controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); thisDetector->currentThresholdEV=retval; @@ -3290,7 +3288,7 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti ostfn << thisDetector->settingsDir << ssettings << "/" << e_eV << "eV" << "/noise.sn" << setfill('0') << setw(3) << dec << getId(DETECTOR_SERIAL_NUMBER) << setbase(10); string settingsfname = ostfn.str(); #ifdef VERBOSE - printf("Settings File is %s\n", settingsfname1.c_str()); + printf("Settings File is %s\n", settingsfname.c_str()); #endif //read the files myMod=createModule(); @@ -3370,7 +3368,7 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti setModule(*myMod, iodelay, tau, e_eV, 0, 0); deleteModule(myMod); if (getSettings(-1) != is){ - std::cout << "Could not set settings in detector" << endl; + printf( "Could not set settings in detector \n" ); setErrorMask((getErrorMask())|(SETTINGS_NOT_SET)); return FAIL; } @@ -3394,7 +3392,7 @@ slsDetectorDefs::detectorSettings slsDetector::getSettings(int imod){ arg[0]=GET_SETTINGS; arg[1]=imod; #ifdef VERBOSE - std::cout<< "Getting settings "<< std::endl; + printf( "Getting settings \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -3403,12 +3401,12 @@ slsDetectorDefs::detectorSettings slsDetector::getSettings(int imod){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else{ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); thisDetector->currentSettings=(detectorSettings)retval; #ifdef VERBOSE - std::cout<< "Settings are "<< retval << std::endl; + printf( "Settings are %d \n", retval ); #endif } disconnectControl(); @@ -3424,7 +3422,7 @@ slsDetectorDefs::detectorSettings slsDetector::getSettings(int imod){ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings isettings, int imod){ #ifdef VERBOSE - std::cout<< "slsDetector setSettings "<< std::endl; + printf( "slsDetector setSettings \n" ); #endif //only set client shared memory variable for Eiger, settings threshold loads the module data (trimbits, dacs etc.) @@ -3564,7 +3562,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise if (isettings != thisDetector->currentSettings) { - std::cout<< "Unknown settings for this detector!" << std::endl; + printf( "Unknown settings for this detector! \n" ); }else{ if (imod<0) { modmi=0; @@ -3576,7 +3574,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise ostringstream ostfn, oscfn; myMod->module=im; - std::cout << std::endl << "Loading settings for module:" << im << std::endl; + printf( "\nLoading settings for module: %d \n", im ); //create file names switch(thisDetector->myDetectorType){ @@ -3586,7 +3584,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise ostfn << thisDetector->settingsDir << ssettings <<"/noise.sn" << setfill('0') << setw(3) << dec << getId(DETECTOR_SERIAL_NUMBER) << setbase(10); oscfn << thisDetector->calDir << ssettings << "/calibration.sn" << setfill('0') << setw(3) << dec << getId(DETECTOR_SERIAL_NUMBER) << setbase(10); #ifdef VERBOSE - std::cout<< thisDetector->settingsDir<calDir <settingsDir, thisDetector->calDir ); #endif break; case MOENCH: @@ -3599,7 +3597,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise ostfn << thisDetector->settingsDir << ssettings <<"/settings.sn";// << setfill('0') << setw(3) << hex << getId(MODULE_SERIAL_NUMBER, im) << setbase(10); oscfn << thisDetector->calDir << ssettings << "/calibration.sn";// << setfill('0') << setw(3) << hex << getId(MODULE_SERIAL_NUMBER, im) << setbase(10); #ifdef VERBOSE - std::cout<< thisDetector->settingsDir<calDir <settingsDir, thisDetector->calDir ); #endif break; default: @@ -3611,7 +3609,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise //settings file**** settingsfname=ostfn.str(); #ifdef VERBOSE - cout << "the settings file name is "<myDetectorType, iodelay, tau, myMod)) { //if it didnt open, try default settings file @@ -3631,11 +3629,11 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise } settingsfname=ostfn_default.str(); #ifdef VERBOSE - cout << settingsfname << endl; + printf( "%s \n", settingsfname.c_str() ); #endif if (NULL == readSettingsFile(settingsfname,thisDetector->myDetectorType, iodelay, tau, myMod)) { //if default doesnt work, return error - std::cout << "Could not open settings file" << endl; + printf( "Could not open settings file \n" ); setErrorMask((getErrorMask())|(SETTINGS_FILE_NOT_OPEN)); return thisDetector->currentSettings; } @@ -3647,7 +3645,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise if(thisDetector->myDetectorType != EIGER) { calfname=oscfn.str(); #ifdef VERBOSE - cout << "Specific file:"<< calfname << endl; + printf( "Specific file: %s \n", calfname.c_str() ); #endif //extra gain and offset if(thisDetector->nGain) @@ -3662,7 +3660,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise oscfn_default << thisDetector->calDir << ssettings << ssettings << ".cal"; calfname=oscfn_default.str(); #ifdef VERBOSE - cout << "Default file:" << calfname << endl; + printf( "Default file: %s \n", calfname.c_str() ); #endif //extra gain and offset if(thisDetector->nGain) @@ -3673,7 +3671,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise } //if default doesnt work, return error if(ret != OK){ - std::cout << "Could not open calibration file" << calfname << endl; + printf( "Could not open calibration file %s \n", calfname.c_str() ); setErrorMask((getErrorMask())|(SETTINGS_FILE_NOT_OPEN)); return thisDetector->currentSettings; } @@ -3701,7 +3699,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise } if (getSettings(imod) != isettings){ - std::cout << "Could not set settings" << endl; + printf( "Could not set settings \n" ); setErrorMask((getErrorMask())|(SETTINGS_NOT_SET)); } @@ -3737,7 +3735,7 @@ int slsDetector::updateDetectorNoWait() { n = controlSocket->ReceiveDataOnly(lastClientIP,sizeof(lastClientIP)); #ifdef VERBOSE - cout << "Updating detector last modified by " << lastClientIP << std::endl; + printf( "Updating detector last modified by %s \n", lastClientIP ); #endif n = controlSocket->ReceiveDataOnly(&nm,sizeof(nm)); thisDetector->nMod[X]=nm; @@ -3831,7 +3829,7 @@ int slsDetector::updateDetector() { controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else updateDetectorNoWait(); disconnectControl(); @@ -3853,7 +3851,7 @@ int slsDetector::startAcquisition(){ char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<< "Starting acquisition "<< std::endl; + printf( "Starting acquisition \n" ); #endif thisDetector->stoppedFlag=0; if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -3862,7 +3860,7 @@ int slsDetector::startAcquisition(){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -3881,7 +3879,7 @@ int slsDetector::stopAcquisition(){ char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<< "Stopping acquisition "<< std::endl; + printf( "Stopping acquisition \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (stopSocket) { @@ -3890,7 +3888,7 @@ int slsDetector::stopAcquisition(){ stopSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { stopSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectStop(); } @@ -3909,7 +3907,7 @@ int slsDetector::startReadOut(){ char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<< "Starting readout "<< std::endl; + printf( "Starting readout \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -3917,7 +3915,7 @@ int slsDetector::startReadOut(){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -3935,7 +3933,7 @@ slsDetectorDefs::runStatus slsDetector::getRunStatus(){ strcpy(mess,"aaaaa"); runStatus retval=ERROR; #ifdef VERBOSE - std::cout<< "Getting status "<< std::endl; + printf( "Getting status \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (stopSocket) { @@ -3943,14 +3941,14 @@ slsDetectorDefs::runStatus slsDetector::getRunStatus(){ stopSocket->SendDataOnly(&fnum,sizeof(fnum)); stopSocket->ReceiveDataOnly(&ret,sizeof(ret)); - //cout << "________:::____________" << ret << endl; + //printf( "________:::____________%d \n", ret ); if (ret==FAIL) { stopSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { stopSocket->ReceiveDataOnly(&retval,sizeof(retval)); - //cout << "____________________" << retval << endl; + //printf( "____________________ %d \n", retval ); } disconnectStop(); } @@ -3968,7 +3966,7 @@ int* slsDetector::readFrame(){ int* retval=NULL; #ifdef VERBOSE - std::cout<< "slsDetector: Reading frame "<< std::endl; + printf( "slsDetector: Reading frame \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -4004,11 +4002,11 @@ int* slsDetector::getDataFromDetector(int *retval){ #ifdef VERBOSE - std::cout<< "getting data "<< thisDetector->dataBytes << " " << nel<< std::endl; + printf( "getting data %d %d \n", thisDetector->dataBytes, nel ); #endif controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); #ifdef VERBOSE - cout << "ret=" << ret << endl; + printf( "ret=%d \n", ret ); #endif if (ret!=OK) { @@ -4016,11 +4014,11 @@ int* slsDetector::getDataFromDetector(int *retval){ // if(thisDetector->receiverOnlineFlag == OFFLINE_FLAG) if (ret==FAIL) { thisDetector->stoppedFlag=1; - std::cout<< "Detector returned: " << mess << " " << n << std::endl; + printf( "Detector returned: %s %d \n", mess, n ); } else { ; #ifdef VERBOSE - std::cout<< "Detector successfully returned: " << mess << " " << n << std::endl; + printf( "Detector successfully returned: %s %d \n", mess, n ); #endif } if ((!nodatadetectortype) && (r==NULL)){ @@ -4032,10 +4030,10 @@ int* slsDetector::getDataFromDetector(int *retval){ n=controlSocket->ReceiveDataOnly(retval,thisDetector->dataBytes); #ifdef VERBOSE - std::cout<< "Received "<< n << " data bytes" << std::endl; + printf( "Received %d data bytes \n", n ); #endif if (n!=thisDetector->dataBytes) { - std::cout<< "wrong data size received from detector: received " << n << " but expected " << thisDetector->dataBytes << std::endl; + printf( "wrong data size received from detector: received %d but expected %d \n", n, thisDetector->dataBytes ); thisDetector->stoppedFlag=1; ret=FAIL; if (r==NULL) { @@ -4044,7 +4042,7 @@ int* slsDetector::getDataFromDetector(int *retval){ return NULL; } } - // cout << "get data returning " << endl; + // printf( "get data returning \n" ); return retval; }; @@ -4061,7 +4059,7 @@ int* slsDetector::readAll(){ int i=0; #ifdef VERBOSE - std::cout<< "Reading all frames "<< std::endl; + printf( "Reading all frames \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -4070,20 +4068,20 @@ int* slsDetector::readAll(){ while ((retval=getDataFromDetector())){ i++; //#ifdef VERBOSE - std::cout<< i << std::endl; + printf(" %d \n", i ); //#else - //std::cout << "-" << flush ; + //fflush(stdout); //#endif dataQueue.push(retval); - std::cout<< "pushed" << std::endl; + printf( "pushed \n" ); } disconnectControl(); } } #ifdef VERBOSE - std::cout<< "received "<< i<< " frames" << std::endl; + printf( "received %d frames \n", i ); //#else - // std::cout << std::endl; + // printf( " \n" ); #endif return dataQueue.front(); // check what we return! @@ -4098,7 +4096,7 @@ int slsDetector::readAllNoWait(){ int fnum= F_READ_ALL; #ifdef VERBOSE - std::cout<< "Reading all frames "<< std::endl; + printf( "Reading all frames \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -4126,29 +4124,29 @@ int* slsDetector::startAndReadAll(){ #endif startAndReadAllNoWait(); //#ifdef VERBOSE - // std::cout<< "started" << std::endl; + // printf( "started \n" ); //#endif while ((retval=getDataFromDetector())){ #ifdef VERBOSE i++; - std::cout<< i << std::endl; + printf( "%d \n", i ); //#else - //std::cout<< "-" << flush; + //fflush(stdout); #endif dataQueue.push(retval); } disconnectControl(); #ifdef VERBOSE - std::cout<< "received "<< i<< " frames" << std::endl; + printf( "received %d frames \n", i ); //#else - // std::cout << std::endl; + // printf( " \n" ); #endif return dataQueue.front(); // check what we return! /* while ((retval=getDataFromDetectorNoWait())) i++; #ifdef VERBOSE - std::cout<< "Received " << i << " frames"<< std::endl; + printf( "Received %d frames \n", i ); #endif return dataQueue.front(); // check what we return! */ @@ -4162,12 +4160,12 @@ int slsDetector::startAndReadAllNoWait(){ int fnum= F_START_AND_READ_ALL; #ifdef VERBOSE - std::cout<< "Starting and reading all frames "<< std::endl; + printf( "Starting and reading all frames \n" ); #endif thisDetector->stoppedFlag=0; if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ - //std::cout<< "connected" << std::endl; + //printf( "connected \n" ); controlSocket->SendDataOnly(&fnum,sizeof(fnum)); return OK; } @@ -4183,11 +4181,11 @@ int slsDetector::startAndReadAllNoWait(){ // disconnectControl(); // #ifdef VERBOSE -// std::cout<< "Run finished "<< std::endl; +// printf( "Run finished " \n" ); // #endif // } else { // #ifdef VERBOSE -// std::cout<< "Frame received "<< std::endl; +// printf( "Frame received " \n" ); // #endif // } // } @@ -4224,7 +4222,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ #ifdef VERBOSE - std::cout<< "Setting timer "<< index << " to " << t << "ns/value" << std::endl; + printf( "Setting timer %d to %ld ns value \n", index , t ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -4234,7 +4232,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(DETECTOR_TIMER_VALUE_NOT_SET)); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -4244,13 +4242,13 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ if (ret==FORCE_UPDATE) { updateDetector(); #ifdef VERBOSE - std::cout<< "Updated!" << std::endl; + printf( "Updated! \n" ); #endif } } } else { - //std::cout<< "offline " << std::endl; + //printf( "offline \n" ); if (t>=0) thisDetector->timerValue[index]=t; if((thisDetector->myDetectorType==GOTTHARD)|| @@ -4264,14 +4262,14 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ thisDetector->timerValue[index]=t; } #ifdef VERBOSE - std::cout<< "Timer " << index << " set to "<< thisDetector->timerValue[index] << "ns" << std::endl; + printf( "Timer %d set to %ldns \n", index, thisDetector->timerValue[index] ); #endif if(t!=-1){ if ((thisDetector->myDetectorType==MYTHEN)&&(index==PROBES_NUMBER)) { setDynamicRange(); - //cout << "Changing probes: data size = " << thisDetector->dataBytes <dataBytes); } /* set progress */ @@ -4309,7 +4307,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ //set #frames, #cycles if((index==FRAME_NUMBER)||(index==CYCLES_NUMBER)){ #ifdef VERBOSE - std::cout << "Setting/Getting number of frames*cycles " << index <<" to/from receiver " << args[1] << std::endl; + printf( "Setting/Getting number of frames*cycles %d to/from receiver %ld \n", index, args[1] ); #endif if(thisDetector->timerValue[CYCLES_NUMBER]==0) args[1] = thisDetector->timerValue[FRAME_NUMBER]; @@ -4320,9 +4318,9 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ else{ #ifdef VERBOSE if(index==ACQUISITION_TIME) - std::cout << "Setting/Getting acquisition time " << index << " to/from receiver " << args[1] << std::endl; + printf( "Setting/Getting acquisition time %d to/from receiver %ld \n", index, args[1] ); else - std::cout << "Setting/Getting acquisition period " << index << " to/from receiver " << args[1] << std::endl; + printf( "Setting/Getting acquisition period %d to/from receiver %ld \n", index, args[1] ); #endif } @@ -4335,15 +4333,15 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ ret = FAIL; if(index==ACQUISITION_TIME){ if(strstr(mess,"receiver not idle")==NULL) - cout << "ERROR:Acquisition Time in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; + printf( "ERROR:Acquisition Time in receiver set incorrectly to %ld instead of %ld \n", retval, args[1] ); setErrorMask((getErrorMask())|(RECEIVER_ACQ_TIME_NOT_SET)); }else if(index==FRAME_PERIOD){ if(strstr(mess,"receiver not idle")==NULL) - cout << "ERROR:Acquisition Period in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; + printf( "ERROR:Acquisition Period in receiver set incorrectly to %ld instead of %ld \n", retval, args[1] ); setErrorMask((getErrorMask())|(RECEIVER_ACQ_PERIOD_NOT_SET)); }else{ if(strstr(mess,"receiver not idle")==NULL) - cout << "ERROR:Number of Frames (* Number of cycles) in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; + printf( "ERROR:Number of Frames (* Number of cycles) in receiver set incorrectly to %ld instead of %ld \n", retval, args[1] ); setErrorMask((getErrorMask())|(RECEIVER_FRAME_NUM_NOT_SET)); } } @@ -4368,7 +4366,7 @@ int slsDetector::lockServer(int lock) { controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } @@ -4397,7 +4395,7 @@ string slsDetector::getLastClientIP() { controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { controlSocket->ReceiveDataOnly(clientName,sizeof(clientName)); } @@ -4428,14 +4426,13 @@ int slsDetector::setPort(portType index, int num){ s=controlSocket; retval=thisDetector->controlPort; #ifdef VERBOSE - cout << "s="<< s<< endl; - cout << thisDetector->controlPort<< " " << " " << thisDetector->stopPort << endl; + printf( " %d %d \n", thisDetector->controlPort, thisDetector->stopPort ); #endif if (s==NULL) { #ifdef VERBOSE - cout << "s=NULL"<< endl; - cout << thisDetector->controlPort<< " " << " " << thisDetector->stopPort << endl; + printf( "s=NULL \n" ); + printf( " %d %d \n", thisDetector->controlPort, thisDetector->stopPort ); #endif setTCPSocket("",DEFAULT_PORTNO); } @@ -4443,8 +4440,8 @@ int slsDetector::setPort(portType index, int num){ s=controlSocket; } else { #ifdef VERBOSE - cout << "still cannot connect!"<< endl; - cout << thisDetector->controlPort<< " " << " " << thisDetector->stopPort << endl; + printf( "still cannot connect! \n" ); + printf( " %d %d \n", thisDetector->controlPort, thisDetector->stopPort ); #endif setTCPSocket("",retval); @@ -4456,7 +4453,7 @@ int slsDetector::setPort(portType index, int num){ return thisDetector->controlPort; //reusable port, so print error else if((num==thisDetector->stopPort)||(num==thisDetector->receiverTCPPort)){ - std::cout<< "Can not connect to port in use " << std::endl; + printf( "Can not connect to port in use \n" ); setErrorMask((getErrorMask())|(COULDNOT_SET_CONTROL_PORT)); return thisDetector->controlPort; } @@ -4477,7 +4474,7 @@ int slsDetector::setPort(portType index, int num){ return thisDetector->receiverTCPPort; //reusable port, so print error else if((num==thisDetector->stopPort)||(num==thisDetector->controlPort)){ - std::cout<< "Can not connect to port in use " << std::endl; + printf( "Can not connect to port in use \n" ); setErrorMask((getErrorMask())|(COULDNOT_SET_DATA_PORT)); return thisDetector->receiverTCPPort; } @@ -4497,7 +4494,7 @@ int slsDetector::setPort(portType index, int num){ return thisDetector->stopPort; //reusable port, so print error else if((num==thisDetector->receiverTCPPort)||(num==thisDetector->controlPort)){ - std::cout<< "Can not connect to port in use " << std::endl; + printf( "Can not connect to port in use \n" ); setErrorMask((getErrorMask())|(COULDNOT_SET_STOP_PORT)); return thisDetector->stopPort; } @@ -4523,17 +4520,17 @@ int slsDetector::setPort(portType index, int num){ s->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { s->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { s->ReceiveDataOnly(&retval,sizeof(retval)); } s->Disconnect(); }else{ if (index == CONTROL_PORT){ - std::cout << "cannot connect to detector" << endl; + printf( "cannot connect to detector \n" ); setErrorMask((getErrorMask())|(CANNOT_CONNECT_TO_DETECTOR)); }else if (index == DATA_PORT){ - std::cout << "cannot connect to receiver" << endl; + printf( "cannot connect to receiver \n" ); setErrorMask((getErrorMask())|(CANNOT_CONNECT_TO_RECEIVER)); } } @@ -4561,7 +4558,7 @@ int slsDetector::setPort(portType index, int num){ break; } #ifdef VERBOSE - cout << "ret is ok" << endl; + printf( "ret is ok \n" ); #endif } else { @@ -4611,7 +4608,7 @@ int slsDetector::setPort(portType index, int num){ #ifdef VERBOSE - cout << thisDetector->controlPort<< " " << thisDetector->receiverTCPPort << " " << thisDetector->stopPort << endl; + printf( " %d %d %d \n", thisDetector->controlPort, thisDetector->receiverTCPPort, thisDetector->stopPort ); #endif @@ -4659,14 +4656,14 @@ int slsDetector::setTotalProgress() { thisDetector->totalProgress=nf*nc*npos*nm*nscan[0]*nscan[1]; #ifdef VERBOSE - cout << "nc " << nc << endl; - cout << "nm " << nm << endl; - cout << "nf " << nf << endl; - cout << "npos " << npos << endl; - cout << "nscan[0] " << nscan[0] << endl; - cout << "nscan[1] " << nscan[1] << endl; + printf( "nc %d \n", nc ); + printf( "nm %d \n", nm ); + printf( "nf %d \n", nf ); + printf( "npos %d \n", npos ); + printf( "nscan[0] %d \n", nscan[0] ); + printf( "nscan[1] %d \n", nscan[1] ); - cout << "Set total progress " << thisDetector->totalProgress << endl; + printf( "Set total progress %d \n", thisDetector->totalProgress); #endif return thisDetector->totalProgress; } @@ -4710,7 +4707,7 @@ int slsDetector::setSpeed(speedVariable sp, int value) { int ret=OK; int n=0; #ifdef VERBOSE - std::cout<< "Setting speed variable"<< sp << " to " << value << std::endl; + printf( "Setting speed variable %d to %d \n", sp, value ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -4718,12 +4715,12 @@ int slsDetector::setSpeed(speedVariable sp, int value) { controlSocket->SendDataOnly(&sp,sizeof(sp)); n=controlSocket->SendDataOnly(&value,sizeof(value)); #ifdef VERBOSE - std::cout<< "Sent "<< n << " bytes " << std::endl; + printf( "Sent %d bytes \n", n ); #endif controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(COULD_NOT_SET_SPEED_PARAMETERS)); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -4734,7 +4731,7 @@ int slsDetector::setSpeed(speedVariable sp, int value) { } } #ifdef VERBOSE - std::cout<< "Speed set to "<< retval << std::endl; + printf( "Speed set to %d \n", retval ); #endif return retval; @@ -4752,7 +4749,7 @@ int64_t slsDetector::getTimeLeft(timerIndex index){ int ret=OK; #ifdef VERBOSE - std::cout<< "Getting timer "<< index << std::endl; + printf( "Getting timer %d \n", index ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (stopSocket) { @@ -4762,7 +4759,7 @@ int64_t slsDetector::getTimeLeft(timerIndex index){ stopSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { stopSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { stopSocket->ReceiveDataOnly(&retval,sizeof(retval)); } @@ -4771,7 +4768,7 @@ int64_t slsDetector::getTimeLeft(timerIndex index){ } } #ifdef VERBOSE - std::cout<< "Time left is "<< retval << std::endl; + printf( "Time left is %ld \n", retval ); #endif return retval; @@ -4781,14 +4778,14 @@ int64_t slsDetector::getTimeLeft(timerIndex index){ // Flags int slsDetector::setDynamicRange(int n){ - // cout << "single " << endl; + // printf( "single \n" ); int fnum=F_SET_DYNAMIC_RANGE,fnum2=F_SET_RECEIVER_DYNAMIC_RANGE; int retval=-1,retval1; char mess[MAX_STR_LENGTH]=""; int ret=OK, rateret=OK; #ifdef VERBOSE - std::cout<< "Setting dynamic range to "<< n << std::endl; + printf( "Setting dynamic range to %d\n", n ); #endif if ((thisDetector->myDetectorType == MYTHEN) &&(n==24)) n=32; @@ -4804,7 +4801,7 @@ int slsDetector::setDynamicRange(int n){ controlSocket->ReceiveDataOnly(&rateret,sizeof(rateret)); if (rateret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); if(strstr(mess,"Rate Correction")!=NULL){ if(strstr(mess,"32")!=NULL) setErrorMask((getErrorMask())|(RATE_CORRECTION_NOT_32or16BIT)); @@ -4816,7 +4813,7 @@ int slsDetector::setDynamicRange(int n){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } @@ -4855,8 +4852,8 @@ int slsDetector::setDynamicRange(int n){ #ifdef VERBOSE - std::cout<< "Dynamic range set to "<< thisDetector->dynamicRange << std::endl; - std::cout<< "Data bytes "<< thisDetector->dataBytes << std::endl; + printf( "Dynamic range set to %d \n", thisDetector->dynamicRange ); + printf( "Data bytes %d \n", thisDetector->dataBytes ); #endif } @@ -4867,7 +4864,7 @@ int slsDetector::setDynamicRange(int n){ if((n==-1) && (ret!= FORCE_UPDATE)) n =-1; if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending/Getting dynamic range to/from receiver " << n << std::endl; + printf( "Sending/Getting dynamic range to/from receiver %d\n", n ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum2,retval1,n); @@ -4875,7 +4872,7 @@ int slsDetector::setDynamicRange(int n){ } if ((ret==FAIL) || (retval1 != retval)){ ret = FAIL; - cout << "ERROR:Dynamic range in receiver set incorrectly to " << retval1 << " instead of " << retval << endl; + printf( "ERROR:Dynamic range in receiver set incorrectly to %d instead of %d\n", retval1, retval ); setErrorMask((getErrorMask())|(RECEIVER_DYNAMIC_RANGE)); } if(ret==FORCE_UPDATE) @@ -4935,11 +4932,11 @@ int slsDetector::sendROI(int n,ROI roiLimits[]){ controlSocket->SendDataOnly(&arg,sizeof(arg)); if(arg==-1){; #ifdef VERBOSE - cout << "Getting ROI from detector" << endl; + printf( "Getting ROI from detector \n" ); #endif }else{ #ifdef VERBOSE - cout << "Sending ROI of size " << arg << " to detector" << endl; + printf( "Sending ROI of size %d to detector \n", arg ); #endif controlSocket->SendDataOnly(roiLimits,arg*sizeof(ROI)); } @@ -4948,13 +4945,13 @@ int slsDetector::sendROI(int n,ROI roiLimits[]){ if (ret!=FAIL){ controlSocket->ReceiveDataOnly(&retvalsize,sizeof(retvalsize)); nrec = controlSocket->ReceiveDataOnly(retval,retvalsize*sizeof(ROI)); - if(nrec!=(retvalsize*sizeof(ROI))){ + if(nrec!=(retvalsize*(int)sizeof(ROI))){ ret=FAIL; - std::cout << " wrong size received: received " << nrec << "but expected " << retvalsize*sizeof(ROI) << endl; + printf( " wrong size received: received %d but expected %d \n", nrec, retvalsize*(int)sizeof(ROI) ); } }else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -4971,7 +4968,7 @@ int slsDetector::sendROI(int n,ROI roiLimits[]){ #ifdef VERBOSE for(int j=0;jnROI;j++) - cout<onlineFlag==ONLINE_FLAG) { @@ -5010,7 +5007,7 @@ int slsDetector::setReadOutFlags(readOutFlags flag){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(COULD_NOT_SET_READOUT_FLAGS)); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -5026,7 +5023,7 @@ int slsDetector::setReadOutFlags(readOutFlags flag){ } #ifdef VERBOSE - std::cout<< "Readout flag set to "<< retval << std::endl; + printf( "Readout flag set to %d \n", retval ); #endif return thisDetector->roFlags; }; @@ -5054,14 +5051,14 @@ int slsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod){ #ifdef VERBOSE - std::cout<< "Trimming module " << imod << " with mode "<< mode << " parameters " << par1 << " " << par2 << std::endl; + printf( "Trimming module %d with mode %d parameters %d %d \n", imod, mode, par1, par2 ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); #ifdef VERBOSE - std::cout<< "sending mode bytes= "<< controlSocket->SendDataOnly(&mode,sizeof(mode)) << std::endl; + printf( "sending mode bytes= %d \n", controlSocket->SendDataOnly(&mode,sizeof(mode)) ); #endif controlSocket->SendDataOnly(&mode,sizeof(mode)); controlSocket->SendDataOnly(arg,sizeof(arg)); @@ -5069,10 +5066,10 @@ int slsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { #ifdef VERBOSE - std::cout<< "Detector trimmed "<< ret << std::endl; + printf( "Detector trimmed %d \n", ret ); #endif /* controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -5188,7 +5185,7 @@ double* slsDetector::decodeData(int *datain, double *fdata) { #ifdef VERBOSE - std::cout<< "decoded "<< ichan << " channels" << std::endl; + printf( "decoded %d channels \n", ichan ); #endif return dataout; @@ -5223,7 +5220,7 @@ int slsDetector::setFlatFieldCorrection(string fname) if (fname=="") { #ifdef VERBOSE - std::cout<< "disabling flat field correction" << std::endl; + printf( "disabling flat field correction \n" ); #endif thisDetector->correctionMask&=~(1<nMod[X]*thisDetector->nChans*thisDetector->nChips; ichan++) { // #ifdef VERBOSE - // std::cout<< ichan << " "<< corr[ichan] << std::endl; + // printf( "%d %f \n", ichan, corr[ichan] ); // #endif ffcoefficients[ichan]=corr[ichan]; if (ecorr!=NULL) @@ -5289,13 +5286,13 @@ int slsDetector::setFlatFieldCorrection(double *corr, double *ecorr) { else fferrors[ichan]=1; - cout << ichan << " " << ffcoefficients[ichan] << endl; + printf( " %d %f \n", ichan, ffcoefficients[ichan] ); } thisDetector->correctionMask|=(1<correctionMask&=~(1<correctionMask)&(1<correctionMask)&(1<correctionMask&(1<nMod[X]*thisDetector->nMod[Y]*thisDetector->nChans*thisDetector->nChips; ichan++) { @@ -5329,7 +5326,7 @@ int slsDetector::getFlatFieldCorrection(double *corr, double *ecorr) { return 1; } else { #ifdef VERBOSE - std::cout<< "Flat field correction is disabled" << std::endl; + printf( "Flat field correction is disabled \n" ); #endif if (corr) for (int ichan=0; ichannMod[X]*thisDetector->nMod[Y]*thisDetector->nChans*thisDetector->nChips; ichan++) { @@ -5345,7 +5342,7 @@ int slsDetector::getFlatFieldCorrection(double *corr, double *ecorr) { int slsDetector::flatFieldCorrect(double* datain, double *errin, double* dataout, double *errout){ #ifdef VERBOSE - std::cout<< "Flat field correcting data" << std::endl; + printf( "Flat field correcting data \n" ); #endif double e, eo; if (thisDetector->correctionMask & (1<onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -5385,7 +5381,7 @@ int slsDetector::setRateCorrection(double t){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); if(strstr(mess,"default tau")!=NULL) setErrorMask((getErrorMask())|(RATE_CORRECTION_NO_TAU_PROVIDED)); if(strstr(mess,"32")!=NULL) @@ -5406,7 +5402,7 @@ int slsDetector::setRateCorrection(double t){ double tdead[]=defaultTDead; if (t==0) { #ifdef VERBOSE - std::cout<< "unsetting rate correction" << std::endl; + printf( "unsetting rate correction \n" ); #endif thisDetector->correctionMask&=~(1<tDead=0; } #ifdef VERBOSE - std::cout<< "Setting rate correction with dead time "<< thisDetector->tDead << std::endl; + printf( "Setting rate correction with dead time %f \n", thisDetector->tDead ); #endif } return thisDetector->correctionMask&(1<correctionMask&(1<tDead << std::endl; + printf( "Rate correction is enabled with dead time %f \n", thisDetector->tDead ); #endif t=thisDetector->tDead; return 1; } else t=0; #ifdef VERBOSE - std::cout<< "Rate correction is disabled " << std::endl; + printf( "Rate correction is disabled \n" ); #endif return 0; }; @@ -5458,7 +5454,7 @@ double slsDetector::getRateCorrectionTau(){ char mess[MAX_STR_LENGTH]=""; int64_t retval = -1; #ifdef VERBOSE - std::cout<< "Setting Rate Correction to " << arg << endl; + printf( "Getting Rate Correction \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -5468,7 +5464,7 @@ double slsDetector::getRateCorrectionTau(){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -5483,13 +5479,13 @@ double slsDetector::getRateCorrectionTau(){ //mythen only if (thisDetector->correctionMask&(1<tDead << std::endl; + printf( "Rate correction is enabled with dead time %f \n", thisDetector->tDead ); #endif return thisDetector->tDead; //return 1; } else #ifdef VERBOSE - std::cout<< "Rate correction is disabled " << std::endl; + printf( "Rate correction is disabled \n" ); #endif return 0; }; @@ -5521,7 +5517,7 @@ int slsDetector::rateCorrect(double* datain, double *errin, double* dataout, dou double e; if (thisDetector->correctionMask&(1<nMod[X]*thisDetector->nMod[Y]*thisDetector->nChans*thisDetector->nChips; ichan++) { @@ -5576,7 +5572,7 @@ int slsDetector::setBadChannelCorrection(string fname){ int slsDetector::setBadChannelCorrection(int nch, int *chs, int ff) { #ifdef VERBOSE - cout << "setting " << nch << " bad chans " << endl; + printf( "setting %d bad chans \n", nch ); #endif if (ff==0) { if (nch0) { @@ -5586,7 +5582,7 @@ int slsDetector::setBadChannelCorrection(int nch, int *chs, int ff) { if (chs[ich]>=0 && chs[ich]badChansList[ich]=chs[ich]; thisDetector->nBadChans++; - // cout << "det : " << thisDetector->nBadChans << " " << thisDetector->badChansList[ich] << endl; + // printf( "det : %d %d \n", thisDetector->nBadChans, thisDetector->badChansList[ich] ); } } } else @@ -5600,7 +5596,7 @@ int slsDetector::setBadChannelCorrection(int nch, int *chs, int ff) { } } #ifdef VERBOSE - cout << "badchans flag is "<< (thisDetector->correctionMask&(1<< DISCARD_BAD_CHANNELS)) << endl; + printf( "badchans flag is %d \n", (thisDetector->correctionMask&(1<< DISCARD_BAD_CHANNELS)) ); #endif // fillBadChannelMask(); if (thisDetector->correctionMask&(1<< DISCARD_BAD_CHANNELS)) { @@ -5654,9 +5650,9 @@ int slsDetector::exitServer(){ } } if (retval!=OK) { - std::cout<< std::endl; - std::cout<< "Shutting down the server" << std::endl; - std::cout<< std::endl; + printf( "\n" ); + printf( "Shutting down the server \n" ); + printf( "\n" ); } return retval; @@ -5745,17 +5741,17 @@ char* slsDetector::setDetectorMAC(string detectorMAC){ (detectorMAC[11]==':')&&(detectorMAC[14]==':')){ strcpy(thisDetector->detectorMAC,detectorMAC.c_str()); if(!strcmp(thisDetector->receiver_hostname,"none")) - std::cout << "Warning: Receiver hostname not set yet." << endl; + printf( "Warning: Receiver hostname not set yet. \n" ); else if(setUDPConnection()==FAIL) - std::cout<< "Warning: UDP connection set up failed" << std::endl; + printf( "Warning: UDP connection set up failed \n" ); }else{ setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - std::cout << "Warning: server MAC Address should be in xx:xx:xx:xx:xx:xx format" << endl; + printf( "Warning: server MAC Address should be in xx:xx:xx:xx:xx:xx format \n" ); } } else{ setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - std::cout << "Warning: server MAC Address should be in xx:xx:xx:xx:xx:xx format" << std::endl; + printf( "Warning: server MAC Address should be in xx:xx:xx:xx:xx:xx format \n" ); } return thisDetector->detectorMAC; @@ -5772,12 +5768,12 @@ char* slsDetector::setDetectorIP(string detectorIP){ if(result!=0){ strcpy(thisDetector->detectorIP,detectorIP.c_str()); if(!strcmp(thisDetector->receiver_hostname,"none")) - std::cout << "Warning: Receiver hostname not set yet." << endl; + printf( "Warning: Receiver hostname not set yet. \n" ); else if(setUDPConnection()==FAIL) - std::cout<< "Warning: UDP connection set up failed" << std::endl; + printf( "Warning: UDP connection set up failed \n" ); }else{ setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - std::cout << "Warning: Detector IP Address should be VALID and in xxx.xxx.xxx.xxx format" << std::endl; + printf( "Warning: Detector IP Address should be VALID and in xxx.xxx.xxx.xxx format \n" ); } } } @@ -5797,22 +5793,22 @@ char* slsDetector::setReceiver(string receiverIP){ if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Setting up receiver with" << endl; - std::cout << "detector type:" << slsDetectorBase::getDetectorType(thisDetector->myDetectorType) << endl; - std::cout << "detector hostname:" << thisDetector->hostname << endl; - std::cout << "file path:" << fileIO::getFilePath() << endl; - std::cout << "file name:" << fileIO::getFileName() << endl; - std::cout << "file index:" << fileIO::getFileIndex() << endl; + printf( "Setting up receiver with \n" ); + printf( "detector type: %s \n", slsDetectorBase::getDetectorType(thisDetector->myDetectorType).c_str() ); + printf( "detector hostname: %s \n", thisDetector->hostname ); + printf( "file path: %s \n", fileIO::getFilePath().c_str() ); + printf( "file name: %s \n", fileIO::getFileName().c_str() ); + printf( "file index: %d \n", fileIO::getFileIndex() ); pthread_mutex_lock(&ms); - std::cout << "write enable:" << parentDet->enableWriteToFileMask() << endl; - std::cout << "overwrite enable:" << parentDet->enableOverwriteMask() << endl; + printf( "write enable: %d \n", parentDet->enableWriteToFileMask()); + printf( "overwrite enable: %d \n", parentDet->enableOverwriteMask()); pthread_mutex_unlock(&ms); - std::cout << "frame index needed:" << ((thisDetector->timerValue[FRAME_NUMBER]*thisDetector->timerValue[CYCLES_NUMBER])>1) << endl; - std::cout << "frame period:" << thisDetector->timerValue[FRAME_PERIOD] << endl; - std::cout << "frame number:" << thisDetector->timerValue[FRAME_NUMBER] << endl; - std::cout << "dynamic range:" << thisDetector->dynamicRange << endl << endl; - std::cout << "10GbE:" << thisDetector->tenGigaEnable << endl << endl; - //std::cout << "dataStreaming:" << enableDataStreamingFromReceiver(-1) << endl << endl; + printf( "frame index needed: %d \n", ((thisDetector->timerValue[FRAME_NUMBER]*thisDetector->timerValue[CYCLES_NUMBER])>1)); + printf( "frame period: %ld \n", thisDetector->timerValue[FRAME_PERIOD]); + printf( "frame number: %ld \n", thisDetector->timerValue[FRAME_NUMBER]); + printf( "dynamic range: %d \n", thisDetector->dynamicRange ); + printf( "10GbE: %d \n\n", thisDetector->tenGigaEnable ); + //printf( "dataStreaming: %d \n\n", enableDataStreamingFromReceiver(-1) ); /** enable compresison, */ #endif if(setDetectorType()!= GENERIC){ @@ -5841,7 +5837,7 @@ char* slsDetector::setReceiver(string receiverIP){ setFlippedData(X,-1); activate(-1); } - //std::cout << "***********************************dataStreaming:" << parentDet->enableDataStreamingFromReceiver(-1) << endl << endl; + //printf( "***********************************dataStreaming: %d \n\n", parentDet->enableDataStreamingFromReceiver(-1) ); //parentDet->enableDataStreamingFromReceiver(parentDet->enableDataStreamingFromReceiver(-1)); //set scan tag setUDPConnection(); @@ -5864,13 +5860,15 @@ char* slsDetector::setReceiverUDPIP(string udpip){ int result = inet_pton(AF_INET, udpip.c_str(), &(sa.sin_addr)); if(result==0){ setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - std::cout << "Warning: Receiver UDP IP Address should be VALID and in xxx.xxx.xxx.xxx format" << std::endl; + printf( "Warning: Receiver UDP IP Address should be VALID and in xxx.xxx.xxx.xxx format \n" ); }else{ strcpy(thisDetector->receiverUDPIP,udpip.c_str()); if(!strcmp(thisDetector->receiver_hostname,"none")) - std::cout << "Warning: Receiver hostname not set yet." << endl; + printf("Warning: Receiver hostname not set yet.\n"); + //printf( "Warning: Receiver hostname not set yet. \n" ); else if(setUDPConnection()==FAIL){ - std::cout<< "Warning: UDP connection set up failed" << std::endl; + printf("Warning: UDP connection set up failed\n"); + //printf( "Warning: UDP connection set up failed \n" ); } } } @@ -5884,20 +5882,20 @@ char* slsDetector::setReceiverUDPIP(string udpip){ char* slsDetector::setReceiverUDPMAC(string udpmac){ if(udpmac.length()!=17){ setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - std::cout << "Warning: receiver udp mac address should be in xx:xx:xx:xx:xx:xx format" << std::endl; + printf( "Warning: receiver udp mac address should be in xx:xx:xx:xx:xx:xx format \n" ); } else{ if((udpmac[2]==':')&&(udpmac[5]==':')&&(udpmac[8]==':')&& (udpmac[11]==':')&&(udpmac[14]==':')){ strcpy(thisDetector->receiverUDPMAC,udpmac.c_str()); if(!strcmp(thisDetector->receiver_hostname,"none")) - std::cout << "Warning: Receiver hostname not set yet." << endl; + printf( "Warning: Receiver hostname not set yet. \n" ); else if(setUDPConnection()==FAIL){ - std::cout<< "Warning: UDP connection set up failed" << std::endl; + printf( "Warning: UDP connection set up failed \n" ); } }else{ setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - std::cout << "Warning: receiver udp mac address should be in xx:xx:xx:xx:xx:xx format" << std::endl; + printf( "Warning: receiver udp mac address should be in xx:xx:xx:xx:xx:xx format \n" ); } } @@ -5910,9 +5908,9 @@ char* slsDetector::setReceiverUDPMAC(string udpmac){ int slsDetector::setReceiverUDPPort(int udpport){ thisDetector->receiverUDPPort = udpport; if(!strcmp(thisDetector->receiver_hostname,"none")) - std::cout << "Warning: Receiver hostname not set yet." << endl; + printf( "Warning: Receiver hostname not set yet. \n" ); else if(setUDPConnection()==FAIL){ - std::cout<< "Warning: UDP connection set up failed" << std::endl; + printf( "Warning: UDP connection set up failed \n" ); } return thisDetector->receiverUDPPort; } @@ -5920,9 +5918,9 @@ int slsDetector::setReceiverUDPPort(int udpport){ int slsDetector::setReceiverUDPPort2(int udpport){ thisDetector->receiverUDPPort2 = udpport; if(!strcmp(thisDetector->receiver_hostname,"none")) - std::cout << "Warning: Receiver hostname not set yet." << endl; + printf( "Warning: Receiver hostname not set yet. \n" ); else if(setUDPConnection()==FAIL){ - std::cout<< "Warning: UDP connection set up failed" << std::endl; + printf( "Warning: UDP connection set up failed \n" ); } return thisDetector->receiverUDPPort2; } @@ -5936,7 +5934,7 @@ char* slsDetector::setDetectorNetworkParameter(networkParameter index, int delay char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<< "Setting Transmission delay of mode "<< index << " to " << delay << std::endl; + printf( "Setting Transmission delay of mode %d to %d \n", index, delay ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -5946,7 +5944,7 @@ char* slsDetector::setDetectorNetworkParameter(networkParameter index, int delay controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(DETECTOR_NETWORK_PARAMETER)); } else controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -5956,7 +5954,7 @@ char* slsDetector::setDetectorNetworkParameter(networkParameter index, int delay } } #ifdef VERBOSE - std::cout<< "Speed set to "<< retval << std::endl; + printf( "Speed set to %d\n", retval ); #endif @@ -5974,7 +5972,7 @@ int slsDetector::setUDPConnection(){ //called before set up if(!strcmp(thisDetector->receiver_hostname,"none")){ - std::cout << "Warning: Receiver hostname not set yet." << endl; + printf( "Warning: Receiver hostname not set yet. \n" ); return FAIL; } @@ -5987,8 +5985,8 @@ int slsDetector::setUDPConnection(){ else{ struct hostent *he = gethostbyname(thisDetector->receiver_hostname); if (he == NULL){ - cout<<"rx_hostname:"<receiver_hostname<receiver_hostname ); + printf( "no rx_udpip given and could not convert receiver hostname to ip \n" ); return FAIL; }else strcpy(thisDetector->receiverUDPIP,inet_ntoa(*(struct in_addr*)he->h_addr)); @@ -6001,15 +5999,15 @@ int slsDetector::setUDPConnection(){ sprintf(args[1],"%d",thisDetector->receiverUDPPort); sprintf(args[2],"%d",thisDetector->receiverUDPPort2); #ifdef VERBOSE - std::cout << "Receiver udp ip address: " << thisDetector->receiverUDPIP << std::endl; - std::cout << "Receiver udp port: " << thisDetector->receiverUDPPort << std::endl; - std::cout << "Receiver udp port2: " << thisDetector->receiverUDPPort2 << std::endl; + printf( "Receiver udp ip address: %s \n",thisDetector->receiverUDPIP ); + printf( "Receiver udp port: %d \n",thisDetector->receiverUDPPort ); + printf( "Receiver udp port2: %d \n", thisDetector->receiverUDPPort2 ); #endif //set up receiver for UDP Connection and get receivermac address if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Setting up UDP Connection for Receiver " << args[0] << "\t" << args[1] << std::endl; + printf( "Setting up UDP Connection for Receiver %s\t%s \n", args[0], args[1] ); #endif if (connectData() == OK){ ret=thisReceiver->sendUDPDetails(fnum,retval,args); @@ -6019,7 +6017,7 @@ int slsDetector::setUDPConnection(){ strcpy(thisDetector->receiverUDPMAC,retval); #ifdef VERBOSE - std::cout << "Receiver mac address: " << thisDetector->receiverUDPMAC << std::endl; + printf( "Receiver mac address: %s \n", thisDetector->receiverUDPMAC ); #endif if(ret==FORCE_UPDATE) updateReceiver(); @@ -6027,7 +6025,7 @@ int slsDetector::setUDPConnection(){ //configure detector with udp details, -100 is so it doesnt overwrite the previous value if(configureMAC()==FAIL){ setReceiverOnline(OFFLINE_FLAG); - std::cout << "could not configure mac" << endl; + printf( "could not configure mac \n" ); } } }else @@ -6060,7 +6058,7 @@ int slsDetector::configureMAC(){ if (he != NULL) strcpy(thisDetector->receiverUDPIP,inet_ntoa(*(struct in_addr*)he->h_addr)); else{ - std::cout << "configure mac failed. no rx_udpip given and invalid receiver hostname" << endl; + printf( "configure mac failed. no rx_udpip given and invalid receiver hostname \n" ); setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); return FAIL; } @@ -6074,20 +6072,20 @@ int slsDetector::configureMAC(){ sprintf(arg[5],"%x",thisDetector->receiverUDPPort2); #ifdef VERBOSE - std::cout<< "Configuring MAC"<< std::endl; + printf( "Configuring MAC \n" ); #endif for(i=0;i<2;i++){ if(!strcmp(arg[i],"none")){ - std::cout<< "Configure MAC Error. IP/MAC Addresses not set"<< std::endl; + printf( "Configure MAC Error. IP/MAC Addresses not set \n" ); setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); return FAIL; } } #ifdef VERBOSE - std::cout<< "IP/MAC Addresses valid "<< std::endl; + printf( "IP/MAC Addresses valid \n" ); #endif @@ -6103,7 +6101,7 @@ int slsDetector::configureMAC(){ bzero(arg[0], 50); strcpy(arg[0],cword); #ifdef VERBOSE - std::cout<<"receiver udp ip:"<ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL){ controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); } else @@ -6184,7 +6182,7 @@ int slsDetector::configureMAC(){ } if (ret==FAIL) { ret=FAIL; - std::cout<< "Configuring MAC failed " << std::endl; + printf( "Configuring MAC failed \n" ); setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); } else if (thisDetector->myDetectorType==GOTTHARD){ @@ -6198,7 +6196,7 @@ int slsDetector::configureMAC(){ //connect to receiver if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending adc val to receiver " << retval << std::endl; + printf( "Sending adc val to receiver %d\n", retval ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum2,retval,retval); @@ -6279,19 +6277,19 @@ int slsDetector::loadImageToDetector(imageType index,string const fname){ short int arg[thisDetector->nChans*thisDetector->nChips]; #ifdef VERBOSE - std::cout<< std::endl<< "Loading "; + printf( "\n Loading " ); if(!index) - std::cout<<"Dark"; + printf( "Dark"); else - std::cout<<"Gain"; - std::cout<<" image from file " << fname << std::endl; + printf( "Gain"); + printf( " image from file %s \n", fname.c_str() ); #endif if(readDataFile(fname,arg)){ ret = sendImageToDetector(index,arg); return ret; } - std::cout<< "Could not open file "<< fname << std::endl; + printf( "Could not open file %s \n", fname.c_str() ); return ret; } @@ -6304,7 +6302,7 @@ int slsDetector::sendImageToDetector(imageType index,short int imageVals[]){ char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<<"Sending image to detector " <onlineFlag==ONLINE_FLAG) { @@ -6317,7 +6315,7 @@ int slsDetector::sendImageToDetector(imageType index,short int imageVals[]){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -6342,7 +6340,7 @@ int slsDetector::getCounterBlock(short int arg[],int startACQ){ controlSocket->ReceiveDataOnly(arg,thisDetector->dataBytes); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -6360,10 +6358,10 @@ int slsDetector::writeCounterBlockFile(string const fname,int startACQ){ short int counterVals[thisDetector->nChans*thisDetector->nChips]; #ifdef VERBOSE - std::cout<< std::endl<< "Reading Counter to \""<onlineFlag==ONLINE_FLAG) { @@ -6394,7 +6392,7 @@ int slsDetector::resetCounterBlock(int startACQ){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL){ controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -6416,11 +6414,11 @@ int slsDetector::setCounterBit(int i){ if(thisDetector->onlineFlag==ONLINE_FLAG){ #ifdef VERBOSE if(i ==-1) - std::cout<< "Getting counter bit from detector" << endl; + printf( "Getting counter bit from detector \n" ); else if(i==0) - std::cout<< "Resetting counter bit in detector " << endl; + printf( "Resetting counter bit in detector \n" ); else - std::cout<< "Setting counter bit in detector " << endl; + printf( "Setting counter bit in detector \n" ); #endif if (connectControl() == OK){ @@ -6429,7 +6427,7 @@ int slsDetector::setCounterBit(int i){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL){ controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; + printf( "Receiver returned error: %s \n", mess ); setErrorMask((getErrorMask())|(COULD_NOT_SET_COUNTER_BIT)); } controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -6450,19 +6448,19 @@ int slsDetector::setCounterBit(int i){ int slsDetector::printReceiverConfiguration(){ - std::cout << "Detector IP:\t\t" << getNetworkParameter(DETECTOR_IP) << std::endl; - std::cout << "Detector MAC:\t\t" << getNetworkParameter(DETECTOR_MAC) << std::endl; + printf( "Detector IP:\t\t %s \n", getNetworkParameter(DETECTOR_IP) ); + printf( "Detector MAC:\t\t %s \n", getNetworkParameter(DETECTOR_MAC) ); - std::cout << "Receiver Hostname:\t" << getNetworkParameter(RECEIVER_HOSTNAME) << std::endl; - std::cout << "Receiver UDP IP:\t" << getNetworkParameter(RECEIVER_UDP_IP) << std::endl; - std::cout << "Receiver UDP MAC:\t" << getNetworkParameter(RECEIVER_UDP_MAC) << std::endl; + printf( "Receiver Hostname:\t %s \n", getNetworkParameter(RECEIVER_HOSTNAME) ); + printf( "Receiver UDP IP:\t %s \n", getNetworkParameter(RECEIVER_UDP_IP) ); + printf( "Receiver UDP MAC:\t %s \n", getNetworkParameter(RECEIVER_UDP_MAC) ); - std::cout << "Receiver UDP Port:\t" << getNetworkParameter(RECEIVER_UDP_PORT) << std::endl; + printf( "Receiver UDP Port:\t %s \n", getNetworkParameter(RECEIVER_UDP_PORT) ); if(thisDetector->myDetectorType == EIGER) - std::cout << "Receiver UDP Port2:\t" << getNetworkParameter(RECEIVER_UDP_PORT2) << std::endl; + printf( "Receiver UDP Port2:\t %s \n", getNetworkParameter(RECEIVER_UDP_PORT2) ); - std::cout << std::endl; + printf( " \n" ); return OK; } @@ -6481,18 +6479,18 @@ int slsDetector::readConfigurationFile(string const fname){ string sargname, sargval; int iline=0; #ifdef VERBOSE - std::cout<< "config file name "<< fname << std::endl; + printf( "config file name %s \n", fname.c_str() ); #endif infile.open(fname.c_str(), ios_base::in); if (infile.is_open()) { iline=readConfigurationFile(infile); infile.close(); } else { - std::cout<< "Error opening configuration file " << fname << " for reading" << std::endl; + printf( "Error opening configuration file %s for reading \n", fname.c_str() ); return FAIL; } #ifdef VERBOSE - std::cout<< "Read configuration file of " << iline << " lines" << std::endl; + printf( "Read configuration file of %d lines \n", iline ); #endif return OK; @@ -6521,17 +6519,17 @@ int slsDetector::readConfigurationFile(ifstream &infile){ getline(infile,str); iline++; #ifdef VERBOSE - std::cout<< str << std::endl; + printf( "<< str \n" ); #endif if (str.find('#')!=string::npos) { #ifdef VERBOSE - std::cout<< "Line is a comment " << std::endl; - std::cout<< str << std::endl; + printf( "Line is a comment \n" ); + printf( "<< str \n" ); #endif continue; } else if (str.length()<2) { #ifdef VERBOSE - std::cout<< "Empty line " << std::endl; + printf( "Empty line \n" ); #endif continue; } else { @@ -6541,7 +6539,7 @@ int slsDetector::readConfigurationFile(ifstream &infile){ ssstr >> sargname; //if (ssstr.good()) { #ifdef VERBOSE - std::cout<< iargval << " " << sargname << std::endl; + printf( "%d %s \n", iargval, sargname.c_str() ); #endif strcpy(myargs[iargval],sargname.c_str()); args[iargval]=myargs[iargval]; @@ -6550,7 +6548,7 @@ int slsDetector::readConfigurationFile(ifstream &infile){ } ans=cmd->executeLine(iargval,args,PUT_ACTION); #ifdef VERBOSE - std::cout<< ans << std::endl; + printf( "%s \n", ans.c_str() ); #endif } iline++; @@ -6581,11 +6579,11 @@ int slsDetector::writeConfigurationFile(string const fname){ outfile.close(); } else { - std::cout<< "Error opening configuration file " << fname << " for writing" << std::endl; + printf( "Error opening configuration file %s for writing\n", fname.c_str() ); return FAIL; } #ifdef VERBOSE - std::cout<< "wrote " <=0) outfile << id << ":"; - outfile << args[0] << " " << cmd->executeLine(1,args,GET_ACTION) << std::endl; + outfile << args[0] << " " << cmd->executeLine(1,args,GET_ACTION) << endl; } } else { strcpy(args[0],names[iv].c_str()); if (id>=0) outfile << id << ":"; - outfile << names[iv] << " " << cmd->executeLine(1,args,GET_ACTION) << std::endl; + outfile << names[iv] << " " << cmd->executeLine(1,args,GET_ACTION) << endl; } } delete cmd; @@ -6706,12 +6704,11 @@ int slsDetector::programFPGA(string fname){ int ret=FAIL; int fnum=F_PROGRAM_FPGA; char mess[MAX_STR_LENGTH]=""; - int64_t retval = -1; size_t filesize=0; char* fpgasrc = NULL; if(thisDetector->myDetectorType != JUNGFRAU){ - std::cout << "Not implemented for this detector" << std::endl; + printf( "Not implemented for this detector \n" ); return FAIL; } @@ -6719,7 +6716,7 @@ int slsDetector::programFPGA(string fname){ //check if it exists struct stat st; if(stat(fname.c_str(),&st)){ - std::cout << "Programming file does not exist" << endl; + printf( "Programming file does not exist \n" ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); return FAIL; } @@ -6732,7 +6729,7 @@ int slsDetector::programFPGA(string fname){ destfname = fname.substr(0,found+1); destfname.append("Jungfrau_MCB.rawbin"); #ifdef VERBOSE - std::cout << "Converting " << fname << " to " << destfname << std::endl; + printf( "Converting %s to %s \n", fname.c_str(), destfname.c_str() ); #endif int filepos,x,y,i; FILE* src = fopen(fname.c_str(),"rb"); @@ -6753,57 +6750,57 @@ int slsDetector::programFPGA(string fname){ fputc(y,dst); } if (filepos < 0x1000000){ - std::cout << "Could not convert programming file. EOF before end of flash" << std::endl; + printf( "Could not convert programming file. EOF before end of flash \n" ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); return FAIL; } #ifdef VERBOSE - std::cout << "File has been converted to " << destfname << std::endl; + printf( "File has been converted to %s \n", destfname.c_str() ); #endif //loading file to memory FILE* fp = fopen(destfname.c_str(),"r"); if(fp == NULL){ - std::cout << "Could not open rawbin file" << std::endl; + printf( "Could not open rawbin file \n" ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); return FAIL; } if(fseek(fp,0,SEEK_END)){ - std::cout << "Seek error in rawbin file" << std::endl; + printf( "Seek error in rawbin file \n" ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); return FAIL; } filesize = ftell(fp); if(filesize <= 0){ - std::cout << "Could not get length of rawbin file" << std::endl; + printf( "Could not get length of rawbin file \n" ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); return FAIL; } rewind(fp); fpgasrc = (char*)malloc(filesize+1); if(fpgasrc == NULL){ - std::cout << "Could not allocate size of program" << std::endl; + printf( "Could not allocate size of program \n" ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); return FAIL; } if(fread(fpgasrc, sizeof(char), filesize, fp) != filesize){ - std::cout << "Could not read rawbin file" << std::endl; + printf( "Could not read rawbin file \n" ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); return FAIL; } if(fclose(fp)){ - std::cout << "Could not close rawbin file" << std::endl; + printf( "Could not close rawbin file \n" ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); return FAIL; } #ifdef VERBOSE - std::cout << "Successfully loaded the rawbin file to program memory" << std::endl; + printf( "Successfully loaded the rawbin file to program memory \n" ); #endif #ifdef VERBOSE - std::cout<< "Sending programming binary to detector " << endl; + printf( "Sending programming binary to detector \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -6813,7 +6810,7 @@ int slsDetector::programFPGA(string fname){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); filesize = 0; } @@ -6821,20 +6818,20 @@ int slsDetector::programFPGA(string fname){ //erasing flash if(ret!=FAIL){ - std::cout<< "This can take awhile. Please be patient..." << endl; + printf( "This can take awhile. Please be patient... \n" ); printf("Erasing Flash:%d%%\r",0); - std::cout << flush; + fflush(stdout); //erasing takes 65 seconds, printing here (otherwise need threads in server-unnecessary) int count = 66; while(count>0){ usleep(1 * 1000 * 1000); count--; printf("Erasing Flash:%d%%\r",(int) (((double)(65-count)/65)*100)); - std::cout << flush; + fflush(stdout); } - std::cout< filesize) //less than 2mb unitprogramsize = filesize; #ifdef VERBOSE - std::cout << "unitprogramsize:" << unitprogramsize << "\t filesize:" << filesize << std::endl; + printf( "unitprogramsize:%zu\t filesize: %zu \n", unitprogramsize, filesize ); #endif controlSocket->SendDataOnly(fpgasrc+currentPointer,unitprogramsize); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); @@ -6858,20 +6855,20 @@ int slsDetector::programFPGA(string fname){ //print progress printf("Writing to Flash:%d%%\r",(int) (((double)(totalsize-filesize)/totalsize)*100)); - std::cout << flush; + fflush(stdout); }else{ controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); } } - std::cout<ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); } disconnectControl(); @@ -6894,11 +6891,11 @@ int slsDetector::resetFPGA(){ char mess[MAX_STR_LENGTH]=""; if(thisDetector->myDetectorType != JUNGFRAU){ - std::cout << "Not implemented for this detector" << std::endl; + printf( "Not implemented for this detector \n" ); return FAIL; } #ifdef VERBOSE - std::cout<< "Sending reset to FPGA " << endl; + printf( "Sending reset to FPGA \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -6908,7 +6905,7 @@ int slsDetector::resetFPGA(){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(RESET_ERROR)); } @@ -6930,11 +6927,11 @@ int slsDetector::powerChip(int ival){ int retval=-1; if(thisDetector->myDetectorType != JUNGFRAU){ - std::cout << "Not implemented for this detector" << std::endl; + printf( "Not implemented for this detector \n" ); return FAIL; } #ifdef VERBOSE - std::cout<< "Sending power on/off/get to the chip " << endl; + printf( "Sending power on/off/get to the chip \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ @@ -6944,7 +6941,7 @@ int slsDetector::powerChip(int ival){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(POWER_CHIP)); }else controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -7038,7 +7035,7 @@ int slsDetector::setAllTrimbits(int val, int imod){ int ret=OK; #ifdef VERBOSE - std::cout<< "Setting all trimbits to "<< val << std::endl; + printf( "Setting all trimbits to %d \n", val ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -7048,7 +7045,7 @@ int slsDetector::setAllTrimbits(int val, int imod){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(ALLTIMBITS_NOT_SET)); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -7060,7 +7057,7 @@ int slsDetector::setAllTrimbits(int val, int imod){ } #ifdef VERBOSE - std::cout<< "All trimbits were set to "<< retval << std::endl; + printf( "All trimbits were set to %d \n", retval ); #endif return retval; } @@ -7071,7 +7068,7 @@ int slsDetector::setAllTrimbits(int val, int imod){ int slsDetector::loadCalibrationFile(string fname, int imod) { if(thisDetector->myDetectorType == EIGER) { - std::cout << "Not required for this detector!" << std::endl; + printf( "Not required for this detector! \n" ); return FAIL; } @@ -7179,7 +7176,7 @@ slsDetectorDefs::masterFlags slsDetector::setMaster(masterFlags flag) { int ret=OK; #ifdef VERBOSE - std::cout<< "Setting master flags to "<< flag << std::endl; + printf( "Setting master flags to %d \n", flag ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -7189,7 +7186,7 @@ slsDetectorDefs::masterFlags slsDetector::setMaster(masterFlags flag) { controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } @@ -7200,7 +7197,7 @@ slsDetectorDefs::masterFlags slsDetector::setMaster(masterFlags flag) { } #ifdef VERBOSE - std::cout<< "Master flag set to "<< retval << std::endl; + printf( "Master flag set to %d \n", retval ); #endif return retval; } @@ -7223,7 +7220,7 @@ slsDetectorDefs::synchronizationMode slsDetector::setSynchronization(synchroniza int ret=OK; #ifdef VERBOSE - std::cout<< "Setting synchronization mode to "<< flag << std::endl; + printf( "Setting synchronization mode to %d \n", flag ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -7233,7 +7230,7 @@ slsDetectorDefs::synchronizationMode slsDetector::setSynchronization(synchroniza controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } @@ -7244,7 +7241,7 @@ slsDetectorDefs::synchronizationMode slsDetector::setSynchronization(synchroniza } #ifdef VERBOSE - std::cout<< "Readout flag set to "<< retval << std::endl; + printf( "Readout flag set to %d \n", retval ); #endif return retval; @@ -7268,7 +7265,7 @@ int slsDetector::setReceiverOnline(int off) { if (thisDetector->receiverOnlineFlag==ONLINE_FLAG){ setReceiverTCPSocket(); if(thisDetector->receiverOnlineFlag==OFFLINE_FLAG){ - std::cout << "cannot connect to receiver" << endl; + printf( "cannot connect to receiver \n" ); setErrorMask((getErrorMask())|(CANNOT_CONNECT_TO_RECEIVER)); } } @@ -7298,7 +7295,7 @@ string slsDetector::checkReceiverOnline() { delete dataSocket; dataSocket=NULL; #ifdef VERBOSE - std::cout<< "receiver offline!" << std::endl; + printf( "receiver offline! \n" ); #endif return string(thisDetector->receiver_hostname); } else { @@ -7306,11 +7303,12 @@ string slsDetector::checkReceiverOnline() { dataSocket->SetTimeOut(100); disconnectData(); #ifdef VERBOSE - std::cout<< "receiver online!" << std::endl; + printf( "receiver online! \n" ); #endif return string(""); } } + return retval; } @@ -7326,7 +7324,7 @@ int slsDetector::setReceiverTCPSocket(string const name, int const receiver_port //if receiver ip given if (strcmp(name.c_str(),"")!=0) { #ifdef VERBOSE - std::cout<< "setting receiver" << std::endl; + printf( "setting receiver \n" ); #endif strcpy(thisName,name.c_str()); strcpy(thisDetector->receiver_hostname,thisName); @@ -7340,7 +7338,7 @@ int slsDetector::setReceiverTCPSocket(string const name, int const receiver_port //if receiverTCPPort given if (receiver_port>0) { #ifdef VERBOSE - std::cout<< "setting data port" << std::endl; + printf( "setting data port \n" ); #endif thisRP=receiver_port; thisDetector->receiverTCPPort=thisRP; @@ -7356,7 +7354,7 @@ int slsDetector::setReceiverTCPSocket(string const name, int const receiver_port dataSocket=new MySocketTCP(thisName, thisRP); if (dataSocket->getErrorStatus()){ #ifdef VERBOSE - std::cout<< "Could not connect Data socket "<receiverOnlineFlag=OFFLINE_FLAG; #ifdef VERBOSE - std::cout<< "offline!" << std::endl; + printf( "offline! \n" ); #endif } thisReceiver->setSocket(dataSocket); @@ -7396,7 +7394,7 @@ string slsDetector::setFilePath(string s) { if(thisDetector->receiverOnlineFlag==OFFLINE_FLAG){ if(!s.empty()){ if(stat(s.c_str(),&st)){ - std::cout << "path does not exist" << endl; + printf( "path does not exist \n" ); setErrorMask((getErrorMask())|(FILE_PATH_DOES_NOT_EXIST)); }else{ pthread_mutex_lock(&ms); @@ -7409,7 +7407,7 @@ string slsDetector::setFilePath(string s) { else{ strcpy(arg,s.c_str()); #ifdef VERBOSE - std::cout << "Sending file path to receiver " << arg << std::endl; + printf( "Sending file path to receiver %s \n", arg ); #endif if (connectData() == OK){ ret=thisReceiver->sendString(fnum,retval,arg); @@ -7421,7 +7419,7 @@ string slsDetector::setFilePath(string s) { pthread_mutex_unlock(&ms); } else if(!s.empty()){ - std::cout << "path does not exist" << endl; + printf( "path does not exist \n" ); setErrorMask((getErrorMask())|(FILE_PATH_DOES_NOT_EXIST)); } if(ret==FORCE_UPDATE) @@ -7457,7 +7455,7 @@ string slsDetector::setFileName(string s) { if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ strcpy(arg,s.c_str()); #ifdef VERBOSE - std::cout << "Sending file name to receiver " << arg << std::endl; + printf( "Sending file name to receiver %s \n", arg ); #endif if (connectData() == OK){ ret=thisReceiver->sendString(fnum,retval,arg); @@ -7465,7 +7463,7 @@ string slsDetector::setFileName(string s) { } if(ret!=FAIL){ #ifdef VERBOSE - std::cout << "Complete file prefix from receiver: " << retval << std::endl; + printf( "Complete file prefix from receiver: %s \n", retval); #endif pthread_mutex_lock(&ms); fileIO::setFileName(parentDet->getNameFromReceiverFilePrefix(string(retval))); @@ -7504,7 +7502,7 @@ int slsDetector::setFileIndex(int i) { else{ #ifdef VERBOSE - std::cout << "Sending file index to receiver " << arg << std::endl; + printf( "Sending file index to receiver %d \n", arg ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,arg); @@ -7532,7 +7530,7 @@ int slsDetector::startReceiver(){ if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { #ifdef VERBOSE - std::cout << "Starting Receiver " << std::endl; + printf( "Starting Receiver \n" ); #endif if (connectData() == OK){ ret=thisReceiver->executeFunction(fnum,mess); @@ -7572,7 +7570,7 @@ int slsDetector::stopReceiver(){ if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { #ifdef VERBOSE - std::cout << "Stopping Receiver " << std::endl; + printf( "Stopping Receiver \n" ); #endif if (connectData() == OK){ ret=thisReceiver->executeFunction(fnum,mess); @@ -7598,7 +7596,7 @@ slsDetectorDefs::runStatus slsDetector::startReceiverReadout(){ if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { #ifdef VERBOSE - std::cout << "Starting Receiver Readout" << std::endl; + printf( "Starting Receiver Readout \n" ); #endif if (connectData() == OK){ ret=thisReceiver->getInt(fnum,retval); @@ -7623,21 +7621,21 @@ int slsDetector::detectorSendToReceiver(bool set){ if (thisDetector->onlineFlag==ONLINE_FLAG) { #ifdef VERBOSE - std::cout << "Setting detector to send packets via client to: " << set << std::endl; + printf( "Setting detector to send packets via client to: %d \n", (int)set ); #endif if (connectControl() == OK){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL){ controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) updateDetector(); } }else - std::cout << "cannot connect to detector" << endl; + printf( "cannot connect to detector \n" ); return ret; } @@ -7656,7 +7654,7 @@ slsDetectorDefs::runStatus slsDetector::getReceiverStatus(){ if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { #ifdef VERBOSE - std::cout << "Getting Receiver Status" << std::endl; + printf( "Getting Receiver Status \n" ); #endif if (connectData() == OK){ ret=thisReceiver->getInt(fnum,retval); @@ -7681,7 +7679,7 @@ int slsDetector::getFramesCaughtByReceiver(){ if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { #ifdef VERBOSE - std::cout << "Getting Frames Caught by Receiver " << std::endl; + printf( "Getting Frames Caught by Receiver \n" ); #endif if (connectData() == OK){ ret=thisReceiver->getInt(fnum,retval); @@ -7703,7 +7701,7 @@ int slsDetector::getReceiverCurrentFrameIndex(){ if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { #ifdef VERBOSE - std::cout << "Getting Current Frame Index of Receiver " << std::endl; + printf( "Getting Current Frame Index of Receiver \n" ); #endif if (connectData() == OK){ ret=thisReceiver->getInt(fnum,retval); @@ -7726,7 +7724,7 @@ int slsDetector::resetFramesCaught(){ if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { #ifdef VERBOSE - std::cout << "Reset Frames Caught by Receiver" << std::endl; + printf( "Reset Frames Caught by Receiver \n" ); #endif if (connectData() == OK){ ret=thisReceiver->executeFunction(fnum,mess); @@ -7753,7 +7751,7 @@ int slsDetector::lockReceiver(int lock){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Locking or Unlocking Receiver " << std::endl; + printf( "Locking or Unlocking Receiver \n" ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,arg); @@ -7778,7 +7776,7 @@ string slsDetector::getReceiverLastClientIP(){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Geting Last Client IP connected to Receiver " << std::endl; + printf( "Geting Last Client IP connected to Receiver \n" ); #endif if (connectData() == OK){ ret=thisReceiver->getLastClientIP(fnum,retval); @@ -7803,7 +7801,7 @@ int slsDetector::updateReceiverNoWait() { n = dataSocket->ReceiveDataOnly(lastClientIP,sizeof(lastClientIP)); #ifdef VERBOSE - cout << "Updating receiver last modified by " << lastClientIP << std::endl; + printf( "Updating receiver last modified by %s \n", lastClientIP ); #endif n = dataSocket->ReceiveDataOnly(&ind,sizeof(ind)); @@ -7842,7 +7840,7 @@ int slsDetector::updateReceiver() { updateReceiverNoWait(); else{ dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; + printf( "Receiver returned error: %s \n", mess ); } disconnectData(); } @@ -7870,9 +7868,9 @@ int slsDetector::exitReceiver(){ } } if (retval!=OK) { - std::cout<< std::endl; - std::cout<< "Shutting down the receiver" << std::endl; - std::cout<< std::endl; + printf( "\n" ); + printf( "Shutting down the receiver \n" ); + printf( "\n" ); } return retval; @@ -7899,7 +7897,7 @@ int slsDetector::enableWriteToFile(int enable){ else if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending enable file write to receiver " << arg << std::endl; + printf( "Sending enable file write to receiver %d \n", arg ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,arg); @@ -7941,7 +7939,7 @@ int slsDetector::overwriteFile(int enable){ else if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending enable file write to receiver " << arg << std::endl; + printf( "Sending enable file write to receiver %d \n", arg ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,arg); @@ -7980,7 +7978,7 @@ int slsDetector::setFrameIndex(int index){ else if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending frame index to receiver " << arg << std::endl; + printf( "Sending frame index to receiver %d \n", arg ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,arg); @@ -8009,7 +8007,7 @@ int slsDetector::calibratePedestal(int frames){ char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<<"Calibrating Pedestal " <onlineFlag==ONLINE_FLAG) { @@ -8021,7 +8019,7 @@ int slsDetector::calibratePedestal(int frames){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -8060,7 +8058,7 @@ int slsDetector::setReadReceiverFrequency(int getFromReceiver, int freq){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending read frequency to receiver " << arg << std::endl; + printf( "Sending read frequency to receiver %d \n", arg ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,arg); @@ -8073,7 +8071,7 @@ int slsDetector::setReadReceiverFrequency(int getFromReceiver, int freq){ } if ((freq > 0) && (retval != freq)){ - cout << "could not set receiver read frequency to " << freq <<" Returned:" << retval << endl; + printf( "could not set receiver read frequency to %d Returned: %d \n", freq, retval ); setErrorMask((getErrorMask())|(RECEIVER_READ_FREQUENCY)); } return retval; @@ -8089,7 +8087,7 @@ int slsDetector::setReceiverReadTimer(int time_in_ms){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending read timer to receiver " << arg << std::endl; + printf( "Sending read timer to receiver %d\n", arg ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,arg); @@ -8100,7 +8098,7 @@ int slsDetector::setReceiverReadTimer(int time_in_ms){ } if ((time_in_ms > 0) && (retval != time_in_ms)){ - cout << "could not set receiver read timer to " << time_in_ms <<" Returned:" << retval << endl; + printf( "could not set receiver read timer to %d Returned: %d \n", time_in_ms, retval ); setErrorMask((getErrorMask())|(RECEIVER_READ_TIMER)); } return retval; @@ -8117,7 +8115,7 @@ int slsDetector::enableDataStreamingFromReceiver(int enable){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "***************Sending Data Streaming in Receiver " << arg << std::endl; + printf( "***************Sending Data Streaming in Receiver %d \n", arg ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,arg); @@ -8130,7 +8128,7 @@ int slsDetector::enableDataStreamingFromReceiver(int enable){ } if ((enable > 0) && (retval != enable)){ - cout << "could not set data streaming in receiver to " << enable <<" Returned:" << retval << endl; + printf( "could not set data streaming in receiver to %d Returned %d \n", enable, retval ); setErrorMask((getErrorMask())|(DATA_STREAMING)); } return retval; @@ -8146,7 +8144,7 @@ int slsDetector::enableReceiverCompression(int i){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Getting/Enabling/Disabling Receiver Compression with argument " << i << std::endl; + printf( "Getting/Enabling/Disabling Receiver Compression with argument %d \n", i ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,i); @@ -8168,7 +8166,7 @@ void slsDetector::setDetectorHostname(){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending detector hostname to Receiver " << thisDetector->hostname << std::endl; + printf( "Sending detector hostname to Receiver %s \n", thisDetector->hostname ); #endif if (connectData() == OK){ ret=thisReceiver->sendString(fnum,retval,thisDetector->hostname); @@ -8188,7 +8186,7 @@ int slsDetector::enableTenGigabitEthernet(int i){ char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<< std::endl<< "Enabling / Disabling 10Gbe" << endl; + printf( "\nEnabling / Disabling 10Gbe \n" ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -8198,7 +8196,7 @@ int slsDetector::enableTenGigabitEthernet(int i){ controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL){ controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(DETECTOR_TEN_GIGA)); } controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -8217,7 +8215,7 @@ int slsDetector::enableTenGigabitEthernet(int i){ retval=-1; if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Enabling / Disabling 10Gbe in receiver: " << i << std::endl; + printf( "Enabling / Disabling 10Gbe in receiver: %d \n", i ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum2,retval,i); @@ -8246,9 +8244,9 @@ int slsDetector::setReceiverFifoDepth(int i){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ #ifdef VERBOSE if(i ==-1) - std::cout<< "Getting Receiver Fifo Depth" << endl; + printf( "Getting Receiver Fifo Depth \n" ); else - std::cout<< "Setting Receiver Fifo Depth to " << i << endl; + printf( "Setting Receiver Fifo Depth to %d \n", i ); #endif if (connectData() == OK){ ret=thisReceiver->sendInt(fnum,retval,i); @@ -8272,15 +8270,13 @@ int slsDetector::setReceiverFifoDepth(int i){ */ int slsDetector::setCTBPattern(string fname) { - - int fnum=F_SET_CTB_PATTERN; - int ret = FAIL; - char retval[MAX_STR_LENGTH]=""; - + //int fnum=F_SET_CTB_PATTERN; + //int ret = FAIL; + //char retval[MAX_STR_LENGTH]=""; // if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ // #ifdef VERBOSE -// std::cout << "Sending detector hostname to Receiver " << thisDetector->hostname << std::endl; +// printf( "Sending detector hostname to Receiver %s \n", thisDetector->hostname ); // #endif // if (connectData() == OK) // ret=thisReceiver->sendString(fnum,retval,thisDetector->hostname); @@ -8298,7 +8294,7 @@ int slsDetector::setCTBPattern(string fname) { if (fd>0) { while (fread(&word, sizeof(word), 1,fd)) { setCTBWord(addr,word); - // cout << hex << addr << " " << word << dec << endl; + // printf( " 0x%x %llx \n", addr, word ); addr++; } @@ -8333,7 +8329,7 @@ uint64_t slsDetector::setCTBWord(int addr,uint64_t word) { char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<<"Setting CTB word" <onlineFlag==ONLINE_FLAG) { @@ -8347,7 +8343,7 @@ uint64_t slsDetector::setCTBWord(int addr,uint64_t word) { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -8385,7 +8381,7 @@ int slsDetector::setCTBPatLoops(int level,int &start, int &stop, int &n) { char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<<"Setting CTB word" <onlineFlag==ONLINE_FLAG) { @@ -8401,7 +8397,7 @@ int slsDetector::setCTBPatLoops(int level,int &start, int &stop, int &n) { n=retval[2]; } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -8435,7 +8431,7 @@ int slsDetector::setCTBPatWaitAddr(int level, int addr) { char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<<"Setting CTB word" <onlineFlag==ONLINE_FLAG) { @@ -8449,7 +8445,7 @@ int slsDetector::setCTBPatWaitAddr(int level, int addr) { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -8485,7 +8481,7 @@ int slsDetector::setCTBPatWaitTime(int level, uint64_t t) { char mess[MAX_STR_LENGTH]=""; #ifdef VERBOSE - std::cout<<"Setting CTB word" <onlineFlag==ONLINE_FLAG) { @@ -8499,7 +8495,7 @@ int slsDetector::setCTBPatWaitTime(int level, uint64_t t) { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); } disconnectControl(); if (ret==FORCE_UPDATE) @@ -8520,7 +8516,7 @@ int slsDetector::pulsePixel(int n,int x,int y) { arg[0] = n; arg[1] = x; arg[2] = y; #ifdef VERBOSE - std::cout<< std::endl<< "Pulsing Pixel " << n << " number of times at (" << x << "," << "y)" << endl << endl; + printf( "\nPulsing Pixel %d number of times at (%d,%d) \n\n", n, x, y ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -8530,7 +8526,7 @@ int slsDetector::pulsePixel(int n,int x,int y) { controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL){ controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(COULD_NOT_PULSE_PIXEL)); } disconnectControl(); @@ -8551,7 +8547,7 @@ int slsDetector::pulsePixelNMove(int n,int x,int y) { arg[0] = n; arg[1] = x; arg[2] = y; #ifdef VERBOSE - std::cout<< std::endl<< "Pulsing Pixel " << n << " number of times and move by deltax:" << x << " deltay:" << y << endl << endl; + printf( "\nPulsing Pixel %d number of times and move by deltax:%d deltay:%d \n\n", n, x, y ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -8561,7 +8557,7 @@ int slsDetector::pulsePixelNMove(int n,int x,int y) { controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL){ controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf( "Detector returned error: %s \n", mess ); setErrorMask((getErrorMask())|(COULD_NOT_PULSE_PIXEL_NMOVE)); } disconnectControl(); @@ -8582,7 +8578,7 @@ int slsDetector::pulseChip(int n) { #ifdef VERBOSE - std::cout<< std::endl<< "Pulsing Pixel " << n << " number of times" << endl << endl; + printf( "\nPulsing Pixel %d number of times \n\n", n ); #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -8592,7 +8588,7 @@ int slsDetector::pulseChip(int n) { controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL){ controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; + printf("Detector returned error: %s\n", mess); setErrorMask((getErrorMask())|(COULD_NOT_PULSE_CHIP)); } disconnectControl(); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index f977bd28e6..ee81bffee4 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -7,6 +7,7 @@ #include + slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { myDet=det; @@ -3426,7 +3427,11 @@ string slsDetectorCommand::cmdSN(int narg, char *args[], int action) { if (cmd=="thisversion"){ - sprintf(answer,"%llx",myDet->getId(THIS_SOFTWARE_VERSION)); + int64_t retval = myDet->getId(THIS_SOFTWARE_VERSION); + if (retval < 0) + sprintf(answer, "%d", -1); + else + sprintf(answer,"%llx", (long long unsigned int)retval); return string(answer); } @@ -3436,37 +3441,61 @@ string slsDetectorCommand::cmdSN(int narg, char *args[], int action) { if (cmd=="moduleversion") { int ival=-1; if (sscanf(args[0],"moduleversion:%d",&ival)) { - sprintf(answer,"%llx",myDet->getId(MODULE_FIRMWARE_VERSION,ival)); + int64_t retval = myDet->getId(MODULE_FIRMWARE_VERSION, ival); + if (retval < 0) + sprintf(answer, "%d", -1); + else + sprintf(answer,"%llx", (long long unsigned int)retval); return string(answer); } else return string("undefined module number"); } if (cmd=="detectornumber") { - sprintf(answer,"%llx",myDet->getId(DETECTOR_SERIAL_NUMBER)); + int64_t retval = myDet->getId(DETECTOR_SERIAL_NUMBER); + if (retval < 0) + sprintf(answer, "%d", -1); + else + sprintf(answer,"%llx", (long long unsigned int)retval); return string(answer); } if (cmd.find("modulenumber")!=string::npos) { int ival=-1; if (sscanf(args[0],"modulenumber:%d",&ival)) { - sprintf(answer,"%llx",myDet->getId(MODULE_SERIAL_NUMBER,ival)); + int64_t retval = myDet->getId(MODULE_SERIAL_NUMBER, ival); + if (retval < 0) + sprintf(answer, "%d", -1); + else + sprintf(answer,"%llx", (long long unsigned int)retval); return string(answer); } else return string("undefined module number"); } if (cmd=="detectorversion") { - sprintf(answer,"%llx",myDet->getId(DETECTOR_FIRMWARE_VERSION)); + int64_t retval = myDet->getId(DETECTOR_FIRMWARE_VERSION); + if (retval < 0) + sprintf(answer, "%d", -1); + else + sprintf(answer,"%llx", (long long unsigned int)retval); return string(answer); } if (cmd=="softwareversion") { - sprintf(answer,"%llx",myDet->getId(DETECTOR_SOFTWARE_VERSION)); + int64_t retval = myDet->getId(DETECTOR_SOFTWARE_VERSION); + if (retval < 0) + sprintf(answer, "%d", -1); + else + sprintf(answer,"%llx", (long long unsigned int)retval); return string(answer); } if (cmd=="receiverversion") { myDet->setReceiverOnline(ONLINE_FLAG); - sprintf(answer,"%llx",myDet->getId(RECEIVER_VERSION)); + int64_t retval = myDet->getId(RECEIVER_VERSION); + if (retval < 0) + sprintf(answer, "%d", -1); + else + sprintf(answer,"%llx", (long long unsigned int)retval); return string(answer); } return string("unknown id mode ")+cmd; @@ -4491,7 +4520,7 @@ string slsDetectorCommand::cmdAdvanced(int narg, char *args[], int action) { if (action==GET_ACTION) return string("cannot get"); #ifdef VERBOSE - std::cout<< " resetting fpga " << sval << std::endl; + std::cout<< " resetting fpga " << std::endl; #endif myDet->setOnline(ONLINE_FLAG); if(myDet->resetFPGA() == OK) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index ec3d1dae55..9134122453 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -798,7 +798,6 @@ int slsDetectorUtils::dumpDetectorSetup(string const fname, int level){ slsDetectorCommand *cmd; string names[100]; int nvar=0; - int nvar1=0; names[nvar++]="fname"; names[nvar++]="index"; @@ -878,6 +877,8 @@ int slsDetectorUtils::dumpDetectorSetup(string const fname, int level){ names[nvar++]="patnloop2"; names[nvar++]="patwait2"; names[nvar++]="patwaittime2"; + default: + break; } @@ -908,6 +909,8 @@ int slsDetectorUtils::dumpDetectorSetup(string const fname, int level){ names[nvar++]="flatfield"; names[nvar++]="badchannels"; break; + default: + break; } @@ -916,7 +919,8 @@ int slsDetectorUtils::dumpDetectorSetup(string const fname, int level){ case MYTHEN: names[nvar++]="trimbits"; break; - +default: + break; } // char ext[100]; diff --git a/slsDetectorSoftware/slsDetectorAnalysis/angularConversionStatic.cpp b/slsDetectorSoftware/slsDetectorAnalysis/angularConversionStatic.cpp index 43e5a44364..2e380323c6 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/angularConversionStatic.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/angularConversionStatic.cpp @@ -255,8 +255,8 @@ int angularConversionStatic::readAngularConversion( ifstream& infile, int nmod, angOff[nm].etilt=epitch; } - // cout << angOff[nm].center << " " << \ - // angOff[nm].r_conversion << " " << \ + // cout << angOff[nm].center << " " << + // angOff[nm].r_conversion << " " << // angOff[nm].offset << endl; } else diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp index d55e4cc8fb..d24c8de502 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp @@ -17,20 +17,20 @@ int energyConversion::readCalibrationFile(string fname, double &gain, double &of string str; ifstream infile; #ifdef VERBOSE - std::cout<< "Opening file "<< fname << std::endl; + printf( "Opening file %s \n", fname.c_str() ); #endif infile.open(fname.c_str(), ios_base::in); if (infile.is_open()) { getline(infile,str); #ifdef VERBOSE - std::cout<< str << std::endl; + printf( "%s \n", str.c_str() ); #endif istringstream ssstr(str); ssstr >> offset >> gain; infile.close(); - cout << "Calibration file loaded: " << fname << endl; + printf( "Calibration file loaded: %s \n", fname.c_str() ); } else { - std::cout<< "Could not open calibration file "<< fname << std::endl; + printf( "Could not open calibration file %s \n", fname.c_str() ); gain=0.; offset=0.; #ifndef MYROOT @@ -45,7 +45,7 @@ int energyConversion::readCalibrationFile(string fname, double &gain, double &of }; int energyConversion::writeCalibrationFile(string fname, double gain, double offset){ - //std::cout<< "Function not yet implemented " << std::endl; + //printf( "Function not yet implemented \n" ); ofstream outfile; outfile.open (fname.c_str()); @@ -53,7 +53,7 @@ int energyConversion::writeCalibrationFile(string fname, double gain, double off if (outfile.is_open()) { outfile << offset << " " << gain << std::endl; } else { - std::cout<< "Could not open calibration file "<< fname << " for writing" << std::endl; + printf( "Could not open calibration file %s for writing \n", fname.c_str() ); #ifndef MYROOT return FAIL; #endif @@ -76,7 +76,7 @@ int energyConversion::readCalibrationFile(string fname, int *gain, int *offset){ double o,g; int ig=0; #ifdef VERBOSE - std::cout<< "Opening file "<< fname << std::endl; + printf( "Opening file %s \n", fname.c_str() ); #endif infile.open(fname.c_str(), ios_base::in); if (infile.is_open()) { @@ -85,7 +85,7 @@ int energyConversion::readCalibrationFile(string fname, int *gain, int *offset){ //while ( (getline(infile,str)) > -1) { getline(infile,str); #ifdef VERBOSE - std::cout<< str << std::endl; + printf( "%s \n", str.c_str() ); #endif istringstream ssstr(str); ssstr >> o >> g; @@ -96,9 +96,9 @@ int energyConversion::readCalibrationFile(string fname, int *gain, int *offset){ break; } infile.close(); - cout << "Calibration file loaded: " << fname << endl; + printf( "Calibration file loaded: %s \n", fname.c_str() ); } else { - cout << "Could not open calibration file: "<< fname << std::endl; + printf( "Could not open calibration file: %s \n", fname.c_str() ); gain[0]=0; offset[0]=0; #ifndef MYROOT @@ -114,7 +114,7 @@ int energyConversion::readCalibrationFile(string fname, int *gain, int *offset){ }; int energyConversion::writeCalibrationFile(string fname, int *gain, int *offset){ - //std::cout<< "Function not yet implemented " << std::endl; + //printf( "Function not yet implemented \n" ); ofstream outfile; outfile.open (fname.c_str()); // >> i/o operations here << @@ -122,7 +122,7 @@ int energyConversion::writeCalibrationFile(string fname, int *gain, int *offset) for (int ig=0; ig<4; ig++) outfile << ((double)offset[ig]/1000) << " " << ((double)gain[ig]/1000) << std::endl; } else { - std::cout<< "Could not open calibration file "<< fname << " for writing" << std::endl; + printf( "Could not open calibration file %s for writing \n", fname.c_str() ); #ifndef MYROOT return FAIL; #endif @@ -251,16 +251,16 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string names[id++]="VDAC15"; break; default: - cout << "Unknown detector type - unknown format for settings file" << endl; + printf( "Unknown detector type - unknown format for settings file \n" ); return NULL; } #ifdef VERBOSE - std::cout<< "reading settings file for module number "<< myMod->module << std::endl; + printf( " reading settings file for module number %d \n", myMod->module ); #endif myfname=fname; #ifdef VERBOSE - std::cout<< "file name is "<< myfname << std::endl; + printf( "file name is %s \n", myfname.c_str() ); #endif switch (myDetectorType) { @@ -274,7 +274,7 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string istringstream ssstr(str); ssstr >> sargname >> ival; #ifdef VERBOSE - std::cout<< sargname << " dac nr. " << idac << " is " << ival << std::endl; + printf( "%s dac nr. %d is %d \n", sargname.c_str(), idac, ival ); #endif myMod->dacs[idac]=ival; idac++; @@ -283,24 +283,24 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string getline(infile,str); iline++; #ifdef VERYVERBOSE - std::cout<< str << std::endl; + printf( "%s \n", str.c_str() ); #endif istringstream ssstr(str); ssstr >> sargname >> ival; #ifdef VERYVERBOSE - std::cout<< "chip " << ichip << " " << sargname << " is " << ival << std::endl; + printf( "chip %d %s is %d \n", ichip, sargname.c_str(), ival ); #endif myMod->chipregs[ichip]=ival; for (ichan=0; ichannChans <<" iline " << iline<< std::endl; + printf( "channel %d iline %d \n", ichan+ichip*myMod->nchan, iline ); #endif iline++; myMod->chanregs[ichip*nch+ichan]=0; @@ -310,42 +310,42 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string switch (iarg) { case 0: #ifdef VERYVERBOSE - std::cout<< "trimbits " << ival ; + printf( "trimbits %d", ival ); #endif myMod->chanregs[ichip*nch+ichan]|=ival&TRIMBITMASK; break; case 1: #ifdef VERYVERBOSE - std::cout<< " compen " << ival ; + printf( " compen %d", ival ); #endif myMod->chanregs[ichip*nch+ichan]|=ival<<9; break; case 2: #ifdef VERYVERBOSE - std::cout<< " anen " << ival ; + printf( " anen %d", ival ); #endif myMod->chanregs[ichip*nch+ichan]|=ival<<8; break; case 3: #ifdef VERYVERBOSE - std::cout<< " calen " << ival ; + printf( " calen %d", ival ) ; #endif myMod->chanregs[ichip*nch+ichan]|=ival<<7; break; case 4: #ifdef VERBOSE - std::cout<< " outcomp " << ival ; + printf( " outcomp %d", ival ) ; #endif myMod->chanregs[ichip*nch+ichan]|=ival<<10; break; case 5: #ifdef VERBOSE - std::cout<< " counts " << ival << std::endl; + printf( " counts %d \n", ival ); #endif myMod->chanregs[ichip*nch+ichan]|=ival<<11; break; default: - std::cout<< " too many columns" << std::endl; + printf( " too many columns \n" ); break; } } @@ -353,7 +353,7 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string // } } #ifdef VERBOSE - std::cout<< "read " << ichan*ichip << " channels" <chanregs,sizeof(int)*(myMod->nchan)); #ifdef VERBOSE for(int i=0;indac;i++) - std::cout << "dac " << i << ":" << myMod->dacs[i] << std::endl; - std::cout << "iodelay:" << iodelay << std::endl; - std::cout << "tau:" << tau << std::endl; + printf( "dac %d:%d \n", i, myMod->dacs[i] ); + printf( "iodelay:%d \n", iodelay ); + printf( "tau:%d \n", tau ); #endif if(infile.eof()){ - cout<> sargname >> ival; @@ -415,7 +415,7 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string myMod->dacs[i]=ival; idac++; #ifdef VERBOSE - std::cout<< sargname << " dac nr. " << idac << " is " << ival << std::endl; + printf( " %s dac nr. %d is %d \n", sargname.c_str(), idac, ival ); #endif break; } @@ -423,10 +423,10 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string } if (i < id) { #ifdef VERBOSE - std::cout<< sargname << " dac nr. " << idac << " is " << ival << std::endl; + printf( " %s dac nr. %d is %d \n", sargname.c_str(), idac, ival ); #endif }else - std::cout<< "Unknown dac " << sargname << std::endl; + printf( "Unknown dac %s \n", sargname.c_str() ); infile.close(); strcpy(settingsFile,fname.c_str()); @@ -439,7 +439,7 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string break; default: - std::cout<< "Unknown detector type - don't know how to read file" << myfname << std::endl; + printf( "Unknown detector type - don't know how to read file %s\n", myfname.c_str()); infile.close(); deleteModule(myMod); return NULL; @@ -517,7 +517,7 @@ int energyConversion::writeSettingsFile(string fname, detectorType myDetectorTyp names[id++]="VDAC15"; break; default: - cout << "Unknown detector type - unknown format for settings file" << endl; + printf( "Unknown detector type - unknown format for settings file \n" ); return FAIL; } @@ -532,9 +532,9 @@ int energyConversion::writeSettingsFile(string fname, detectorType myDetectorTyp iv = 1150; #ifdef VERBOSE for(int i=0;i*m_fn)());} private: - _Class* m_ptr; _Ret (_Class::*m_fn)(); + _Class* m_ptr; }; template @@ -36,8 +36,8 @@ class func0_t{ ~func0_t() {} void operator()() const {*m_store = ((m_ptr->*m_fn)());} private: - _Class* m_ptr; _Ret (_Class::*m_fn)(); + _Class* m_ptr; _Store* m_store; }; @@ -49,8 +49,8 @@ class func1_t{ ~func1_t() {} void operator()() const {*m_store = ((m_ptr->*m_fn)(m_arg1));} private: - _Class* m_ptr; _Ret (_Class::*m_fn)(_Arg1); + _Class* m_ptr; _Arg1 m_arg1; _Store* m_store; }; @@ -63,8 +63,8 @@ class func2_t{ ~func2_t() {} void operator()() const {*m_store = ((m_ptr->*m_fn)(m_arg1,m_arg2));} private: - _Class* m_ptr; _Ret (_Class::*m_fn)(_Arg1,_Arg2); + _Class* m_ptr; _Arg1 m_arg1; _Arg2 m_arg2; _Store* m_store; @@ -78,8 +78,8 @@ class func3_t{ ~func3_t() {} void operator()() const {*m_store = ((m_ptr->*m_fn)(m_arg1,m_arg2,m_arg3));} private: - _Class* m_ptr; _Ret (_Class::*m_fn)(_Arg1,_Arg2,_Arg3); + _Class* m_ptr; _Arg1 m_arg1; _Arg2 m_arg2; _Arg3 m_arg3; @@ -94,8 +94,8 @@ class func4_t{ ~func4_t() {} void operator()() const {*m_store = ((m_ptr->*m_fn)(m_arg1,m_arg2,m_arg3,m_arg4));} private: - _Class* m_ptr; _Ret (_Class::*m_fn)(_Arg1,_Arg2,_Arg3,_Arg4); + _Class* m_ptr; _Arg1 m_arg1; _Arg2 m_arg2; _Arg3 m_arg3; diff --git a/slsDetectorSoftware/threadFiles/ThreadPool.cpp b/slsDetectorSoftware/threadFiles/ThreadPool.cpp index 347a15e31f..e1d473ead5 100644 --- a/slsDetectorSoftware/threadFiles/ThreadPool.cpp +++ b/slsDetectorSoftware/threadFiles/ThreadPool.cpp @@ -85,7 +85,8 @@ int ThreadPool::destroy_threadpool(){ } void* ThreadPool::execute_thread(){ - int ithread = current_thread_number; + //for debugging seting ithread value + // int ithread = current_thread_number; thread_started = true; Task* task = NULL; m_tasks_loaded = false; From f7d85231f2ac6efcda71bbd972442da6d14dfcc1 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:12:21 +0200 Subject: [PATCH 10/41] solved warnings except sscanf for uint64_t --- slsReceiverSoftware/include/logger.h | 11 ++++------- .../src/UDPStandardImplementation.cpp | 12 +++++++----- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/slsReceiverSoftware/include/logger.h b/slsReceiverSoftware/include/logger.h index a91dea9f4e..d01b1db2d6 100644 --- a/slsReceiverSoftware/include/logger.h +++ b/slsReceiverSoftware/include/logger.h @@ -7,16 +7,13 @@ #include #include -#ifdef VERBOSE -#define FILELOG_MAX_LEVEL logDEBUG -#endif - -#ifdef VERYVERBOSE -#define FILELOG_MAX_LEVEL logDEBUG4 -#endif #ifdef FIFODEBUG #define FILELOG_MAX_LEVEL logDEBUG5 +#elif VERYVERBOSE +#define FILELOG_MAX_LEVEL logDEBUG4 +#elif VERBOSE +#define FILELOG_MAX_LEVEL logDEBUG #endif #ifndef FILELOG_MAX_LEVEL diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index c31a037cb1..d26ec75ca0 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -20,6 +20,7 @@ #include //zmq #include +#include //printf of uint64_t etc using namespace std; @@ -1531,11 +1532,12 @@ int UDPStandardImplementation::setupWriter(){ tempname=tempname.substr(0,uscore); startAcquisitionCallBack(filePath, (char*)tempname.c_str(),fileIndex, (uint32_t)bufferSize,pStartAcquisition); } - if (rawDataReadyCallBack) + if (rawDataReadyCallBack) { FILE_LOG(logINFO) << "Data Write has been defined externally"; - if (!fileWriteEnable) + } + if (!fileWriteEnable) { FILE_LOG(logINFO) << "Data will not be saved"; - + } //creating first file @@ -2346,7 +2348,7 @@ int UDPStandardImplementation::prepareAndListenBufferCompleteFrames(int ithread) #ifdef VERBOSE if(!ithread) cprintf(BLUE, - "framenumber:%llu\tsubfnum:%u\tpnum:%u\tbunchid:%llu\txcoord:%u\tdettype:%u\tversion:%u\n", + "framenumber:%lu\tsubfnum:%u\tpnum:%u\tbunchid:%lu\txcoord:%u\tdettype:%u\tversion:%u\n", header->frameNumber, header->expLength, header->packetNumber, header->bunchId, header->xCoord, header->detType, header->version); #endif @@ -3325,7 +3327,7 @@ void UDPStandardImplementation::handleDataCompression(int ithread, char* wbuffer break; } - while(buff[0] = receiverData[ithread]->findNextFrame(data,ndata,remainingsize)){ + while((buff[0] = receiverData[ithread]->findNextFrame(data,ndata,remainingsize))){ //remaining number of packets np = ndata/onePacketSize; From 9aef802beab2c4f926dbe264deab64b2ae7454f7 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:24:49 +0200 Subject: [PATCH 11/41] changed all -lpthread to -pthread --- Makefile.include | 6 +++--- manual/manual-api/Makefile | 4 ++-- manual/manual-api/mainClient.cpp | 2 +- manual/manual-api/mainReceiver.cpp | 2 +- users/Makefile | 4 ++-- users/Makefile_new | 4 ++-- users/mainClient.cpp | 4 ++-- users/mainClient_new.cpp | 4 ++-- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Makefile.include b/Makefile.include index d223a7ce36..7357ba2a9e 100755 --- a/Makefile.include +++ b/Makefile.include @@ -5,9 +5,9 @@ CC = g++ CXX = $(CC) ASM=$(shell echo "/lib/modules/`uname -r`/build/include") -LDFLAGDET = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector -L/usr/lib64/ -lpthread -LDFLAGRXR = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -lpthread -FLAGS= -Wall #-DEIGER_DEBUG2 -DEIGER_DEBUG -DEIGER_DEBUG3 #-DFIFO_DEBUG +LDFLAGDET = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread +LDFLAGRXR = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread +FLAGS= -Wall -DVERBOSE -DVERYVERBOSE #-DEIGER_DEBUG2 -DEIGER_DEBUG -DEIGER_DEBUG3 #-DFIFO_DEBUG # -DVERBOSE # Setting up the verbose flags diff --git a/manual/manual-api/Makefile b/manual/manual-api/Makefile index 9c236d3edd..ac5451e012 100644 --- a/manual/manual-api/Makefile +++ b/manual/manual-api/Makefile @@ -2,8 +2,8 @@ INCLUDES = -I . SRC_DET = mainClient.cpp SRC_REC = mainReceiver.cpp LIBDIR = ../../bin -LDFLAG_DET = -L$(LIBDIR) -lSlsDetector -L/usr/lib64/ -lpthread -LDFLAG_REC = -L$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -lpthread +LDFLAG_DET = -L$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread +LDFLAG_REC = -L$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread DESTDIR ?= ../docs diff --git a/manual/manual-api/mainClient.cpp b/manual/manual-api/mainClient.cpp index cf2a335dfa..15838ba865 100644 --- a/manual/manual-api/mainClient.cpp +++ b/manual/manual-api/mainClient.cpp @@ -4,7 +4,7 @@ This file is an example of how to implement the slsDetectorUsers class You can compile it linking it to the slsDetector library -gcc mainClient.cpp -L lib -l SlsDetector -lm -lpthread +gcc mainClient.cpp -L lib -l SlsDetector -lm -pthread where lib is the location of libSlsDetector.so diff --git a/manual/manual-api/mainReceiver.cpp b/manual/manual-api/mainReceiver.cpp index 60276a9690..c0727dfa56 100644 --- a/manual/manual-api/mainReceiver.cpp +++ b/manual/manual-api/mainReceiver.cpp @@ -9,7 +9,7 @@ This file is an example of how to implement the slsDetectorUsers class You can compile it linking it to the slsDetector library -gcc mainReceiver.cpp -L lib -l SlsDetector -lm -lpthread +gcc mainReceiver.cpp -L lib -l SlsDetector -lm -pthread where lib is the location of libSlsDetector.so diff --git a/users/Makefile b/users/Makefile index 8922830370..3c5c83e572 100644 --- a/users/Makefile +++ b/users/Makefile @@ -2,8 +2,8 @@ WD = $(shell pwd) LIBDIR = $(WD)/../bin LIBRARYRXRDIR = $(WD)/../slsReceiverSoftware LIBRARYDETDIR = $(WD)/../slsDetectorSoftware -LDFLAGRXR = -L$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -lpthread -LDFLAGDET = -L$(LIBDIR) -lSlsDetector -L/usr/lib64/ -lpthread +LDFLAGRXR = -L$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread +LDFLAGDET = -L$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread INCLUDESRXR = -I $(LIBRARYRXRDIR)/include INCLUDESDET = -I $(LIBRARYRXRDIR)/include -I $(LIBRARYDETDIR)/slsDetector -I $(LIBRARYDETDIR)/slsDetectorAnalysis diff --git a/users/Makefile_new b/users/Makefile_new index ddc0050189..0f5bae42a3 100644 --- a/users/Makefile_new +++ b/users/Makefile_new @@ -2,8 +2,8 @@ WD = $(shell pwd) LIBDIR = $(WD)/../bin LIBRARYRXRDIR = $(WD)/../slsReceiverSoftware LIBRARYDETDIR = $(WD)/../slsDetectorSoftware -LDFLAGRXR = -L$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -lpthread -LDFLAGDET = -L$(LIBDIR) -lSlsDetector -L/usr/lib64/ -lpthread +LDFLAGRXR = -L$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread +LDFLAGDET = -L$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread INCLUDESRXR = -I $(LIBRARYRXRDIR)/include INCLUDESDET = -I $(LIBRARYDETDIR)/slsDetector -I $(LIBRARYDETDIR)/slsDetectorAnalysis diff --git a/users/mainClient.cpp b/users/mainClient.cpp index df03ad74e8..e7310e1a38 100644 --- a/users/mainClient.cpp +++ b/users/mainClient.cpp @@ -4,10 +4,10 @@ This file is an example of how to implement the slsDetectorUsers class You can compile it linking it to the slsDetector library -gcc mainClient.cpp -L lib -l SlsDetector -lm -lpthread +gcc mainClient.cpp -L lib -l SlsDetector -lm -pthread where lib is the location of libSlsDetector.so -gcc mainClient.cpp -L . -l SlsDetector -lm -lpthread -o users +gcc mainClient.cpp -L . -l SlsDetector -lm -pthread -o users */ diff --git a/users/mainClient_new.cpp b/users/mainClient_new.cpp index 9208c0b971..6490888ec5 100644 --- a/users/mainClient_new.cpp +++ b/users/mainClient_new.cpp @@ -5,10 +5,10 @@ This file is an example of how to implement the slsDetectorUsers class You can compile it linking it to the slsDetector library -gcc mainClient.cpp -L lib -l SlsDetector -lm -lpthread +gcc mainClient.cpp -L lib -l SlsDetector -lm -pthread where lib is the location of libSlsDetector.so -gcc mainClient.cpp -L . -l SlsDetector -lm -lpthread -o users +gcc mainClient.cpp -L . -l SlsDetector -lm -pthread -o users */ From 7c3b5065a5af163859f015c8397e8d1e1bd1c02c Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:25:09 +0200 Subject: [PATCH 12/41] changed all -lpthread to -pthread --- slsDetectorGui/client/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorGui/client/Makefile b/slsDetectorGui/client/Makefile index 5545785fa8..c7ea673022 100644 --- a/slsDetectorGui/client/Makefile +++ b/slsDetectorGui/client/Makefile @@ -1,6 +1,6 @@ CC = g++ CLAGS += -DVERBOSE #VERYBOSE -LDLIBS += -lm -lstdc++ -lpthread +LDLIBS += -lm -lstdc++ -pthread LDIR = ../../slsDetectorSoftware RDIR = ../../slsReceiverSoftware From b91180f5b2f04e500d6f6bf6cd259a93d9c83c5f Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:26:03 +0200 Subject: [PATCH 13/41] changed all -lpthread to -pthread --- slsDetectorSoftware/Makefile | 4 ++-- .../slsDetectorClient/Makefile | 2 +- .../slsDetectorClient/Makefile.x04sa | 2 +- slsDetectorSoftware/threadFiles/Makefile | 20 +++++++++---------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/slsDetectorSoftware/Makefile b/slsDetectorSoftware/Makefile index e28fae7905..2f5ff41539 100644 --- a/slsDetectorSoftware/Makefile +++ b/slsDetectorSoftware/Makefile @@ -69,14 +69,14 @@ gotthardVirtualServer: $(SRC_MYTHEN_SVC) %.o : %.cpp %.h Makefile - $(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) -lpthread -lrt $(LIBZMQ) $(FLAGS) + $(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) -pthread -lrt $(LIBZMQ) $(FLAGS) package: $(OBJS) $(DESTDIR)/libSlsDetector.so $(DESTDIR)/libSlsDetector.a $(DESTDIR)/libSlsDetector.so: $(OBJS) - $(CXX) -shared -Wl,-soname,libSlsDetector.so -o libSlsDetector.so $(OBJS) -lc $(INCLUDES) $(DFLAGS) $(FLAGS) $(EPICSFLAGS) -L/usr/lib64 -lpthread -lrt $(LIBZMQ) + $(CXX) -shared -Wl,-soname,libSlsDetector.so -o libSlsDetector.so $(OBJS) -lc $(INCLUDES) $(DFLAGS) $(FLAGS) $(EPICSFLAGS) -L/usr/lib64 -pthread -lrt $(LIBZMQ) $(shell test -d $(DESTDIR) || mkdir -p $(DESTDIR)) mv libSlsDetector.so $(DESTDIR) diff --git a/slsDetectorSoftware/slsDetectorClient/Makefile b/slsDetectorSoftware/slsDetectorClient/Makefile index fef04074ae..63a49637ae 100644 --- a/slsDetectorSoftware/slsDetectorClient/Makefile +++ b/slsDetectorSoftware/slsDetectorClient/Makefile @@ -13,7 +13,7 @@ INCLUDES?= -I../commonFiles -I../slsDetector -I ../MySocketTCP -I../usersFuncti LIBDIR?=../ LIBS?= -L$(LIBDIR) -lSlsDetector -LDFLAG= -L/usr/lib64/ -lpthread +LDFLAG= -L/usr/lib64/ -pthread DESTDIR ?= bin diff --git a/slsDetectorSoftware/slsDetectorClient/Makefile.x04sa b/slsDetectorSoftware/slsDetectorClient/Makefile.x04sa index 7e2daa9bdb..af02ea1769 100644 --- a/slsDetectorSoftware/slsDetectorClient/Makefile.x04sa +++ b/slsDetectorSoftware/slsDetectorClient/Makefile.x04sa @@ -2,7 +2,7 @@ CFLAGS= -DC_ONLY FLAGS=-DVERBOSE INCLUDES= -I../slsDetectorSoftware/commonFiles -I../slsDetectorSoftware/slsDetector -I ../slsDetectorSoftware/MySocketTCP -I../slsDetectorSoftware/usersFunctions -I../slsDetectorSoftware/multiSlsDetector -I../slsDetectorSoftware/slsDetectorAnalysis LIBS= -L../slsDetectorSoftware/ -LDFLAG= -lSlsDetector -lpthread +LDFLAG= -lSlsDetector -pthread EPICSFLAGS=-DEPICS -I/usr/local/epics/base/include/ -I /usr/local/epics/base/include/os/Linux/ -L /usr/local/epics/base/lib/SL5-x86/ -Wl,-R/usr/local/epics/base/lib/SL5-x86 -lca -lCom diff --git a/slsDetectorSoftware/threadFiles/Makefile b/slsDetectorSoftware/threadFiles/Makefile index 19b5b40e49..a1eb27d297 100644 --- a/slsDetectorSoftware/threadFiles/Makefile +++ b/slsDetectorSoftware/threadFiles/Makefile @@ -2,20 +2,20 @@ OBJPATH=bin/obj EXAMPLEPATH=bin/example all: - g++ CondVar.cpp -lpthread -c -g -o $(OBJPATH)/CondVar.o - g++ Mutex.cpp -lpthread -c -g -o $(OBJPATH)/Mutex.o - #g++ Task.cpp -lpthread -c -g -o $(OBJPATH)/Task.o - g++ ThreadPool.cpp -lpthread -c -g -o $(OBJPATH)/ThreadPool.o - g++ Multi.cpp -lpthread -c -g -o $(OBJPATH)/Multi.o - #g++ $(OBJPATH)/CondVar.o $(OBJPATH)/Mutex.o $(OBJPATH)/Task.o $(OBJPATH)/ThreadPool.o threadpool_test.cpp Single.cpp Multi.cpp -lpthread -I . -g -o $(EXAMPLEPATH)threadpool_test - g++ $(OBJPATH)/CondVar.o $(OBJPATH)/Mutex.o $(OBJPATH)/ThreadPool.o threadpool_test.cpp Single.cpp Multi.cpp -lpthread -I . -g -o $(EXAMPLEPATH)threadpool_test + g++ CondVar.cpp -pthread -c -g -o $(OBJPATH)/CondVar.o + g++ Mutex.cpp -pthread -c -g -o $(OBJPATH)/Mutex.o + #g++ Task.cpp -pthread -c -g -o $(OBJPATH)/Task.o + g++ ThreadPool.cpp -pthread -c -g -o $(OBJPATH)/ThreadPool.o + g++ Multi.cpp -pthread -c -g -o $(OBJPATH)/Multi.o + #g++ $(OBJPATH)/CondVar.o $(OBJPATH)/Mutex.o $(OBJPATH)/Task.o $(OBJPATH)/ThreadPool.o threadpool_test.cpp Single.cpp Multi.cpp -pthread -I . -g -o $(EXAMPLEPATH)threadpool_test + g++ $(OBJPATH)/CondVar.o $(OBJPATH)/Mutex.o $(OBJPATH)/ThreadPool.o threadpool_test.cpp Single.cpp Multi.cpp -pthread -I . -g -o $(EXAMPLEPATH)threadpool_test #all: -# g++ threadpool.cpp -lpthread -fpic -c -o bin/obj/threadpool.o -# g++ -L./bin bin/obj/threadpool.o -lpthread threadpool_test.cpp -o bin/example/threadpool_test +# g++ threadpool.cpp -pthread -fpic -c -o bin/obj/threadpool.o +# g++ -L./bin bin/obj/threadpool.o -pthread threadpool_test.cpp -o bin/example/threadpool_test #threadpool: -# g++ threadpool.cpp -lpthread -fpic -c -o bin/obj/threadpool.o +# g++ threadpool.cpp -pthread -fpic -c -o bin/obj/threadpool.o # g++ -shared -fPIC bin/obj/threadpool.o -o bin/lib/libthreadpool.so #example: # g++ -L./bin/lib -lthreadpool threadpool_test.cpp -o threadpool_test From bd5293f4b184ece0cee6e4c7e6a4f03865950127 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:26:09 +0200 Subject: [PATCH 14/41] changed all -lpthread to -pthread --- slsReceiverSoftware/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slsReceiverSoftware/Makefile b/slsReceiverSoftware/Makefile index d94ac77a04..c65f2806e4 100644 --- a/slsReceiverSoftware/Makefile +++ b/slsReceiverSoftware/Makefile @@ -54,7 +54,7 @@ $(BUILDDIR)/%.o : $(SRCDIR)/%.cpp Makefile ifeq ($(ROOTSLS),yes) $(CXX) -DROOTSLS -o $@ -c $< $(INCLUDES) $(DFLAGS) $(ROOTFLAGS) -fPIC $(EPICSFLAGS) $(LDFLAGRXR) -L/usr/lib64/ $(FLAGS) else - $(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) $(LDFLAGRXR) -lpthread $(FLAGS) $(LIBZMQ) -lrt + $(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) $(LDFLAGRXR) -pthread $(FLAGS) $(LIBZMQ) -lrt endif lib: $(OBJS) $(DESTDIR)/libSlsReceiver.so $(DESTDIR)/libSlsReceiver.a @@ -63,7 +63,7 @@ receiver: $(DESTDIR)/slsReceiver $(DESTDIR)/libSlsReceiver.so: $(OBJS) - $(CXX) -shared -Wl,-soname,libSlsReceiver.so -o libSlsReceiver.so $(OBJS) -lc $(INCLUDES) $(DFLAGS) $(FLAGS) $(EPICSFLAGS) -L/usr/lib64 -lpthread $(LIBZMQ) -lrt + $(CXX) -shared -Wl,-soname,libSlsReceiver.so -o libSlsReceiver.so $(OBJS) -lc $(INCLUDES) $(DFLAGS) $(FLAGS) $(EPICSFLAGS) -L/usr/lib64 -pthread $(LIBZMQ) -lrt $(shell test -d $(DESTDIR) || mkdir -p $(DESTDIR)) mv libSlsReceiver.so $(DESTDIR) From 8fb39b8c7ec5b7d4c02568972c86968e69f671da Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:27:27 +0200 Subject: [PATCH 15/41] changed all -lpthread to -pthread --- Makefile.include | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.include b/Makefile.include index 7357ba2a9e..5d74d15bd6 100755 --- a/Makefile.include +++ b/Makefile.include @@ -7,7 +7,7 @@ CXX = $(CC) ASM=$(shell echo "/lib/modules/`uname -r`/build/include") LDFLAGDET = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread LDFLAGRXR = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread -FLAGS= -Wall -DVERBOSE -DVERYVERBOSE #-DEIGER_DEBUG2 -DEIGER_DEBUG -DEIGER_DEBUG3 #-DFIFO_DEBUG +FLAGS= -Wall -pthread -DVERBOSE -DVERYVERBOSE #-DEIGER_DEBUG2 -DEIGER_DEBUG -DEIGER_DEBUG3 #-DFIFO_DEBUG # -DVERBOSE # Setting up the verbose flags From 5ddccbdee4043a967bfdc92c6fe90069b2796c5d Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:28:00 +0200 Subject: [PATCH 16/41] changed all -lpthread to -pthread --- Makefile.include | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.include b/Makefile.include index 5d74d15bd6..bfdb2d673a 100755 --- a/Makefile.include +++ b/Makefile.include @@ -12,10 +12,10 @@ FLAGS= -Wall -pthread -DVERBOSE -DVERYVERBOSE #-DEIGER_DEBUG2 -DEIGER_DEBUG -D # Setting up the verbose flags ifeq ($(DEBUG),1) - FLAGS = -Wall -DVERBOSE + FLAGS = -Wall -pthread -DVERBOSE endif ifeq ($(DEBUG),2) - FLAGS = -Wall -DVERYVERBOSE + FLAGS = -Wall -pthread -DVERYVERBOSE endif ############################################################## From f0198d2d2ede5631acf5e907f538b607d800a0cf Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:50:17 +0200 Subject: [PATCH 17/41] alejandro's changes from ESRF --- .../include/UDPStandardImplementation.h | 4 ++-- slsReceiverSoftware/include/circularFifo.h | 2 +- slsReceiverSoftware/include/logger.h | 18 ++++++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/slsReceiverSoftware/include/UDPStandardImplementation.h b/slsReceiverSoftware/include/UDPStandardImplementation.h index ccada5681c..a97ab3de64 100644 --- a/slsReceiverSoftware/include/UDPStandardImplementation.h +++ b/slsReceiverSoftware/include/UDPStandardImplementation.h @@ -739,7 +739,7 @@ class UDPStandardImplementation: private virtual slsReceiverDefs, public UDPBase //***data call back thread parameters*** /** Ensures if zmq threads created successfully */ - bool zmqThreadStarted; + volatile bool zmqThreadStarted; /** Number of data callback Threads */ int numberofDataCallbackThreads; @@ -760,7 +760,7 @@ class UDPStandardImplementation: private virtual slsReceiverDefs, public UDPBase //***general and listening thread parameters*** /** Ensures if threads created successfully */ - bool threadStarted; + volatile bool threadStarted; /** Current Thread Index*/ int currentThreadIndex; diff --git a/slsReceiverSoftware/include/circularFifo.h b/slsReceiverSoftware/include/circularFifo.h index 1d6fd427de..b0d70eab4b 100644 --- a/slsReceiverSoftware/include/circularFifo.h +++ b/slsReceiverSoftware/include/circularFifo.h @@ -134,7 +134,7 @@ bool CircularFifo::isEmpty() const template bool CircularFifo::isFull() const { - int tailCheck = (tail+1) % Capacity; + int tailCheck = increment(tail); return (tailCheck == head); } diff --git a/slsReceiverSoftware/include/logger.h b/slsReceiverSoftware/include/logger.h index d01b1db2d6..ff1762c19a 100644 --- a/slsReceiverSoftware/include/logger.h +++ b/slsReceiverSoftware/include/logger.h @@ -123,14 +123,18 @@ inline std::string NowTime() inline std::string NowTime() { char buffer[11]; + const int buffer_len = sizeof(buffer); time_t t; time(&t); tm r = {0}; - strftime(buffer, sizeof(buffer), "%X", localtime_r(&t, &r)); + strftime(buffer, buffer_len, "%X", localtime_r(&t, &r)); + buffer[buffer_len - 1] = 0; struct timeval tv; gettimeofday(&tv, 0); - char result[100] = {0}; - sprintf(result, "%s.%03ld", buffer, (long)tv.tv_usec / 1000); + char result[100]; + const int result_len = sizeof(result); + snprintf(result, result_len, "%s.%03ld", buffer, (long)tv.tv_usec / 1000); + result[result_len - 1] = 0; return result; } @@ -144,7 +148,8 @@ template std::ostringstream& Log::Get(TLogLevel level) lev = level; os << "- " << NowTime(); os << " " << ToString(level) << ": "; - os << std::string(level > logDEBUG ? level - logDEBUG : 0, '\t'); + if (level > logDEBUG) + os << std::string(level - logDEBUG, '\t'); return os; } @@ -216,14 +221,15 @@ inline void Output2FILE::Output(const std::string& msg, TLogLevel level) FILE* pStream = Stream(); if (!pStream) return; + bool out = true; switch(level){ case logERROR: cprintf(RED BOLD,"%s",msg.c_str()); break; case logWARNING: cprintf(YELLOW BOLD,"%s",msg.c_str()); break; case logINFO: cprintf(GRAY,"%s",msg.c_str());break; // case logINFO: cprintf(DARKGRAY BOLD,"%s",msg.c_str());break; - default: fprintf(pStream,"%s",msg.c_str()); break; + default: fprintf(pStream,"%s",msg.c_str()); out = false; break; } - fflush(pStream); + fflush(out ? stdout : pStream); } #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) From 7c725cc69b1ba2deb0f825d21066d34ae229c65a Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 14:57:19 +0200 Subject: [PATCH 18/41] .c_str() must not access global variables from thread --- slsReceiverSoftware/src/UDPStandardImplementation.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index d26ec75ca0..6075e0666f 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -2523,8 +2523,7 @@ uint32_t UDPStandardImplementation::processListeningBuffer(int ithread, int &cSi break; default: - cprintf(RED,"Listening_Thread %d: Error: This detector %s is not implemented in the receiver\n", - ithread, getDetectorType(myDetectorType).c_str()); + cprintf(RED,"Listening_Thread %d: Error: This detector is not implemented in the receiver\n", ithread); break; } From ab94af6d2922e6386adf500df710992cf4a12ba4 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 7 Apr 2017 15:08:40 +0200 Subject: [PATCH 19/41] removed verbose etc --- Makefile.include | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.include b/Makefile.include index bfdb2d673a..e76952335f 100755 --- a/Makefile.include +++ b/Makefile.include @@ -7,7 +7,7 @@ CXX = $(CC) ASM=$(shell echo "/lib/modules/`uname -r`/build/include") LDFLAGDET = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread LDFLAGRXR = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread -FLAGS= -Wall -pthread -DVERBOSE -DVERYVERBOSE #-DEIGER_DEBUG2 -DEIGER_DEBUG -DEIGER_DEBUG3 #-DFIFO_DEBUG +FLAGS= -Wall -pthread #-DEIGER_DEBUG2 -DEIGER_DEBUG -DEIGER_DEBUG3 #-DFIFO_DEBUG # -DVERBOSE # Setting up the verbose flags From 4f83fcb001071ab37ac3f0496c41bb68a907bcc7 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 11 Apr 2017 09:02:10 +0200 Subject: [PATCH 20/41] updaterev --- slsDetectorGui/gitInfo.txt | 10 +++++----- slsDetectorGui/include/gitInfoGui.h | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/slsDetectorGui/gitInfo.txt b/slsDetectorGui/gitInfo.txt index c627d20965..f63ad47239 100644 --- a/slsDetectorGui/gitInfo.txt +++ b/slsDetectorGui/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorGui URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_gui.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_gui.git -Repsitory UUID: c43f58653a9b90aade45b9649810ff11225ca844 -Revision: 379 -Branch: 2.3-rc +Repsitory UUID: bddd126e382c1b2e8082419ff393f6e1fb17526a +Revision: 381 +Branch: 2.3.1 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 379 -Last Changed Date: 2016-12-16 14:46:02 +0100 +Last Changed Rev: 381 +Last Changed Date: 2017-04-07 14:25:09 +0200 diff --git a/slsDetectorGui/include/gitInfoGui.h b/slsDetectorGui/include/gitInfoGui.h index 3c2a38f68b..7d0f53315e 100644 --- a/slsDetectorGui/include/gitInfoGui.h +++ b/slsDetectorGui/include/gitInfoGui.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_detector_gui.git" //#define SVNREPPATH "" -#define SVNREPUUID "c43f58653a9b90aade45b9649810ff11225ca844" -//#define SVNREV 0x379 +#define SVNREPUUID "bddd126e382c1b2e8082419ff393f6e1fb17526a" +//#define SVNREV 0x381 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x379 -#define SVNDATE 0x20161216 +#define SVNREV 0x381 +#define SVNDATE 0x20170407 // From 17cb63a57f3c3b77412d57aaf6c1f9f4c7a9f27f Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 11 Apr 2017 09:03:19 +0200 Subject: [PATCH 21/41] updaterev --- slsDetectorSoftware/gitInfo.txt | 10 +++++----- slsDetectorSoftware/slsDetector/gitInfoLib.h | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index 5bd5174f4d..22abc58a9c 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 3618c87c5cd000fff7799ddd8cd07a4162d9fdec -Revision: 1340 -Branch: 2.3 +Repsitory UUID: 008ed7012306d2ab0911963d6b82c6fb23f5d94a +Revision: 1344 +Branch: 2.3.1 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1340 -Last Changed Date: 2017-03-23 13:46:02 +0100 +Last Changed Rev: 1344 +Last Changed Date: 2017-04-07 14:26:03 +0200 diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index e12835184b..a6363c728e 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURLLIB "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUIDLIB "3618c87c5cd000fff7799ddd8cd07a4162d9fdec" -//#define SVNREV 0x1340 +#define SVNREPUUIDLIB "008ed7012306d2ab0911963d6b82c6fb23f5d94a" +//#define SVNREV 0x1344 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTHLIB "Dhanya_Maliakal" -#define SVNREVLIB 0x1340 -#define SVNDATELIB 0x20170323 +#define SVNREVLIB 0x1344 +#define SVNDATELIB 0x20170407 // From 6ecca8fcb0c3e5f7155b94970344b6b58f62dff1 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 11 Apr 2017 09:03:26 +0200 Subject: [PATCH 22/41] updaterev --- slsReceiverSoftware/gitInfo.txt | 10 +++++----- slsReceiverSoftware/include/gitInfoReceiver.h | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/slsReceiverSoftware/gitInfo.txt b/slsReceiverSoftware/gitInfo.txt index bfc610dae6..793f120513 100644 --- a/slsReceiverSoftware/gitInfo.txt +++ b/slsReceiverSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsReceiverSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_receiver_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_receiver_software.git -Repsitory UUID: a453c1d55d73fecc18af9df6ada21621a989ee4b -Revision: 514 -Branch: 2.3 +Repsitory UUID: 8d07417b37c1cc24c0350404c0e52baee1aa0dc7 +Revision: 519 +Branch: 2.3.1 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 514 -Last Changed Date: 2017-03-24 13:41:56 +0100 +Last Changed Rev: 519 +Last Changed Date: 2017-04-07 14:57:19 +0200 diff --git a/slsReceiverSoftware/include/gitInfoReceiver.h b/slsReceiverSoftware/include/gitInfoReceiver.h index 29510e4e99..bf5a17e702 100644 --- a/slsReceiverSoftware/include/gitInfoReceiver.h +++ b/slsReceiverSoftware/include/gitInfoReceiver.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_receiver_software.git" //#define SVNREPPATH "" -#define SVNREPUUID "a453c1d55d73fecc18af9df6ada21621a989ee4b" -//#define SVNREV 0x514 +#define SVNREPUUID "8d07417b37c1cc24c0350404c0e52baee1aa0dc7" +//#define SVNREV 0x519 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x514 -#define SVNDATE 0x20170324 +#define SVNREV 0x519 +#define SVNDATE 0x20170407 // From 43efb8acfddcb2f42968565a315dcdc66f227d6c Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 11 Apr 2017 13:31:32 +0200 Subject: [PATCH 23/41] removing warnings shown from esrf debian --- .../multiSlsDetector/multiSlsDetector.cpp | 7 +- .../slsDetector/slsDetector.cpp | 103 ++++++++++-------- slsDetectorSoftware/slsDetector/slsDetector.h | 2 +- .../slsDetector/slsDetectorActions.cpp | 4 +- .../slsDetector/slsDetectorCommand.cpp | 26 ++--- .../slsDetectorAnalysis/energyConversion.cpp | 6 +- .../slsDetectorAnalysis/energyConversion.h | 2 +- .../slsDetectorAnalysis/fileIOStatic.h | 2 - .../slsDetectorAnalysis/postProcessing.cpp | 4 + .../threadFiles/ThreadPool.cpp | 5 +- 10 files changed, 87 insertions(+), 74 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index fb1ae4bda2..d792ab0c21 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1436,7 +1436,7 @@ int* multiSlsDetector::getDataFromDetector() { int n = 0; int* retval= NULL; int *retdet, *p=retval; - int nodata=1, nodatadet=-1; + int nodatadet=-1; int nodatadetectortype = false; detectorType types = getDetectorsType(); if(types == EIGER || types == JUNGFRAU){ @@ -1455,7 +1455,6 @@ int* multiSlsDetector::getDataFromDetector() { if(!nodatadetectortype){ n=detectors[id]->getDataBytes(); if (retdet) { - nodata=0; #ifdef VERBOSE cout << "Detector " << id << " returned " << n << " bytes " << endl; #endif @@ -2105,7 +2104,6 @@ slsDetectorDefs::ROI* multiSlsDetector::getROI(int &n){ n = 0; int num = 0,i,j; int ndet = thisMultiDetector->numberOfDetectors; - int nroi[ndet]; int maxroi = ndet*MAX_ROIS; ROI temproi; ROI roiLimits[maxroi]; @@ -2120,7 +2118,6 @@ slsDetectorDefs::ROI* multiSlsDetector::getROI(int &n){ if(detectors[i]->getErrorMask()) setErrorMask(getErrorMask()|(1<setRateCorrection(t); if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<nModsMax; imod++) { @@ -967,66 +967,67 @@ slsDetectorDefs::sls_detector_module* slsDetector::createModule(detectorType t) sls_detector_module *myMod=(sls_detector_module*)malloc(sizeof(sls_detector_module)); - int nch, nm, nc, nd, na=0; + int nch, nc, nd, na=0; + //int nm = 0; switch(t) { case MYTHEN: nch=128; // complete mythen system - nm=24; + // nm=24; nc=10; nd=6; // dacs break; case PICASSO: nch=128; // complete mythen system - nm=24; + // nm=24; nc=12; nd=6; // dacs+adcs break; case GOTTHARD: nch=128; - nm=1; + // nm=1; nc=10; nd=8; // dacs+adcs na=5; break; case PROPIX: nch=22*22; - nm=1; + // nm=1; nc=1; nd=8; // dacs+adcs na=5; break; case EIGER: nch=256*256; // one EIGER half module - nm=1; //modules/detector + // nm=1; //modules/detector nc=4*1; //chips nd=16; //dacs na=0; break; case MOENCH: nch=160*160; - nm=1; //modules/detector + // nm=1; //modules/detector nc=1; //chips nd=8; //dacs na=1; break; case JUNGFRAU: nch=256*256;//32; - nm=1; + // nm=1; nc=4*2; nd=16; // dacs+adcs na=0; break; case JUNGFRAUCTB: nch=32;//32; - nm=1; + // nm=1; nc=1; nd=8; // dacs+adcs na=1; break; default: nch=0; // dum! - nm=0; //modules/detector + // nm=0; //modules/detector nc=0; //chips nd=0; //dacs+adcs na=0; @@ -1672,7 +1673,6 @@ int slsDetector::setNumberOfModules(int n, dimension d){ int ret=FAIL; char mess[MAX_STR_LENGTH]="dummy"; int connect; - int num; arg[0]=d; arg[1]=n; @@ -1693,11 +1693,11 @@ int slsDetector::setNumberOfModules(int n, dimension d){ if (connect == UNDEFINED) printf( "no control socket? \n" ); else if (connect == OK){ - num = controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - num = controlSocket->SendDataOnly(&arg,sizeof(arg)); - num = controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&arg,sizeof(arg)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret!=FAIL) { - num = controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); printf( "Detector returned error: %s \n", mess ); @@ -3728,18 +3728,18 @@ int slsDetector::updateDetectorNoWait() { // int ret=OK; enum detectorSettings t; - int thr, n, nm; + int thr, n, nm = 0; // int it; int64_t retval;// tns=-1; char lastClientIP[INET_ADDRSTRLEN]; - n = controlSocket->ReceiveDataOnly(lastClientIP,sizeof(lastClientIP)); + n += controlSocket->ReceiveDataOnly(lastClientIP,sizeof(lastClientIP)); #ifdef VERBOSE printf( "Updating detector last modified by %s \n", lastClientIP ); #endif - n = controlSocket->ReceiveDataOnly(&nm,sizeof(nm)); + n += controlSocket->ReceiveDataOnly(&nm,sizeof(nm)); thisDetector->nMod[X]=nm; - n = controlSocket->ReceiveDataOnly( &nm,sizeof(nm)); + n += controlSocket->ReceiveDataOnly( &nm,sizeof(nm)); /// Should be overcome at a certain point! if (thisDetector->myDetectorType==MYTHEN) { @@ -3761,13 +3761,13 @@ int slsDetector::updateDetectorNoWait() { if (thisDetector->nModMax[Y]nMod[Y]) thisDetector->nModMax[Y]=thisDetector->nMod[Y]; - n = controlSocket->ReceiveDataOnly( &nm,sizeof(nm)); + n += controlSocket->ReceiveDataOnly( &nm,sizeof(nm)); thisDetector->dynamicRange=nm; - n = controlSocket->ReceiveDataOnly( &nm,sizeof(nm)); + n += controlSocket->ReceiveDataOnly( &nm,sizeof(nm)); thisDetector->dataBytes=nm; //t=setSettings(GET_SETTINGS); - n = controlSocket->ReceiveDataOnly( &t,sizeof(t)); + n += controlSocket->ReceiveDataOnly( &t,sizeof(t)); thisDetector->currentSettings=t; if((thisDetector->myDetectorType!= GOTTHARD)&& @@ -3775,42 +3775,45 @@ int slsDetector::updateDetectorNoWait() { (thisDetector->myDetectorType!= JUNGFRAU)&& (thisDetector->myDetectorType!= MOENCH)){ //thr=getThresholdEnergy(); - n = controlSocket->ReceiveDataOnly( &thr,sizeof(thr)); + n += controlSocket->ReceiveDataOnly( &thr,sizeof(thr)); thisDetector->currentThresholdEV=thr; } //retval=setFrames(tns); - n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + n += controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[FRAME_NUMBER]=retval; // retval=setExposureTime(tns); - n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + n += controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[ACQUISITION_TIME]=retval; if(thisDetector->myDetectorType == EIGER){ //retval=setSubFrameExposureTime(tns); - n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + n += controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]=retval; } //retval=setPeriod(tns); - n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + n += controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[FRAME_PERIOD]=retval; //retval=setDelay(tns); - n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + n += controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[DELAY_AFTER_TRIGGER]=retval; // retval=setGates(tns); - n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + n += controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[GATES_NUMBER]=retval; //retval=setProbes(tns); if (thisDetector->myDetectorType == MYTHEN){ - n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + n += controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[PROBES_NUMBER]=retval; } //retval=setTrains(tns); - n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + n += controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[CYCLES_NUMBER]=retval; + if (!n) + printf("n: %d\n", n); + return OK; } @@ -4216,7 +4219,6 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ int64_t retval = -1; char mess[MAX_STR_LENGTH]=""; int ret=OK; - int n=0; if (index!=MEASUREMENTS_NUMBER) { @@ -4228,7 +4230,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ if (connectControl() == OK){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&index,sizeof(index)); - n=controlSocket->SendDataOnly(&t,sizeof(t)); + controlSocket->SendDataOnly(&t,sizeof(t)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); @@ -4705,7 +4707,7 @@ int slsDetector::setSpeed(speedVariable sp, int value) { int retval=-1; char mess[MAX_STR_LENGTH]=""; int ret=OK; - int n=0; + #ifdef VERBOSE printf( "Setting speed variable %d to %d \n", sp, value ); #endif @@ -4713,7 +4715,7 @@ int slsDetector::setSpeed(speedVariable sp, int value) { if (connectControl() == OK){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&sp,sizeof(sp)); - n=controlSocket->SendDataOnly(&value,sizeof(value)); + controlSocket->SendDataOnly(&value,sizeof(value)); #ifdef VERBOSE printf( "Sent %d bytes \n", n ); #endif @@ -6477,13 +6479,17 @@ int slsDetector::readConfigurationFile(string const fname){ //char *args[1000]; string sargname, sargval; - int iline=0; #ifdef VERBOSE + int iline=0; printf( "config file name %s \n", fname.c_str() ); #endif infile.open(fname.c_str(), ios_base::in); if (infile.is_open()) { +#ifdef VERBOSE iline=readConfigurationFile(infile); +#else + readConfigurationFile(infile); +#endif infile.close(); } else { printf( "Error opening configuration file %s for reading \n", fname.c_str() ); @@ -6571,11 +6577,16 @@ int slsDetector::writeConfigurationFile(string const fname){ ofstream outfile; +#ifdef VERBOSE int ret; - +#endif outfile.open(fname.c_str(),ios_base::out); if (outfile.is_open()) { - ret=writeConfigurationFile(outfile); +#ifdef VERBOSE + ret=writeConfigurationFile(outfile); +#else + writeConfigurationFile(outfile); +#endif outfile.close(); } else { @@ -6691,7 +6702,7 @@ int slsDetector::writeConfigurationFile(ofstream &outfile, int id){ -int slsDetector::writeSettingsFile(string fname, int imod, int& iodelay, int& tau){ +int slsDetector::writeSettingsFile(string fname, int imod, int iodelay, int tau){ return writeSettingsFile(fname,thisDetector->myDetectorType, detectorModules[imod], iodelay, tau); @@ -7795,21 +7806,21 @@ string slsDetector::getReceiverLastClientIP(){ int slsDetector::updateReceiverNoWait() { - int n,ind; + int n,ind = 0; char path[MAX_STR_LENGTH]; char lastClientIP[INET_ADDRSTRLEN]; - n = dataSocket->ReceiveDataOnly(lastClientIP,sizeof(lastClientIP)); + n += dataSocket->ReceiveDataOnly(lastClientIP,sizeof(lastClientIP)); #ifdef VERBOSE printf( "Updating receiver last modified by %s \n", lastClientIP ); #endif - n = dataSocket->ReceiveDataOnly(&ind,sizeof(ind)); + n += dataSocket->ReceiveDataOnly(&ind,sizeof(ind)); pthread_mutex_lock(&ms); fileIO::setFileIndex(ind); pthread_mutex_unlock(&ms); - n = dataSocket->ReceiveDataOnly(path,MAX_STR_LENGTH); + n += dataSocket->ReceiveDataOnly(path,MAX_STR_LENGTH); pthread_mutex_lock(&ms); fileIO::setFilePath(path); pthread_mutex_unlock(&ms); @@ -7819,6 +7830,8 @@ int slsDetector::updateReceiverNoWait() { fileIO::setFileName(path); pthread_mutex_unlock(&ms); + if (!n) printf("n: %d\n", n); + return OK; } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index ed8f57ac02..fa3cc8e258 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -511,7 +511,7 @@ class slsDetector : public slsDetectorUtils, public energyConversion { \sa ::sls_detector_module sharedSlsDetector mythenDetector::writeSettingsFile(string, int) */ using energyConversion::writeSettingsFile; - int writeSettingsFile(string fname, int imod, int& iodelay, int& tau); + int writeSettingsFile(string fname, int imod, int iodelay, int tau); /** diff --git a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp index 5d0b77621a..6db2329a24 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp @@ -75,10 +75,10 @@ int slsDetectorActions::setActionScript(int iaction, string fname) { int slsDetectorActions::setActionParameter(int iaction, string par) { - int am; + // int am; if (iaction>=0 && iaction(&iodelay), sizeof(iodelay)); + outfile.write(reinterpret_cast(&tau), sizeof(tau)); outfile.write((char*)mod.chanregs, sizeof(int)*(mod.nchan)); outfile.close(); diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h index 54a104e031..8aec3cb472 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h @@ -119,7 +119,7 @@ class energyConversion \sa ::sls_detector_module mythenDetector::writeSettingsFile(string, sls_detector_module) */ - int writeSettingsFile(string fname, detectorType myDetectorType, sls_detector_module mod, int& iodelay, int& tau); + int writeSettingsFile(string fname, detectorType myDetectorType, sls_detector_module mod, int iodelay, int tau); /** allocates the momery for a detector module structure \param myDetectorType detector type (needed for number of channels, chips, dacs etc.) diff --git a/slsDetectorSoftware/slsDetectorAnalysis/fileIOStatic.h b/slsDetectorSoftware/slsDetectorAnalysis/fileIOStatic.h index 178f4b9b0c..ae909b06b4 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/fileIOStatic.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/fileIOStatic.h @@ -534,9 +534,7 @@ class fileIOStatic { static int readDataFile(int nch, string fname, double *data, double *err=NULL, double *ang=NULL, char dataformat='f') { \ ifstream infile; \ int iline=0; \ - int maxchans; \ string str; \ - maxchans=nch; \ infile.open(fname.c_str(), ios_base::in); \ if (infile.is_open()) { \ iline=readDataFile(nch, infile, data, err, ang, dataformat, 0); \ diff --git a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp index 5f331775f6..8d8a364525 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp @@ -879,10 +879,14 @@ void postProcessing::startThread(int delflag) { else ret = pthread_create(&dataProcessingThread, &tattr,startProcessDataNoDelete, (void*)this); + if (ret) + printf("ret %d\n", ret); + pthread_attr_destroy(&tattr); // scheduling parameters of target thread ret = pthread_setschedparam(dataProcessingThread, policy, ¶m); + } diff --git a/slsDetectorSoftware/threadFiles/ThreadPool.cpp b/slsDetectorSoftware/threadFiles/ThreadPool.cpp index e1d473ead5..2a1781d5ce 100644 --- a/slsDetectorSoftware/threadFiles/ThreadPool.cpp +++ b/slsDetectorSoftware/threadFiles/ThreadPool.cpp @@ -67,12 +67,13 @@ int ThreadPool::destroy_threadpool(){ /*cout << "Broadcasting STOP signal to all threads..." << endl;*/ m_task_cond_var.broadcast(); // notify all threads we are shttung down - int ret = -1; + //int ret = -1; for (int i = 0; i < m_pool_size; i++) { void* result; sem_post(&semStart); sem_post(&semDone); - ret = pthread_join(m_threads[i], &result); + //ret = + pthread_join(m_threads[i], &result); /*cout << "pthread_join() returned " << ret << ": " << strerror(errno) << endl;*/ m_task_cond_var.broadcast(); // try waking up a bunch of threads that are still waiting } From 4730c8c0a949f616bc0af4de1f3fbfd08603040f Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 11 Apr 2017 13:31:49 +0200 Subject: [PATCH 24/41] updaterev --- slsDetectorSoftware/gitInfo.txt | 8 ++++---- slsDetectorSoftware/slsDetector/gitInfoLib.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index 22abc58a9c..684f07f1d3 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 008ed7012306d2ab0911963d6b82c6fb23f5d94a -Revision: 1344 +Repsitory UUID: a73101093961c0619ba909bad883c79e680a3f22 +Revision: 1346 Branch: 2.3.1 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1344 -Last Changed Date: 2017-04-07 14:26:03 +0200 +Last Changed Rev: 1346 +Last Changed Date: 2017-04-11 13:31:32 +0200 diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index a6363c728e..c6b6ee605d 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURLLIB "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUIDLIB "008ed7012306d2ab0911963d6b82c6fb23f5d94a" -//#define SVNREV 0x1344 +#define SVNREPUUIDLIB "a73101093961c0619ba909bad883c79e680a3f22" +//#define SVNREV 0x1346 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTHLIB "Dhanya_Maliakal" -#define SVNREVLIB 0x1344 -#define SVNDATELIB 0x20170407 +#define SVNREVLIB 0x1346 +#define SVNDATELIB 0x20170411 // From 0c9ac8911a329a3bf913344463ef723d815db2e5 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 11 Apr 2017 13:39:28 +0200 Subject: [PATCH 25/41] removing warnings shown from esrf debian --- slsDetectorSoftware/slsDetector/slsDetector.cpp | 4 ++-- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 93e544196a..20e6976d50 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -3728,7 +3728,7 @@ int slsDetector::updateDetectorNoWait() { // int ret=OK; enum detectorSettings t; - int thr, n, nm = 0; + int thr, n = 0, nm; // int it; int64_t retval;// tns=-1; char lastClientIP[INET_ADDRSTRLEN]; @@ -7806,7 +7806,7 @@ string slsDetector::getReceiverLastClientIP(){ int slsDetector::updateReceiverNoWait() { - int n,ind = 0; + int n = 0,ind; char path[MAX_STR_LENGTH]; char lastClientIP[INET_ADDRSTRLEN]; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 0b846988a8..c510395348 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -5363,13 +5363,11 @@ string slsDetectorCommand::cmdPulse(int narg, char *args[], int action) { } - return string(""); -/* + if(retval == OK) return string(" successful"); else return string(" failed"); - */ } From 9cf5714a5b0ddbaff17e37b1e63d8557c999a12c Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 11 Apr 2017 13:39:35 +0200 Subject: [PATCH 26/41] removing warnings shown from esrf debian --- slsReceiverSoftware/src/UDPStandardImplementation.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 6075e0666f..98140d4e23 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -1810,7 +1810,6 @@ void UDPStandardImplementation::startDataCallback(){ char buf[1000]; uint64_t acquisitionIndex = -1; uint64_t frameIndex = -1; - uint32_t subframeIndex = -1; #ifdef DEBUG int oldpnum = -1; #endif @@ -1834,7 +1833,6 @@ void UDPStandardImplementation::startDataCallback(){ //update frame details frameIndex = fnum; acquisitionIndex = fnum - startAcquisitionIndex; - if(dynamicRange == 32) subframeIndex = snum; int len = sprintf(buf,jsonFmt, SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );/* will not work for other detectors*/ @@ -1954,7 +1952,6 @@ void UDPStandardImplementation::startDataCallback(){ //update frame details frameIndex = fnum; acquisitionIndex = fnum - startAcquisitionIndex; - if(dynamicRange == 32) subframeIndex = snum; int len = sprintf(buf,jsonFmt, SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );/* will not work for other detectors*/ @@ -1992,7 +1989,6 @@ void UDPStandardImplementation::startDataCallback(){ //update frame details frameIndex = fnum; acquisitionIndex = fnum - startAcquisitionIndex; - if(dynamicRange == 32) subframeIndex = snum; int len = sprintf(buf,jsonFmt, SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );/* will not work for other detectors*/ @@ -3305,7 +3301,6 @@ void UDPStandardImplementation::handleDataCompression(int ithread, char* wbuffer int once = 0; int xmax = 0, ymax = 0; //max pixels in x and y direction int xmin = 1, ymin = 1; //min pixels in x and y direction - double tot, tl, tr, bl, br; //determining xmax and ymax switch(myDetectorType){ @@ -3351,11 +3346,6 @@ void UDPStandardImplementation::handleDataCompression(int ithread, char* wbuffer for(int iy = ymin - 1; iy < ymax+1; iy++){ thisEvent=singlePhotonDetectorObject[ithread]->getEventType(buff[0], ix, iy, commonModeSubtractionEnable); if (nf>1000) { - tot=0; - tl=0; - tr=0; - bl=0; - br=0; if (thisEvent==PHOTON_MAX) { receiverData[ithread]->getFrameNumber(buff[0]); //iFrame=receiverData[ithread]->getFrameNumber(buff); From d7982e178e1950aeb1d2223043f33bdd35734810 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 11 Apr 2017 13:39:53 +0200 Subject: [PATCH 27/41] updaterev --- slsDetectorSoftware/gitInfo.txt | 8 ++++---- slsDetectorSoftware/slsDetector/gitInfoLib.h | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index 684f07f1d3..68f0d36c8c 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: a73101093961c0619ba909bad883c79e680a3f22 -Revision: 1346 +Repsitory UUID: 7a0a1ee8734440dc4e1e638d6fec1eaa9d2404ae +Revision: 1348 Branch: 2.3.1 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1346 -Last Changed Date: 2017-04-11 13:31:32 +0200 +Last Changed Rev: 1348 +Last Changed Date: 2017-04-11 13:39:28 +0200 diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index c6b6ee605d..a08358465d 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURLLIB "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUIDLIB "a73101093961c0619ba909bad883c79e680a3f22" -//#define SVNREV 0x1346 +#define SVNREPUUIDLIB "7a0a1ee8734440dc4e1e638d6fec1eaa9d2404ae" +//#define SVNREV 0x1348 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTHLIB "Dhanya_Maliakal" -#define SVNREVLIB 0x1346 +#define SVNREVLIB 0x1348 #define SVNDATELIB 0x20170411 // From 9468b9ca1e56f809f1ed17e0b7a5d2d55c83d485 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 11 Apr 2017 13:39:59 +0200 Subject: [PATCH 28/41] updaterev --- slsReceiverSoftware/gitInfo.txt | 8 ++++---- slsReceiverSoftware/include/gitInfoReceiver.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/slsReceiverSoftware/gitInfo.txt b/slsReceiverSoftware/gitInfo.txt index 793f120513..e3052e62d4 100644 --- a/slsReceiverSoftware/gitInfo.txt +++ b/slsReceiverSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsReceiverSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_receiver_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_receiver_software.git -Repsitory UUID: 8d07417b37c1cc24c0350404c0e52baee1aa0dc7 -Revision: 519 +Repsitory UUID: db080a125daed36a1fa85b00df7a239e22ae5130 +Revision: 521 Branch: 2.3.1 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 519 -Last Changed Date: 2017-04-07 14:57:19 +0200 +Last Changed Rev: 521 +Last Changed Date: 2017-04-11 13:39:35 +0200 diff --git a/slsReceiverSoftware/include/gitInfoReceiver.h b/slsReceiverSoftware/include/gitInfoReceiver.h index bf5a17e702..1b3f7e886c 100644 --- a/slsReceiverSoftware/include/gitInfoReceiver.h +++ b/slsReceiverSoftware/include/gitInfoReceiver.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_receiver_software.git" //#define SVNREPPATH "" -#define SVNREPUUID "8d07417b37c1cc24c0350404c0e52baee1aa0dc7" -//#define SVNREV 0x519 +#define SVNREPUUID "db080a125daed36a1fa85b00df7a239e22ae5130" +//#define SVNREV 0x521 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x519 -#define SVNDATE 0x20170407 +#define SVNREV 0x521 +#define SVNDATE 0x20170411 // From 91b7a87557effcc6891a57b676cf7183fad6cc68 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 18 Apr 2017 15:32:01 +0200 Subject: [PATCH 29/41] just started changin frm ostringstream --- slsReceiverSoftware/include/UDPInterface.h | 2 +- .../include/UDPStandardImplementation.h | 3 + slsReceiverSoftware/include/genericSocket.h | 4 +- slsReceiverSoftware/include/logger.h | 281 +--- slsReceiverSoftware/include/slsReceiver.h | 2 +- .../include/slsReceiverTCPIPInterface.h | 2 +- .../src/UDPBaseImplementation.cpp | 253 ++-- slsReceiverSoftware/src/UDPInterface.cpp | 12 +- .../src/UDPStandardImplementation.cpp | 1282 +++++++++++------ slsReceiverSoftware/src/main.cpp | 1 - slsReceiverSoftware/src/slsReceiver.cpp | 18 +- .../src/slsReceiverTCPIPInterface.cpp | 188 +-- 12 files changed, 1177 insertions(+), 871 deletions(-) diff --git a/slsReceiverSoftware/include/UDPInterface.h b/slsReceiverSoftware/include/UDPInterface.h index adaa7e0dec..47e989ef85 100644 --- a/slsReceiverSoftware/include/UDPInterface.h +++ b/slsReceiverSoftware/include/UDPInterface.h @@ -21,7 +21,7 @@ #include "logger.h" -class UDPInterface { +class UDPInterface: public Logger { /* abstract class that defines the UDP interface of an sls detector data receiver. diff --git a/slsReceiverSoftware/include/UDPStandardImplementation.h b/slsReceiverSoftware/include/UDPStandardImplementation.h index a97ab3de64..1909d45ef7 100644 --- a/slsReceiverSoftware/include/UDPStandardImplementation.h +++ b/slsReceiverSoftware/include/UDPStandardImplementation.h @@ -831,6 +831,9 @@ class UDPStandardImplementation: private virtual slsReceiverDefs, public UDPBase /** Progress (currentFrameNumber) Mutex */ pthread_mutex_t progressMutex; + char streambuf[MAX_NUMBER_OF_WRITER_THREADS][MAX_STR_LENGTH]; + char cstreambuf[MAX_STR_LENGTH]; + }; diff --git a/slsReceiverSoftware/include/genericSocket.h b/slsReceiverSoftware/include/genericSocket.h index 1e4f2b32ff..2cbe9259ad 100644 --- a/slsReceiverSoftware/include/genericSocket.h +++ b/slsReceiverSoftware/include/genericSocket.h @@ -111,8 +111,8 @@ enum communicationProtocol{ total_sent(0),// sender (client): where to? ip header_packet_size(0) { - memset(&serverAddress, 0, sizeof(serverAddress)); - memset(&clientAddress, 0, sizeof(clientAddress)); + memset(&serverAddress, 0,sizeof(serverAddress)); + memset(&clientAddress,0,sizeof(clientAddress)); // strcpy(hostname,host_ip_or_name); strcpy(lastClientIP,"none"); diff --git a/slsReceiverSoftware/include/logger.h b/slsReceiverSoftware/include/logger.h index ff1762c19a..6d4bd30041 100644 --- a/slsReceiverSoftware/include/logger.h +++ b/slsReceiverSoftware/include/logger.h @@ -1,5 +1,6 @@ -//#ifndef __LOG_H__ -//#define __LOG_H__ +#ifndef __LOG_H__ +#define __LOG_H__ + #include #include @@ -20,230 +21,66 @@ #define FILELOG_MAX_LEVEL logINFO #endif +#define REPORT_LEVEL logDEBUG5 -#define STRINGIFY(x) #x -#define TOSTRING(x) STRINGIFY(x) -#define MYCONCAT(x,y) -#define __AT__ string(__FILE__) + string("::") + string(__func__) + string("(): ") -#define __SHORT_FORM_OF_FILE__ \ -(strrchr(__FILE__,'/') \ -? strrchr(__FILE__,'/')+1 \ -: __FILE__ \ -) -#define __SHORT_AT__ string(__SHORT_FORM_OF_FILE__) + string("::") + string(__func__) + string("(): ") - -//":" TOSTRING(__LINE__) - -/* -void error(const char *location, const char *msg){ - printf("Error at %s: %s\n", location, msg); -} -*/ - -inline std::string NowTime(); - -enum TLogLevel {logERROR, logWARNING, logINFO, logDEBUG, logDEBUG1, logDEBUG2, logDEBUG3, logDEBUG4, logDEBUG5}; - -template class Log{ - public: - Log(); - virtual ~Log(); - std::ostringstream& Get(TLogLevel level = logINFO); - static TLogLevel& ReportingLevel(); - static std::string ToString(TLogLevel level); - static TLogLevel FromString(const std::string& level); - protected: - std::ostringstream os; - TLogLevel lev; - private: - Log(const Log&); - Log& operator =(const Log&); -}; - - -class Output2FILE { -public: - static FILE*& Stream(); - static void Output(const std::string& msg); - static void Output(const std::string& msg, TLogLevel level); -}; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) -# if defined (BUILDING_FILELOG_DLL) -# define FILELOG_DECLSPEC __declspec (dllexport) -# elif defined (USING_FILELOG_DLL) -# define FILELOG_DECLSPEC __declspec (dllimport) -# else -# define FILELOG_DECLSPEC -# endif // BUILDING_DBSIMPLE_DLL -#else -# define FILELOG_DECLSPEC -#endif // _WIN32 - -class FILELOG_DECLSPEC FILELog : public Log {}; -//typedef Log FILELog; - -#ifdef REST -#define FILE_LOG(level) \ - if (level > FILELOG_MAX_LEVEL) ; \ - else if (level > FILELog::ReportingLevel() || !Output2FILE::Stream()) ; \ - else FILELog().Get(level) -#else - #define FILE_LOG(level) \ - if (level > FILELOG_MAX_LEVEL) ; \ - else if (level > FILELog::ReportingLevel() || !Output2FILE::Stream()) ; \ - else FILELog().Get(level) -#endif - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) -#include - - - -inline std::string NowTime() +#include -{ - const int MAX_LEN = 200; - char buffer[MAX_LEN]; - if (GetTimeFormatA(LOCALE_USER_DEFAULT, 0, 0, - "HH':'mm':'ss", buffer, MAX_LEN) == 0) - return "Error in NowTime()"; - char result[100] = {0}; - static DWORD first = GetTickCount(); - sprintf(result, "%s.%03ld", buffer, (long)(GetTickCount() - first) % 1000); - return result; -} +class Logger { +public: + Logger(){}; + + enum TLogLevel {logERROR, logWARNING, logINFO, logDEBUG, logDEBUG1, logDEBUG2, logDEBUG3, logDEBUG4, logDEBUG5}; + + + static void FILE_LOG(TLogLevel level, char* msg) + { + char buffer[11]; + const int buffer_len = sizeof(buffer); + time_t t; + time(&t); + tm r = {0}; + strftime(buffer, buffer_len, "%X", localtime_r(&t, &r)); + buffer[buffer_len - 1] = 0; + struct timeval tv; + gettimeofday(&tv, 0); + char result[100]; + const int result_len = sizeof(result); + snprintf(result, result_len, "%s.%03ld", buffer, (long)tv.tv_usec / 1000); + result[result_len - 1] = 0; + + + /* + const char* const slevel[] = {"ERROR", "WARNING", "INFO", "DEBUG", "DEBUG1", "DEBUG2", "DEBUG3", "DEBUG4","DEBUG5"}; + ostringstream os; + os << "- " << string(result); + os << " " << string(slevel[level]) << ": "; + // if (level > logDEBUG) + // os << std::string(level - logDEBUG, '\t'); + os << msg; + string smessage = os.str(); + + switch(level){ + case logERROR: cprintf(RED BOLD, "%s\n", smessage.c_str()); break; + case logWARNING: cprintf(YELLOW BOLD, "%s\n", smessage.c_str()); break; + case logINFO: cprintf(GRAY, "%s\n", smessage.c_str()); break; + default: break; + } + */ + + switch(level){ + case logERROR: cprintf(RED BOLD, "- %s ERROR: %s", result, msg); break; + case logWARNING: cprintf(YELLOW BOLD,"- %s WARNING: %s", result, msg); break; + case logINFO: cprintf(GRAY, "- %s INFO: %s", result, msg); break; + default: break; + } + + + fflush(stdout); + } -#else +}; -#include -inline std::string NowTime() -{ - char buffer[11]; - const int buffer_len = sizeof(buffer); - time_t t; - time(&t); - tm r = {0}; - strftime(buffer, buffer_len, "%X", localtime_r(&t, &r)); - buffer[buffer_len - 1] = 0; - struct timeval tv; - gettimeofday(&tv, 0); - char result[100]; - const int result_len = sizeof(result); - snprintf(result, result_len, "%s.%03ld", buffer, (long)tv.tv_usec / 1000); - result[result_len - 1] = 0; - return result; -} - -#endif //WIN32 - - -template Log::Log():lev(logDEBUG){} - -template std::ostringstream& Log::Get(TLogLevel level) -{ - lev = level; - os << "- " << NowTime(); - os << " " << ToString(level) << ": "; - if (level > logDEBUG) - os << std::string(level - logDEBUG, '\t'); - return os; -} - -template Log::~Log() -{ - os << std::endl; -#ifdef REST - T::Output( os.str()); -#else - T::Output( os.str(),lev); -#endif -} - -template TLogLevel& Log::ReportingLevel() -{ - static TLogLevel reportingLevel = logDEBUG5; - return reportingLevel; -} - -template std::string Log::ToString(TLogLevel level) -{ - static const char* const buffer[] = {"ERROR", "WARNING", "INFO", "DEBUG", "DEBUG1", "DEBUG2", "DEBUG3", "DEBUG4","DEBUG5"}; - return buffer[level]; -} - -template -TLogLevel Log::FromString(const std::string& level) -{ - if (level == "DEBUG5") - return logDEBUG5; - if (level == "DEBUG4") - return logDEBUG4; - if (level == "DEBUG3") - return logDEBUG3; - if (level == "DEBUG2") - return logDEBUG2; - if (level == "DEBUG1") - return logDEBUG1; - if (level == "DEBUG") - return logDEBUG; - if (level == "INFO") - return logINFO; - if (level == "WARNING") - return logWARNING; - if (level == "ERROR") - return logERROR; - Log().Get(logWARNING) << "Unknown logging level '" << level << "'. Using INFO level as default."; - return logINFO; -} - - -inline FILE*& Output2FILE::Stream() -{ - static FILE* pStream = stderr; - return pStream; -} - -inline void Output2FILE::Output(const std::string& msg) -{ - FILE* pStream = Stream(); - if (!pStream) - return; - fprintf(pStream, "%s", msg.c_str()); - fflush(pStream); -} - -inline void Output2FILE::Output(const std::string& msg, TLogLevel level) -{ - FILE* pStream = Stream(); - if (!pStream) - return; - bool out = true; - switch(level){ - case logERROR: cprintf(RED BOLD,"%s",msg.c_str()); break; - case logWARNING: cprintf(YELLOW BOLD,"%s",msg.c_str()); break; - case logINFO: cprintf(GRAY,"%s",msg.c_str());break; - // case logINFO: cprintf(DARKGRAY BOLD,"%s",msg.c_str());break; - default: fprintf(pStream,"%s",msg.c_str()); out = false; break; - } - fflush(out ? stdout : pStream); -} - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) -# if defined (BUILDING_FILELOG_DLL) -# define FILELOG_DECLSPEC __declspec (dllexport) -# elif defined (USING_FILELOG_DLL) -# define FILELOG_DECLSPEC __declspec (dllimport) -# else -# define FILELOG_DECLSPEC -# endif // BUILDING_DBSIMPLE_DLL -#else -# define FILELOG_DECLSPEC -#endif // _WIN32 - - - -//#endif //__LOG_H__ +#endif //__LOG_H__ diff --git a/slsReceiverSoftware/include/slsReceiver.h b/slsReceiverSoftware/include/slsReceiver.h index 0dfd2b6a76..2d25235a8e 100644 --- a/slsReceiverSoftware/include/slsReceiver.h +++ b/slsReceiverSoftware/include/slsReceiver.h @@ -18,7 +18,7 @@ *@short creates the UDP and TCP class objects */ -class slsReceiver : private virtual slsReceiverDefs { +class slsReceiver : public Logger, private virtual slsReceiverDefs { public: /** diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index f574773aaf..cfcb3b5e3f 100644 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -17,7 +17,7 @@ *@short interface between receiver and client */ -class slsReceiverTCPIPInterface : private virtual slsReceiverDefs { +class slsReceiverTCPIPInterface : public Logger, private virtual slsReceiverDefs { public: /** diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index 5539b4d95e..dfae32bc26 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -19,7 +19,6 @@ using namespace std; * They access local cache of configuration or detector parameters ******* *************************************************************************/ UDPBaseImplementation::UDPBaseImplementation(){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; initializeMembers(); @@ -33,9 +32,7 @@ UDPBaseImplementation::UDPBaseImplementation(){ } void UDPBaseImplementation::initializeMembers(){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; - FILE_LOG(logDEBUG) << "Info: Initializing base members"; //**detector parameters*** myDetectorType = GENERIC; strcpy(detHostname,""); @@ -93,7 +90,6 @@ UDPBaseImplementation::~UDPBaseImplementation(){} /**initial parameters***/ char *UDPBaseImplementation::getDetectorHostname() const{ - FILE_LOG(logDEBUG) << __AT__ << " starting"; //not initialized if(!strlen(detHostname)) @@ -106,7 +102,6 @@ char *UDPBaseImplementation::getDetectorHostname() const{ } int UDPBaseImplementation::getFlippedData(int axis) const{ - FILE_LOG(logDEBUG) << __AT__ << " starting"; if(axis<0 || axis > 1) return -1; return flippedData[axis]; } @@ -114,7 +109,6 @@ int UDPBaseImplementation::getFlippedData(int axis) const{ /***file parameters***/ char *UDPBaseImplementation::getFileName() const{ - FILE_LOG(logDEBUG) << __AT__ << " starting"; //not initialized if(!strlen(fileName)) @@ -127,7 +121,6 @@ char *UDPBaseImplementation::getFileName() const{ } char *UDPBaseImplementation::getFilePath() const{ - FILE_LOG(logDEBUG) << __AT__ << " starting"; //not initialized if(!strlen(filePath)) @@ -139,25 +132,24 @@ char *UDPBaseImplementation::getFilePath() const{ return output; } -uint64_t UDPBaseImplementation::getFileIndex() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return fileIndex;} +uint64_t UDPBaseImplementation::getFileIndex() const{ return fileIndex;} -int UDPBaseImplementation::getScanTag() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return scanTag;} +int UDPBaseImplementation::getScanTag() const{ return scanTag;} -bool UDPBaseImplementation::getFrameIndexEnable() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return frameIndexEnable;} +bool UDPBaseImplementation::getFrameIndexEnable() const{ return frameIndexEnable;} -bool UDPBaseImplementation::getFileWriteEnable() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return fileWriteEnable;} +bool UDPBaseImplementation::getFileWriteEnable() const{ return fileWriteEnable;} -bool UDPBaseImplementation::getOverwriteEnable() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return overwriteEnable;} +bool UDPBaseImplementation::getOverwriteEnable() const{ return overwriteEnable;} -bool UDPBaseImplementation::getDataCompressionEnable() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return dataCompressionEnable;} +bool UDPBaseImplementation::getDataCompressionEnable() const{ return dataCompressionEnable;} /***acquisition count parameters***/ -uint64_t UDPBaseImplementation::getTotalFramesCaught() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return (totalPacketsCaught/packetsPerFrame);} +uint64_t UDPBaseImplementation::getTotalFramesCaught() const{ return (totalPacketsCaught/packetsPerFrame);} -uint64_t UDPBaseImplementation::getFramesCaught() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return (packetsCaught/packetsPerFrame);} +uint64_t UDPBaseImplementation::getFramesCaught() const{ return (packetsCaught/packetsPerFrame);} int64_t UDPBaseImplementation::getAcquisitionIndex() const{ - FILE_LOG(logDEBUG) << __AT__ << " starting"; if(!totalPacketsCaught) return -1; @@ -166,12 +158,12 @@ int64_t UDPBaseImplementation::getAcquisitionIndex() const{ /***connection parameters***/ -uint32_t UDPBaseImplementation::getUDPPortNumber() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return udpPortNum[0];} +uint32_t UDPBaseImplementation::getUDPPortNumber() const{ return udpPortNum[0];} -uint32_t UDPBaseImplementation::getUDPPortNumber2() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return udpPortNum[1];} +uint32_t UDPBaseImplementation::getUDPPortNumber2() const{ return udpPortNum[1];} char *UDPBaseImplementation::getEthernetInterface() const{ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + char* output = new char[MAX_STR_LENGTH](); strcpy(output,eth); @@ -181,30 +173,30 @@ char *UDPBaseImplementation::getEthernetInterface() const{ /***acquisition parameters***/ -int UDPBaseImplementation::getShortFrameEnable() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return shortFrameEnable;} +int UDPBaseImplementation::getShortFrameEnable() const{ return shortFrameEnable;} -uint32_t UDPBaseImplementation::getFrameToGuiFrequency() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return frameToGuiFrequency;} +uint32_t UDPBaseImplementation::getFrameToGuiFrequency() const{ return frameToGuiFrequency;} -uint32_t UDPBaseImplementation::getFrameToGuiTimer() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return frameToGuiTimerinMS;} +uint32_t UDPBaseImplementation::getFrameToGuiTimer() const{ return frameToGuiTimerinMS;} -uint32_t UDPBaseImplementation::getDataStreamEnable() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return dataStreamEnable;} +uint32_t UDPBaseImplementation::getDataStreamEnable() const{ return dataStreamEnable;} -uint64_t UDPBaseImplementation::getAcquisitionPeriod() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return acquisitionPeriod;} +uint64_t UDPBaseImplementation::getAcquisitionPeriod() const{ return acquisitionPeriod;} -uint64_t UDPBaseImplementation::getAcquisitionTime() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return acquisitionTime;} +uint64_t UDPBaseImplementation::getAcquisitionTime() const{ return acquisitionTime;} -uint64_t UDPBaseImplementation::getNumberOfFrames() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return numberOfFrames;} +uint64_t UDPBaseImplementation::getNumberOfFrames() const{ return numberOfFrames;} -uint32_t UDPBaseImplementation::getDynamicRange() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return dynamicRange;} +uint32_t UDPBaseImplementation::getDynamicRange() const{ return dynamicRange;} -bool UDPBaseImplementation::getTenGigaEnable() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return tengigaEnable;} +bool UDPBaseImplementation::getTenGigaEnable() const{ return tengigaEnable;} -uint32_t UDPBaseImplementation::getFifoDepth() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return fifoDepth;} +uint32_t UDPBaseImplementation::getFifoDepth() const{ return fifoDepth;} /***receiver status***/ -slsReceiverDefs::runStatus UDPBaseImplementation::getStatus() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return status;} +slsReceiverDefs::runStatus UDPBaseImplementation::getStatus() const{ return status;} -int UDPBaseImplementation::getActivate() const{FILE_LOG(logDEBUG) << __AT__ << " starting"; return activated;} +int UDPBaseImplementation::getActivate() const{ return activated;} /************************************************************************* @@ -214,29 +206,35 @@ int UDPBaseImplementation::getActivate() const{FILE_LOG(logDEBUG) << __AT__ << " /**initial parameters***/ void UDPBaseImplementation::configure(map config_map){ - FILE_LOG(logWARNING) << __AT__ << " doing nothing..."; - FILE_LOG(logERROR) << __AT__ << " must be overridden by child classes"; + ostringstream os; + os << " must be overridden by child classes"; + string message(os.str()); FILE_LOG(logERROR, message); } void UDPBaseImplementation::setFlippedData(int axis, int enable){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + if(axis<0 || axis>1) return; flippedData[axis] = enable==0?0:1; - FILE_LOG(logINFO) << "Flipped Data: " << flippedData[0] << " , " << flippedData[1]; + + ostringstream os; + os << "Flipped Data: " << flippedData[0] << " , " << flippedData[1]; + string message(os.str()); FILE_LOG(logINFO, message); } /***file parameters***/ void UDPBaseImplementation::setFileName(const char c[]){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; if(strlen(c)) strcpy(fileName, c); - FILE_LOG(logINFO) << "File name:" << fileName; + + ostringstream os; + os << "File name:" << fileName; + string message(os.str()); FILE_LOG(logINFO, message); } void UDPBaseImplementation::setFilePath(const char c[]){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + if(strlen(c)){ //check if filepath exists @@ -245,55 +243,69 @@ void UDPBaseImplementation::setFilePath(const char c[]){ strcpy(filePath,c); else{ strcpy(filePath,""); - FILE_LOG(logWARNING) << "FilePath does not exist:" << filePath; + ostringstream os; + os << "FilePath does not exist:" << filePath; + string message(os.str()); FILE_LOG(logWARNING, message); } strcpy(filePath, c); } - FILE_LOG(logDEBUG) << "Info: File path:" << filePath; + /*FILE_LOG(logDEBUG) << "Info: File path:" << filePath;*/ } void UDPBaseImplementation::setFileIndex(const uint64_t i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + fileIndex = i; - FILE_LOG(logINFO) << "File Index:" << fileIndex; + ostringstream os; + os << "File Index:" << fileIndex; + string message(os.str()); FILE_LOG(logINFO, message); } //FIXME: needed? void UDPBaseImplementation::setScanTag(const int i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + scanTag = i; - FILE_LOG(logINFO) << "Scan Tag:" << scanTag; + ostringstream os; + os << "Scan Tag:" << scanTag; + string message(os.str()); FILE_LOG(logINFO, message); } void UDPBaseImplementation::setFrameIndexEnable(const bool b){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + frameIndexEnable = b; - FILE_LOG(logINFO) << "Frame Index Enable: " << stringEnable(frameIndexEnable); + ostringstream os; + os << "Frame Index Enable: " << stringEnable(frameIndexEnable); + string message(os.str()); FILE_LOG(logINFO, message); } void UDPBaseImplementation::setFileWriteEnable(const bool b){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + fileWriteEnable = b; - FILE_LOG(logINFO) << "File Write Enable: " << stringEnable(fileWriteEnable); + ostringstream os; + os << "File Write Enable: " << stringEnable(fileWriteEnable); + string message(os.str()); FILE_LOG(logINFO, message); } void UDPBaseImplementation::setOverwriteEnable(const bool b){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + overwriteEnable = b; - FILE_LOG(logINFO) << "Overwrite Enable: " << stringEnable(overwriteEnable); + ostringstream os; + os << "Overwrite Enable: " << stringEnable(overwriteEnable); + string message(os.str()); FILE_LOG(logINFO, message); } int UDPBaseImplementation::setDataCompressionEnable(const bool b){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + dataCompressionEnable = b; - FILE_LOG(logINFO) << "Data Compression : " << stringEnable(dataCompressionEnable); + ostringstream os; + os << "Data Compression : " << stringEnable(dataCompressionEnable); + string message(os.str()); FILE_LOG(logINFO, message); //overridden methods might return FAIL return OK; @@ -302,58 +314,72 @@ int UDPBaseImplementation::setDataCompressionEnable(const bool b){ /***connection parameters***/ void UDPBaseImplementation::setUDPPortNumber(const uint32_t i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + udpPortNum[0] = i; - FILE_LOG(logINFO) << "UDP Port Number[0]:" << udpPortNum[0]; + ostringstream os; + os << "UDP Port Number[0]:" << udpPortNum[0]; + string message(os.str()); FILE_LOG(logINFO, message); } void UDPBaseImplementation::setUDPPortNumber2(const uint32_t i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + udpPortNum[1] = i; - FILE_LOG(logINFO) << "UDP Port Number[1]:" << udpPortNum[1]; + ostringstream os; + os << "UDP Port Number[1]:" << udpPortNum[1]; + string message(os.str()); FILE_LOG(logINFO, message); } void UDPBaseImplementation::setEthernetInterface(const char* c){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + strcpy(eth, c); - FILE_LOG(logINFO) << "Ethernet Interface: " << eth; + ostringstream os; + os << "Ethernet Interface: " << eth; + string message(os.str()); FILE_LOG(logINFO, message); } /***acquisition parameters***/ void UDPBaseImplementation::setShortFrameEnable(const int i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + shortFrameEnable = i; - FILE_LOG(logINFO) << "Short Frame Enable: " << stringEnable(shortFrameEnable); + ostringstream os; + os << "Short Frame Enable: " << stringEnable(shortFrameEnable); + string message(os.str()); FILE_LOG(logINFO, message); } int UDPBaseImplementation::setFrameToGuiFrequency(const uint32_t freq){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + frameToGuiFrequency = freq; - FILE_LOG(logINFO) << "Frame To Gui Frequency:" << frameToGuiFrequency; + ostringstream os; + os << "Frame To Gui Frequency:" << frameToGuiFrequency; + string message(os.str()); FILE_LOG(logINFO, message); //overrridden child classes might return FAIL return OK; } void UDPBaseImplementation::setFrameToGuiTimer(const uint32_t time_in_ms){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + frameToGuiTimerinMS = time_in_ms; - FILE_LOG(logINFO) << "Frame To Gui Timer:" << frameToGuiTimerinMS; + ostringstream os; + os << "Frame To Gui Timer:" << frameToGuiTimerinMS; + string message(os.str()); FILE_LOG(logINFO, message); } uint32_t UDPBaseImplementation::setDataStreamEnable(const uint32_t enable){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + dataStreamEnable = enable; - FILE_LOG(logINFO) << "Streaming Data from Receiver:" << dataStreamEnable; + ostringstream os; + os << "Streaming Data from Receiver:" << dataStreamEnable; + string message(os.str()); FILE_LOG(logINFO, message); //overrridden child classes might return FAIL return OK; @@ -361,60 +387,72 @@ uint32_t UDPBaseImplementation::setDataStreamEnable(const uint32_t enable){ int UDPBaseImplementation::setAcquisitionPeriod(const uint64_t i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + acquisitionPeriod = i; - FILE_LOG(logINFO) << "Acquisition Period:" << (double)acquisitionPeriod/(1E9) << "s"; + ostringstream os; + os << "Acquisition Period:" << (double)acquisitionPeriod/(1E9) << "s"; + string message(os.str()); FILE_LOG(logINFO, message); //overrridden child classes might return FAIL return OK; } int UDPBaseImplementation::setAcquisitionTime(const uint64_t i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + acquisitionTime = i; - FILE_LOG(logINFO) << "Acquisition Time:" << (double)acquisitionTime/(1E9) << "s"; + ostringstream os; + os << "Acquisition Time:" << (double)acquisitionTime/(1E9) << "s"; + string message(os.str()); FILE_LOG(logINFO, message); //overrridden child classes might return FAIL return OK; } int UDPBaseImplementation::setNumberOfFrames(const uint64_t i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + numberOfFrames = i; - FILE_LOG(logINFO) << "Number of Frames:" << numberOfFrames; + ostringstream os; + os << "Number of Frames:" << numberOfFrames; + string message(os.str()); FILE_LOG(logINFO, message); //overrridden child classes might return FAIL return OK; } int UDPBaseImplementation::setDynamicRange(const uint32_t i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + dynamicRange = i; - FILE_LOG(logINFO) << "Dynamic Range:" << dynamicRange; + ostringstream os; + os << "Dynamic Range:" << dynamicRange; + string message(os.str()); FILE_LOG(logINFO, message); //overrridden child classes might return FAIL return OK; } int UDPBaseImplementation::setTenGigaEnable(const bool b){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + tengigaEnable = b; - FILE_LOG(logINFO) << "Ten Giga Enable: " << stringEnable(tengigaEnable); + ostringstream os; + os << "Ten Giga Enable: " << stringEnable(tengigaEnable); + string message(os.str()); FILE_LOG(logINFO, message); //overridden functions might return FAIL return OK; } int UDPBaseImplementation::setFifoDepth(const uint32_t i){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + fifoDepth = i; - FILE_LOG(logINFO) << "Fifo Depth: " << i; + ostringstream os; + os << "Fifo Depth: " << i; + string message(os.str()); FILE_LOG(logINFO, message); //overridden functions might return FAIL return OK; @@ -428,79 +466,94 @@ int UDPBaseImplementation::setFifoDepth(const uint32_t i){ /***initial functions***/ int UDPBaseImplementation::setDetectorType(const detectorType d){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + myDetectorType = d; //if eiger, set numberofListeningThreads = 2; - FILE_LOG(logINFO) << "Detector Type:" << getDetectorType(d); + ostringstream os; + os << "Detector Type:" << getDetectorType(d); + string message(os.str()); FILE_LOG(logINFO, message); return OK; } void UDPBaseImplementation::initialize(const char *c){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + if(strlen(c)) strcpy(detHostname, c); - FILE_LOG(logINFO) << "Detector Hostname:" << detHostname; + ostringstream os; + os << "Detector Hostname:" << detHostname; + string message(os.str()); FILE_LOG(logINFO, message); } /***acquisition functions***/ void UDPBaseImplementation::resetAcquisitionCount(){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + totalPacketsCaught = 0; - FILE_LOG(logINFO) << "totalPacketsCaught:" << totalPacketsCaught; + ostringstream os; + os << "totalPacketsCaught:" << totalPacketsCaught; + string message(os.str()); FILE_LOG(logINFO, message); } int UDPBaseImplementation::startReceiver(char *c){ - FILE_LOG(logWARNING) << __AT__ << " doing nothing..."; - FILE_LOG(logERROR) << __AT__ << " must be overridden by child classes"; + ostringstream os; + os << " must be overridden by child classes"; + string message(os.str()); FILE_LOG(logERROR, message); return OK; } void UDPBaseImplementation::stopReceiver(){ - FILE_LOG(logWARNING) << __AT__ << " doing nothing..."; - FILE_LOG(logERROR) << __AT__ << " must be overridden by child classes"; + ostringstream os; + os << " must be overridden by child classes"; + string message(os.str()); FILE_LOG(logERROR, message); } void UDPBaseImplementation::startReadout(){ - FILE_LOG(logWARNING) << __AT__ << " doing nothing..."; - FILE_LOG(logERROR) << __AT__ << " must be overridden by child classes"; + ostringstream os; + os << " must be overridden by child classes"; + string message(os.str()); FILE_LOG(logERROR, message); } int UDPBaseImplementation::shutDownUDPSockets(){ - FILE_LOG(logWARNING) << __AT__ << " doing nothing..."; - FILE_LOG(logERROR) << __AT__ << " must be overridden by child classes"; + ostringstream os; + os << " must be overridden by child classes"; + string message(os.str()); FILE_LOG(logERROR, message); //overridden functions might return FAIL return OK; } void UDPBaseImplementation::readFrame(int ithread, char* c,char** raw, int64_t &startAcquisitionIndex, int64_t &startFrameIndex){ - FILE_LOG(logWARNING) << __AT__ << " doing nothing..."; - FILE_LOG(logERROR) << __AT__ << " must be overridden by child classes"; + ostringstream os; + os << " must be overridden by child classes"; + string message(os.str()); FILE_LOG(logERROR, message); } //FIXME: needed, isnt stopReceiver enough? void UDPBaseImplementation::abort(){ - FILE_LOG(logWARNING) << __AT__ << " doing nothing..."; - FILE_LOG(logERROR) << __AT__ << " must be overridden by child classes"; + ostringstream os; + os << " must be overridden by child classes"; + string message(os.str()); FILE_LOG(logERROR, message); } void UDPBaseImplementation::closeFile(int ithread){ - FILE_LOG(logWARNING) << __AT__ << " doing nothing..."; - FILE_LOG(logERROR) << __AT__ << " must be overridden by child classes"; + ostringstream os; + os << " must be overridden by child classes"; + string message(os.str()); FILE_LOG(logERROR, message); } int UDPBaseImplementation::setActivate(int enable){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + if(enable != -1){ activated = enable; - FILE_LOG(logINFO) << "Activation: " << stringEnable(activated); + ostringstream os; + os << "Activation: " << stringEnable(activated); + string message(os.str()); FILE_LOG(logINFO, message); } return activated; diff --git a/slsReceiverSoftware/src/UDPInterface.cpp b/slsReceiverSoftware/src/UDPInterface.cpp index a6bd2cfaca..749be3b711 100644 --- a/slsReceiverSoftware/src/UDPInterface.cpp +++ b/slsReceiverSoftware/src/UDPInterface.cpp @@ -23,17 +23,23 @@ using namespace std; UDPInterface * UDPInterface::create(string receiver_type){ if (receiver_type == "standard"){ - FILE_LOG(logINFO) << "Starting " << receiver_type; + ostringstream os; + os << "Starting " << receiver_type; + string message(os.str()); FILE_LOG(logINFO, message); return new UDPStandardImplementation(); } #ifdef REST else if (receiver_type == "REST"){ - FILE_LOG(logINFO) << "Starting " << receiver_type; + ostringstream os; + os << "Starting " << receiver_type; + string message(os.str()); FILE_LOG(logINFO, message); return new UDPRESTImplementation(); } #endif else{ - FILE_LOG(logWARNING) << "[ERROR] UDP interface not supported, using standard implementation"; + ostringstream os; + os << "[ERROR] UDP interface not supported, using standard implementation"; + string message(os.str()); FILE_LOG(logWARNING, message); return new UDPBaseImplementation(); } } diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 98140d4e23..ee8bf034eb 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -3,6 +3,8 @@ * @short does all the functions for a receiver, set/get parameters, start/stop etc. ***********************************************/ +sprintf(cstreambuf, "%s", " \0"); +FILE_LOG(logDEBUG, cstreambuf); #include "UDPStandardImplementation.h" @@ -32,10 +34,14 @@ using namespace std; *************************************************************************/ UDPStandardImplementation::UDPStandardImplementation(){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + initializeMembers(); + for(int i= 0; i < MAX_NUMBER_OF_WRITER_THREADS; ++i) + memset(streambuf[i], 0, MAX_STR_LENGTH ); + memset(cstreambuf, 0, MAX_STR_LENGTH ); + //***mutex*** pthread_mutex_init(&statusMutex,NULL); pthread_mutex_init(&writeMutex,NULL); @@ -45,9 +51,11 @@ UDPStandardImplementation::UDPStandardImplementation(){ //to increase socket receiver buffer size and max length of input queue by changing kernel settings if(myDetectorType == EIGER); else if(system("echo $((100*1024*1024)) > /proc/sys/net/core/rmem_max")){ - FILE_LOG(logDEBUG) << "Warning: No root permission to change socket receiver buffer size in file /proc/sys/net/core/rmem_max"; + sprintf(cstreambuf, "%s", "Warning: No root permission to change socket receiver buffer size in file /proc/sys/net/core/rmem_max \0"); + FILE_LOG(logDEBUG, cstreambuf); }else if(system("echo 250000 > /proc/sys/net/core/netdev_max_backlog")){ - FILE_LOG(logDEBUG) << "Warning: No root permission to change max length of input queue in file /proc/sys/net/core/netdev_max_backlog"; + sprintf(cstreambuf, "%s", "Warning: No root permission to change max length of input queue in file /proc/sys/net/core/netdev_max_backlog \0"); + FILE_LOG(logDEBUG, cstreambuf); } /** permanent setting by heiner @@ -61,7 +69,7 @@ UDPStandardImplementation::UDPStandardImplementation(){ } UDPStandardImplementation::~UDPStandardImplementation(){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + for(int i=0;iShutDownSocket(); - FILE_LOG(logINFO) << "Shut down UDP Socket " << i; + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "Shut down UDP Socket " << i; + string message(os.str()); FILE_LOG(logINFO, message); + } delete udpSocket[i]; udpSocket[i] = 0; } @@ -1114,9 +1321,14 @@ int UDPStandardImplementation::shutDownUDPSockets(){ * Post:udp sockets closed, status is transmitting * */ void UDPStandardImplementation::startReadout(){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); - FILE_LOG(logDEBUG) << "Transmitting last data"; + { + ostringstream os; + os << "Transmitting last data"; + string message(os.str()); FILE_LOG(logDEBUG, message); + } if(status == RUNNING){ @@ -1168,8 +1380,13 @@ void UDPStandardImplementation::startReadout(){ pthread_mutex_lock(&statusMutex); status = TRANSMITTING; pthread_mutex_unlock(&statusMutex); - - FILE_LOG(logINFO) << "Status: Transmitting"; + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "Status: Transmitting"; + string message(os.str()); FILE_LOG(logINFO, message); + } } //shut down udp sockets and make listeners push dummy (end) packets for writers @@ -1180,21 +1397,24 @@ void UDPStandardImplementation::startReadout(){ /**make this better by asking all of it at once*/ void UDPStandardImplementation::readFrame(int ithread, char* c,char** raw, int64_t &startAcq, int64_t &startFrame){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + } void UDPStandardImplementation::closeFile(int ithread){ - FILE_LOG(logDEBUG) << __AT__ << " called for " << ithread ; - //normal if(!dataCompressionEnable){ if(sfilefd[ithread]){ -#ifdef DEBUG4 - FILE_LOG(logDEBUG4) << "Going to close file: " << fileno(sfilefd)); -#endif + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "Going to close file: " << fileno(sfilefd[ithread]); + string message(os.str()); FILE_LOG(logDEBUG4, message); + } + fflush(sfilefd[ithread]); fclose(sfilefd[ithread]); sfilefd[ithread] = 0; @@ -1205,9 +1425,13 @@ void UDPStandardImplementation::closeFile(int ithread){ else{ #if (defined(MYROOT1) && defined(ALLFILE_DEBUG)) || !defined(MYROOT1) if(sfilefd[0]){ -#ifdef DEBUG4 - FILE_LOG(logDEBUG4) << "sfilefd: " << (int)sfilefd[i]; -#endif + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "sfilefd: " << fileno(sfilefd[0]); + string message(os.str()); FILE_LOG(logDEBUG4, message); + } fclose(sfilefd[0]); sfilefd[0] = 0; } @@ -1243,11 +1467,17 @@ void UDPStandardImplementation::closeFile(int ithread){ //eiger only int UDPStandardImplementation::setActivate(int enable){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; + if(enable != -1){ activated = enable; - FILE_LOG(logINFO) << "Activation: " << stringEnable(activated); + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "Activation: " << stringEnable(activated); + string message(os.str()); FILE_LOG(logINFO, message); + } } for(int i=0; inumberOfFrames) - ?(long long int)((numberOfFrames-(frameNumberInPreviousFile[ithread]+1))*packetsPerFrame - totalPacketsInFile[ithread]) - :(long long int)((frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread])*packetsPerFrame - totalPacketsInFile[ithread]), - (long long int)totalPacketsInFile[ithread], - (long long int)currentFrameNumber[ithread], - (long long int)frameNumberInPreviousFile[ithread] - ); + ?(long long int)((numberOfFrames-(frameNumberInPreviousFile[ithread]+1))*packetsPerFrame - totalPacketsInFile[ithread]) + :(long long int)((frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread])*packetsPerFrame - totalPacketsInFile[ithread]), + (long long int)totalPacketsInFile[ithread], + (long long int)currentFrameNumber[ithread], + (long long int)frameNumberInPreviousFile[ithread] + ); }else{ cprintf(BLUE,"File:%s" "\nLost:%lld" @@ -1636,12 +2058,12 @@ int UDPStandardImplementation::createNewFile(int ithread){ "\tPFrame#:%lld\n", completeFileName[ithread], ((frameNumberInPreviousFile[ithread]+1+maxFramesPerFile)>numberOfFrames) - ?(long long int)(numberOfFrames-(frameNumberInPreviousFile[ithread]+1)) - :(long long int)(frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread]), - (long long int)totalPacketsInFile[ithread], - (long long int)currentFrameNumber[ithread], - (long long int)frameNumberInPreviousFile[ithread] - ); + ?(long long int)(numberOfFrames-(frameNumberInPreviousFile[ithread]+1)) + :(long long int)(frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread]), + (long long int)totalPacketsInFile[ithread], + (long long int)currentFrameNumber[ithread], + (long long int)frameNumberInPreviousFile[ithread] + ); } }else @@ -1670,29 +2092,41 @@ int UDPStandardImplementation::createNewFile(int ithread){ int UDPStandardImplementation::createCompressionFile(int ithread, int iframe){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + #ifdef MYROOT1 char temp[MAX_STR_LENGTH]; - //create file name for gui purposes, and set up acquistion parameters - sprintf(temp, "%s/%s_fxxx_%d_%d.root", filePath,fileNamePerThread[ithread],fileIndex,ithread); - //file - myFile[ithread] = new TFile(temp,"RECREATE");/** later return error if it exists */ - cprintf(GREEN,"Writing_Thread %d: Created Compression File: %s\n",ithread, temp); - //tree - sprintf(temp, "%s_fxxx_%d_%d",fileNamePerThread[ithread],fileIndex,ithread); - myTree[ithread]=singlePhotonDetectorObject[ithread]->initEventTree(temp, &iframe); - //resets the pedestalSubtraction array and the commonModeSubtraction - singlePhotonDetectorObject[ithread]->newDataSet(); - if(myFile[ithread]==NULL){ - FILE_LOG(logERROR) << "File Null"; - return FAIL; + //create file name for gui purposes, and set up acquistion parameters + sprintf(temp, "%s/%s_fxxx_%d_%d.root", filePath,fileNamePerThread[ithread],fileIndex,ithread); + //file + myFile[ithread] = new TFile(temp,"RECREATE");/** later return error if it exists */ + cprintf(GREEN,"Writing_Thread %d: Created Compression File: %s\n",ithread, temp); + //tree + sprintf(temp, "%s_fxxx_%d_%d",fileNamePerThread[ithread],fileIndex,ithread); + myTree[ithread]=singlePhotonDetectorObject[ithread]->initEventTree(temp, &iframe); + //resets the pedestalSubtraction array and the commonModeSubtraction + singlePhotonDetectorObject[ithread]->newDataSet(); + if(myFile[ithread]==NULL){ + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "File Null"; + string message(os.str()); FILE_LOG(logERROR, message); } - if(!myFile[ithread]->IsOpen()){ - FILE_LOG(logERROR) << "File Not Open"; - return FAIL; + return FAIL; + } + if(!myFile[ithread]->IsOpen()){ + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "File Not Open"; + string message(os.str()); FILE_LOG(logERROR, message); } - return OK; + return FAIL; + } + return OK; #endif return FAIL; } @@ -1700,7 +2134,7 @@ int UDPStandardImplementation::createCompressionFile(int ithread, int iframe){ void* UDPStandardImplementation::startDataCallbackThread(void* this_pointer){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + ((UDPStandardImplementation*)this_pointer)->startDataCallback(); return this_pointer; } @@ -1708,7 +2142,7 @@ void* UDPStandardImplementation::startDataCallbackThread(void* this_pointer){ void* UDPStandardImplementation::startListeningThread(void* this_pointer){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + ((UDPStandardImplementation*)this_pointer)->startListening(); return this_pointer; } @@ -1716,7 +2150,7 @@ void* UDPStandardImplementation::startListeningThread(void* this_pointer){ void* UDPStandardImplementation::startWritingThread(void* this_pointer){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + ((UDPStandardImplementation*)this_pointer)->startWriting(); return this_pointer; } @@ -1725,7 +2159,7 @@ void* UDPStandardImplementation::startWritingThread(void* this_pointer){ void UDPStandardImplementation::startDataCallback(){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + //set current thread value index int ithread = currentThreadIndex; @@ -1743,8 +2177,15 @@ void UDPStandardImplementation::startDataCallback(){ zmq_setsockopt(zmqsocket, ZMQ_LINGER, &val,sizeof(val)); // wait for the unsent packets before closing socket //val = 10; //zmq_setsockopt(zmqsocket,ZMQ_SNDHWM,&val,sizeof(val)); //set SEND HIGH WATER MARK (8-9ms slower) - zmq_bind(zmqsocket,hostName); // bind - FILE_LOG(logINFO) << "Thread" << ithread << ": ZMQ Server at " << hostName; + zmq_bind(zmqsocket,hostName); + // bind + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "Thread" << ithread << ": ZMQ Server at " << hostName; + string message(os.str()); FILE_LOG(logINFO, message); + } int headersize=0; @@ -1800,14 +2241,13 @@ void UDPStandardImplementation::startDataCallback(){ "\"roundRNumber\":%u, " "\"detType\":%u, " "\"version\":%u" - "}"; + "}\0"; int npixelsx=0, npixelsy=0; switch(myDetectorType) { case JUNGFRAU: npixelsx = JFRAU_PIXELS_IN_ONE_ROW; npixelsy = JFRAU_PIXELS_IN_ONE_COL; break; case EIGER: npixelsx = EIGER_PIXELS_IN_ONE_ROW; npixelsy = EIGER_PIXELS_IN_ONE_COL; break; default:break; /* will not work for other detectors*/ } - char buf[1000]; uint64_t acquisitionIndex = -1; uint64_t frameIndex = -1; #ifdef DEBUG @@ -1827,23 +2267,6 @@ void UDPStandardImplementation::startDataCallback(){ //end if acquistion if(guiNumPackets[ithread] == dummyPacketValue){ - //sending previous half frames if any - if(!excludeMissingPackets && newFrame){ - //send header - //update frame details - frameIndex = fnum; - acquisitionIndex = fnum - startAcquisitionIndex; - int len = sprintf(buf,jsonFmt, - SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );/* will not work for other detectors*/ - zmq_send(zmqsocket, buf,len, ZMQ_SNDMORE); - //send data - zmq_send(zmqsocket, buffer, oneframesize, 0); - newFrame = false; - } - - - //send final header //update frame details #ifdef DEBUG @@ -1852,13 +2275,16 @@ void UDPStandardImplementation::startDataCallback(){ frameIndex = -1; acquisitionIndex = -1; - int len = sprintf(buf,jsonFmt, - SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + { + char buf[1000]="";memset(buf,0,1000); + int len = sprintf(buf,jsonFmt, + SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - zmq_send(zmqsocket, buf,len, ZMQ_SNDMORE); + zmq_send(zmqsocket, buf,1000, 0); + } //send final data - zmq_send (zmqsocket, "end", 3, 0); + zmq_send (zmqsocket, "end\0", 4, 0); pthread_mutex_lock(&statusMutex); dataCallbackThreadsMask^=(1<frameNumber; frameIndex = fnum - startFrameIndex; acquisitionIndex = fnum - startAcquisitionIndex; + { + char buf[1000]="";memset(buf,0,1000); + int len = sprintf(buf,jsonFmt, + SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], + header->frameNumber, header->expLength, header->packetNumber, header->bunchId, header->timestamp, + header->modId, header->xCoord, header->yCoord, header->zCoord, header->debug, header->roundRNumber, header->detType, header->version); - int len = sprintf(buf,jsonFmt, - SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], - header->frameNumber, header->expLength, header->packetNumber, header->bunchId, header->timestamp, - header->modId, header->xCoord, header->yCoord, header->zCoord, header->debug, header->roundRNumber, header->detType, header->version); - - zmq_send(zmqsocket, buf,len, ZMQ_SNDMORE); + zmq_send(zmqsocket, buf,1000, 0); + } //send data zmq_send(zmqsocket, (latestData[ithread]+sizeof(sls_detector_header)), bufferSize, 0); //start clock after sending @@ -1913,107 +2341,8 @@ void UDPStandardImplementation::startDataCallback(){ //moench, jctb else{ - - size = guiNumPackets[ithread]*onePacketSize; - datapacketscaught+=guiNumPackets[ithread]; - offset=0; - - //copy packet by packet -getting rid of headers, -in the right order(padding missing packets) - while(offset < size){ - - //until getting frame number is not error - while((size>0) && (getFrameandPacketNumber(ithread, latestData[ithread]+offset, fnum, pnum,snum,bid)==FAIL)){ - offset+= onePacketSize; - } - //if(!ithread) cout<< ithread <<" fnum:"<< fnum<<" pnum:"<= size) - break; - - if(!frameToGuiFrequency) - currentfnum = fnum; - - - //last packet of same frame - if(fnum == currentfnum && pnum == (packetsPerFrame-1)){ -#ifdef DEBUG - oldpnum=0; -#endif - memcpy(buffer+(pnum*oneDataSize), latestData[ithread]+offset+headersize,oneDataSize); - offset+= onePacketSize; - //send header - //update frame details - frameIndex = fnum; - acquisitionIndex = fnum - startAcquisitionIndex; - int len = sprintf(buf,jsonFmt, - SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );/* will not work for other detectors*/ - zmq_send(zmqsocket, buf,len, ZMQ_SNDMORE); - //send data - zmq_send(zmqsocket, buffer, oneframesize, 0); - newFrame = false; -#ifdef DEBUG - if(!ithread)cprintf(BLUE,"%d sent (last packet)\n",ithread); -#endif - currentfnum++; - //start clock after sending - if(!frameToGuiFrequency){ - randomSendNow = false; - clock_gettime(CLOCK_REALTIME, &begin); - } - memset(buffer,0xFF,oneframesize); - - } - //same frame (not last) or next frame - else { - //next frame -#ifdef DEBUG - int once = true; -#endif - while(fnum > currentfnum){ -#ifdef DEBUG - if(once){ - if((fnum-currentfnum-1)>1) cprintf(RED,"%d Complete sub image missing:%d (cfnum:%d nfnum:%d)\n", - ithread,fnum-currentfnum-1,currentfnum,fnum); - once = false; - } -#endif - //send header - //update frame details - frameIndex = fnum; - acquisitionIndex = fnum - startAcquisitionIndex; - int len = sprintf(buf,jsonFmt, - SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );/* will not work for other detectors*/ - zmq_send(zmqsocket, buf,len, ZMQ_SNDMORE); - //send data - zmq_send(zmqsocket, buffer, oneframesize, 0); - newFrame = false; -#ifdef DEBUG - cprintf(BLUE,"%d sent (last packet of previous frame)\n",ithread); -#endif - currentfnum++; - //start clock after sending - if(!frameToGuiFrequency){ - randomSendNow = false; - clock_gettime(CLOCK_REALTIME, &begin); - } - memset(buffer,0xFF,oneframesize); - } - - memcpy(buffer+(pnum*oneDataSize), latestData[ithread]+offset+headersize,oneDataSize); - offset+= onePacketSize; - newFrame = true; - } - - } + cprintf(BG_RED, "should not be in here, only for moench, jctb. Exiting\n"); + exit(-1); } @@ -2046,7 +2375,7 @@ void UDPStandardImplementation::startDataCallback(){ void UDPStandardImplementation::startListening(){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + //set current thread value index int ithread = currentThreadIndex; @@ -2081,7 +2410,13 @@ void UDPStandardImplementation::startListening(){ //udpsocket doesnt exist if(activated && !udpSocket[ithread]){ - FILE_LOG(logERROR) << "Listening_Thread " << ithread << ": UDP Socket not created or shut down earlier"; + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "Listening_Thread " << ithread << ": UDP Socket not created or shut down earlier"; + string message(os.str()); FILE_LOG(logERROR, message); + } stopListening(ithread,0); continue; } @@ -2128,7 +2463,7 @@ void UDPStandardImplementation::startListening(){ int UDPStandardImplementation::prepareAndListenBuffer(int ithread, int cSize, char* temp){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + int receivedSize = 0; @@ -2163,7 +2498,7 @@ int UDPStandardImplementation::prepareAndListenBuffer(int ithread, int cSize, ch int UDPStandardImplementation::prepareAndListenBufferDeactivated(int ithread){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + //last if(currentFrameNumber[ithread] == numberOfFrames) @@ -2187,7 +2522,7 @@ int UDPStandardImplementation::prepareAndListenBufferDeactivated(int ithread){ int UDPStandardImplementation::prepareAndListenBufferCompleteFrames(int ithread){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + int headerlength = 0; uint32_t LASTPNUM = 0; @@ -2279,7 +2614,7 @@ int UDPStandardImplementation::prepareAndListenBufferCompleteFrames(int ithread) totalIgnoredPacketCount[ithread] += (pnum + 1); } else if(myDetectorType == EIGER) - fnum = fi; //update currentfnum for eiger (next packets should have currentfnum value) + fnum = fi; //update currentfnum for eiger (next packets should have currentfnum value) #ifdef VERBOSE if(!ithread) cout << "next currentpnum :" << pnum << endl; #endif @@ -2343,10 +2678,10 @@ int UDPStandardImplementation::prepareAndListenBufferCompleteFrames(int ithread) #ifdef VERBOSE if(!ithread) - cprintf(BLUE, - "framenumber:%lu\tsubfnum:%u\tpnum:%u\tbunchid:%lu\txcoord:%u\tdettype:%u\tversion:%u\n", - header->frameNumber, header->expLength, header->packetNumber, - header->bunchId, header->xCoord, header->detType, header->version); + cprintf(BLUE, + "framenumber:%lu\tsubfnum:%u\tpnum:%u\tbunchid:%lu\txcoord:%u\tdettype:%u\tversion:%u\n", + header->frameNumber, header->expLength, header->packetNumber, + header->bunchId, header->xCoord, header->detType, header->version); #endif //write packet count to buffer @@ -2357,7 +2692,7 @@ int UDPStandardImplementation::prepareAndListenBufferCompleteFrames(int ithread) void UDPStandardImplementation::startFrameIndices(int ithread){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + jfrau_packet_header_t* header=0; @@ -2375,7 +2710,7 @@ void UDPStandardImplementation::startFrameIndices(int ithread){ & (frameIndexMask)) >> frameIndexOffset); }else{ startFrameIndex = ((((uint32_t)(*((uint32_t*)(buffer[ithread]+fifoBufferHeaderSize)))) - & (frameIndexMask)) >> frameIndexOffset); + & (frameIndexMask)) >> frameIndexOffset); } break; } @@ -2401,7 +2736,7 @@ void UDPStandardImplementation::startFrameIndices(int ithread){ void UDPStandardImplementation::stopListening(int ithread, int numbytes){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + #ifdef DEBUG4 cprintf(BLUE,"Listening_Thread %d: Stop Listening\nStatus: %s numbytes:%d\n", ithread, runStatusType(status).c_str(),numbytes); @@ -2409,7 +2744,13 @@ void UDPStandardImplementation::stopListening(int ithread, int numbytes){ //free empty buffer if(numbytes <= 0){ - FILE_LOG(logINFO) << "Listening "<< ithread << ": End of Acquisition"; + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "Listening "<< ithread << ": End of Acquisition"; + string message(os.str()); FILE_LOG(logINFO, message); + } while(!fifoFree[ithread]->push(buffer[ithread])); } @@ -2443,7 +2784,13 @@ void UDPStandardImplementation::stopListening(int ithread, int numbytes){ listeningThreadsMask^=(1<push(wbuffer)); @@ -2730,64 +3088,64 @@ void UDPStandardImplementation::stopWriting(int ithread, char* wbuffer){ //Print packet loss //if(totalWritingPacketCountFromLastCheck[ithread]){ #ifdef VERBOSE - if(numberofWriterThreads>1){ - printf("Thread:%d" - "\tLost:%lld" - "\t\tPackets:%lld" - "\tFrame#:%lld" - "\tPFrame#:%lld\n", - ithread, - ((frameNumberInPreviousCheck[ithread]+1+(maxFramesPerFile/progressFrequency))>numberOfFrames) - ?(long long int)((numberOfFrames-(frameNumberInPreviousCheck[ithread]+1))*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]) + if(numberofWriterThreads>1){ + printf("Thread:%d" + "\tLost:%lld" + "\t\tPackets:%lld" + "\tFrame#:%lld" + "\tPFrame#:%lld\n", + ithread, + ((frameNumberInPreviousCheck[ithread]+1+(maxFramesPerFile/progressFrequency))>numberOfFrames) + ?(long long int)((numberOfFrames-(frameNumberInPreviousCheck[ithread]+1))*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]) :(long long int)((frameNumberInPreviousCheck[ithread]+(maxFramesPerFile/progressFrequency) - frameNumberInPreviousCheck[ithread])*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]), - (long long int)totalWritingPacketCountFromLastCheck[ithread], - (long long int)currentFrameNumber[ithread], - (long long int)frameNumberInPreviousCheck[ithread] - ); - }else{ - printf("Lost:%lld" - "\t\tPackets:%lld" - "\tFrame#:%lld" - "\tPFrame#:%lld\n", - ((frameNumberInPreviousCheck[ithread]+1+(maxFramesPerFile/progressFrequency))>numberOfFrames) - ?(long long int)((numberOfFrames-(frameNumberInPreviousCheck[ithread]+1))*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]) + (long long int)totalWritingPacketCountFromLastCheck[ithread], + (long long int)currentFrameNumber[ithread], + (long long int)frameNumberInPreviousCheck[ithread] + ); + }else{ + printf("Lost:%lld" + "\t\tPackets:%lld" + "\tFrame#:%lld" + "\tPFrame#:%lld\n", + ((frameNumberInPreviousCheck[ithread]+1+(maxFramesPerFile/progressFrequency))>numberOfFrames) + ?(long long int)((numberOfFrames-(frameNumberInPreviousCheck[ithread]+1))*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]) :(long long int)((frameNumberInPreviousCheck[ithread]+(maxFramesPerFile/progressFrequency) - frameNumberInPreviousCheck[ithread])*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]), - (long long int)totalWritingPacketCountFromLastCheck[ithread], - (long long int)currentFrameNumber[ithread], - (long long int)frameNumberInPreviousCheck[ithread] - ); - } - - if(numberofWriterThreads>1){ - cprintf(BLUE,"File:%s" - "\nThread:%d" - "\tLost:%lld" - "\t\tPackets:%lld" - "\tFrame#:%lld" - "\tPFrame#:%lld\n", - completeFileName[ithread],ithread, - ((frameNumberInPreviousFile[ithread]+1+maxFramesPerFile)>numberOfFrames) - ?(long long int)((numberOfFrames-(frameNumberInPreviousFile[ithread]+1))*packetsPerFrame - totalPacketsInFile[ithread]) - :(long long int)((frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread])*packetsPerFrame - totalPacketsInFile[ithread]), - (long long int)totalPacketsInFile[ithread], - (long long int)currentFrameNumber[ithread], - (long long int)frameNumberInPreviousFile[ithread] - ); - }else{ - cprintf(BLUE,"File:%s" - "\nLost:%lld" - "\t\tPackets:%lld" - "\tFrame#:%lld" - "\tPFrame#:%lld\n", - completeFileName[ithread], - ((frameNumberInPreviousFile[ithread]+1+maxFramesPerFile)>numberOfFrames) - ?(long long int)(numberOfFrames-(frameNumberInPreviousFile[ithread]+1)) - :(long long int)(frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread]), - (long long int)totalPacketsInFile[ithread], - (long long int)currentFrameNumber[ithread], - (long long int)frameNumberInPreviousFile[ithread] - ); - } + (long long int)totalWritingPacketCountFromLastCheck[ithread], + (long long int)currentFrameNumber[ithread], + (long long int)frameNumberInPreviousCheck[ithread] + ); + } + + if(numberofWriterThreads>1){ + cprintf(BLUE,"File:%s" + "\nThread:%d" + "\tLost:%lld" + "\t\tPackets:%lld" + "\tFrame#:%lld" + "\tPFrame#:%lld\n", + completeFileName[ithread],ithread, + ((frameNumberInPreviousFile[ithread]+1+maxFramesPerFile)>numberOfFrames) + ?(long long int)((numberOfFrames-(frameNumberInPreviousFile[ithread]+1))*packetsPerFrame - totalPacketsInFile[ithread]) + :(long long int)((frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread])*packetsPerFrame - totalPacketsInFile[ithread]), + (long long int)totalPacketsInFile[ithread], + (long long int)currentFrameNumber[ithread], + (long long int)frameNumberInPreviousFile[ithread] + ); + }else{ + cprintf(BLUE,"File:%s" + "\nLost:%lld" + "\t\tPackets:%lld" + "\tFrame#:%lld" + "\tPFrame#:%lld\n", + completeFileName[ithread], + ((frameNumberInPreviousFile[ithread]+1+maxFramesPerFile)>numberOfFrames) + ?(long long int)(numberOfFrames-(frameNumberInPreviousFile[ithread]+1)) + :(long long int)(frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread]), + (long long int)totalPacketsInFile[ithread], + (long long int)currentFrameNumber[ithread], + (long long int)frameNumberInPreviousFile[ithread] + ); + } #endif //} @@ -2817,7 +3175,13 @@ void UDPStandardImplementation::stopWriting(int ithread, char* wbuffer){ pthread_mutex_unlock(&(statusMutex)); //statistics - FILE_LOG(logINFO) << "Status: Run Finished"; + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "Status: Run Finished"; + string message(os.str()); FILE_LOG(logINFO, message); + } for(int i=0;inumberOfFrames) - ?(long long int)((numberOfFrames-(frameNumberInPreviousCheck[ithread]+1))*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]) - :(long long int)((frameNumberInPreviousCheck[ithread]+(maxFramesPerFile/progressFrequency) - frameNumberInPreviousCheck[ithread])*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]), - (long long int)totalWritingPacketCountFromLastCheck[ithread], - (long long int)currentFrameNumber[ithread], - (long long int)frameNumberInPreviousCheck[ithread] + ?(long long int)((numberOfFrames-(frameNumberInPreviousCheck[ithread]+1))*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]) + :(long long int)((frameNumberInPreviousCheck[ithread]+(maxFramesPerFile/progressFrequency) - frameNumberInPreviousCheck[ithread])*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]), + (long long int)totalWritingPacketCountFromLastCheck[ithread], + (long long int)currentFrameNumber[ithread], + (long long int)frameNumberInPreviousCheck[ithread] ); }else{ printf("Lost:%lld" @@ -2994,11 +3358,11 @@ void UDPStandardImplementation::handleCompleteFramesOnly(int ithread, char* wbuf "\tFrame#:%lld" "\tPFrame#:%lld\n", ((frameNumberInPreviousCheck[ithread]+1+(maxFramesPerFile/progressFrequency))>numberOfFrames) - ?(long long int)((numberOfFrames-(frameNumberInPreviousCheck[ithread]+1))*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]) - :(long long int)((frameNumberInPreviousCheck[ithread]+(maxFramesPerFile/progressFrequency) - frameNumberInPreviousCheck[ithread])*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]), - (long long int)totalWritingPacketCountFromLastCheck[ithread], - (long long int)currentFrameNumber[ithread], - (long long int)frameNumberInPreviousCheck[ithread] + ?(long long int)((numberOfFrames-(frameNumberInPreviousCheck[ithread]+1))*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]) + :(long long int)((frameNumberInPreviousCheck[ithread]+(maxFramesPerFile/progressFrequency) - frameNumberInPreviousCheck[ithread])*packetsPerFrame - totalWritingPacketCountFromLastCheck[ithread]), + (long long int)totalWritingPacketCountFromLastCheck[ithread], + (long long int)currentFrameNumber[ithread], + (long long int)frameNumberInPreviousCheck[ithread] ); } //reset counters for each new file @@ -3053,7 +3417,7 @@ void UDPStandardImplementation::handleCompleteFramesOnly(int ithread, char* wbuf void UDPStandardImplementation::writeFileWithoutCompression(int ithread, char* wbuffer,uint32_t numpackets){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + //if write enabled if((fileWriteEnable) && (sfilefd[ithread])){ @@ -3205,16 +3569,16 @@ void UDPStandardImplementation::updateFileHeader(int ithread){ activated, (long long int)(totalPacketsInFile[ithread]/packetsPerFrame), ((frameNumberInPreviousFile[ithread]+1+maxFramesPerFile)>numberOfFrames) - ?(long long int)((numberOfFrames-(frameNumberInPreviousFile[ithread]+1)) - (totalPacketsInFile[ithread]/packetsPerFrame)) - :(long long int)((frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread]) - (totalPacketsInFile[ithread]/packetsPerFrame)), - dynamicRange,tengigaEnable, - bufferSize, - //only for eiger right now - EIGER_PIXELS_IN_ONE_ROW,EIGER_PIXELS_IN_ONE_COL, - (long long int)numberOfFrames, - (long long int)acquisitionTime, - (long long int)acquisitionPeriod, - ctime(&t)); + ?(long long int)((numberOfFrames-(frameNumberInPreviousFile[ithread]+1)) - (totalPacketsInFile[ithread]/packetsPerFrame)) + :(long long int)((frameNumberInPreviousFile[ithread]+maxFramesPerFile - frameNumberInPreviousFile[ithread]) - (totalPacketsInFile[ithread]/packetsPerFrame)), + dynamicRange,tengigaEnable, + bufferSize, + //only for eiger right now + EIGER_PIXELS_IN_ONE_ROW,EIGER_PIXELS_IN_ONE_COL, + (long long int)numberOfFrames, + (long long int)acquisitionTime, + (long long int)acquisitionPeriod, + ctime(&t)); if(strlen(fileHeader[ithread]) > FILE_HEADER_SIZE) cprintf(BG_RED,"File Header Size %d is too small for fixed file header size %d\n",(int)strlen(fileHeader[ithread]),(int)FILE_HEADER_SIZE); @@ -3223,7 +3587,7 @@ void UDPStandardImplementation::updateFileHeader(int ithread){ //called only if datacallback enabled void UDPStandardImplementation::copyFrameToGui(int ithread, char* buffer, uint32_t numpackets){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + //if nthe frame, wait for your turn (1st frame always shown as its zero) if(frameToGuiFrequency && ((frametoGuiCounter[ithread])%frameToGuiFrequency)); @@ -3266,7 +3630,7 @@ void UDPStandardImplementation::copyFrameToGui(int ithread, char* buffer, uint32 void UDPStandardImplementation::handleDataCompression(int ithread, char* wbuffer, uint64_t &nf){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + //get frame number uint64_t tempframenumber=-1; @@ -3394,7 +3758,7 @@ void UDPStandardImplementation::handleDataCompression(int ithread, char* wbuffer while(!fifoFree[0]->push(wbuffer)); #ifdef EVERYFIFODEBUG if(fifoFree[0]->getSemValue()<100) - cprintf(GREEN,"FifoFree[%d]: value:%d, push 0x%x\n",0,fifoFree[0]->getSemValue(),(void*)(wbuffer)); + cprintf(GREEN,"FifoFree[%d]: value:%d, push 0x%x\n",0,fifoFree[0]->getSemValue(),(void*)(wbuffer)); #endif #ifdef DEBUG5 cprintf(GREEN,"Writing_Thread %d: Compression free pushed into fifofree %p for listerner 0\n", ithread, (void*)(wbuffer)); @@ -3404,7 +3768,7 @@ void UDPStandardImplementation::handleDataCompression(int ithread, char* wbuffer int UDPStandardImplementation::getFrameandPacketNumber(int ithread, char* wbuffer, uint64_t &framenumber, uint32_t &packetnumber,uint32_t &subframenumber, uint64_t &bunchid){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + eiger_packet_footer_t* footer=0; eiger_packet_header_t* e_header=0; @@ -3422,7 +3786,25 @@ int UDPStandardImplementation::getFrameandPacketNumber(int ithread, char* wbuffe //error in frame number sent by fpga if(((uint32_t)(*( (uint64_t*) footer)))==0){ framenumber = 0; - FILE_LOG(logERROR) << "Fifo "<< ithread << ": Frame Number is zero from firmware."; + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + { + ostringstream os; + os << "Fifo "<< ithread << ": Frame Number is zero from firmware."; + string message(os.str()); FILE_LOG(logERROR, message); + + + } + if(((uint32_t)(*( (uint64_t*) footer)))==0) + { + sprintf(cstreambuf, "%s", " \0"); + FILE_LOG(logDEBUG, cstreambuf); + packetnumber = (*( (uint16_t*) footer->packetNumber))-1; + ostringstream os; + os << "Fifo "<< ithread << ": Frame Number is still zero from firmware. and pnum:" << packetnumber << "udp port num:" << udpPortNum[ithread]; + string message(os.str()); FILE_LOG(logERROR, message); + + } return FAIL; } packetnumber = (*( (uint16_t*) footer->packetNumber))-1; @@ -3477,7 +3859,7 @@ int UDPStandardImplementation::getFrameandPacketNumber(int ithread, char* wbuffe int UDPStandardImplementation::writeUptoFrameNumber(int ithread, char* wbuffer, int &offset, uint64_t nextFrameNumber, uint32_t numpackets, int &numPacketsWritten){ - FILE_LOG(logDEBUG) << __AT__ << " called"; + //if(ithread) cout<<"at writeUptoFrameNumber " << nextFrameNumber<< endl; diff --git a/slsReceiverSoftware/src/main.cpp b/slsReceiverSoftware/src/main.cpp index b4e5ef142f..bced35a06d 100644 --- a/slsReceiverSoftware/src/main.cpp +++ b/slsReceiverSoftware/src/main.cpp @@ -104,7 +104,6 @@ int main(int argc, char *argv[]) { //start tcp server thread if(receiver->start() == slsReceiverDefs::OK){ - FILE_LOG(logDEBUG1) << "DONE!" << endl; string str; cin>>str; //wait and look for an exit keyword diff --git a/slsReceiverSoftware/src/slsReceiver.cpp b/slsReceiverSoftware/src/slsReceiver.cpp index 4a28ab8e10..1f1678c6ce 100644 --- a/slsReceiverSoftware/src/slsReceiver.cpp +++ b/slsReceiverSoftware/src/slsReceiver.cpp @@ -106,23 +106,31 @@ slsReceiver::slsReceiver(int argc, char *argv[], int &success){ if( !fname.empty() ){ try{ - FILE_LOG(logINFO) << "config file name " << fname; + ostringstream os; + os << "config file name " << fname; + string message(os.str()); FILE_LOG(logDEBUG, message); success = read_config_file(fname, &tcpip_port_no, &configuration_map); //VERBOSE_PRINT("Read configuration file of " + iline + " lines"); } catch(...){ - FILE_LOG(logERROR) << "Error opening configuration file " << fname ; - success = FAIL; + ostringstream os; + os << "Error opening configuration file " << fname ; + string message(os.str()); FILE_LOG(logERROR, message); + success = FAIL; } } if(success != OK){ - FILE_LOG(logERROR) << "Failed: see output above for more information " ; + ostringstream os; + os << "Failed: see output above for more information " ; + string message(os.str()); FILE_LOG(logERROR, message); } if (success==OK){ - FILE_LOG(logINFO) << "SLS Receiver starting " << udp_interface_type << " on port " << tcpip_port_no << endl; + ostringstream os; + os << "SLS Receiver starting " << udp_interface_type << " on port " << tcpip_port_no << endl; + string message(os.str()); FILE_LOG(logDEBUG, message); #ifdef REST udp_interface = UDPInterface::create(udp_interface_type); udp_interface->configure(configuration_map); diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 8f4fd537a5..ea68631fd1 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -28,17 +28,17 @@ slsReceiverTCPIPInterface::~slsReceiverTCPIPInterface() { } slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int &success, UDPInterface* rbase, int pn): - myDetectorType(GOTTHARD), - receiverBase(rbase), - ret(OK), - lockStatus(0), - shortFrame(-1), - packetsPerFrame(GOTTHARD_PACKETS_PER_FRAME), - dynamicrange(16), - killTCPServerThread(0), - tenGigaEnable(0), - portNumber(DEFAULT_PORTNO+2), - mySock(NULL){ + myDetectorType(GOTTHARD), + receiverBase(rbase), + ret(OK), + lockStatus(0), + shortFrame(-1), + packetsPerFrame(GOTTHARD_PACKETS_PER_FRAME), + dynamicrange(16), + killTCPServerThread(0), + tenGigaEnable(0), + portNumber(DEFAULT_PORTNO+2), + mySock(NULL){ strcpy(SET_RECEIVER_ERR_MESSAGE,"Receiver not set up. Please use rx_hostname first.\n"); @@ -126,14 +126,22 @@ int slsReceiverTCPIPInterface::setPortNumber(int pn){ int slsReceiverTCPIPInterface::start(){ - FILE_LOG(logDEBUG) << "Creating TCP Server Thread" << endl; + { + ostringstream os; + os << "Creating TCP Server Thread" << endl; + string message(os.str()); FILE_LOG(logDEBUG, message); + } killTCPServerThread = 0; if(pthread_create(&TCPServer_thread, NULL,startTCPServerThread, (void*) this)){ cout << "Could not create TCP Server thread" << endl; return FAIL; } //#ifdef VERYVERBOSE - FILE_LOG(logDEBUG) << "TCP Server thread created successfully." << endl; + { + ostringstream os; + os << "TCP Server thread created successfully." << endl; + string message(os.str()); FILE_LOG(logDEBUG, message); + } //#endif return OK; } @@ -387,23 +395,27 @@ int slsReceiverTCPIPInterface::set_detector_type(){ receiverBase->registerCallBackRawDataReady(rawDataReadyCallBack,pRawDataReady); } #endif - myDetectorType = dr; - ret=receiverBase->setDetectorType(myDetectorType); - retval = myDetectorType; + myDetectorType = dr; + ret=receiverBase->setDetectorType(myDetectorType); + retval = myDetectorType; } - + } } //#ifdef VERYVERBOSE if(ret!=FAIL) - FILE_LOG(logDEBUG) << "detector type " << dr; + { + ostringstream os; + os << "detector type " << dr; + string message(os.str()); FILE_LOG(logDEBUG, message); + } else cprintf(RED, "%s\n", mess); //#endif #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -470,7 +482,7 @@ int slsReceiverTCPIPInterface::set_file_name() { if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -545,7 +557,7 @@ int slsReceiverTCPIPInterface::set_file_dir() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -617,7 +629,7 @@ int slsReceiverTCPIPInterface::set_file_index() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -695,7 +707,7 @@ int slsReceiverTCPIPInterface::set_frame_index() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -759,12 +771,16 @@ int slsReceiverTCPIPInterface::setup_udp(){ receiverBase->setUDPPortNumber2(udpport2); //setup udpip //get ethernet interface or IP to listen to - FILE_LOG(logINFO) << "Receiver UDP IP: " << args[0]; + { + ostringstream os; + os << "Receiver UDP IP: " << args[0]; + string message(os.str()); FILE_LOG(logINFO, message); + } temp = genericSocket::ipToName(args[0]); if(temp=="none"){ ret = FAIL; strcpy(mess, "Failed to get ethernet interface or IP\n"); - FILE_LOG(logERROR) << mess; + FILE_LOG(logERROR, string(mess)); } else{ strcpy(eth,temp.c_str()); @@ -785,7 +801,9 @@ int slsReceiverTCPIPInterface::setup_udp(){ } else{ strcpy(retval,temp.c_str()); - FILE_LOG(logINFO) << "Reciever MAC Address: " << retval; + ostringstream os; + os << "Reciever MAC Address: " << retval; + string message(os.str()); FILE_LOG(logINFO, message); } } } @@ -793,14 +811,14 @@ int slsReceiverTCPIPInterface::setup_udp(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } // send answer mySock->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL){ - FILE_LOG(logERROR) << mess; + FILE_LOG(logERROR, string(mess)); mySock->SendDataOnly(mess,sizeof(mess)); } mySock->SendDataOnly(retval,MAX_STR_LENGTH); @@ -849,7 +867,7 @@ int slsReceiverTCPIPInterface::start_receiver(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -897,7 +915,7 @@ int slsReceiverTCPIPInterface::stop_receiver(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -928,7 +946,7 @@ int slsReceiverTCPIPInterface::get_status(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -959,7 +977,7 @@ int slsReceiverTCPIPInterface::get_frames_caught(){ }else retval=receiverBase->getTotalFramesCaught(); #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -991,7 +1009,7 @@ int slsReceiverTCPIPInterface::get_frame_index(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -1036,7 +1054,7 @@ int slsReceiverTCPIPInterface::reset_frames_caught(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -1105,7 +1123,7 @@ int slsReceiverTCPIPInterface::set_short_frame() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -1287,7 +1305,7 @@ int slsReceiverTCPIPInterface::moench_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -1468,7 +1486,7 @@ int slsReceiverTCPIPInterface::gotthard_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -1622,7 +1640,7 @@ int slsReceiverTCPIPInterface::propix_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -1657,7 +1675,7 @@ int slsReceiverTCPIPInterface::propix_read_frame(){ int slsReceiverTCPIPInterface::eiger_read_frame(){ ret=OK; -/* + /* char fName[MAX_STR_LENGTH]=""; int acquisitionIndex = -1; int frameIndex= -1; @@ -1889,7 +1907,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -1910,7 +1928,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ delete [] retval; delete [] origVal; delete [] raw; -*/ + */ return ret; } @@ -2052,7 +2070,7 @@ int slsReceiverTCPIPInterface::jungfrau_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2130,7 +2148,7 @@ int slsReceiverTCPIPInterface::set_read_frequency(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2196,7 +2214,7 @@ int slsReceiverTCPIPInterface::set_read_receiver_timer(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2259,7 +2277,7 @@ int slsReceiverTCPIPInterface::set_data_stream_enable(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2319,7 +2337,7 @@ int slsReceiverTCPIPInterface::enable_file_write(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2347,7 +2365,7 @@ int slsReceiverTCPIPInterface::get_id(){ #endif if(mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2371,43 +2389,43 @@ int64_t slsReceiverTCPIPInterface::getReceiverVersion(){ int slsReceiverTCPIPInterface::start_readout(){cprintf(BLUE,"In start readout!\n"); - ret=OK; - enum runStatus retval; +ret=OK; +enum runStatus retval; - // execute action if the arguments correctly arrived +// execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_UDP_FUNCTIONS - if (receiverBase == NULL){ - strcpy(mess,SET_RECEIVER_ERR_MESSAGE); - ret=FAIL; - } - /*else if(receiverBase->getStatus()!= IDLE){ +if (receiverBase == NULL){ + strcpy(mess,SET_RECEIVER_ERR_MESSAGE); + ret=FAIL; +} +/*else if(receiverBase->getStatus()!= IDLE){ strcpy(mess,"Can not start receiver readout while receiver not idle\n"); ret = FAIL; }*/ - else{ - receiverBase->startReadout(); - retval = receiverBase->getStatus(); - if((retval == TRANSMITTING) || (retval == RUN_FINISHED) || (retval == IDLE)) - ret = OK; - else - ret = FAIL; - } +else{ + receiverBase->startReadout(); + retval = receiverBase->getStatus(); + if((retval == TRANSMITTING) || (retval == RUN_FINISHED) || (retval == IDLE)) + ret = OK; + else + ret = FAIL; +} #endif - if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; - ret=FORCE_UPDATE; - } +if(ret==OK && mySock->differentClients){ + FILE_LOG(logDEBUG,"Force update" ); + ret=FORCE_UPDATE; +} - // send answer - mySock->SendDataOnly(&ret,sizeof(ret)); - if(ret==FAIL){ - cprintf(RED,"%s\n",mess); - mySock->SendDataOnly(mess,sizeof(mess)); - } - mySock->SendDataOnly(&retval,sizeof(retval)); - //return ok/fail - return ret; +// send answer +mySock->SendDataOnly(&ret,sizeof(ret)); +if(ret==FAIL){ + cprintf(RED,"%s\n",mess); + mySock->SendDataOnly(mess,sizeof(mess)); +} +mySock->SendDataOnly(&retval,sizeof(retval)); +//return ok/fail +return ret; } @@ -2483,7 +2501,7 @@ int slsReceiverTCPIPInterface::set_timer() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2555,7 +2573,7 @@ int slsReceiverTCPIPInterface::enable_compression() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2621,7 +2639,7 @@ int slsReceiverTCPIPInterface::set_detector_hostname() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2722,7 +2740,7 @@ int slsReceiverTCPIPInterface::set_dynamic_range() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2790,7 +2808,7 @@ int slsReceiverTCPIPInterface::enable_overwrite() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2860,7 +2878,7 @@ int slsReceiverTCPIPInterface::enable_tengiga() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -2932,7 +2950,7 @@ int slsReceiverTCPIPInterface::set_fifo_depth() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -3006,7 +3024,7 @@ int slsReceiverTCPIPInterface::set_activate() { if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } @@ -3070,7 +3088,7 @@ int slsReceiverTCPIPInterface::set_flipped_data(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG) << "Force update"; + FILE_LOG(logDEBUG,"Force update" ); ret=FORCE_UPDATE; } From df0fdb7ecb9fca30a257239c0b52673b648b7255 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 19 Apr 2017 10:16:45 +0200 Subject: [PATCH 30/41] changes without ostringstream done --- Makefile | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 Makefile diff --git a/Makefile b/Makefile old mode 100755 new mode 100644 From f405aa173370459be890def5638ecef89a236218 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 19 Apr 2017 10:17:30 +0200 Subject: [PATCH 31/41] split zmq_msg_t so its not reused --- .../multiSlsDetector/multiSlsDetector.cpp | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index d792ab0c21..3ac129dddd 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -5159,25 +5159,27 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy){ int multiSlsDetector::getData(const int isocket, const bool masking, int* image, const int size, uint64_t &acqIndex, uint64_t &frameIndex, uint32_t &subframeIndex, string &filename){ - zmq_msg_t message; + zmq_msg_t header_message; //scan header------------------------------------------------------------------- - zmq_msg_init (&message); + zmq_msg_init (&header_message); //cprintf(BLUE,"%d going to receive message\n", isocket); - int len = zmq_msg_recv(&message, zmqsocket[isocket], 0); + int len = zmq_msg_recv(&header_message, zmqsocket[isocket], 0); if (len == -1) { cprintf(BG_RED,"Could not read header for socket %d\n",isocket); - zmq_msg_close(&message); + zmq_msg_close(&header_message); cprintf(RED, "%d message null\n",isocket); return FAIL; } - // error if you print it - // cprintf(BLUE,"%d header len:%d value:%s\n",isocket, len, (char*)zmq_msg_data(&message)); - //cprintf(BLUE,"%d header %d\n",isocket,len); + //cprintf(BLUE,"%d header len:%d value:%s\n",isocket, len, (char*)zmq_msg_data(&header_message)); + rapidjson::Document d; - d.Parse( (char*)zmq_msg_data(&message), zmq_msg_size(&message)); + rapidjson::ParseResult result = d.Parse( (char*)zmq_msg_data(&header_message), len); + if (!result) { + cprintf(RED,"%d Could not parse. len:%d: Message:%s \n", isocket, len, (char*)zmq_msg_data(&header_message) ); + } #ifdef VERYVERBOSE // htype is an array of strings rapidjson::Value::Array htype = d["htype"].GetArray(); @@ -5193,7 +5195,7 @@ int multiSlsDetector::getData(const int isocket, const bool masking, int* image, cout << isocket << "type: " << d["type"].GetString() << endl; #endif - if(d["acqIndex"].GetUint64()!= (long long unsigned int)-1){ //!isocket && + if(d["acqIndex"].GetUint64()!= (uint64_t)-1){ //!isocket && acqIndex = d["acqIndex"].GetUint64(); frameIndex = d["fIndex"].GetUint64(); subframeIndex = -1; @@ -5210,17 +5212,19 @@ int multiSlsDetector::getData(const int isocket, const bool masking, int* image, if(frameIndex == (long long unsigned int)-1) cprintf(RED,"multi frame index -1!!\n"); } // close the message - zmq_msg_close(&message); + zmq_msg_close(&header_message); //scan data------------------------------------------------------------------- - zmq_msg_init (&message); - len = zmq_msg_recv(&message, zmqsocket[isocket], 0); - //cprintf(BLUE,"%d data %d\n",isocket,len); - - //end of socket ("end") - if(len == 3){ - //cprintf(RED,"%d Received end of acquisition\n", isocket); + zmq_msg_t data_message; + zmq_msg_init (&data_message); + len = zmq_msg_recv(&data_message, zmqsocket[isocket], 0); + //cprintf(GREEN,"%d data %d\n",isocket,len); + + //end of socket ("end\0") + if(len == 4){ + zmq_msg_close(&data_message); // close the message + //cprintf(RED,"%d Received end of acquisition len:%d\n", isocket, len); return FAIL; } @@ -5232,8 +5236,8 @@ int multiSlsDetector::getData(const int isocket, const bool masking, int* image, //actual image else{ //actual data - //cprintf(BLUE,"%d actual dataaa\n",isocket); - memcpy((char*)image,(char*)zmq_msg_data(&message),size); + // cprintf(GREEN,"%d actual dataaa\n",isocket); + memcpy((char*)image,(char*)zmq_msg_data(&data_message),size); //jungfrau masking adcval if(masking){ @@ -5244,7 +5248,7 @@ int multiSlsDetector::getData(const int isocket, const bool masking, int* image, } } - zmq_msg_close(&message); // close the message + zmq_msg_close(&data_message); // close the message return OK; } From 3b4b2d707f176b8d48582a9229d626b1cb5ce25a Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 19 Apr 2017 10:17:39 +0200 Subject: [PATCH 32/41] changes without ostringstream done --- .../include/UDPStandardImplementation.h | 2 - slsReceiverSoftware/include/logger.h | 17 +- .../src/UDPBaseImplementation.cpp | 230 ++-- slsReceiverSoftware/src/UDPInterface.cpp | 15 +- .../src/UDPStandardImplementation.cpp | 1072 ++++++----------- slsReceiverSoftware/src/slsReceiver.cpp | 25 +- .../src/slsReceiverTCPIPInterface.cpp | 110 +- 7 files changed, 557 insertions(+), 914 deletions(-) diff --git a/slsReceiverSoftware/include/UDPStandardImplementation.h b/slsReceiverSoftware/include/UDPStandardImplementation.h index 1909d45ef7..0352dee455 100644 --- a/slsReceiverSoftware/include/UDPStandardImplementation.h +++ b/slsReceiverSoftware/include/UDPStandardImplementation.h @@ -831,8 +831,6 @@ class UDPStandardImplementation: private virtual slsReceiverDefs, public UDPBase /** Progress (currentFrameNumber) Mutex */ pthread_mutex_t progressMutex; - char streambuf[MAX_NUMBER_OF_WRITER_THREADS][MAX_STR_LENGTH]; - char cstreambuf[MAX_STR_LENGTH]; }; diff --git a/slsReceiverSoftware/include/logger.h b/slsReceiverSoftware/include/logger.h index 6d4bd30041..35d48473d0 100644 --- a/slsReceiverSoftware/include/logger.h +++ b/slsReceiverSoftware/include/logger.h @@ -14,7 +14,7 @@ #elif VERYVERBOSE #define FILELOG_MAX_LEVEL logDEBUG4 #elif VERBOSE -#define FILELOG_MAX_LEVEL logDEBUG +#define FILELOG_MAX_LEVEL logDEBUG1 #endif #ifndef FILELOG_MAX_LEVEL @@ -31,11 +31,14 @@ class Logger { public: Logger(){}; - enum TLogLevel {logERROR, logWARNING, logINFO, logDEBUG, logDEBUG1, logDEBUG2, logDEBUG3, logDEBUG4, logDEBUG5}; + enum TLogLevel {logERROR, logWARNING, logINFO, logDEBUG1, logDEBUG2, logDEBUG3, logDEBUG4, logDEBUG5}; - static void FILE_LOG(TLogLevel level, char* msg) + static void FILE_LOG(TLogLevel level, char const* msg) { + + if(level > FILELOG_MAX_LEVEL) return; + char buffer[11]; const int buffer_len = sizeof(buffer); time_t t; @@ -70,10 +73,10 @@ class Logger { */ switch(level){ - case logERROR: cprintf(RED BOLD, "- %s ERROR: %s", result, msg); break; - case logWARNING: cprintf(YELLOW BOLD,"- %s WARNING: %s", result, msg); break; - case logINFO: cprintf(GRAY, "- %s INFO: %s", result, msg); break; - default: break; + case logERROR: cprintf(RED BOLD, "- %s ERROR: %s \n", result, msg); break; + case logWARNING: cprintf(YELLOW BOLD,"- %s WARNING: %s \n", result, msg); break; + case logINFO: cprintf(GRAY, "- %s INFO: %s \n", result, msg); break; + default: cprintf(GRAY, "- %s DEBUG: %s \n", result, msg); break; } diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index dfae32bc26..2235e480d6 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -206,9 +206,7 @@ int UDPBaseImplementation::getActivate() const{ return activated;} /**initial parameters***/ void UDPBaseImplementation::configure(map config_map){ - ostringstream os; - os << " must be overridden by child classes"; - string message(os.str()); FILE_LOG(logERROR, message); + FILE_LOG(logERROR, " must be overridden by child classes"); } void UDPBaseImplementation::setFlippedData(int axis, int enable){ @@ -216,9 +214,9 @@ void UDPBaseImplementation::setFlippedData(int axis, int enable){ if(axis<0 || axis>1) return; flippedData[axis] = enable==0?0:1; - ostringstream os; - os << "Flipped Data: " << flippedData[0] << " , " << flippedData[1]; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Flipped Data: %d , %d ", flippedData[0], flippedData[1]); + FILE_LOG(logINFO, cstreambuf); } @@ -228,14 +226,13 @@ void UDPBaseImplementation::setFileName(const char c[]){ if(strlen(c)) strcpy(fileName, c); - ostringstream os; - os << "File name:" << fileName; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "File name: %s ", fileName); + FILE_LOG(logINFO, cstreambuf); } void UDPBaseImplementation::setFilePath(const char c[]){ - if(strlen(c)){ //check if filepath exists struct stat st; @@ -243,69 +240,67 @@ void UDPBaseImplementation::setFilePath(const char c[]){ strcpy(filePath,c); else{ strcpy(filePath,""); - ostringstream os; - os << "FilePath does not exist:" << filePath; - string message(os.str()); FILE_LOG(logWARNING, message); + + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "FilePath does not exist: %s ", filePath); + FILE_LOG(logWARNING, cstreambuf); } strcpy(filePath, c); } - /*FILE_LOG(logDEBUG) << "Info: File path:" << filePath;*/ + /*{ + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "File path:: %s ", filePath); + FILE_LOG(logDEBUG, cstreambuf); + }*/ } void UDPBaseImplementation::setFileIndex(const uint64_t i){ - fileIndex = i; - ostringstream os; - os << "File Index:" << fileIndex; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "File Index: %lu ", fileIndex); + FILE_LOG(logINFO, cstreambuf); } //FIXME: needed? void UDPBaseImplementation::setScanTag(const int i){ - scanTag = i; - ostringstream os; - os << "Scan Tag:" << scanTag; - string message(os.str()); FILE_LOG(logINFO, message); - + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Scan Tag: %d ", scanTag); + FILE_LOG(logINFO, cstreambuf); } void UDPBaseImplementation::setFrameIndexEnable(const bool b){ - frameIndexEnable = b; - ostringstream os; - os << "Frame Index Enable: " << stringEnable(frameIndexEnable); - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Frame Index Enable: %s ", stringEnable(frameIndexEnable).c_str()); + FILE_LOG(logINFO, cstreambuf); } void UDPBaseImplementation::setFileWriteEnable(const bool b){ - fileWriteEnable = b; - ostringstream os; - os << "File Write Enable: " << stringEnable(fileWriteEnable); - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "File Write Enable: %s ", stringEnable(fileWriteEnable).c_str()); + FILE_LOG(logINFO, cstreambuf); } void UDPBaseImplementation::setOverwriteEnable(const bool b){ - overwriteEnable = b; - ostringstream os; - os << "Overwrite Enable: " << stringEnable(overwriteEnable); - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Overwrite Enable: %s ", stringEnable(overwriteEnable).c_str()); + FILE_LOG(logINFO, cstreambuf); } int UDPBaseImplementation::setDataCompressionEnable(const bool b){ - dataCompressionEnable = b; - ostringstream os; - os << "Data Compression : " << stringEnable(dataCompressionEnable); - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Data Compression: %s ", stringEnable(dataCompressionEnable).c_str()); + FILE_LOG(logINFO, cstreambuf); //overridden methods might return FAIL return OK; @@ -315,49 +310,44 @@ int UDPBaseImplementation::setDataCompressionEnable(const bool b){ /***connection parameters***/ void UDPBaseImplementation::setUDPPortNumber(const uint32_t i){ - udpPortNum[0] = i; - ostringstream os; - os << "UDP Port Number[0]:" << udpPortNum[0]; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "UDP Port Number[0]: %u ", udpPortNum[0]); + FILE_LOG(logINFO, cstreambuf); } void UDPBaseImplementation::setUDPPortNumber2(const uint32_t i){ - udpPortNum[1] = i; - ostringstream os; - os << "UDP Port Number[1]:" << udpPortNum[1]; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "UDP Port Number[1]: %u ", udpPortNum[1]); + FILE_LOG(logINFO, cstreambuf); } void UDPBaseImplementation::setEthernetInterface(const char* c){ - strcpy(eth, c); - ostringstream os; - os << "Ethernet Interface: " << eth; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Ethernet Interface: %s ", eth); + FILE_LOG(logINFO, cstreambuf); } /***acquisition parameters***/ void UDPBaseImplementation::setShortFrameEnable(const int i){ - shortFrameEnable = i; - ostringstream os; - os << "Short Frame Enable: " << stringEnable(shortFrameEnable); - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Short Frame Enable: %d ", shortFrameEnable); + FILE_LOG(logINFO, cstreambuf); } int UDPBaseImplementation::setFrameToGuiFrequency(const uint32_t freq){ - frameToGuiFrequency = freq; - ostringstream os; - os << "Frame To Gui Frequency:" << frameToGuiFrequency; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Frame To Gui Frequency: %u ", frameToGuiFrequency); + FILE_LOG(logINFO, cstreambuf); //overrridden child classes might return FAIL return OK; @@ -365,21 +355,19 @@ int UDPBaseImplementation::setFrameToGuiFrequency(const uint32_t freq){ void UDPBaseImplementation::setFrameToGuiTimer(const uint32_t time_in_ms){ - frameToGuiTimerinMS = time_in_ms; - ostringstream os; - os << "Frame To Gui Timer:" << frameToGuiTimerinMS; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Frame To Gui Timer: %u ", frameToGuiTimerinMS); + FILE_LOG(logINFO, cstreambuf); } uint32_t UDPBaseImplementation::setDataStreamEnable(const uint32_t enable){ - dataStreamEnable = enable; - ostringstream os; - os << "Streaming Data from Receiver:" << dataStreamEnable; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Streaming Data from Receiver: %d ", dataStreamEnable); + FILE_LOG(logINFO, cstreambuf); //overrridden child classes might return FAIL return OK; @@ -388,11 +376,10 @@ uint32_t UDPBaseImplementation::setDataStreamEnable(const uint32_t enable){ int UDPBaseImplementation::setAcquisitionPeriod(const uint64_t i){ - acquisitionPeriod = i; - ostringstream os; - os << "Acquisition Period:" << (double)acquisitionPeriod/(1E9) << "s"; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Acquisition Period: %f s ", (double)acquisitionPeriod/(1E9)); + FILE_LOG(logINFO, cstreambuf); //overrridden child classes might return FAIL return OK; @@ -400,11 +387,10 @@ int UDPBaseImplementation::setAcquisitionPeriod(const uint64_t i){ int UDPBaseImplementation::setAcquisitionTime(const uint64_t i){ - acquisitionTime = i; - ostringstream os; - os << "Acquisition Time:" << (double)acquisitionTime/(1E9) << "s"; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Acquisition Time: %f s ", (double)acquisitionTime/(1E9)); + FILE_LOG(logINFO, cstreambuf); //overrridden child classes might return FAIL return OK; @@ -412,11 +398,10 @@ int UDPBaseImplementation::setAcquisitionTime(const uint64_t i){ int UDPBaseImplementation::setNumberOfFrames(const uint64_t i){ - numberOfFrames = i; - ostringstream os; - os << "Number of Frames:" << numberOfFrames; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Number of Frames: %lu ", numberOfFrames); + FILE_LOG(logINFO, cstreambuf); //overrridden child classes might return FAIL return OK; @@ -424,11 +409,10 @@ int UDPBaseImplementation::setNumberOfFrames(const uint64_t i){ int UDPBaseImplementation::setDynamicRange(const uint32_t i){ - dynamicRange = i; - ostringstream os; - os << "Dynamic Range:" << dynamicRange; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Dynamic Range: %u ", dynamicRange); + FILE_LOG(logINFO, cstreambuf); //overrridden child classes might return FAIL return OK; @@ -436,11 +420,10 @@ int UDPBaseImplementation::setDynamicRange(const uint32_t i){ int UDPBaseImplementation::setTenGigaEnable(const bool b){ - tengigaEnable = b; - ostringstream os; - os << "Ten Giga Enable: " << stringEnable(tengigaEnable); - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Ten Giga Enable: %s ", stringEnable(tengigaEnable).c_str()); + FILE_LOG(logINFO, cstreambuf); //overridden functions might return FAIL return OK; @@ -448,11 +431,10 @@ int UDPBaseImplementation::setTenGigaEnable(const bool b){ int UDPBaseImplementation::setFifoDepth(const uint32_t i){ - fifoDepth = i; - ostringstream os; - os << "Fifo Depth: " << i; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Fifo Depth: %u ", i); + FILE_LOG(logINFO, cstreambuf); //overridden functions might return FAIL return OK; @@ -467,23 +449,23 @@ int UDPBaseImplementation::setFifoDepth(const uint32_t i){ /***initial functions***/ int UDPBaseImplementation::setDetectorType(const detectorType d){ - myDetectorType = d; //if eiger, set numberofListeningThreads = 2; - ostringstream os; - os << "Detector Type:" << getDetectorType(d); - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Detector Type: %s ", getDetectorType(d).c_str()); + FILE_LOG(logINFO, cstreambuf); + return OK; } void UDPBaseImplementation::initialize(const char *c){ - if(strlen(c)) strcpy(detHostname, c); - ostringstream os; - os << "Detector Hostname:" << detHostname; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Detector Hostname: %s ", detHostname); + FILE_LOG(logINFO, cstreambuf); + } @@ -492,68 +474,62 @@ void UDPBaseImplementation::resetAcquisitionCount(){ totalPacketsCaught = 0; - ostringstream os; - os << "totalPacketsCaught:" << totalPacketsCaught; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Total Packets Caught: %lu ", totalPacketsCaught); + FILE_LOG(logINFO, cstreambuf); } int UDPBaseImplementation::startReceiver(char *c){ - ostringstream os; - os << " must be overridden by child classes"; - string message(os.str()); FILE_LOG(logERROR, message); + + FILE_LOG(logERROR, " must be overridden by child classes"); + return OK; } void UDPBaseImplementation::stopReceiver(){ - ostringstream os; - os << " must be overridden by child classes"; - string message(os.str()); FILE_LOG(logERROR, message); + + FILE_LOG(logERROR, " must be overridden by child classes"); } void UDPBaseImplementation::startReadout(){ - ostringstream os; - os << " must be overridden by child classes"; - string message(os.str()); FILE_LOG(logERROR, message); + + FILE_LOG(logERROR, " must be overridden by child classes"); } int UDPBaseImplementation::shutDownUDPSockets(){ - ostringstream os; - os << " must be overridden by child classes"; - string message(os.str()); FILE_LOG(logERROR, message); + + FILE_LOG(logERROR, " must be overridden by child classes"); //overridden functions might return FAIL return OK; } void UDPBaseImplementation::readFrame(int ithread, char* c,char** raw, int64_t &startAcquisitionIndex, int64_t &startFrameIndex){ - ostringstream os; - os << " must be overridden by child classes"; - string message(os.str()); FILE_LOG(logERROR, message); + + FILE_LOG(logERROR, " must be overridden by child classes"); } //FIXME: needed, isnt stopReceiver enough? void UDPBaseImplementation::abort(){ - ostringstream os; - os << " must be overridden by child classes"; - string message(os.str()); FILE_LOG(logERROR, message); + + FILE_LOG(logERROR, " must be overridden by child classes"); } void UDPBaseImplementation::closeFile(int ithread){ - ostringstream os; - os << " must be overridden by child classes"; - string message(os.str()); FILE_LOG(logERROR, message); + + FILE_LOG(logERROR, " must be overridden by child classes"); } int UDPBaseImplementation::setActivate(int enable){ - if(enable != -1){ activated = enable; - ostringstream os; - os << "Activation: " << stringEnable(activated); - string message(os.str()); FILE_LOG(logINFO, message); + + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Activation: %s ", stringEnable(activated).c_str()); + FILE_LOG(logINFO, cstreambuf); } return activated; diff --git a/slsReceiverSoftware/src/UDPInterface.cpp b/slsReceiverSoftware/src/UDPInterface.cpp index 749be3b711..193c6e3e35 100644 --- a/slsReceiverSoftware/src/UDPInterface.cpp +++ b/slsReceiverSoftware/src/UDPInterface.cpp @@ -22,24 +22,21 @@ using namespace std; UDPInterface * UDPInterface::create(string receiver_type){ + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Starting %s ", receiver_type.c_str()); + if (receiver_type == "standard"){ - ostringstream os; - os << "Starting " << receiver_type; - string message(os.str()); FILE_LOG(logINFO, message); + FILE_LOG(logINFO, cstreambuf); return new UDPStandardImplementation(); } #ifdef REST else if (receiver_type == "REST"){ - ostringstream os; - os << "Starting " << receiver_type; - string message(os.str()); FILE_LOG(logINFO, message); + FILE_LOG(logINFO, cstreambuf); return new UDPRESTImplementation(); } #endif else{ - ostringstream os; - os << "[ERROR] UDP interface not supported, using standard implementation"; - string message(os.str()); FILE_LOG(logWARNING, message); + FILE_LOG(logWARNING, "[ERROR] UDP interface not supported, using standard implementation"); return new UDPBaseImplementation(); } } diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index ee8bf034eb..820ed27065 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -3,9 +3,6 @@ * @short does all the functions for a receiver, set/get parameters, start/stop etc. ***********************************************/ -sprintf(cstreambuf, "%s", " \0"); -FILE_LOG(logDEBUG, cstreambuf); - #include "UDPStandardImplementation.h" #include "moench02ModuleData.h" @@ -38,10 +35,6 @@ UDPStandardImplementation::UDPStandardImplementation(){ initializeMembers(); - for(int i= 0; i < MAX_NUMBER_OF_WRITER_THREADS; ++i) - memset(streambuf[i], 0, MAX_STR_LENGTH ); - memset(cstreambuf, 0, MAX_STR_LENGTH ); - //***mutex*** pthread_mutex_init(&statusMutex,NULL); pthread_mutex_init(&writeMutex,NULL); @@ -51,11 +44,9 @@ UDPStandardImplementation::UDPStandardImplementation(){ //to increase socket receiver buffer size and max length of input queue by changing kernel settings if(myDetectorType == EIGER); else if(system("echo $((100*1024*1024)) > /proc/sys/net/core/rmem_max")){ - sprintf(cstreambuf, "%s", "Warning: No root permission to change socket receiver buffer size in file /proc/sys/net/core/rmem_max \0"); - FILE_LOG(logDEBUG, cstreambuf); + FILE_LOG(logDEBUG1, "Warning: No root permission to change socket receiver buffer size in file /proc/sys/net/core/rmem_max"); }else if(system("echo 250000 > /proc/sys/net/core/netdev_max_backlog")){ - sprintf(cstreambuf, "%s", "Warning: No root permission to change max length of input queue in file /proc/sys/net/core/netdev_max_backlog \0"); - FILE_LOG(logDEBUG, cstreambuf); + FILE_LOG(logDEBUG1, "Warning: No root permission to change max length of input queue in file /proc/sys/net/core/netdev_max_backlog "); } /** permanent setting by heiner @@ -84,8 +75,7 @@ UDPStandardImplementation::~UDPStandardImplementation(){ /***initial parameters***/ void UDPStandardImplementation::deleteMembers(){ - sprintf(cstreambuf, "%s", "Deleting member pointers \0"); - FILE_LOG(logDEBUG, cstreambuf); + FILE_LOG(logDEBUG1, "Deleting member pointers "); shutDownUDPSockets(); for(int i=0;iShutDownSocket(); - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); - { - ostringstream os; - os << "Shut down UDP Socket " << i; - string message(os.str()); FILE_LOG(logINFO, message); - } + + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Shut down UDP Sock %d ", i); + FILE_LOG(logINFO, cstreambuf); + delete udpSocket[i]; udpSocket[i] = 0; } @@ -1321,14 +1190,8 @@ int UDPStandardImplementation::shutDownUDPSockets(){ * Post:udp sockets closed, status is transmitting * */ void UDPStandardImplementation::startReadout(){ - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); - { - ostringstream os; - os << "Transmitting last data"; - string message(os.str()); FILE_LOG(logDEBUG, message); - } + FILE_LOG(logDEBUG1, "Transmitting last data "); if(status == RUNNING){ @@ -1353,7 +1216,7 @@ void UDPStandardImplementation::startReadout(){ //(as one listens to many at a time, shouldnt cut off in between) while((prev != totalP) || (prevReceivedInBuffer!= currentReceivedInBuffer)){ #ifdef DEBUG5 - cprintf(MAGENTA,"waiting for all packets prevP:%d totalP:%d PrevBuffer:%d currentBuffer:%d\n",prev,totalP,prevReceivedInBuffer,currentReceivedInBuffer); + cprintf(MAGENTA,"waiting for all packets prevP:%d totalP:%d PrevBuffer:%d currentBuffer:\n",prev,totalP,prevReceivedInBuffer,currentReceivedInBuffer); #endif //usleep(2*1000*1000); @@ -1380,13 +1243,9 @@ void UDPStandardImplementation::startReadout(){ pthread_mutex_lock(&statusMutex); status = TRANSMITTING; pthread_mutex_unlock(&statusMutex); - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); - { - ostringstream os; - os << "Status: Transmitting"; - string message(os.str()); FILE_LOG(logINFO, message); - } + + FILE_LOG(logINFO, "Status: Transmitting "); + } //shut down udp sockets and make listeners push dummy (end) packets for writers @@ -1407,13 +1266,9 @@ void UDPStandardImplementation::closeFile(int ithread){ //normal if(!dataCompressionEnable){ if(sfilefd[ithread]){ - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); - { - ostringstream os; - os << "Going to close file: " << fileno(sfilefd[ithread]); - string message(os.str()); FILE_LOG(logDEBUG4, message); - } + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Going to close file: %d ", fileno(sfilefd[ithread])); + FILE_LOG(logDEBUG4, cstreambuf); fflush(sfilefd[ithread]); fclose(sfilefd[ithread]); @@ -1425,13 +1280,10 @@ void UDPStandardImplementation::closeFile(int ithread){ else{ #if (defined(MYROOT1) && defined(ALLFILE_DEBUG)) || !defined(MYROOT1) if(sfilefd[0]){ - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); - { - ostringstream os; - os << "sfilefd: " << fileno(sfilefd[0]); - string message(os.str()); FILE_LOG(logDEBUG4, message); - } + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "sfilefd: %d ", fileno(sfilefd[0])); + FILE_LOG(logDEBUG4, cstreambuf); + fclose(sfilefd[0]); sfilefd[0] = 0; } @@ -1471,13 +1323,9 @@ int UDPStandardImplementation::setActivate(int enable){ if(enable != -1){ activated = enable; - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); - { - ostringstream os; - os << "Activation: " << stringEnable(activated); - string message(os.str()); FILE_LOG(logINFO, message); - } + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Activation: %s ", stringEnable(activated).c_str()); + FILE_LOG(logINFO, cstreambuf); } for(int i=0; inewDataSet(); if(myFile[ithread]==NULL){ - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); - { - ostringstream os; - os << "File Null"; - string message(os.str()); FILE_LOG(logERROR, message); - } + FILE_LOG(logERROR, "File Null "); return FAIL; } if(!myFile[ithread]->IsOpen()){ - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); - { - ostringstream os; - os << "File Not Open"; - string message(os.str()); FILE_LOG(logERROR, message); - } + FILE_LOG(logERROR, "File Not Open "); return FAIL; } return OK; @@ -2179,15 +1891,12 @@ void UDPStandardImplementation::startDataCallback(){ //zmq_setsockopt(zmqsocket,ZMQ_SNDHWM,&val,sizeof(val)); //set SEND HIGH WATER MARK (8-9ms slower) zmq_bind(zmqsocket,hostName); // bind - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); { - ostringstream os; - os << "Thread" << ithread << ": ZMQ Server at " << hostName; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Thread %d: ZMQ Server at %s ", ithread, hostName); + FILE_LOG(logINFO, cstreambuf); } - int headersize=0; switch(myDetectorType){ case EIGER: @@ -2207,17 +1916,7 @@ void UDPStandardImplementation::startDataCallback(){ int oneframesize = oneDataSize * packetsPerFrame; char* buffer = new char[packetsPerFrame*oneDataSize](); memset(buffer,0xFF,oneframesize); - int size = 0; - int offset = 0; - uint32_t currentfnum = 0; - uint64_t fnum = 0; - uint32_t pnum = 0; - uint32_t snum = 0; - uint64_t bid = 0; bool randomSendNow = true; - bool newFrame = false; - - //header details const char *jsonFmt ="{" @@ -2241,7 +1940,7 @@ void UDPStandardImplementation::startDataCallback(){ "\"roundRNumber\":%u, " "\"detType\":%u, " "\"version\":%u" - "}\0"; + "}\n"; int npixelsx=0, npixelsy=0; switch(myDetectorType) { case JUNGFRAU: npixelsx = JFRAU_PIXELS_IN_ONE_ROW; npixelsy = JFRAU_PIXELS_IN_ONE_COL; break; @@ -2253,7 +1952,6 @@ void UDPStandardImplementation::startDataCallback(){ #ifdef DEBUG int oldpnum = -1; #endif - int datapacketscaught = 0; /* inner loop - loop for each buffer */ //until mask reset (dummy pcaket got by writer) @@ -2277,14 +1975,14 @@ void UDPStandardImplementation::startDataCallback(){ acquisitionIndex = -1; { char buf[1000]="";memset(buf,0,1000); - int len = sprintf(buf,jsonFmt, + sprintf(buf,jsonFmt, SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); zmq_send(zmqsocket, buf,1000, 0); } //send final data - zmq_send (zmqsocket, "end\0", 4, 0); + zmq_send (zmqsocket, "end\n", 4, 0); pthread_mutex_lock(&statusMutex); dataCallbackThreadsMask^=(1<frameNumber, header->expLength, header->packetNumber, header->bunchId, header->timestamp, header->modId, header->xCoord, header->yCoord, header->zCoord, header->debug, header->roundRNumber, header->detType, header->version); @@ -2410,12 +2108,10 @@ void UDPStandardImplementation::startListening(){ //udpsocket doesnt exist if(activated && !udpSocket[ithread]){ - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); { - ostringstream os; - os << "Listening_Thread " << ithread << ": UDP Socket not created or shut down earlier"; - string message(os.str()); FILE_LOG(logERROR, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Listening_Thread %d: UDP Socket not created or shut down earlier ", ithread); + FILE_LOG(logERROR, cstreambuf); } stopListening(ithread,0); continue; @@ -2744,13 +2440,9 @@ void UDPStandardImplementation::stopListening(int ithread, int numbytes){ //free empty buffer if(numbytes <= 0){ - sprintf(cstreambuf, "%s", " \0"); - FILE_LOG(logDEBUG, cstreambuf); - { - ostringstream os; - os << "Listening "<< ithread << ": End of Acquisition"; - string message(os.str()); FILE_LOG(logINFO, message); - } + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Listening %d: End of Acquisition", ithread); + FILE_LOG(logINFO, cstreambuf); while(!fifoFree[ithread]->push(buffer[ithread])); } @@ -2784,12 +2476,10 @@ void UDPStandardImplementation::stopListening(int ithread, int numbytes){ listeningThreadsMask^=(1<packetNumber))-1; - ostringstream os; - os << "Fifo "<< ithread << ": Frame Number is still zero from firmware. and pnum:" << packetnumber << "udp port num:" << udpPortNum[ithread]; - string message(os.str()); FILE_LOG(logERROR, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Fifo %d: Frame Number is zero from firmware. ", ithread); + FILE_LOG(logERROR, cstreambuf); - } return FAIL; } packetnumber = (*( (uint16_t*) footer->packetNumber))-1; diff --git a/slsReceiverSoftware/src/slsReceiver.cpp b/slsReceiverSoftware/src/slsReceiver.cpp index 1f1678c6ce..343cd8559a 100644 --- a/slsReceiverSoftware/src/slsReceiver.cpp +++ b/slsReceiverSoftware/src/slsReceiver.cpp @@ -106,31 +106,32 @@ slsReceiver::slsReceiver(int argc, char *argv[], int &success){ if( !fname.empty() ){ try{ - ostringstream os; - os << "config file name " << fname; - string message(os.str()); FILE_LOG(logDEBUG, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "config file name : %s ",fname.c_str()); + FILE_LOG(logDEBUG1, cstreambuf); + success = read_config_file(fname, &tcpip_port_no, &configuration_map); //VERBOSE_PRINT("Read configuration file of " + iline + " lines"); } catch(...){ - ostringstream os; - os << "Error opening configuration file " << fname ; - string message(os.str()); FILE_LOG(logERROR, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Error opening configuration file : %s ",fname.c_str()); + FILE_LOG(logERROR, cstreambuf); + success = FAIL; } } if(success != OK){ - ostringstream os; - os << "Failed: see output above for more information " ; - string message(os.str()); FILE_LOG(logERROR, message); + FILE_LOG(logERROR, "Failed: see output above for more information "); } if (success==OK){ - ostringstream os; - os << "SLS Receiver starting " << udp_interface_type << " on port " << tcpip_port_no << endl; - string message(os.str()); FILE_LOG(logDEBUG, message); + + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "SLS Receiver starting %s on port %d ",udp_interface_type.c_str(), tcpip_port_no); + FILE_LOG(logDEBUG1, cstreambuf); #ifdef REST udp_interface = UDPInterface::create(udp_interface_type); udp_interface->configure(configuration_map); diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index ea68631fd1..1840f7715a 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -126,22 +126,17 @@ int slsReceiverTCPIPInterface::setPortNumber(int pn){ int slsReceiverTCPIPInterface::start(){ - { - ostringstream os; - os << "Creating TCP Server Thread" << endl; - string message(os.str()); FILE_LOG(logDEBUG, message); - } + + FILE_LOG(logDEBUG1, "Creating TCP Server Thread"); + killTCPServerThread = 0; if(pthread_create(&TCPServer_thread, NULL,startTCPServerThread, (void*) this)){ cout << "Could not create TCP Server thread" << endl; return FAIL; } //#ifdef VERYVERBOSE - { - ostringstream os; - os << "TCP Server thread created successfully." << endl; - string message(os.str()); FILE_LOG(logDEBUG, message); - } + FILE_LOG(logDEBUG1, "TCP Server thread created successfully."); + //#endif return OK; } @@ -402,20 +397,20 @@ int slsReceiverTCPIPInterface::set_detector_type(){ } } - //#ifdef VERYVERBOSE +//#ifdef VERYVERBOSE if(ret!=FAIL) { - ostringstream os; - os << "detector type " << dr; - string message(os.str()); FILE_LOG(logDEBUG, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Detector Type %d ", (int)dr); + FILE_LOG(logDEBUG1, cstreambuf); } else cprintf(RED, "%s\n", mess); - //#endif +//#endif #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -482,7 +477,7 @@ int slsReceiverTCPIPInterface::set_file_name() { if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -557,7 +552,7 @@ int slsReceiverTCPIPInterface::set_file_dir() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -629,7 +624,7 @@ int slsReceiverTCPIPInterface::set_file_index() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -707,7 +702,7 @@ int slsReceiverTCPIPInterface::set_frame_index() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -772,15 +767,15 @@ int slsReceiverTCPIPInterface::setup_udp(){ //setup udpip //get ethernet interface or IP to listen to { - ostringstream os; - os << "Receiver UDP IP: " << args[0]; - string message(os.str()); FILE_LOG(logINFO, message); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Receiver UDP IP: %s ",args[0]); + FILE_LOG(logINFO, cstreambuf); } temp = genericSocket::ipToName(args[0]); if(temp=="none"){ ret = FAIL; strcpy(mess, "Failed to get ethernet interface or IP\n"); - FILE_LOG(logERROR, string(mess)); + FILE_LOG(logERROR, "Failed to get ethernet interface or IP "); } else{ strcpy(eth,temp.c_str()); @@ -801,9 +796,10 @@ int slsReceiverTCPIPInterface::setup_udp(){ } else{ strcpy(retval,temp.c_str()); - ostringstream os; - os << "Reciever MAC Address: " << retval; - string message(os.str()); FILE_LOG(logINFO, message); + + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "Reciever MAC Address: %s ",retval); + FILE_LOG(logINFO, cstreambuf); } } } @@ -811,14 +807,16 @@ int slsReceiverTCPIPInterface::setup_udp(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } // send answer mySock->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL){ - FILE_LOG(logERROR, string(mess)); + char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); + sprintf(cstreambuf, "%s ", mess); + FILE_LOG(logERROR, cstreambuf); mySock->SendDataOnly(mess,sizeof(mess)); } mySock->SendDataOnly(retval,MAX_STR_LENGTH); @@ -867,7 +865,7 @@ int slsReceiverTCPIPInterface::start_receiver(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -915,7 +913,7 @@ int slsReceiverTCPIPInterface::stop_receiver(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -946,7 +944,7 @@ int slsReceiverTCPIPInterface::get_status(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -977,7 +975,7 @@ int slsReceiverTCPIPInterface::get_frames_caught(){ }else retval=receiverBase->getTotalFramesCaught(); #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -1009,7 +1007,7 @@ int slsReceiverTCPIPInterface::get_frame_index(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -1054,7 +1052,7 @@ int slsReceiverTCPIPInterface::reset_frames_caught(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -1123,7 +1121,7 @@ int slsReceiverTCPIPInterface::set_short_frame() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -1305,7 +1303,7 @@ int slsReceiverTCPIPInterface::moench_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -1486,7 +1484,7 @@ int slsReceiverTCPIPInterface::gotthard_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -1640,7 +1638,7 @@ int slsReceiverTCPIPInterface::propix_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -1907,7 +1905,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2070,7 +2068,7 @@ int slsReceiverTCPIPInterface::jungfrau_read_frame(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2148,7 +2146,7 @@ int slsReceiverTCPIPInterface::set_read_frequency(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2214,7 +2212,7 @@ int slsReceiverTCPIPInterface::set_read_receiver_timer(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2277,7 +2275,7 @@ int slsReceiverTCPIPInterface::set_data_stream_enable(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2337,7 +2335,7 @@ int slsReceiverTCPIPInterface::enable_file_write(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2365,7 +2363,7 @@ int slsReceiverTCPIPInterface::get_id(){ #endif if(mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2413,7 +2411,7 @@ else{ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2501,7 +2499,7 @@ int slsReceiverTCPIPInterface::set_timer() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2573,7 +2571,7 @@ int slsReceiverTCPIPInterface::enable_compression() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2639,7 +2637,7 @@ int slsReceiverTCPIPInterface::set_detector_hostname() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2740,7 +2738,7 @@ int slsReceiverTCPIPInterface::set_dynamic_range() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2808,7 +2806,7 @@ int slsReceiverTCPIPInterface::enable_overwrite() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2878,7 +2876,7 @@ int slsReceiverTCPIPInterface::enable_tengiga() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -2950,7 +2948,7 @@ int slsReceiverTCPIPInterface::set_fifo_depth() { #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -3024,7 +3022,7 @@ int slsReceiverTCPIPInterface::set_activate() { if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } @@ -3088,7 +3086,7 @@ int slsReceiverTCPIPInterface::set_flipped_data(){ #endif if(ret==OK && mySock->differentClients){ - FILE_LOG(logDEBUG,"Force update" ); + FILE_LOG(logDEBUG1,"Force update" ); ret=FORCE_UPDATE; } From 0f3a63f101b14d5df20ea09706fc0330791d1237 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 19 Apr 2017 17:42:38 +0200 Subject: [PATCH 33/41] changed zmq default port starting at 40001 to be able to view in wireshark and removed headersize for warning --- slsReceiverSoftware/include/genericSocket.h | 2 +- slsReceiverSoftware/src/UDPStandardImplementation.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/slsReceiverSoftware/include/genericSocket.h b/slsReceiverSoftware/include/genericSocket.h index 2cbe9259ad..2f151de43e 100644 --- a/slsReceiverSoftware/include/genericSocket.h +++ b/slsReceiverSoftware/include/genericSocket.h @@ -81,7 +81,7 @@ using namespace std; #define DEFAULT_BACKLOG 5 #define DEFAULT_UDP_PORTNO 50001 #define DEFAULT_GUI_PORTNO 65000 -#define DEFAULT_ZMQ_PORTNO 70001 +#define DEFAULT_ZMQ_PORTNO 40001 diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 820ed27065..ece4363f1c 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -1897,7 +1897,6 @@ void UDPStandardImplementation::startDataCallback(){ FILE_LOG(logINFO, cstreambuf); } - int headersize=0; switch(myDetectorType){ case EIGER: headersize = EIGER_DATA_PACKET_HEADER_SIZE; break; From b1de501befc149fc41dfb6481de9f2a9a9ef7162 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 19 Apr 2017 17:59:46 +0200 Subject: [PATCH 34/41] updaterev --- slsDetectorSoftware/gitInfo.txt | 10 +++++----- slsDetectorSoftware/slsDetector/gitInfoLib.h | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index 68f0d36c8c..39f94001e1 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 7a0a1ee8734440dc4e1e638d6fec1eaa9d2404ae -Revision: 1348 -Branch: 2.3.1 +Repsitory UUID: 41acb4c1ab89fe85b049c329adb539c3ad5b107a +Revision: 1350 +Branch: 2.3.2 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1348 -Last Changed Date: 2017-04-11 13:39:28 +0200 +Last Changed Rev: 1350 +Last Changed Date: 2017-04-19 10:17:30 +0200 diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index a08358465d..ef27d91d61 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURLLIB "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUIDLIB "7a0a1ee8734440dc4e1e638d6fec1eaa9d2404ae" -//#define SVNREV 0x1348 +#define SVNREPUUIDLIB "41acb4c1ab89fe85b049c329adb539c3ad5b107a" +//#define SVNREV 0x1350 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTHLIB "Dhanya_Maliakal" -#define SVNREVLIB 0x1348 -#define SVNDATELIB 0x20170411 +#define SVNREVLIB 0x1350 +#define SVNDATELIB 0x20170419 // From 75ddf535dc96168d069ca9ae8faf33edd134a018 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 19 Apr 2017 17:59:53 +0200 Subject: [PATCH 35/41] updaterev --- slsReceiverSoftware/gitInfo.txt | 10 +++++----- slsReceiverSoftware/include/gitInfoReceiver.h | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/slsReceiverSoftware/gitInfo.txt b/slsReceiverSoftware/gitInfo.txt index e3052e62d4..4588a64571 100644 --- a/slsReceiverSoftware/gitInfo.txt +++ b/slsReceiverSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsReceiverSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_receiver_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_receiver_software.git -Repsitory UUID: db080a125daed36a1fa85b00df7a239e22ae5130 -Revision: 521 -Branch: 2.3.1 +Repsitory UUID: 9c7ef694925368efd5108b674f577b104a97f01f +Revision: 525 +Branch: 2.3.2 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 521 -Last Changed Date: 2017-04-11 13:39:35 +0200 +Last Changed Rev: 525 +Last Changed Date: 2017-04-19 17:42:38 +0200 diff --git a/slsReceiverSoftware/include/gitInfoReceiver.h b/slsReceiverSoftware/include/gitInfoReceiver.h index 1b3f7e886c..069dc38d1e 100644 --- a/slsReceiverSoftware/include/gitInfoReceiver.h +++ b/slsReceiverSoftware/include/gitInfoReceiver.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_receiver_software.git" //#define SVNREPPATH "" -#define SVNREPUUID "db080a125daed36a1fa85b00df7a239e22ae5130" -//#define SVNREV 0x521 +#define SVNREPUUID "9c7ef694925368efd5108b674f577b104a97f01f" +//#define SVNREV 0x525 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x521 -#define SVNDATE 0x20170411 +#define SVNREV 0x525 +#define SVNDATE 0x20170419 // From 0ba537e4796bafe53809835c5d2b987df46bae90 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 20 Apr 2017 08:26:16 +0200 Subject: [PATCH 36/41] removed headersize compile error --- slsReceiverSoftware/src/UDPStandardImplementation.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index ece4363f1c..5108e7b927 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -1897,13 +1897,6 @@ void UDPStandardImplementation::startDataCallback(){ FILE_LOG(logINFO, cstreambuf); } - switch(myDetectorType){ - case EIGER: - headersize = EIGER_DATA_PACKET_HEADER_SIZE; break; - default: - headersize = 0; break; - } - //let calling function know thread started and obtained current (after sockets created) if(!zmqThreadStarted) zmqThreadStarted = true; From b6b0df62b604b2d34713433ab468ac4502521798 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 20 Apr 2017 08:26:29 +0200 Subject: [PATCH 37/41] updaterev --- slsReceiverSoftware/gitInfo.txt | 8 ++++---- slsReceiverSoftware/include/gitInfoReceiver.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/slsReceiverSoftware/gitInfo.txt b/slsReceiverSoftware/gitInfo.txt index 4588a64571..f1d69d5c5a 100644 --- a/slsReceiverSoftware/gitInfo.txt +++ b/slsReceiverSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsReceiverSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_receiver_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_receiver_software.git -Repsitory UUID: 9c7ef694925368efd5108b674f577b104a97f01f -Revision: 525 +Repsitory UUID: 239415ea0db2b9cdccd9bce80f0c78216115ffea +Revision: 527 Branch: 2.3.2 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 525 -Last Changed Date: 2017-04-19 17:42:38 +0200 +Last Changed Rev: 527 +Last Changed Date: 2017-04-20 08:26:16 +0200 diff --git a/slsReceiverSoftware/include/gitInfoReceiver.h b/slsReceiverSoftware/include/gitInfoReceiver.h index 069dc38d1e..8a16cca19d 100644 --- a/slsReceiverSoftware/include/gitInfoReceiver.h +++ b/slsReceiverSoftware/include/gitInfoReceiver.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_receiver_software.git" //#define SVNREPPATH "" -#define SVNREPUUID "9c7ef694925368efd5108b674f577b104a97f01f" -//#define SVNREV 0x525 +#define SVNREPUUID "239415ea0db2b9cdccd9bce80f0c78216115ffea" +//#define SVNREV 0x527 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x525 -#define SVNDATE 0x20170419 +#define SVNREV 0x527 +#define SVNDATE 0x20170420 // From 9e2f2697c7a77f4108d053c8e1243b0020689c0e Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 27 Apr 2017 13:58:25 +0200 Subject: [PATCH 38/41] crazy amount of changes, both necessary and unnecessary;need to narrow down the real change later --- .../multiSlsDetector/multiSlsDetector.cpp | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 3ac129dddd..595e27bc4c 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -5158,7 +5158,7 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy){ int multiSlsDetector::getData(const int isocket, const bool masking, int* image, const int size, uint64_t &acqIndex, uint64_t &frameIndex, uint32_t &subframeIndex, string &filename){ - + bool data = true; zmq_msg_t header_message; //scan header------------------------------------------------------------------- @@ -5179,6 +5179,14 @@ int multiSlsDetector::getData(const int isocket, const bool masking, int* image, rapidjson::ParseResult result = d.Parse( (char*)zmq_msg_data(&header_message), len); if (!result) { cprintf(RED,"%d Could not parse. len:%d: Message:%s \n", isocket, len, (char*)zmq_msg_data(&header_message) ); + fflush( stdout ); + char* buf = (char*)zmq_msg_data(&header_message); + for(int i= 0;i < len; ++i) { + cprintf(RED,"%02x ",buf[i]); + } + printf("\n"); + fflush( stdout ); + } #ifdef VERYVERBOSE // htype is an array of strings @@ -5195,38 +5203,47 @@ int multiSlsDetector::getData(const int isocket, const bool masking, int* image, cout << isocket << "type: " << d["type"].GetString() << endl; #endif - if(d["acqIndex"].GetUint64()!= (uint64_t)-1){ //!isocket && + int temp = d["data"].GetUint64(); + data = temp?true:false; + if(data){ //!isocket && acqIndex = d["acqIndex"].GetUint64(); frameIndex = d["fIndex"].GetUint64(); subframeIndex = -1; if(d["bitmode"].GetInt()==32 && d["detType"].GetUint()== EIGER) { subframeIndex = d["expLength"].GetUint(); } - filename = d["fname"].GetString(); + filename.assign(d["fname"].GetString()); #ifdef VERYVERBOSE cout << "Acquisition index: " << acqIndex << endl; cout << "Frame index: " << frameIndex << endl; cout << "Subframe index: " << subframeIndex << endl; cout << "File name: " << filename << endl; #endif - if(frameIndex == (long long unsigned int)-1) cprintf(RED,"multi frame index -1!!\n"); + // if(frameIndex == (long long unsigned int)-1) cprintf(RED,"multi frame index -1!!\n"); } // close the message zmq_msg_close(&header_message); + //end of acquisition + if(!data){ + //cprintf(RED,"%d Received end of acquisition \n", isocket); + return FAIL; + } + + //scan data------------------------------------------------------------------- zmq_msg_t data_message; zmq_msg_init (&data_message); len = zmq_msg_recv(&data_message, zmqsocket[isocket], 0); - //cprintf(GREEN,"%d data %d\n",isocket,len); + //cprintf(GREEN,"%d data %d\n",isocket,len); fflush(stdout); //end of socket ("end\0") - if(len == 4){ + /* if(len == 4){ zmq_msg_close(&data_message); // close the message //cprintf(RED,"%d Received end of acquisition len:%d\n", isocket, len); return FAIL; - } + }*/ //crappy image if (len < size ) { @@ -5345,7 +5362,7 @@ void multiSlsDetector::readFrameFromReceiver(){ //get individual images if(FAIL == getData(isocket, jungfrau, image, expectedslssize, currentAcquisitionIndex,currentFrameIndex,currentSubFrameIndex,currentFileName)){ - dataThreadMask^=(1< Date: Thu, 27 Apr 2017 14:05:04 +0200 Subject: [PATCH 39/41] crazy amount of changes, both necessary and unnecessary;need to narrow down the real change later --- slsReceiverSoftware/include/genericSocket.h | 57 +++- .../src/UDPBaseImplementation.cpp | 101 ++++--- .../src/UDPStandardImplementation.cpp | 268 ++++++++++-------- 3 files changed, 255 insertions(+), 171 deletions(-) diff --git a/slsReceiverSoftware/include/genericSocket.h b/slsReceiverSoftware/include/genericSocket.h index 2f151de43e..485e8903ad 100644 --- a/slsReceiverSoftware/include/genericSocket.h +++ b/slsReceiverSoftware/include/genericSocket.h @@ -100,7 +100,6 @@ enum communicationProtocol{ genericSocket(const char* const host_ip_or_name, unsigned short int const port_number, communicationProtocol p, int ps = DEFAULT_PACKET_SIZE) : - // portno(port_number), protocol(p), is_a_server(0), socketDescriptor(-1), @@ -109,11 +108,15 @@ enum communicationProtocol{ nsending(0), nsent(0), total_sent(0),// sender (client): where to? ip - header_packet_size(0) + header_packet_size(0), + portno(port_number) { memset(&serverAddress, 0,sizeof(serverAddress)); memset(&clientAddress,0,sizeof(clientAddress)); // strcpy(hostname,host_ip_or_name); + memset(lastClientIP, 0, INET_ADDRSTRLEN); + memset(thisClientIP, 0, INET_ADDRSTRLEN); + memset(dummyClientIP, 0, INET_ADDRSTRLEN); strcpy(lastClientIP,"none"); strcpy(thisClientIP,"none1"); @@ -164,7 +167,6 @@ enum communicationProtocol{ */ genericSocket(unsigned short int const port_number, communicationProtocol p, int ps = DEFAULT_PACKET_SIZE, const char *eth=NULL, int hsize=0): - //portno(port_number), protocol(p), is_a_server(1), socketDescriptor(-1), @@ -173,7 +175,8 @@ enum communicationProtocol{ nsending(0), nsent(0), total_sent(0), - header_packet_size(hsize) + header_packet_size(hsize), + portno(port_number) { memset(&serverAddress, 0, sizeof(serverAddress)); @@ -181,7 +184,9 @@ enum communicationProtocol{ /* // you can specify an IP address: */ /* // or you can let it automatically select one: */ /* myaddr.sin_addr.s_addr = INADDR_ANY; */ - + memset(lastClientIP, 0, INET_ADDRSTRLEN); + memset(thisClientIP, 0, INET_ADDRSTRLEN); + memset(dummyClientIP, 0, INET_ADDRSTRLEN); strcpy(lastClientIP,"none"); strcpy(thisClientIP,"none1"); @@ -610,6 +615,7 @@ enum communicationProtocol{ break; case UDP: + if (socketDescriptor<0) return -1; //if length given, listens to length, else listens for packetsize till length is reached if(length){ @@ -632,12 +638,30 @@ enum communicationProtocol{ else{ //normal nsending=packet_size; + /* if(portno%2){ + cprintf(BLUE,"%d total_sent set to zero:%d\n",portno, total_sent);fflush(stdout); + }else{ + cprintf(GREEN,"%d total_sent set to zero:%d\n",portno, total_sent);fflush(stdout); + }*/ while(1){ nsent = recvfrom(socketDescriptor,(char*)buf+total_sent,nsending, 0, (struct sockaddr *) &clientAddress, &clientAddress_length); - if(nsent<=0 || nsent == packet_size) + /* if(portno%2){ + cprintf(BLUE,"%d nsent:%d total_sent:%d\n", portno, nsent, total_sent);fflush(stdout); + }else{ + cprintf(GREEN,"%d nsent:%d total_sent:%d\n", portno, nsent, total_sent);fflush(stdout); + }*/ + if((nsent<=0) || (nsent == packet_size)) { + + /* if(portno%2){ + cprintf(BLUE,"%d breaking out of loop %d\n",portno, nsent);fflush(stdout); + }else{ + cprintf(GREEN,"%d breaking out of loop %d\n",portno, nsent);fflush(stdout); + }*/ break; - if(nsent != packet_size && nsent != header_packet_size) - cprintf(RED,"Incomplete Packet size %d\n",nsent); + } + if(nsent != packet_size && nsent != header_packet_size){ + cprintf(RED,"%d Incomplete Packet size %d\n",portno, nsent);fflush(stdout); + } } //nsent = 1040; total_sent+=nsent; @@ -649,8 +673,13 @@ enum communicationProtocol{ #ifdef VERY_VERBOSE cout << "sent "<< total_sent << " Bytes" << endl; #endif - - + /*if(protocol == UDP){ + if(portno%2){ + cprintf(BLUE,"%d exiting total sent %d\n",portno, total_sent);fflush(stdout); + }else{ + cprintf(GREEN,"%d exiting total sent %d\n",portno, total_sent);fflush(stdout); + } + }*/ return total_sent; @@ -723,11 +752,11 @@ enum communicationProtocol{ private: - - int nsending; - int nsent; - int total_sent; + volatile int nsending; + volatile int nsent; + volatile int total_sent; int header_packet_size; + const int portno; // pthread_mutex_t mp; diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index 2235e480d6..c5c706ce1f 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -35,7 +35,7 @@ void UDPBaseImplementation::initializeMembers(){ //**detector parameters*** myDetectorType = GENERIC; - strcpy(detHostname,""); + memset(detHostname,0,MAX_STR_LENGTH); packetsPerFrame = 0; acquisitionPeriod = 0; acquisitionTime = 0; @@ -51,14 +51,15 @@ void UDPBaseImplementation::initializeMembers(){ activated = true; //***connection parameters*** - strcpy(eth,""); + memset(eth,0,MAX_STR_LENGTH); for(int i=0;iShutDownSocket(); char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Shut down UDP Sock %d ", i); + snprintf(cstreambuf, MAX_STR_LENGTH, "Shut down UDP Sock %d ", i); FILE_LOG(logINFO, cstreambuf); delete udpSocket[i]; @@ -1267,7 +1279,7 @@ void UDPStandardImplementation::closeFile(int ithread){ if(!dataCompressionEnable){ if(sfilefd[ithread]){ char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Going to close file: %d ", fileno(sfilefd[ithread])); + snprintf(cstreambuf, MAX_STR_LENGTH, "Going to close file: %d ", fileno(sfilefd[ithread])); FILE_LOG(logDEBUG4, cstreambuf); fflush(sfilefd[ithread]); @@ -1281,7 +1293,7 @@ void UDPStandardImplementation::closeFile(int ithread){ #if (defined(MYROOT1) && defined(ALLFILE_DEBUG)) || !defined(MYROOT1) if(sfilefd[0]){ char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "sfilefd: %d ", fileno(sfilefd[0])); + snprintf(cstreambuf, MAX_STR_LENGTH, "sfilefd: %d ", fileno(sfilefd[0])); FILE_LOG(logDEBUG4, cstreambuf); fclose(sfilefd[0]); @@ -1324,7 +1336,7 @@ int UDPStandardImplementation::setActivate(int enable){ if(enable != -1){ activated = enable; char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Activation: %s ", stringEnable(activated).c_str()); + snprintf(cstreambuf, MAX_STR_LENGTH, "Activation: %s ", stringEnable(activated).c_str()); FILE_LOG(logINFO, cstreambuf); } @@ -1382,7 +1394,7 @@ int UDPStandardImplementation::createDataCallbackThreads(bool destroy){ currentThreadIndex = i; if(pthread_create(&dataCallbackThreads[i], NULL,startDataCallbackThread, (void*) this)){ char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Could not create data call back thread with index %d ", i); + snprintf(cstreambuf, MAX_STR_LENGTH, "Could not create data call back thread with index %d ", i); FILE_LOG(logERROR, cstreambuf); return FAIL; } @@ -1448,7 +1460,7 @@ int UDPStandardImplementation::createListeningThreads(bool destroy){ currentThreadIndex = i; if(pthread_create(&listeningThreads[i], NULL,startListeningThread, (void*) this)){ char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Could not create listening thread with index %d ", i); + snprintf(cstreambuf, MAX_STR_LENGTH, "Could not create listening thread with index %d ", i); FILE_LOG(logERROR, cstreambuf); return FAIL; } @@ -1514,7 +1526,7 @@ int UDPStandardImplementation::createWriterThreads(bool destroy){ currentThreadIndex = i; if(pthread_create(&writingThreads[i], NULL,startWritingThread, (void*) this)){ char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Could not create writer thread with index %d ", i); + snprintf(cstreambuf, MAX_STR_LENGTH, "Could not create writer thread with index %d ", i); FILE_LOG(logERROR, cstreambuf); return FAIL; } @@ -1595,8 +1607,9 @@ int UDPStandardImplementation::createUDPSockets(){ //if eth is mistaken with ip address - if (strchr(eth,'.') != NULL) - strcpy(eth,""); + if (strchr(eth,'.') != NULL){ + memset(eth,0,MAX_STR_LENGTH); + } shutDownUDPSockets(); int headerpacketsize = 0; @@ -1614,7 +1627,7 @@ int UDPStandardImplementation::createUDPSockets(){ else{ { char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Ethernet Interface: %s", eth); + snprintf(cstreambuf, MAX_STR_LENGTH, "Ethernet Interface: %s", eth); FILE_LOG(logINFO, cstreambuf); } for(int i=0;iinitEventTree(temp, &iframe); //resets the pedestalSubtraction array and the commonModeSubtraction singlePhotonDetectorObject[ithread]->newDataSet(); @@ -1878,9 +1893,10 @@ void UDPStandardImplementation::startDataCallback(){ struct timespec begin,end; // server address to bind - char hostName[100] = "tcp://*:";//"tcp://127.0.0.1:"; + char hostName[100]; + memset(hostName,0,100); int portno = DEFAULT_ZMQ_PORTNO + (detID*numberofListeningThreads+ithread); - sprintf(hostName,"%s%d",hostName,portno); + snprintf(hostName,100,"tcp://*:%d",portno);//"tcp://127.0.0.1:"; //socket details void *context = zmq_ctx_new(); @@ -1893,7 +1909,7 @@ void UDPStandardImplementation::startDataCallback(){ // bind { char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Thread %d: ZMQ Server at %s ", ithread, hostName); + snprintf(cstreambuf, MAX_STR_LENGTH, "Thread %d: ZMQ Server at %s ", ithread, hostName); FILE_LOG(logINFO, cstreambuf); } @@ -1905,19 +1921,18 @@ void UDPStandardImplementation::startDataCallback(){ //infinite loop, exited only to change dynamic range, 10G parameters etc (then recreated again) while(true){ - int oneframesize = oneDataSize * packetsPerFrame; - char* buffer = new char[packetsPerFrame*oneDataSize](); - memset(buffer,0xFF,oneframesize); bool randomSendNow = true; //header details const char *jsonFmt ="{" - "\"jsonversion\":%u, " - "\"acqIndex\":%llu, " - "\"fIndex\":%llu, " - "\"bitmode\":%d, " - "\"shape\":[%d, %d], " - "\"fname\":\"%s\", " + "\"jsonversion\":%u, " + "\"acqIndex\":%llu, " + "\"fIndex\":%llu, " + "\"bitmode\":%d, " + "\"shapex\": %d, " + "\"shapey\": %d, " + "\"fname\":\"%s\", " + "\"data\": %d, " "\"frameNumber\":%llu, " "\"expLength\":%u, " @@ -1932,15 +1947,14 @@ void UDPStandardImplementation::startDataCallback(){ "\"roundRNumber\":%u, " "\"detType\":%u, " "\"version\":%u" - "}\n"; + + "}\n\0"; int npixelsx=0, npixelsy=0; switch(myDetectorType) { case JUNGFRAU: npixelsx = JFRAU_PIXELS_IN_ONE_ROW; npixelsy = JFRAU_PIXELS_IN_ONE_COL; break; case EIGER: npixelsx = EIGER_PIXELS_IN_ONE_ROW; npixelsy = EIGER_PIXELS_IN_ONE_COL; break; default:break; /* will not work for other detectors*/ } - uint64_t acquisitionIndex = -1; - uint64_t frameIndex = -1; #ifdef DEBUG int oldpnum = -1; #endif @@ -1963,19 +1977,22 @@ void UDPStandardImplementation::startDataCallback(){ cprintf(BLUE,"%d sending dummy\n"); #endif - frameIndex = -1; - acquisitionIndex = -1; { - char buf[1000]="";memset(buf,0,1000); - sprintf(buf,jsonFmt, - SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + char buf[MAX_STR_LENGTH]="";memset(buf,0xFF,1000); + int len = snprintf(buf,MAX_STR_LENGTH, jsonFmt, + SLS_DETECTOR_JSON_HEADER_VERSION,0,0,0,0,0, "", 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + //cprintf(BLUE,"%d:Dummy:%s.\n",ithread, buf);fflush(stdout); + zmq_send_const(zmqsocket, buf, len, 0);//ZMQ_SNDMORE); - zmq_send(zmqsocket, buf,1000, 0); } + cprintf(BLUE,"%d dummy\n",ithread); + /* { //send final data - zmq_send (zmqsocket, "end\n", 4, 0); - + char buf[MAX_STR_LENGTH]="";memset(buf,0xFF,0); + int len = snprintf(buf,MAX_STR_LENGTH,"%s","end\n"); + zmq_send_const(zmqsocket, buf,len, 0); + }*/ pthread_mutex_lock(&statusMutex); dataCallbackThreadsMask^=(1<frameNumber; - frameIndex = fnum - startFrameIndex; - acquisitionIndex = fnum - startAcquisitionIndex; + uint64_t frameIndex = fnum - startFrameIndex; + uint64_t acquisitionIndex = fnum - startAcquisitionIndex; + { - char buf[1000]="";memset(buf,0,1000); - sprintf(buf,jsonFmt, - SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread], - header->frameNumber, header->expLength, header->packetNumber, header->bunchId, header->timestamp, - header->modId, header->xCoord, header->yCoord, header->zCoord, header->debug, header->roundRNumber, header->detType, header->version); + char buf[MAX_STR_LENGTH]="";memset(buf,0xFF,1000); + int len = snprintf(buf,MAX_STR_LENGTH,jsonFmt, + SLS_DETECTOR_JSON_HEADER_VERSION, acquisitionIndex, frameIndex, dynamicRange, npixelsx, npixelsy,completeFileName[ithread],1, + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - zmq_send(zmqsocket, buf,1000, 0); + + header->frameNumber, header->expLength, header->packetNumber, header->bunchId, header->timestamp, + header->modId, header->xCoord, header->yCoord, header->zCoord, header->debug, header->roundRNumber, header->detType, header->version + ); + //cprintf(BLUE,"%d:%s.\n",ithread, buf);fflush(stdout); + zmq_send_const(zmqsocket, buf,len, ZMQ_SNDMORE); } //send data - zmq_send(zmqsocket, (latestData[ithread]+sizeof(sls_detector_header)), bufferSize, 0); + zmq_send_const(zmqsocket,(latestData[ithread]+sizeof(sls_detector_header)), bufferSize, 0); //start clock after sending if(!frameToGuiFrequency){ randomSendNow = false; @@ -2039,8 +2061,6 @@ void UDPStandardImplementation::startDataCallback(){ }/*--end of loop for each buffer (inner loop)*/ - //free resources - delete[] buffer; //end of acquisition, wait for next acquisition/change of parameters sem_wait(&dataCallbackSemaphore[ithread]); @@ -2088,6 +2108,7 @@ void UDPStandardImplementation::startListening(){ carryonBufferSize = 0; if(tempBuffer){delete []tempBuffer;tempBuffer=0;} tempBuffer = new char[onePacketSize * (packetsPerFrame - 1)](); //store maximum of 1 packets less in a frame + memset(tempBuffer,0,onePacketSize * (packetsPerFrame - 1)); } /* inner loop - loop for each buffer */ @@ -2102,7 +2123,7 @@ void UDPStandardImplementation::startListening(){ if(activated && !udpSocket[ithread]){ { char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Listening_Thread %d: UDP Socket not created or shut down earlier ", ithread); + snprintf(cstreambuf, MAX_STR_LENGTH, "Listening_Thread %d: UDP Socket not created or shut down earlier ", ithread); FILE_LOG(logERROR, cstreambuf); } stopListening(ithread,0); @@ -2249,6 +2270,11 @@ int UDPStandardImplementation::prepareAndListenBufferCompleteFrames(int ithread) //read first packet pnum = FIRSTPNUM; //first packet number to validate if(status != TRANSMITTING) rc = udpSocket[ithread]->ReceiveDataOnly(buffer[ithread] + offset); + /*if(!ithread){ + cprintf(BLUE,"%d first rc:%d\n",ithread, rc);fflush(stdout); + }else{ + cprintf(GREEN,"%d first rc:%d\n",ithread, rc);fflush(stdout); + }*/ if(rc <= 0) return 0; if(getFrameandPacketNumber(ithread,buffer[ithread] + offset,fi,pi,si,bi) == FAIL){ pi = ALL_MASK_32; //got 0 from fpga @@ -2276,7 +2302,7 @@ int UDPStandardImplementation::prepareAndListenBufferCompleteFrames(int ithread) if(!ithread) cout << "correct packet" << endl; #endif //copy only data - memcpy(buffer[ithread] + offset,buffer[ithread] + offset + headerlength, oneDataSize); + memmove(buffer[ithread] + offset,buffer[ithread] + offset + headerlength, oneDataSize); offset+=oneDataSize; //if complete frame @@ -2364,13 +2390,21 @@ int UDPStandardImplementation::prepareAndListenBufferCompleteFrames(int ithread) header->detType = (uint8_t) myDetectorType; header->version = (uint8_t) SLS_DETECTOR_HEADER_VERSION; -#ifdef VERBOSE - if(!ithread) + //#ifdef VERBOSE + //if(!ithread) + + /*if(!ithread) { cprintf(BLUE, - "framenumber:%lu\tsubfnum:%u\tpnum:%u\tbunchid:%lu\txcoord:%u\tdettype:%u\tversion:%u\n", - header->frameNumber, header->expLength, header->packetNumber, - header->bunchId, header->xCoord, header->detType, header->version); -#endif + "%d framenumber:%lu\tsubfnum:%u\tpnum:%u\tbunchid:%lu\txcoord:%u\tdettype:%u\tversion:%u\n", + ithread, header->frameNumber, header->expLength, header->packetNumber, + header->bunchId, header->xCoord, header->detType, header->version);fflush(stdout); + }else{ + cprintf(GREEN, + "%d framenumber:%lu\tsubfnum:%u\tpnum:%u\tbunchid:%lu\txcoord:%u\tdettype:%u\tversion:%u\n", + ithread, header->frameNumber, header->expLength, header->packetNumber, + header->bunchId, header->xCoord, header->detType, header->version);fflush(stdout); + }*/ + //#endif //write packet count to buffer *((uint32_t*)(buffer[ithread])) = packetsPerFrame; @@ -2433,7 +2467,7 @@ void UDPStandardImplementation::stopListening(int ithread, int numbytes){ //free empty buffer if(numbytes <= 0){ char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Listening %d: End of Acquisition", ithread); + snprintf(cstreambuf, MAX_STR_LENGTH, "Listening %d: End of Acquisition", ithread); FILE_LOG(logINFO, cstreambuf); while(!fifoFree[ithread]->push(buffer[ithread])); } @@ -2470,7 +2504,7 @@ void UDPStandardImplementation::stopListening(int ithread, int numbytes){ //#ifdef DEBUG4 { char cstreambuf[MAX_STR_LENGTH]; memset(cstreambuf, 0, MAX_STR_LENGTH); - sprintf(cstreambuf, "Listening Thread of %u got %d packets ", udpPortNum[ithread], totalListeningPacketCount[ithread]); + snprintf(cstreambuf, MAX_STR_LENGTH, "Listening Thread of %u got %d packets ", udpPortNum[ithread], totalListeningPacketCount[ithread]); FILE_LOG(logINFO, cstreambuf); } //#endif @@ -2667,6 +2701,7 @@ void UDPStandardImplementation::waitWritingBufferForNextAcquisition(int ithread) //create file if((1<subFrameNumber); + snprintf(cstreambuf, MAX_STR_LENGTH, "Fifo %d: Frame Number is zero from firmware. subnum: %u, fnum:%u, pnum:%u ", ithread, subframenumber, + (uint32_t)(*( (uint64_t*) footer)),(*( (uint16_t*) footer->packetNumber))-1); FILE_LOG(logERROR, cstreambuf); - return FAIL; } packetnumber = (*( (uint16_t*) footer->packetNumber))-1; From 6a80bc5b54dc18450f31186e42a01444a5a1109c Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 27 Jun 2017 13:00:38 +0200 Subject: [PATCH 40/41] new feature, set threshold without uploading trimbits --- .../commonFiles/communication_funcs.c | 10 +++ ....0.16.2 => eigerDetectorServerv2.3.4.16.0} | Bin 280601 -> 284169 bytes .../slsDetectorFunctionList.c | 64 +++++++++++------- .../multiSlsDetector/multiSlsDetector.cpp | 6 +- .../multiSlsDetector/multiSlsDetector.h | 3 +- .../slsDetector/slsDetector.cpp | 51 ++++++++------ slsDetectorSoftware/slsDetector/slsDetector.h | 9 ++- .../slsDetector/slsDetectorActions.h | 2 +- .../slsDetector/slsDetectorBase.h | 2 +- .../slsDetector/slsDetectorCommand.cpp | 28 +++++++- .../slsDetector/slsDetectorUtils.h | 2 +- .../slsDetectorAnalysis/energyConversion.cpp | 24 ++++--- .../slsDetectorAnalysis/energyConversion.h | 6 +- slsDetectorSoftware/threadFiles/Task.h | 6 +- 14 files changed, 141 insertions(+), 72 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv2.3.0.16.2 => eigerDetectorServerv2.3.4.16.0} (56%) diff --git a/slsDetectorSoftware/commonFiles/communication_funcs.c b/slsDetectorSoftware/commonFiles/communication_funcs.c index 54ee6bb141..4dc18ae5c9 100755 --- a/slsDetectorSoftware/commonFiles/communication_funcs.c +++ b/slsDetectorSoftware/commonFiles/communication_funcs.c @@ -561,6 +561,15 @@ int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveA myMod->chipregs=chipptr; myMod->chanregs=chanptr; +#ifdef EIGERD + //feature to exclude sending of trimbtis, nchips=0,nchans=0 in that case + if(myMod->nchip == 0 && myMod->nchan == 0) { + receiveAll=0; + nchipold=0; + nchanold=0; + } +#endif + nChips=myMod->nchip; nchipdiff=nChips-nchipold; if (nchipold!=nChips) { @@ -571,6 +580,7 @@ int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveA printf("received %d chips\n",nChips); #endif + nChans=myMod->nchan; nchandiff=nChans-nchanold; if (nchanold!=nChans) { diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.3.0.16.2 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.3.4.16.0 similarity index 56% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.3.0.16.2 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.3.4.16.0 index 59f65ff9a078a59b3b027332a07f97c3759577fe..43cf5bbacd0e4f1b08126feb57b1a7311083febf 100755 GIT binary patch delta 52994 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 SCm?UW?dH{iT}hsr!hZs83M{+; delta 51680 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 diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 1302037fe6..5d3a13cd40 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -627,25 +627,30 @@ int setModule(sls_detector_module myMod, int delay){ for(i=0;iserialnumber=srcMod->serialnumber; } - if ((srcMod->nchip)>(destMod->nchip)) { + //no trimbit feature + if (destMod->nchip && ((srcMod->nchip)>(destMod->nchip))) { printf("Number of chip of source is larger than number of chips of destination\n"); return FAIL; } - if ((srcMod->nchan)>(destMod->nchan)) { + //no trimbit feature + if (destMod->nchan && ((srcMod->nchan)>(destMod->nchan))) { printf("Number of channels of source is larger than number of channels of destination\n"); return FAIL; } @@ -1164,14 +1171,21 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod){ if (srcMod->offset>=0) destMod->offset=srcMod->offset; - for (ichip=0; ichip<(srcMod->nchip); ichip++) { - if (*((srcMod->chipregs)+ichip)>=0) - *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); - } - for (ichan=0; ichan<(srcMod->nchan); ichan++) { - if (*((srcMod->chanregs)+ichan)>=0) - *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); + if((destMod->nchip!=0) || (destMod->nchan!=0)) { + for (ichip=0; ichip<(srcMod->nchip); ichip++) { + if (*((srcMod->chipregs)+ichip)>=0) + *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); + } + for (ichan=0; ichan<(srcMod->nchan); ichan++) { + if (*((srcMod->chanregs)+ichan)>=0) + *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); + } } +#ifdef VERBOSE + printf("Not Copying trimbits\n"); +#endif + + for (idac=0; idac<(srcMod->ndac); idac++) { if (*((srcMod->dacs)+idac)>=0) *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 3ac129dddd..b018e88334 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1139,7 +1139,7 @@ int multiSlsDetector::getThresholdEnergy(int pos) { } -int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings isettings) { +int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings isettings, int tb) { int posmin, posmax; int ret=-100; @@ -1160,8 +1160,8 @@ int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings ise for(int idet=posmin; idet(&slsDetector::setThresholdEnergy, - detectors[idet],e_eV,-1,isettings,iret[idet])); + Task* task = new Task(new func4_t(&slsDetector::setThresholdEnergy, + detectors[idet],e_eV,-1,isettings,tb, iret[idet])); threadpool->add_task(task); } } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 0fe1a164be..3eca95a8c3 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -453,9 +453,10 @@ class multiSlsDetector : public slsDetectorUtils { \param e_eV threshold in eV \param imod module number (-1 all) \param isettings ev. change settings + \param tb 1 to include trimbits, 0 to exclude \returns current threshold value for imod in ev (-1 failed) */ - int setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS); + int setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS, int tb=1); /** get detector settings diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 20e6976d50..6aa864fae2 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -2886,7 +2886,7 @@ int slsDetector::setModule(int reg, int imod){ }; -int slsDetector::setModule(sls_detector_module module, int iodelay, int tau, int e_eV, int* gainval, int* offsetval){ +int slsDetector::setModule(sls_detector_module module, int iodelay, int tau, int e_eV, int* gainval, int* offsetval, int tb){ int fnum=F_SET_MODULE; int retval; @@ -2903,6 +2903,11 @@ int slsDetector::setModule(sls_detector_module module, int iodelay, int tau, int if (thisDetector->onlineFlag==ONLINE_FLAG) { if (connectControl() == OK){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + //to exclude trimbits + if(!tb) { + module.nchan=0; + module.nchip=0; + } sendModule(&module); //not included in module @@ -2936,23 +2941,29 @@ int slsDetector::setModule(sls_detector_module module, int iodelay, int tau, int if (ret!=FAIL) { if (detectorModules) { if (imod>=0 && imodnMod[X]*thisDetector->nMod[Y]) { - (detectorModules+imod)->nchan=module.nchan; - (detectorModules+imod)->nchip=module.nchip; + if(tb) { + (detectorModules+imod)->nchan=module.nchan; + (detectorModules+imod)->nchip=module.nchip; + } (detectorModules+imod)->ndac=module.ndac; (detectorModules+imod)->nadc=module.nadc; - thisDetector->nChips=module.nchip; - thisDetector->nChans=module.nchan/module.nchip; + if(tb) { + thisDetector->nChips=module.nchip; + thisDetector->nChans=module.nchan/module.nchip; + } thisDetector->nDacs=module.ndac; thisDetector->nAdcs=module.nadc; if(thisDetector->myDetectorType != JUNGFRAU){ - for (int ichip=0; ichipnChips; ichip++) { - if (chipregs) - chipregs[ichip+thisDetector->nChips*imod]=module.chipregs[ichip]; - - if (chanregs) { - for (int i=0; inChans; i++) { - chanregs[i+ichip*thisDetector->nChans+thisDetector->nChips*thisDetector->nChans*imod]=module.chanregs[ichip*thisDetector->nChans+i]; + if(tb) { + for (int ichip=0; ichipnChips; ichip++) { + if (chipregs) + chipregs[ichip+thisDetector->nChips*imod]=module.chipregs[ichip]; + + if (chanregs) { + for (int i=0; inChans; i++) { + chanregs[i+ichip*thisDetector->nChans+thisDetector->nChips*thisDetector->nChans*imod]=module.chanregs[ichip*thisDetector->nChans+i]; + } } } } @@ -3182,11 +3193,11 @@ int slsDetector::getThresholdEnergy(int imod){ return thisDetector->currentThresholdEV; }; -int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isettings){ +int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isettings, int tb){ //currently only for eiger if (thisDetector->myDetectorType == EIGER) { - setThresholdEnergyAndSettings(e_eV,isettings); + setThresholdEnergyAndSettings(e_eV,isettings,tb); return thisDetector->currentThresholdEV; } @@ -3226,7 +3237,7 @@ int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isetti -int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isettings) { +int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isettings, int tb) { //if settings provided, use that, else use the shared memory variable detectorSettings is = ((isettings != GET_SETTINGS) ? isettings: thisDetector->currentSettings); @@ -3292,7 +3303,7 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti #endif //read the files myMod=createModule(); - if (NULL == readSettingsFile(settingsfname,thisDetector->myDetectorType, iodelay, tau, myMod)) { + if (NULL == readSettingsFile(settingsfname,thisDetector->myDetectorType, iodelay, tau, myMod, tb)) { if(myMod)deleteModule(myMod); return FAIL; } @@ -3327,13 +3338,13 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti int tau1 = -1; //not included in the module int iodelay2 = -1; //not included in the module int tau2 = -1; //not included in the module - if (NULL == readSettingsFile(settingsfname1,thisDetector->myDetectorType, iodelay1, tau1, myMod1)) { + if (NULL == readSettingsFile(settingsfname1,thisDetector->myDetectorType, iodelay1, tau1, myMod1, tb)) { setErrorMask((getErrorMask())|(SETTINGS_FILE_NOT_OPEN)); deleteModule(myMod1); deleteModule(myMod2); return FAIL; } - if (NULL == readSettingsFile(settingsfname2,thisDetector->myDetectorType, iodelay2, tau2, myMod2)) { + if (NULL == readSettingsFile(settingsfname2,thisDetector->myDetectorType, iodelay2, tau2, myMod2, tb)) { setErrorMask((getErrorMask())|(SETTINGS_FILE_NOT_OPEN)); deleteModule(myMod1); deleteModule(myMod2); @@ -3349,7 +3360,7 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti iodelay = iodelay1; //interpolate module - myMod = interpolateTrim(thisDetector->myDetectorType, myMod1, myMod2, e_eV, trim1, trim2); + myMod = interpolateTrim(thisDetector->myDetectorType, myMod1, myMod2, e_eV, trim1, trim2, tb); if (myMod == NULL) { printf("Could not interpolate, different dac values in files\n"); setErrorMask((getErrorMask())|(SETTINGS_NOT_SET)); @@ -3365,7 +3376,7 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti myMod->module=0; myMod->reg=thisDetector->currentSettings; - setModule(*myMod, iodelay, tau, e_eV, 0, 0); + setModule(*myMod, iodelay, tau, e_eV, 0, 0, tb); deleteModule(myMod); if (getSettings(-1) != is){ printf( "Could not set settings in detector \n" ); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index fa3cc8e258..90daa44930 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -953,10 +953,11 @@ class slsDetector : public slsDetectorUtils, public energyConversion { \param e_eV threashold in eV (detector specific) \param gainval pointer to extra gain values \param offsetval pointer to extra offset values + \param tb 1 to include trimbits, 0 to exclude (used for eiger) \returns current register value \sa ::sls_detector_module */ - int setModule(sls_detector_module module, int iodelay, int tau, int e_eV, int* gainval=0, int* offsetval=0); + int setModule(sls_detector_module module, int iodelay, int tau, int e_eV, int* gainval=0, int* offsetval=0, int tb=1); //virtual int setModule(sls_detector_module module); /** @@ -987,17 +988,19 @@ class slsDetector : public slsDetectorUtils, public energyConversion { \param e_eV threshold in eV \param imod module number (-1 all) \param isettings ev. change settings + \param tb 1 to include trimbits, 0 to exclude \returns current threshold value for imod in ev (-1 failed) */ - int setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS); + int setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS, int tb=1); /** set threshold energy \param e_eV threshold in eV \param isettings ev. change settings + \param tb 1 to include trimbits, 0 to exclude \returns OK if successful, else FAIL */ - int setThresholdEnergyAndSettings(int e_eV, detectorSettings isettings); + int setThresholdEnergyAndSettings(int e_eV, detectorSettings isettings, int tb=1); /** get detector settings diff --git a/slsDetectorSoftware/slsDetector/slsDetectorActions.h b/slsDetectorSoftware/slsDetector/slsDetectorActions.h index a920854b8c..a0db618784 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorActions.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorActions.h @@ -210,7 +210,7 @@ class slsDetectorActions : public virtual slsDetectorBase /* *\/ */ /* virtual detectorType getDetectorsType(int pos=-1)=0; */ - virtual int setThresholdEnergy(int, int im=-1, detectorSettings isettings=GET_SETTINGS)=0; + virtual int setThresholdEnergy(int, int im=-1, detectorSettings isettings=GET_SETTINGS, int tb=1)=0; virtual int setChannel(int64_t, int ich=-1, int ichip=-1, int imod=-1)=0; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 119c0554dc..0cbc4c14d4 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -429,7 +429,7 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef virtual externalCommunicationMode setExternalCommunicationMode(externalCommunicationMode pol=GET_EXTERNAL_COMMUNICATION_MODE)=0; int setTimingMode(int i=-1){return slsDetectorUsers::getTimingMode( externalCommunicationType( setExternalCommunicationMode(externalCommunicationType( slsDetectorUsers::getTimingMode(i) ) ) ) );}; - virtual int setThresholdEnergy(int e_eV, int imod, detectorSettings isettings=GET_SETTINGS)=0; + virtual int setThresholdEnergy(int e_eV, int imod, detectorSettings isettings=GET_SETTINGS, int tb=1)=0; int setThresholdEnergy(int e_eV){return setThresholdEnergy(e_eV,-1);}; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index c510395348..bc67deecaf 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -552,6 +552,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; i++; + descrToFuncMap[i].m_pFuncName="thresholdnotb"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; + i++; + descrToFuncMap[i].m_pFuncName="trimbits"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; i++; @@ -3289,10 +3293,10 @@ string slsDetectorCommand::cmdSettings(int narg, char *args[], int action) { return myDet->getDetectorSettings(myDet->getSettings()); } else if (cmd=="threshold") { if (action==PUT_ACTION) { - detectorType type = myDet->getDetectorsType(); if (!sscanf(args[1],"%d",&val)) { return string("invalid threshold value"); } + detectorType type = myDet->getDetectorsType(); if (type != EIGER || (type == EIGER && narg<=2)) { myDet->setThresholdEnergy(val); } else { @@ -3304,6 +3308,25 @@ string slsDetectorCommand::cmdSettings(int narg, char *args[], int action) { } sprintf(ans,"%d",myDet->getThresholdEnergy()); return string(ans); + } else if (cmd=="thresholdnotb") { + if (action==PUT_ACTION) { + if (!sscanf(args[1],"%d",&val)) { + return string("invalid threshold value"); + } + detectorType type = myDet->getDetectorsType(); + if (type != EIGER) + return string("not implemented for this detector"); + if (narg<=2) { + myDet->setThresholdEnergy(val, -1, GET_SETTINGS, 0); + } else { + detectorSettings sett= myDet->getDetectorSettings(string(args[2])); + if(sett == -1) + return string("invalid settings value"); + myDet->setThresholdEnergy(val, -1, sett, 0); + } + } + sprintf(ans,"%d",myDet->getThresholdEnergy()); + return string(ans); } else if (cmd=="trimbits") { if (narg>=2) { string sval=string(args[1]); @@ -3386,7 +3409,8 @@ string slsDetectorCommand::helpSettings(int narg, char *args[], int action) { if (action==PUT_ACTION || action==HELP_ACTION) { os << "settings s \n sets the settings of the detector - can be standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain" "lownoise, dynamichg0,fixgain1,fixgain2,forceswitchg1, forceswitchg2"<< std::endl; - os << "threshold eV\n sets the detector threshold in eV"<< std::endl; + os << "threshold eV [sett]\n sets the detector threshold in eV. If sett is provided for eiger, uses settings sett"<< std::endl; + os << "thresholdnotb eV [sett]\n sets the detector threshold in eV without loading trimbits. If sett is provided for eiger, uses settings sett"<< std::endl; os << "trimbits fname\n loads the trimfile fname to the detector. If no extension is specified, the serial number of each module will be attached."<< std::endl; os << "trim:mode fname\n trims the detector according to mode (can be noise, beam, improve, fix) and saves the resulting trimbits to file fname."<< std::endl; os << "trimval i \n sets all the trimbits to i" << std::endl; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index cc354b737c..81da358eee 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -421,7 +421,7 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { // double* convertAngles(){return convertAngles(currentPosition);}; // virtual double* convertAngles(double pos)=0; - virtual int setThresholdEnergy(int, int im=-1, detectorSettings isettings=GET_SETTINGS)=0; + virtual int setThresholdEnergy(int, int im=-1, detectorSettings isettings=GET_SETTINGS, int tb=1)=0; virtual int setChannel(int64_t, int ich=-1, int ichip=-1, int imod=-1)=0; virtual double getRateCorrectionTau()=0; diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp index 2b1a384028..40a673f88f 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp @@ -138,7 +138,7 @@ int energyConversion::writeCalibrationFile(string fname, int *gain, int *offset) -slsDetectorDefs::sls_detector_module* energyConversion::interpolateTrim(detectorType myDetectorType, sls_detector_module* a, sls_detector_module* b, const int energy, const int e1, const int e2){ +slsDetectorDefs::sls_detector_module* energyConversion::interpolateTrim(detectorType myDetectorType, sls_detector_module* a, sls_detector_module* b, const int energy, const int e1, const int e2, int tb){ // only implemented for eiger currently (in terms of which dacs) if(myDetectorType != EIGER) { printf("Interpolation of Trim values not implemented for this detector!\n"); @@ -168,8 +168,10 @@ slsDetectorDefs::sls_detector_module* energyConversion::interpolateTrim(detector } //Interpolate all trimbits - for (int i = 0; inchan; i++) - myMod->chanregs[i] = linearInterpolation(energy, e1, e2, a->chanregs[i], b->chanregs[i]); + if(tb) { + for (int i = 0; inchan; i++) + myMod->chanregs[i] = linearInterpolation(energy, e1, e2, a->chanregs[i], b->chanregs[i]); + } return myMod; } @@ -180,7 +182,7 @@ slsDetectorDefs::sls_detector_module* energyConversion::interpolateTrim(detector /* I/O */ -slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string fname, detectorType myDetectorType, int& iodelay, int& tau, sls_detector_module* myMod){ +slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string fname, detectorType myDetectorType, int& iodelay, int& tau, sls_detector_module* myMod, int tb){ @@ -372,19 +374,21 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string infile.read((char*) myMod->dacs,sizeof(dacs_t)*(myMod->ndac)); infile.read((char*)&iodelay,sizeof(iodelay)); infile.read((char*)&tau,sizeof(tau)); - infile.read((char*) myMod->chanregs,sizeof(int)*(myMod->nchan)); #ifdef VERBOSE for(int i=0;indac;i++) printf( "dac %d:%d \n", i, myMod->dacs[i] ); printf( "iodelay:%d \n", iodelay ); printf( "tau:%d \n", tau ); #endif - if(infile.eof()){ - printf( "Error, could not load trimbits end of file reached: %s \n\n", myfname.c_str() ); - if (nflag) - deleteModule(myMod); + if(tb) { + infile.read((char*) myMod->chanregs,sizeof(int)*(myMod->nchan)); + if(infile.eof()){ + printf( "Error, could not load trimbits end of file reached: %s \n\n", myfname.c_str() ); + if (nflag) + deleteModule(myMod); - return NULL; + return NULL; + } } infile.close(); strcpy(settingsFile,fname.c_str()); diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h index 8aec3cb472..608246e6e0 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h @@ -88,9 +88,10 @@ class energyConversion \param energy energy to trim at \param e1 reference trim value \param e2 reference trim value + \param tb 1 to include trimbits, 0 to exclude (used for eiger) \returns the pointer to the module structure with interpolated values or NULL if error */ - sls_detector_module* interpolateTrim(detectorType myDetectorType, sls_detector_module* a, sls_detector_module* b, const int energy, const int e1, const int e2); + sls_detector_module* interpolateTrim(detectorType myDetectorType, sls_detector_module* a, sls_detector_module* b, const int energy, const int e1, const int e2, int tb=1); @@ -103,10 +104,11 @@ class energyConversion \param iodelay io delay (detector specific) \param tau tau (detector specific) \param myMod pointer to the module structure which has to be set.
If it is NULL a new module structure will be created + \param tb 1 to include trimbits, 0 to exclude (used for eiger) \returns the pointer to myMod or NULL if reading the file failed */ - sls_detector_module* readSettingsFile(string fname, detectorType myDetectorType, int& iodelay, int& tau, sls_detector_module* myMod=NULL); + sls_detector_module* readSettingsFile(string fname, detectorType myDetectorType, int& iodelay, int& tau, sls_detector_module* myMod=NULL, int tb=1); /** writes a trim/settings file diff --git a/slsDetectorSoftware/threadFiles/Task.h b/slsDetectorSoftware/threadFiles/Task.h index e90deb9c2f..5ce30d9a51 100644 --- a/slsDetectorSoftware/threadFiles/Task.h +++ b/slsDetectorSoftware/threadFiles/Task.h @@ -129,8 +129,8 @@ class Task: public virtual slsDetectorDefs{ Task(func2_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(t),m12(0),m13(0){}; /* Return: void, Param: none */ Task(func00_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0),m12(t),m13(0){}; - /* Return: int, Param: int,int,detectorSettings */ - Task(func3_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0),m12(0),m13(t){}; + /* Return: int, Param: int,int,detectorSettings,int */ + Task(func4_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0),m12(0),m13(t){}; @@ -178,7 +178,7 @@ class Task: public virtual slsDetectorDefs{ /* Return: void, Param: none */ func00_t * m12; /* Return: int, Param: int,int,detectorSettings */ - func3_t * m13; + func4_t * m13; }; From 834794ad981e204e93463800e06e8069208b82b9 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 19 Dec 2017 18:04:44 +0100 Subject: [PATCH 41/41] gotthard renamed binaries --- serverBin/gotthardDetectorServer | 2 +- ...0.0.7 => gotthardDetectorServerv3.0.0.5.1} | Bin 132056 -> 132056 bytes 2 files changed, 1 insertion(+), 1 deletion(-) rename slsDetectorSoftware/gotthardDetectorServer/{gotthardDetectorServerv3.0.0.7 => gotthardDetectorServerv3.0.0.5.1} (99%) diff --git a/serverBin/gotthardDetectorServer b/serverBin/gotthardDetectorServer index b88a50de5d..ccac24b2a8 120000 --- a/serverBin/gotthardDetectorServer +++ b/serverBin/gotthardDetectorServer @@ -1 +1 @@ -../slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.7 \ No newline at end of file +../slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.5.1 \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.7 b/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.5.1 similarity index 99% rename from slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.7 rename to slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.5.1 index 74c484834730c69bfac30b5d6396cd0d2613aebe..adf23145cd32e108aa8237a2a5312b70587654a4 100755 GIT binary patch delta 26 icmcc7&T*riV}cfwTha8wWsDMyF0C$%TV0r@FarRIwh1c$ delta 26 icmcc7&T*riV}cfw