diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index d4075c0d4..31dbc6365 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -177,7 +177,8 @@ enum networkParameter { RECEIVER_HOSTNAME, /**< receiver IP/hostname */ RECEIVER_UDP_IP, /**< receiever UDP IP */ RECEIVER_UDP_PORT, /**< receiever UDP Port */ - RECEIVER_UDP_MAC /**< receiever UDP MAC */ + RECEIVER_UDP_MAC, /**< receiever UDP MAC */ + RECEIVER_UDP_PORT2 /**< receiever UDP Port of second half module for eiger */ }; /** diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index e412fec91..ec8856772 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -52,6 +52,7 @@ void BebInfo_BebInfo(struct BebInfo* bebInfo, unsigned int beb_num){ bebInfo->src_port_1GbE=bebInfo->src_port_10GbE=0; } + int BebInfo_SetSerialAddress(struct BebInfo* bebInfo, unsigned int a){ //address pre shifted if(a>0xff) return 0; @@ -329,7 +330,7 @@ int Beb_SetUpUDPHeader(unsigned int beb_number, int ten_gig, unsigned int header Beb_SwapDataFun(1,12,&(Beb_send_data[2])); if(!Beb_WriteTo(i)) return 0; - + printf("dst_port:%d\n",dst_port); return 1; } @@ -368,12 +369,18 @@ int Beb_SetHeaderData1(char* src_mac, char* src_ip, unsigned int src_port, char* */ if(!Beb_SetMAC(src_mac,&(udp_header.src_mac[0]))) return 0; + printf("Setting Source MAC to %s\n",src_mac); if(!Beb_SetIP(src_ip,&(udp_header.src_ip[0]))) return 0; + printf("Setting Source IP to %s\n",src_ip); if(!Beb_SetPortNumber(src_port,&(udp_header.src_port[0]))) return 0; + printf("Setting Source port to %d\n",src_port); if(!Beb_SetMAC(dst_mac,&(udp_header.dst_mac[0]))) return 0; + printf("Setting Destination MAC to %s\n",dst_mac); if(!Beb_SetIP(dst_ip,&(udp_header.dst_ip[0]))) return 0; + printf("Setting Destination IP to %s\n",dst_ip); if(!Beb_SetPortNumber(dst_port,&(udp_header.dst_port[0]))) return 0; + printf("Setting Destination port to %d\n",dst_port); Beb_AdjustIPChecksum(&udp_header); @@ -392,8 +399,7 @@ int Beb_SetHeaderData1(char* src_mac, char* src_ip, unsigned int src_port, char* int Beb_SetMAC(char* mac, uint8_t* dst_ptr){ - -char macVal[50];strcpy(macVal,mac); + char macVal[50];strcpy(macVal,mac); int i = 0; char *pch = strtok (macVal,":"); diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.h b/slsDetectorSoftware/eigerDetectorServer/Beb.h index 52d250be6..86c36b0e5 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.h +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.h @@ -28,6 +28,7 @@ struct BebInfo{ void BebInfo_BebInfo(struct BebInfo* bebInfo, unsigned int beb_num); + void BebInfo_BebDstInfo(struct BebInfo* bebInfo, unsigned int beb_num); int BebInfo_SetSerialAddress(struct BebInfo* bebInfo, unsigned int add); int BebInfo_SetHeaderInfo(struct BebInfo* bebInfo, int ten_gig, char* src_mac, char* src_ip, unsigned int src_port);//src_port fixed 42000+beb_number or 52000 + beb_number); unsigned int BebInfo_GetBebNumber(struct BebInfo* bebInfo); diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index 0f3c79ee3..69d7cfc0d 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -72,6 +72,29 @@ void Module_Module(struct Module* mod,unsigned int number, unsigned int address_ for(i=0;ibottom_dac[i] = mod->bottom_address_valid ? -1:0; } + +void Module_ModuleBottom(struct Module* mod,unsigned int number, unsigned int address_bottom){ + unsigned int i; + mod->module_number = number; + mod->top_address_valid = 0; + mod->top_left_address = 0; + mod->top_right_address = 0; + mod-> bottom_address_valid = 1; + mod-> bottom_left_address = 0x100 | (0xff & address_bottom); + mod-> bottom_right_address = (0x200 | (0xff & address_bottom)); + + mod->high_voltage = -1; + + for(i=0;i<4;i++) mod->idelay_top[i]=mod->idelay_bottom[i]=0; + + mod->top_dac = malloc(Module_ndacs * sizeof(int)); + mod->bottom_dac = malloc(Module_ndacs * sizeof(int)); + for(i=0;itop_dac[i] = mod->top_address_valid ? -1:0; + for(i=0;ibottom_dac[i] = mod->bottom_address_valid ? -1:0; +} + + + void Module_Module1(struct Module* mod,unsigned int number, unsigned int address_top, unsigned int address_bottom){ unsigned int i; mod->module_number = number; @@ -159,9 +182,9 @@ void Feb_Control_ClearModules(){ int Feb_Control_Init(){ unsigned int i; Feb_Control_ClearModules(); - Feb_Control_AddModule(0,0xff);//global send + /*Feb_Control_AddModule(0,0xff);//global send - Feb_Control_PrintModuleList(); + Feb_Control_PrintModuleList();*/ Feb_Control_ReadSetUpFileToAddModules("/home/root/executables/setup.txt"); @@ -216,10 +239,29 @@ int Feb_Control_ReadSetUpFileToAddModules(char* file_name){ exit(0); } printf ("str:%s len:%d i0:%d i1:%d\n", str, strlen(str),i0,i1); - if(!Feb_Control_AddModule(i0,i1)){ + + /**Added by dhanya*/ + if(i1 == 0){ + Feb_Control_AddModule1(0,0xff,0,1);//global send + Feb_Control_PrintModuleList(); + if(!Feb_Control_AddModule1(i0,i1,0,1)){ + printf("Error adding module, parameter was assigned twice in setup file: %s.\n",file_name); + exit(0); + } + }else{ + Feb_Control_AddModule1(0,0,0xff,1);//global send + Feb_Control_PrintModuleList(); + if(!Feb_Control_AddModule1(i0,0,i1,1)){ + printf("Error adding module, parameter was assigned twice in setup file: %s.\n",file_name); + exit(0); + } + } + + + /* if(!Feb_Control_AddModule1(i0,i1)){ printf("Error adding module, parameter was assigned twice in setup file: %s.\n",file_name); exit(0); - } + }*/ } } fclose(fp); @@ -315,7 +357,10 @@ int Feb_Control_AddModule1(unsigned int module_number, unsigned int top_address, struct Module mod,* m; m= &mod; - if(half_module) Module_Module(m,module_number,top_address); + /* if((half_module)&& (top_address != 1)) Module_Module(m,module_number,top_address); + else if(half_module) Module_ModuleBottom(m,module_number,top_address);*/ + if ((half_module)&& (!bottom_address)) Module_Module(m,module_number,top_address); + else if (half_module) Module_ModuleBottom(m,module_number,bottom_address); else Module_Module1(m,module_number,top_address,bottom_address); @@ -657,6 +702,7 @@ int Feb_Control_DecodeDACString(char* dac_str, unsigned int* module_index, int* strncpy(temp, p1+3, (p2-p1)); temp[p2-p1] = '\0'; unsigned int number = atoi(temp); //unsigned int number = atoi((local_s.substr(p1+3,p2-3)).c_str()); + if(!Feb_Control_GetModuleIndex(number,module_index)){ printf("Error in dac_name \"%s\", module number %d not in list.\n",dac_str,number); return 0; @@ -664,6 +710,7 @@ int Feb_Control_DecodeDACString(char* dac_str, unsigned int* module_index, int* strcpy(local_s,p2+2);//local_s = local_s.substr(p2+2); } + *top = 1; *bottom = 1; /* @@ -682,12 +729,12 @@ int Feb_Control_DecodeDACString(char* dac_str, unsigned int* module_index, int* strcpy(local_s,p1+8); *top=0; } - *dac_ch = 0; if(!Feb_Control_GetDACNumber(local_s,dac_ch)){ printf("Error in dac_name: %s (%s)\n",dac_str,local_s); return 0; } + return 1; } @@ -748,9 +795,9 @@ int Feb_Control_SetDAC(char* dac_str, int value, int is_a_voltage_mv){ } if(bottom&&Module_BottomAddressIsValid(&modules[module_index])){ - if(!Feb_Control_SendDACValue(Module_GetBottomRightAddress(&modules[module_index]),dac_ch,&v)) return 0; - if(module_index!=0) Module_SetBottomDACValue(&modules[module_index],dac_ch,v); - else for(i=0;indac;i++){ - setDAC((enum detDacIndex)i,-1,(detectorModules)->module,0,retval); - (detectorModules)->dacs[i] = retval[0]; - } + for(i=0;i<(detectorModules)->ndac;i++) + setDAC((enum detDacIndex)i,default_dac_values[i],(detectorModules)->module,0,retval); + /* initialize dynamic range etc. */ @@ -127,6 +130,7 @@ int initDetector(){ setTiming(AUTO_TIMING); int enable[2] = {0,1}; setExternalGating(enable);//disable external gating + return 1; } @@ -288,10 +292,10 @@ void setDAC(enum detDacIndex ind, int val, int imod, int mV, int retval[]){ if(val >= 0) Feb_Control_SetDAC(iname,val,mV); int k; - Feb_Control_GetDAC(iname, &k,0); - retval[0] = k; - Feb_Control_GetDAC(iname,&k,1); - retval[1] = k; + Feb_Control_GetDAC(iname, &k,0); + retval[0] = k; + Feb_Control_GetDAC(iname,&k,1); + retval[1] = k; (detectorModules)->dacs[ind] = retval[0]; @@ -669,7 +673,7 @@ int executeTrimming(enum trimMode mode, int par1, int par2, int imod){ } -int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int udpport, int ival){ +int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int udpport, int udpport2, int ival){ char src_mac[50], src_ip[50],dst_mac[50], dst_ip[50]; int src_port = 0xE185; int dst_port = udpport; @@ -688,7 +692,6 @@ int configureMAC(int ipad, long long int macad, long long int detectormacadd, in (unsigned int)((macad>>8)&0xFF), (unsigned int)((macad>>0)&0xFF)); - printf("Seting up Table Entry Left:\n"); printf("src_port:%d\n",src_port); printf("dst_port:%d\n",dst_port); printf("src_ip:%s\n",src_ip); @@ -696,27 +699,28 @@ int configureMAC(int ipad, long long int macad, long long int detectormacadd, in printf("src_mac:%s\n",src_mac); printf("dst_mac:%s\n\n",dst_mac); + int beb_num = 34; int header_number = 0; -int i=0; - //EigerSetupTableEntryLeft(ipad, macad, detectormacadd, detipad, udpport); + int i=0; /* for(i=0;i<32;i++){/** modified for Aldo*/ if(Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) printf("set up left ok\n"); else return -1; /*}*/ - //EigerSetupTableEntryRight(ipad, macad, detectormacadd, detipad, udpport); + header_number = 32; - dst_port = udpport +1; + dst_port = udpport2; + /*for(i=0;i<32;i++){*//** modified for Aldo*/ if(Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) printf("set up right ok\n"); else return -1; /*}*/ - //SetDestinationParameters(EigerGetNumberOfExposures()*EigerGetNumberOfCycles()); + on_dst = 0; for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested diff --git a/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c b/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c index 897c6bcad..0fa60e7e7 100755 --- a/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c +++ b/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c @@ -2547,7 +2547,7 @@ int update_client(int file_des) { int configure_mac(int file_des) { int ret=OK; - char arg[5][50]; + char arg[6][50]; int n; int imod=0;//should be in future sent from client as -1, arg[2] @@ -2572,7 +2572,7 @@ int configure_mac(int file_des) { sscanf(arg[2], "%x", &udpport); sscanf(arg[3], "%llx", &idetectormacadd); sscanf(arg[4], "%x", &detipad); - + //arg[5] is udpport2 for eiger #ifdef VERBOSE int i; printf("\ndigital_test_bit in server %d\t",digitalTestBit); diff --git a/slsDetectorSoftware/moenchDetectorServer/server_funcs.c b/slsDetectorSoftware/moenchDetectorServer/server_funcs.c index d047802ef..b0d8d56ab 100755 --- a/slsDetectorSoftware/moenchDetectorServer/server_funcs.c +++ b/slsDetectorSoftware/moenchDetectorServer/server_funcs.c @@ -2629,7 +2629,7 @@ int update_client(int file_des) { int configure_mac(int file_des) { int ret=OK; - char arg[5][50]; + char arg[6][50]; int n; int imod=0;//should be in future sent from client as -1, arg[2] @@ -2654,7 +2654,7 @@ int configure_mac(int file_des) { sscanf(arg[2], "%x", &udpport); sscanf(arg[3], "%llx", &idetectormacadd); sscanf(arg[4], "%x", &detipad); - +//arg[5] is for eiger #ifdef VERBOSE int i; printf("\ndigital_test_bit in server %d\t",digitalTestBit); diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index ab6d85ba8..55cb1102a 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -351,56 +351,71 @@ int multiSlsDetector::addSlsDetector(int id, int pos) { void multiSlsDetector::updateOffsets(){ - int offsetX=0,offsetY=0,numX,numY; - int maxChanX = thisMultiDetector->maxNumberOfChannelsPerDetector[X]; - int maxChanY = thisMultiDetector->maxNumberOfChannelsPerDetector[Y]; - cout << "Updating multi detector offsets" << endl; - thisMultiDetector->numberOfChannel[X] = 0; - thisMultiDetector->maxNumberOfChannel[X] = 0; - thisMultiDetector->numberOfChannel[Y] = 0; - thisMultiDetector->maxNumberOfChannel[Y] = 0; - for (int i=0; inumberOfDetectors; i++) { - if (detectors[i]) { - thisMultiDetector->offsetX[i] = offsetX; - thisMultiDetector->offsetY[i] = offsetY; + cout << endl << "Updating multi detector offsets" << endl; - cout << "Detector at position: " << i << " x offset:" << offsetX << " y offset:" << offsetY << endl; + int offsetX=0, offsetY=0, numX=0, numY=0, maxX=0, maxY=0; + int maxChanX = thisMultiDetector->maxNumberOfChannelsPerDetector[X]; + int maxChanY = thisMultiDetector->maxNumberOfChannelsPerDetector[Y]; + thisMultiDetector->numberOfChannel[X] = 0; + thisMultiDetector->maxNumberOfChannel[X] = 0; + thisMultiDetector->numberOfChannel[Y] = 0; + thisMultiDetector->maxNumberOfChannel[Y] = 0; - numX = detectors[i]->getMaxNumberOfChannels(X); - numY = detectors[i]->getMaxNumberOfChannels(Y); + //0th position + if (detectors[0]){ + offsetX = thisMultiDetector->offsetX[0] = 0; + offsetY = thisMultiDetector->offsetY[0] = 0; + numX = thisMultiDetector->numberOfChannel[X] = detectors[0]->getTotalNumberOfChannels(X); + numY = thisMultiDetector->numberOfChannel[Y] = detectors[0]->getTotalNumberOfChannels(Y); + maxX = thisMultiDetector->maxNumberOfChannel[X] = detectors[0]->getMaxNumberOfChannels(X); + maxY = thisMultiDetector->maxNumberOfChannel[Y] = detectors[0]->getMaxNumberOfChannels(Y); - offsetX += numX; - if ((maxChanX == -1) || ((maxChanX > 0) && (offsetX < maxChanX))){ - thisMultiDetector->numberOfChannel[X] += detectors[i]->getTotalNumberOfChannels(X); - thisMultiDetector->maxNumberOfChannel[X] += numX; - //the first time y should be added but offset not increased - if (thisMultiDetector->numberOfChannel[Y] == 0){ - if ((maxChanY == -1) || ((maxChanY > 0) && (numY < maxChanY))){ - thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); - thisMultiDetector->maxNumberOfChannel[Y] += numY; - }else{ - cout<<"Detector at position " << i << "exceeds maximum channels allowed for complete detector set in y dimension also!" << endl; - thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); - thisMultiDetector->maxNumberOfChannel[Y] += numY; - } - } - }else{ - offsetX = 0; - thisMultiDetector->numberOfChannel[X] = 0; - thisMultiDetector->maxNumberOfChannel[X] = 0; - offsetY += numY; - if ((maxChanY == -1) || ((maxChanY > 0) && (offsetY < maxChanY))){ - thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); - thisMultiDetector->maxNumberOfChannel[Y] += numY; - }else{ - cout<<"Detector at position " << i << "exceeds maximum channels allowed for complete detector set in y dimension also!" << endl; - thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); - thisMultiDetector->maxNumberOfChannel[Y] += numY; - } - } - } - } + cout << "Detector at position 0: x offset:" << offsetX << " y offset:" << offsetY << endl; + } + + for (int i=1; inumberOfDetectors; i++) { + if (detectors[i]) { + //incrementing in x direction + if ((maxChanX == -1) || ((maxChanX > 0) && ((offsetX + numX) < maxChanX))){ + offsetX += detectors[i]->getMaxNumberOfChannels(X); + maxX += detectors[i]->getMaxNumberOfChannels(X); + numX += detectors[i]->getTotalNumberOfChannels(X); + } + //incrementing in y direction + else{ + offsetX = 0; + numX = 0; + maxX = 0; + thisMultiDetector->maxNumberOfChannel[X] = 0; + offsetY += detectors[i]->getMaxNumberOfChannels(Y); + if ((maxChanY == -1) || ((maxChanY > 0) && (offsetY <= maxChanY))){ + numY += detectors[i]->getTotalNumberOfChannels(Y); + maxY += detectors[i]->getMaxNumberOfChannels(Y); + }else{ + cout<<"Detector at position " << i << "exceeds maximum channels allowed for complete detector set in y dimension also!" << endl; + numY += detectors[i]->getTotalNumberOfChannels(Y); + maxY += detectors[i]->getMaxNumberOfChannels(Y); + } + } + + thisMultiDetector->offsetX[i] = offsetX; + thisMultiDetector->offsetY[i] = offsetY; + cout << "Detector at position: " << i << " x offset:" << thisMultiDetector->offsetX[i] << " y offset:" << thisMultiDetector->offsetY[i] << endl; + if(numX > thisMultiDetector->numberOfChannel[X]) + thisMultiDetector->numberOfChannel[X] = numX; + if(numY > thisMultiDetector->numberOfChannel[Y]) + thisMultiDetector->numberOfChannel[Y] = numY; + if(maxX > thisMultiDetector->maxNumberOfChannel[X]) + thisMultiDetector->maxNumberOfChannel[X] = maxX; + if(maxY > thisMultiDetector->maxNumberOfChannel[Y]) + thisMultiDetector->maxNumberOfChannel[Y] = maxY; + } + } + + + cout << "Number of Channels in X direction:" << thisMultiDetector->numberOfChannel[X] << endl; + cout << "Number of Channels in Y direction:" << thisMultiDetector->numberOfChannel[Y] << endl << endl; } string multiSlsDetector::setHostname(const char* name, int pos){ @@ -1182,6 +1197,16 @@ int multiSlsDetector::startAcquisition(){ int i=0; int ret=OK, ret1=OK; + + if (detectors[0]) { + ret=detectors[0]->startAcquisition(); + if(detectors[0]->getErrorMask()) + setErrorMask(getErrorMask()|(1<numberOfDetectors; i++) { if (i!=thisMultiDetector->masterPosition) if (detectors[i]) { @@ -1201,7 +1226,7 @@ int multiSlsDetector::startAcquisition(){ if (ret!=OK) ret1=FAIL; } - } + }*/ return ret1; }; @@ -1213,6 +1238,8 @@ int multiSlsDetector::stopAcquisition(){ int i=0; int ret=OK, ret1=OK; + + i=thisMultiDetector->masterPosition; if (thisMultiDetector->masterPosition>=0) { @@ -3474,11 +3501,13 @@ int multiSlsDetector::getMaxMods() { int multiSlsDetector::getTotalNumberOfChannels(){thisMultiDetector->numberOfChannels=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; id++) thisMultiDetector->numberOfChannels+=detectors[id]->getTotalNumberOfChannels(); return thisMultiDetector->numberOfChannels;}; - int multiSlsDetector::getTotalNumberOfChannels(dimension d){thisMultiDetector->numberOfChannel[d]=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; id++) thisMultiDetector->numberOfChannel[d]+=detectors[id]->getTotalNumberOfChannels(d); return thisMultiDetector->numberOfChannel[d];}; + //int multiSlsDetector::getTotalNumberOfChannels(dimension d){thisMultiDetector->numberOfChannel[d]=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; id++) thisMultiDetector->numberOfChannel[d]+=detectors[id]->getTotalNumberOfChannels(d); return thisMultiDetector->numberOfChannel[d];}; + int multiSlsDetector::getTotalNumberOfChannels(dimension d){updateOffsets();return thisMultiDetector->numberOfChannel[d];}; int multiSlsDetector::getMaxNumberOfChannels(){thisMultiDetector->maxNumberOfChannels=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; id++) thisMultiDetector->maxNumberOfChannels+=detectors[id]->getMaxNumberOfChannels();return thisMultiDetector->maxNumberOfChannels;}; - int multiSlsDetector::getMaxNumberOfChannels(dimension d){thisMultiDetector->maxNumberOfChannel[d]=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; id++) thisMultiDetector->maxNumberOfChannel[d]+=detectors[id]->getMaxNumberOfChannels(d);return thisMultiDetector->maxNumberOfChannel[d];}; + // int multiSlsDetector::getMaxNumberOfChannels(dimension d){thisMultiDetector->maxNumberOfChannel[d]=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; id++) thisMultiDetector->maxNumberOfChannel[d]+=detectors[id]->getMaxNumberOfChannels(d);return thisMultiDetector->maxNumberOfChannel[d];}; + int multiSlsDetector::getMaxNumberOfChannels(dimension d){updateOffsets();return thisMultiDetector->maxNumberOfChannel[d];}; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 893135563..dbcb1a3f5 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -488,6 +488,8 @@ int slsDetector::initializeDetectorSize(detectorType type) { thisDetector->receiverTCPPort=DEFAULT_PORTNO+2; /** set receiver udp port */ thisDetector->receiverUDPPort=DEFAULT_UDP_PORTNO; + /** set receiver udp port for Eiger */ + thisDetector->receiverUDPPort2=DEFAULT_UDP_PORTNO+1; /** set receiver ip address/hostname */ strcpy(thisDetector->receiver_hostname,"none"); /** set receiver udp ip address */ @@ -4838,6 +4840,15 @@ char* slsDetector::setNetworkParameter(networkParameter index, string value) { sscanf(value.c_str(),"%d",&i); setReceiverUDPPort(i); return getReceiverUDPPort(); + case RECEIVER_UDP_PORT2: + sscanf(value.c_str(),"%d",&i); + if(thisDetector->myDetectorType == EIGER) + setReceiverUDPPort2(i); + else + setReceiverUDPPort(i); + if(thisDetector->myDetectorType == EIGER) + return getReceiverUDPPort2(); + return getReceiverUDPPort(); default: return ("unknown network parameter"); } @@ -4867,6 +4878,9 @@ char* slsDetector::getNetworkParameter(networkParameter index) { case RECEIVER_UDP_PORT: return getReceiverUDPPort(); break; + case RECEIVER_UDP_PORT2: + return getReceiverUDPPort2(); + break; default: return ("unknown network parameter"); } @@ -5012,14 +5026,17 @@ int slsDetector::setReceiverUDPPort(int udpport){ return thisDetector->receiverUDPPort; } - +int slsDetector::setReceiverUDPPort2(int udpport){ + thisDetector->receiverUDPPort2 = udpport; + return thisDetector->receiverUDPPort2; +} int slsDetector::setUDPConnection(){ int ret = FAIL; int fnum = F_SETUP_RECEIVER_UDP; - char args[2][MAX_STR_LENGTH]; + char args[3][MAX_STR_LENGTH]; char retval[MAX_STR_LENGTH]=""; @@ -5043,9 +5060,11 @@ int slsDetector::setUDPConnection(){ //copy arguments to args[][] strcpy(args[0],thisDetector->receiverUDPIP); 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; #endif //set up receiver for UDP Connection and get receivermac address @@ -5084,7 +5103,7 @@ int slsDetector::configureMAC(){ int ret=FAIL; int fnum=F_CONFIGURE_MAC,fnum2=F_RECEIVER_SHORT_FRAME; char mess[100]; - char arg[5][50]; + char arg[6][50]; char cword[50]="", *pcword; string sword; int retval=-1; @@ -5112,6 +5131,7 @@ int slsDetector::configureMAC(){ 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; @@ -5174,6 +5194,9 @@ int slsDetector::configureMAC(){ #ifdef VERBOSE std::cout<<"detector ip:"<onlineFlag==ONLINE_FLAG) { diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 6ffb42c04..736334dd9 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -240,6 +240,8 @@ class slsDetector : public slsDetectorUtils, public energyConversion { int receiverTCPPort; /** is the port used to communicate between detector and the receiver*/ int receiverUDPPort; + /** is the port used to communicate between second half module of Eiger detector and the receiver*/ + int receiverUDPPort2; /** ip address of the receiver for the detector to send packets to**/ char receiverUDPIP[MAX_STR_LENGTH]; /** mac address of receiver for the detector to send packets to **/ @@ -1603,6 +1605,8 @@ class slsDetector : public slsDetectorUtils, public energyConversion { char* getReceiverUDPMAC() {return thisDetector->receiverUDPMAC;}; /** returns the receiver UDP IP address \sa sharedSlsDetector */ char* getReceiverUDPPort() {char *c= new char[MAX_STR_LENGTH];sprintf(c,"%d",thisDetector->receiverUDPPort); return c;}; + /** returns the receiver UDP2 for Eiger IP address \sa sharedSlsDetector */ + char* getReceiverUDPPort2() {char *c= new char[MAX_STR_LENGTH];sprintf(c,"%d",thisDetector->receiverUDPPort2); return c;}; /** validates the format of detector MAC address and sets it \sa sharedSlsDetector */ char* setDetectorMAC(string detectorMAC); @@ -1616,6 +1620,8 @@ class slsDetector : public slsDetectorUtils, public energyConversion { char* setReceiverUDPMAC(string udpmac); /** sets the receiver udp port \sa sharedSlsDetector */ int setReceiverUDPPort(int udpport); + /** sets the receiver udp port2 for Eiger \sa sharedSlsDetector */ + int setReceiverUDPPort2(int udpport); /** Sets the read receiver frequency if Receiver read upon gui request, readRxrFrequency=0, diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index cee4a387c..247797606 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -344,6 +344,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; + descrToFuncMap[i].m_pFuncName="rx_udpport2"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + descrToFuncMap[i].m_pFuncName="detectormac"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; @@ -2464,6 +2468,12 @@ string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int actio if (!(sscanf(args[1],"%d",&i))) return ("cannot parse argument") + string(args[1]); } + } else if (cmd=="rx_udpport2") { + t=RECEIVER_UDP_PORT2; + if (action==PUT_ACTION){ + if (!(sscanf(args[1],"%d",&i))) + return ("cannot parse argument") + string(args[1]); + } } else return ("unknown network parameter")+cmd; if (action==PUT_ACTION) @@ -2485,6 +2495,7 @@ string slsDetectorCommand::helpNetworkParameter(int narg, char *args[], int acti os << "rx_udpip ip \n sets receiver udp ip to ip"<< std::endl; os << "rx_udpmac mac \n sets receiver udp mac to mac"<< std::endl; os << "rx_udpport port \n sets receiver udp port to port"<< std::endl; + os << "rx_udpport2 port \n sets receiver udp port to port. For Eiger, it is the second half module and for other detectors, same as rx_udpport"<< std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { os << "detectormac \n gets detector mac "<< std::endl; @@ -2492,6 +2503,8 @@ string slsDetectorCommand::helpNetworkParameter(int narg, char *args[], int acti os << "rx_hostname \n gets receiver ip "<< std::endl; os << "rx_udpmac \n gets receiver udp mac "<< std::endl; os << "rx_udpport \n gets receiver udp port "<< std::endl; + os << "rx_udpport2 \n gets receiver udp port. For Eiger, it is the second half module and for other detectors, same as rx_udpport"<< std::endl; + } return os.str(); diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index e21e69ded..cbe43b571 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -95,7 +95,7 @@ int executeTrimming(enum trimMode mode, int par1, int par2, int imod); #ifndef MYTHEND -int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int udpport, int ival); +int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int udpport, int udpport2, int ival); #endif #ifdef GOTTHARDD diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index f87a7d389..3f15764c5 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -2963,11 +2963,11 @@ int execute_trimming(int file_des) { -int configure_mac(int file_des) { +int configure_mac(int file_des) {printf("in hereeeeee\n"); int retval=-100; int ret=OK,ret1=OK; - char arg[5][50]; + char arg[6][50]; int n; #ifndef MYTHEND @@ -2976,9 +2976,10 @@ int configure_mac(int file_des) { long long int imacadd; long long int idetectormacadd; int udpport; + int udpport2; int detipad; #endif - +printf("111\n"); sprintf(mess,"Can't configure MAC\n"); n = receiveData(file_des,arg,sizeof(arg),OTHER); @@ -2986,7 +2987,7 @@ int configure_mac(int file_des) { sprintf(mess,"Error reading from socket\n"); ret=FAIL; } - +printf("222\n"); #ifdef MYTHEND ret = FAIL; strcpy(mess,"Not applicable/implemented for this detector\n"); @@ -2996,7 +2997,7 @@ int configure_mac(int file_des) { sscanf(arg[2], "%x", &udpport); sscanf(arg[3], "%llx", &idetectormacadd); sscanf(arg[4], "%x", &detipad); - + sscanf(arg[5], "%x", &udpport2); #ifdef SLS_DETECTOR_FUNCTION_LIST @@ -3006,7 +3007,8 @@ int configure_mac(int file_des) { printf("mess:%s\n",mess); } #endif -#ifdef VERBOSE +printf("333\n"); + //#ifdef VERBOSE int i; /*printf("\ndigital_test_bit in server %d\t",digitalTestBit);for gotthard*/ printf("\nipadd %x\t",ipad); @@ -3019,9 +3021,10 @@ int configure_mac(int file_des) { for (i=0;i<6;i++) printf("detector mac adress %d is 0x%x \n",6-i,(unsigned int)(((idetectormacadd>>(8*i))&0xFF))); printf("detipad %x\n",detipad); + printf("udp port2:0x%x\n",udpport2); printf("\n"); printf("Configuring MAC of module %d at port %x\n", imod, udpport); -#endif + //#endif #ifdef SLS_DETECTOR_FUNCTION_LIST if (ret==OK) { @@ -3029,13 +3032,13 @@ int configure_mac(int file_des) { stopStateMachine(); } - retval=configureMAC(ipad,imacadd,idetectormacadd,detipad,udpport,0); /*digitalTestBit);*/ + retval=configureMAC(ipad,imacadd,idetectormacadd,detipad,udpport,udpport2,0); /*digitalTestBit);*/ if(retval==-1) ret=FAIL; } #endif -#ifdef VERBOSE + //#ifdef VERBOSE printf("Configured MAC with retval %d\n", retval); -#endif + //#endif if (ret==FAIL) { printf("configuring MAC of mod %d failed\n", imod); } diff --git a/slsDetectorSoftware/slsReceiverInterface/receiverInterface.cpp b/slsDetectorSoftware/slsReceiverInterface/receiverInterface.cpp index 3a1eaa384..b244cdadc 100644 --- a/slsDetectorSoftware/slsReceiverInterface/receiverInterface.cpp +++ b/slsDetectorSoftware/slsReceiverInterface/receiverInterface.cpp @@ -40,8 +40,8 @@ int receiverInterface::sendString(int fnum, char retval[], char arg[]){ -int receiverInterface::sendUDPDetails(int fnum, char retval[], char arg[2][MAX_STR_LENGTH]){ - char args[2][MAX_STR_LENGTH]; +int receiverInterface::sendUDPDetails(int fnum, char retval[], char arg[3][MAX_STR_LENGTH]){ + char args[3][MAX_STR_LENGTH]; int ret = slsDetectorDefs::FAIL; char mess[100] = ""; diff --git a/slsDetectorSoftware/slsReceiverInterface/receiverInterface.h b/slsDetectorSoftware/slsReceiverInterface/receiverInterface.h index 2dd2221d2..27fbea6a1 100644 --- a/slsDetectorSoftware/slsReceiverInterface/receiverInterface.h +++ b/slsDetectorSoftware/slsReceiverInterface/receiverInterface.h @@ -56,7 +56,7 @@ public: * @param arg value to send * \returns success of operation */ - int sendUDPDetails(int fnum, char retval[], char arg[2][MAX_STR_LENGTH]); + int sendUDPDetails(int fnum, char retval[], char arg[3][MAX_STR_LENGTH]); /**