From 7440ee22552346635c8cb0a8bc0acc574b95c77a Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 10 May 2016 17:06:46 +0200 Subject: [PATCH] receiver udp parameters should be sent to receiver everytime if rx_hostname is set --- .../multiSlsDetector/multiSlsDetector.cpp | 75 +++++++++-------- .../slsDetector/slsDetector.cpp | 84 ++++++++++++++----- 2 files changed, 103 insertions(+), 56 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index f46e40062..7dbc6aeab 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -400,57 +400,67 @@ int multiSlsDetector::addSlsDetector(int id, int pos) { void multiSlsDetector::updateOffsets(){ - cout << endl << "Updating multi detector offsets" << endl; + cout << endl << "Updating Multi-Detector Offsets" << endl; int offsetX=0, offsetY=0, numX=0, numY=0, maxX=0, maxY=0; int maxChanX = thisMultiDetector->maxNumberOfChannelsPerDetector[X]; int maxChanY = thisMultiDetector->maxNumberOfChannelsPerDetector[Y]; + int prevChanX=0; + int prevChanY=0; + bool firstTime = true; + thisMultiDetector->numberOfChannel[X] = 0; - thisMultiDetector->maxNumberOfChannel[X] = 0; thisMultiDetector->numberOfChannel[Y] = 0; + thisMultiDetector->maxNumberOfChannel[X] = 0; thisMultiDetector->maxNumberOfChannel[Y] = 0; - //0th position - if ((detectors[0]) && (thisMultiDetector->numberOfDetectors > 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); - cout << "Detector at position 0: x offset:" << offsetX << " y offset:" << offsetY << endl; - } - - for (int i=1; inumberOfDetectors; i++) { + for (int i=0; inumberOfDetectors; i++) { if (detectors[i]) { - //incrementing in y direction - if ((maxChanY == -1) || ((maxChanY > 0) && ((offsetY + detectors[i]->getMaxNumberOfChannels(Y)) < maxChanY))){ - offsetY += detectors[i]->getMaxNumberOfChannels(Y); - maxY += detectors[i]->getMaxNumberOfChannels(Y); + + //incrementing in both direction + if(firstTime){ + //incrementing in both directions + firstTime = false; + if((maxChanX > 0) && ((offsetX + detectors[i]->getTotalNumberOfChannels(X)) > maxChanX)) + cout<<"\nDetector[" << i << "] exceeds maximum channels allowed for complete detector set in X dimension!" << endl; + if ((maxChanY > 0) && ((offsetY + detectors[i]->getTotalNumberOfChannels(Y)) > maxChanY)) + cout<<"\nDetector[" << i << "] exceeds maximum channels allowed for complete detector set in Y dimension!" << endl; + prevChanX = detectors[i]->getTotalNumberOfChannels(X); + prevChanY = detectors[i]->getTotalNumberOfChannels(Y); + numX += detectors[i]->getTotalNumberOfChannels(X); numY += detectors[i]->getTotalNumberOfChannels(Y); + maxX += detectors[i]->getMaxNumberOfChannels(X); + maxY += detectors[i]->getMaxNumberOfChannels(Y); + cout<<"incrementing in both direction"< 0) && ((offsetY + prevChanY + detectors[i]->getTotalNumberOfChannels(Y)) <= maxChanY))){ + offsetY += prevChanY; + prevChanY = detectors[i]->getTotalNumberOfChannels(Y); + numY += detectors[i]->getTotalNumberOfChannels(Y); + maxY += detectors[i]->getMaxNumberOfChannels(Y); + cout<<"incrementing in y direction"< 0) && ((offsetX + prevChanX + detectors[i]->getTotalNumberOfChannels(X)) > maxChanX)) + cout<<"\nDetector[" << i << "] exceeds maximum channels allowed for complete detector set in X dimension!" << endl; offsetY = 0; - numY = 0; - maxY = 0; - thisMultiDetector->maxNumberOfChannel[Y] = 0; - if ((maxChanX == -1) || ((maxChanX > 0) && ((offsetX + detectors[i]->getMaxNumberOfChannels(X)) < maxChanX))){ - offsetX += detectors[i]->getMaxNumberOfChannels(X); - numX += detectors[i]->getTotalNumberOfChannels(X); - maxX += detectors[i]->getMaxNumberOfChannels(X); - }else{ - offsetX += detectors[i]->getMaxNumberOfChannels(X); - numX += detectors[i]->getTotalNumberOfChannels(X); - maxX += detectors[i]->getMaxNumberOfChannels(X); - cout<<"Detector at position " << i << "exceeds maximum channels allowed for complete detector set in X dimension also!" << endl; - } + offsetX += prevChanX; + prevChanX = detectors[i]->getTotalNumberOfChannels(X); + numX += detectors[i]->getTotalNumberOfChannels(X); + maxX += detectors[i]->getMaxNumberOfChannels(X); + cout<<"incrementing in x direction"<offsetX[i] = offsetX; thisMultiDetector->offsetY[i] = offsetY; - cout << "Detector at position" << i << ": x offset:" << thisMultiDetector->offsetX[i] << " y offset:" << thisMultiDetector->offsetY[i] << endl; + cout << "Detector[" << i << "] has offsets (" << thisMultiDetector->offsetX[i] << ", " << thisMultiDetector->offsetY[i] << ")" << endl; + + //offsetY has been reset sometimes and offsetX the first time, but remember the highest values if(numX > thisMultiDetector->numberOfChannel[X]) thisMultiDetector->numberOfChannel[X] = numX; if(numY > thisMultiDetector->numberOfChannel[Y]) @@ -462,7 +472,6 @@ void multiSlsDetector::updateOffsets(){ } } - cout << "Number of Channels in X direction:" << thisMultiDetector->numberOfChannel[X] << endl; cout << "Number of Channels in Y direction:" << thisMultiDetector->numberOfChannel[Y] << endl << endl; } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 4a23b0384..31003d8a6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -1678,6 +1678,10 @@ int slsDetector::setNumberOfModules(int n, dimension d){ std::cout<< "nModX " << thisDetector->nMod[X] << " nModY " << thisDetector->nMod[Y] << " nChips " << thisDetector->nChips << " nChans " << thisDetector->nChans<< " dr " << dr << std::endl; #endif } + + if(n != GET_FLAG) + parentDet->updateOffsets(); + return thisDetector->nMod[d]; }; @@ -5328,16 +5332,20 @@ char* slsDetector::getNetworkParameter(networkParameter index) { char* slsDetector::setDetectorMAC(string detectorMAC){ if(detectorMAC.length()==17){ if((detectorMAC[2]==':')&&(detectorMAC[5]==':')&&(detectorMAC[8]==':')&& - (detectorMAC[11]==':')&&(detectorMAC[14]==':')) + (detectorMAC[11]==':')&&(detectorMAC[14]==':')){ strcpy(thisDetector->detectorMAC,detectorMAC.c_str()); - else{ + if(!strcmp(thisDetector->receiver_hostname,"none")) + std::cout << "Warning: UDP Set up failed. Receiver hostname not set." << endl; + else if(setUDPConnection()==FAIL) + std::cout<< "Warning: UDP connection set up failed" << std::endl; + }else{ setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - return("server MAC Address should be in xx:xx:xx:xx:xx:xx format"); + std::cout << "Warning: server MAC Address should be in xx:xx:xx:xx:xx:xx format" << endl; } } else{ setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - return("server MAC Address should be in xx:xx:xx:xx:xx:xx format"); + std::cout << "Warning: server MAC Address should be in xx:xx:xx:xx:xx:xx format" << std::endl; } return thisDetector->detectorMAC; @@ -5351,11 +5359,15 @@ char* slsDetector::setDetectorIP(string detectorIP){ if(detectorIP.length()){ if(detectorIP.length()<16){ int result = inet_pton(AF_INET, detectorIP.c_str(), &(sa.sin_addr)); - if(result!=0) + if(result!=0){ strcpy(thisDetector->detectorIP,detectorIP.c_str()); - else{ + if(!strcmp(thisDetector->receiver_hostname,"none")) + std::cout << "Warning: UDP Set up failed. Receiver hostname not set." << endl; + else if(setUDPConnection()==FAIL) + std::cout<< "Warning: UDP connection set up failed" << std::endl; + }else{ setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - return ("Detector IP Address should be VALID and in xxx.xxx.xxx.xxx format"); + std::cout << "Warning: Detector IP Address should be VALID and in xxx.xxx.xxx.xxx format" << std::endl; } } } @@ -5409,8 +5421,6 @@ char* slsDetector::setReceiver(string receiverIP){ setUDPConnection(); if(thisDetector->myDetectorType == EIGER) enableTenGigabitEthernet(thisDetector->tenGigaEnable); - - printReceiverConfiguration(); } } @@ -5426,11 +5436,16 @@ char* slsDetector::setReceiverUDPIP(string udpip){ if(udpip.length()){ if(udpip.length()<16){ int result = inet_pton(AF_INET, udpip.c_str(), &(sa.sin_addr)); - if(result!=0) + 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; + }else{ strcpy(thisDetector->receiverUDPIP,udpip.c_str()); - else{ - setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - return ("Receiver UDP IP Address should be VALID and in xxx.xxx.xxx.xxx format"); + if(!strcmp(thisDetector->receiver_hostname,"none")) + std::cout << "Warning: UDP Set up failed. Receiver hostname not set." << endl; + else if(setUDPConnection()==FAIL){ + std::cout<< "Warning: UDP connection set up failed" << std::endl; + } } } } @@ -5441,20 +5456,26 @@ char* slsDetector::setReceiverUDPIP(string udpip){ char* slsDetector::setReceiverUDPMAC(string udpmac){ - if(udpmac.length()==17){ - if((udpmac[2]==':')&&(udpmac[5]==':')&&(udpmac[8]==':')&& - (udpmac[11]==':')&&(udpmac[14]==':')) - strcpy(thisDetector->receiverUDPMAC,udpmac.c_str()); - else{ - setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - return("receiver udp mac address should be in xx:xx:xx:xx:xx:xx format"); - } + 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; } else{ - setErrorMask((getErrorMask())|(COULDNOT_SET_NETWORK_PARAMETER)); - return("receiver udp mac address should be in xx:xx:xx:xx:xx:xx format"); + 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: UDP Set up failed. Receiver hostname not set." << endl; + else if(setUDPConnection()==FAIL){ + std::cout<< "Warning: UDP connection set up failed" << std::endl; + } + }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; + } } + return thisDetector->receiverUDPMAC; } @@ -5462,11 +5483,21 @@ char* slsDetector::setReceiverUDPMAC(string udpmac){ int slsDetector::setReceiverUDPPort(int udpport){ thisDetector->receiverUDPPort = udpport; + if(!strcmp(thisDetector->receiver_hostname,"none")) + std::cout << "Warning: UDP Set up failed. Receiver hostname not set." << endl; + else if(setUDPConnection()==FAIL){ + std::cout<< "Warning: UDP connection set up failed" << std::endl; + } return thisDetector->receiverUDPPort; } int slsDetector::setReceiverUDPPort2(int udpport){ thisDetector->receiverUDPPort2 = udpport; + if(!strcmp(thisDetector->receiver_hostname,"none")) + std::cout << "Warning: UDP Set up failed. Receiver hostname not set." << endl; + else if(setUDPConnection()==FAIL){ + std::cout<< "Warning: UDP connection set up failed" << std::endl; + } return thisDetector->receiverUDPPort2; } @@ -5478,6 +5509,11 @@ int slsDetector::setUDPConnection(){ char args[3][MAX_STR_LENGTH]; char retval[MAX_STR_LENGTH]=""; + //called before set up + if(!strcmp(thisDetector->receiver_hostname,"none")){ + std::cout << "Warning: UDP Set up failed. Receiver hostname not set." << endl; + return FAIL; + } //if no udp ip given, use hostname if(!strcmp(thisDetector->receiverUDPIP,"none")){ @@ -5488,6 +5524,7 @@ int slsDetector::setUDPConnection(){ else{ struct hostent *he = gethostbyname(thisDetector->receiver_hostname); if (he == NULL){ + cout<<"rx_hostname:"<receiver_hostname<