client gives now 3d positions of detector to be configured in udp header, only in jungfrau firmware till now

This commit is contained in:
Dhanya Maliakal 2017-09-22 15:28:57 +02:00
parent 5a8f30fee8
commit 663fd557ff
8 changed files with 76 additions and 22 deletions

View File

@ -1043,7 +1043,25 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t
} }
int setDetectorPosition(int pos[]) {
int ret = OK;
bus_w(COORD_0, bus_r(COORD_0) | ((pos[0] << COORD_0_X_OFST) & COORD_0_X_MSK));
if ((bus_r(COORD_0) & COORD_0_X_MSK) != ((pos[0] << COORD_0_X_OFST) & COORD_0_X_MSK))
ret = FAIL;
bus_w(COORD_0, bus_r(COORD_0) | ((pos[1] << COORD_0_Y_OFST) & COORD_0_Y_MSK));
if ((bus_r(COORD_0) & COORD_0_Y_MSK) != ((pos[1] << COORD_0_Y_OFST) & COORD_0_Y_MSK))
ret = FAIL;
bus_w(COORD_1, bus_r(COORD_1) | ((pos[2] << COORD_0_Z_OFST) & COORD_0_Z_MSK));
if ((bus_r(COORD_1) & COORD_0_Z_MSK) != ((pos[2] << COORD_0_Z_OFST) & COORD_0_Z_MSK))
ret = FAIL;
if (ret == OK)
printf("Position set to [%d, %d, %d]\n", pos[0], pos[1], pos[2]);
return ret;
}

View File

@ -116,6 +116,8 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1)
thisMultiDetector->onlineFlag = ONLINE_FLAG; thisMultiDetector->onlineFlag = ONLINE_FLAG;
thisMultiDetector->receiverOnlineFlag = OFFLINE_FLAG; thisMultiDetector->receiverOnlineFlag = OFFLINE_FLAG;
thisMultiDetector->numberOfDetectors=0; thisMultiDetector->numberOfDetectors=0;
thisMultiDetector->numberOfDetector[X]=0;
thisMultiDetector->numberOfDetector[Y]=0;
for (int id=0; id<MAXDET; ++id) { for (int id=0; id<MAXDET; ++id) {
thisMultiDetector->detectorIds[id]=-1; thisMultiDetector->detectorIds[id]=-1;
thisMultiDetector->offsetX[id]=0; thisMultiDetector->offsetX[id]=0;
@ -433,6 +435,8 @@ void multiSlsDetector::updateOffsets(){//cannot paralllize due to slsdetector ca
thisMultiDetector->numberOfChannel[Y] = 0; thisMultiDetector->numberOfChannel[Y] = 0;
thisMultiDetector->maxNumberOfChannel[X] = 0; thisMultiDetector->maxNumberOfChannel[X] = 0;
thisMultiDetector->maxNumberOfChannel[Y] = 0; thisMultiDetector->maxNumberOfChannel[Y] = 0;
thisMultiDetector->numberOfDetector[X] = 0;
thisMultiDetector->numberOfDetector[Y] = 0;
for (int i=0; i<thisMultiDetector->numberOfDetectors; ++i) { for (int i=0; i<thisMultiDetector->numberOfDetectors; ++i) {
@ -455,6 +459,8 @@ void multiSlsDetector::updateOffsets(){//cannot paralllize due to slsdetector ca
numY += detectors[i]->getTotalNumberOfChannels(Y); numY += detectors[i]->getTotalNumberOfChannels(Y);
maxX += detectors[i]->getMaxNumberOfChannels(X); maxX += detectors[i]->getMaxNumberOfChannels(X);
maxY += detectors[i]->getMaxNumberOfChannels(Y); maxY += detectors[i]->getMaxNumberOfChannels(Y);
++thisMultiDetector->numberOfDetector[X];
++thisMultiDetector->numberOfDetector[Y];
#ifdef VERBOSE #ifdef VERBOSE
cout<<"incrementing in both direction"<<endl; cout<<"incrementing in both direction"<<endl;
#endif #endif
@ -466,6 +472,7 @@ void multiSlsDetector::updateOffsets(){//cannot paralllize due to slsdetector ca
prevChanY = detectors[i]->getTotalNumberOfChannels(Y); prevChanY = detectors[i]->getTotalNumberOfChannels(Y);
numY += detectors[i]->getTotalNumberOfChannels(Y); numY += detectors[i]->getTotalNumberOfChannels(Y);
maxY += detectors[i]->getMaxNumberOfChannels(Y); maxY += detectors[i]->getMaxNumberOfChannels(Y);
++thisMultiDetector->numberOfDetector[Y];
#ifdef VERBOSE #ifdef VERBOSE
cout<<"incrementing in y direction"<<endl; cout<<"incrementing in y direction"<<endl;
#endif #endif
@ -483,6 +490,7 @@ void multiSlsDetector::updateOffsets(){//cannot paralllize due to slsdetector ca
prevChanX = detectors[i]->getTotalNumberOfChannels(X); prevChanX = detectors[i]->getTotalNumberOfChannels(X);
numX += detectors[i]->getTotalNumberOfChannels(X); numX += detectors[i]->getTotalNumberOfChannels(X);
maxX += detectors[i]->getMaxNumberOfChannels(X); maxX += detectors[i]->getMaxNumberOfChannels(X);
++thisMultiDetector->numberOfDetector[X];
#ifdef VERBOSE #ifdef VERBOSE
cout<<"incrementing in x direction"<<endl; cout<<"incrementing in x direction"<<endl;
#endif #endif
@ -791,24 +799,6 @@ int multiSlsDetector::addSlsDetector(detectorType t, int pos) {
void multiSlsDetector::getNumberOfDetectors(int& nx, int& ny) {
nx = 0; ny = 0;
int offsetx = -1, offsety = -1;
for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) {
if (thisMultiDetector->offsetX[i] > offsetx) {
++nx;
offsetx = thisMultiDetector->offsetX[i];
}
if (thisMultiDetector->offsetY[i] > offsety) {
++ny;
offsety = thisMultiDetector->offsetY[i];
}
}
}
int multiSlsDetector::getDetectorOffset(int pos, int &ox, int &oy) { int multiSlsDetector::getDetectorOffset(int pos, int &ox, int &oy) {
ox=-1; ox=-1;

View File

@ -67,6 +67,9 @@ class multiSlsDetector : public slsDetectorUtils {
/** Number of detectors operated at once */ /** Number of detectors operated at once */
int numberOfDetectors; int numberOfDetectors;
/** Number of detectors operated at once */
int numberOfDetector[2];
/** Ids of the detectors to be operated at once */ /** Ids of the detectors to be operated at once */
int detectorIds[MAXDET]; int detectorIds[MAXDET];
@ -329,11 +332,17 @@ class multiSlsDetector : public slsDetectorUtils {
\returns number of detectors */ \returns number of detectors */
int getNumberOfDetectors() {return thisMultiDetector->numberOfDetectors;}; int getNumberOfDetectors() {return thisMultiDetector->numberOfDetectors;};
/**returns number of detectors in dimension d
* \param d dimension d
* \returns number of detectors in dimension d
*/
int getNumberOfDetectors(dimension d) {return thisMultiDetector->numberOfDetector[d];};
/** returns the number of detectors in each direction /** returns the number of detectors in each direction
\param nx number of detectors in x direction \param nx number of detectors in x direction
\param ny number of detectors in y direction \param ny number of detectors in y direction
*/ */
void getNumberOfDetectors(int& nx, int& ny); void getNumberOfDetectors(int& nx, int& ny){nx=thisMultiDetector->numberOfDetector[X];ny=thisMultiDetector->numberOfDetector[Y];};
int getMaxMods(); int getMaxMods();
int getNMods(); int getNMods();

View File

@ -6407,9 +6407,25 @@ int slsDetector::configureMAC(){
int ret=FAIL; int ret=FAIL;
int fnum=F_CONFIGURE_MAC,fnum2=F_RECEIVER_SHORT_FRAME; int fnum=F_CONFIGURE_MAC,fnum2=F_RECEIVER_SHORT_FRAME;
char mess[MAX_STR_LENGTH]=""; char mess[MAX_STR_LENGTH]="";
char arg[6][50]={"","","","","",""}; char arg[6][50];memset(arg,0,sizeof(char)*6*50);
int retval=-1; int retval=-1;
// to send 3d positions to detector
bool sendpos = 0;
int pos[3]={0,0,0};
// only jungfrau send x, y and z in detector udp header
if (thisDetector->myDetectorType == JUNGFRAU) {
sendpos = true;
int max = parentDet->getNumberOfDetectors(X);
if(!posId) {
pos[0] = 0;
pos[1] = 0;
} else {
pos[0] = posId / max;
pos[1] = posId % max;
}
}
//if udpip wasnt initialized in config file //if udpip wasnt initialized in config file
if(!(strcmp(thisDetector->receiverUDPIP,"none"))){ if(!(strcmp(thisDetector->receiverUDPIP,"none"))){
@ -6434,12 +6450,12 @@ int slsDetector::configureMAC(){
strcpy(arg[3],thisDetector->detectorMAC); strcpy(arg[3],thisDetector->detectorMAC);
strcpy(arg[4],thisDetector->detectorIP); strcpy(arg[4],thisDetector->detectorIP);
sprintf(arg[5],"%x",thisDetector->receiverUDPPort2); sprintf(arg[5],"%x",thisDetector->receiverUDPPort2);
#ifdef VERBOSE #ifdef VERBOSE
std::cout<< "Configuring MAC"<< std::endl; std::cout<< "Configuring MAC"<< std::endl;
#endif #endif
for(i=0;i<2;++i){ for(i=0;i<2;++i){
if(!strcmp(arg[i],"none")){ if(!strcmp(arg[i],"none")){
std::cout<< "Configure MAC Error. IP/MAC Addresses not set"<< std::endl; std::cout<< "Configure MAC Error. IP/MAC Addresses not set"<< std::endl;
@ -6529,6 +6545,8 @@ int slsDetector::configureMAC(){
if (connectControl() == OK){ if (connectControl() == OK){
controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&fnum,sizeof(fnum));
controlSocket->SendDataOnly(arg,sizeof(arg)); controlSocket->SendDataOnly(arg,sizeof(arg));
if(sendpos)
controlSocket->SendDataOnly(pos,sizeof(pos));
controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret));
if (ret==FAIL){ if (ret==FAIL){
controlSocket->ReceiveDataOnly(mess,sizeof(mess)); controlSocket->ReceiveDataOnly(mess,sizeof(mess));

View File

@ -152,6 +152,9 @@ long int calcChecksum(int sourceip, int destip);
#ifndef MYTHEND #ifndef MYTHEND
int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2, int ival); int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2, int ival);
#endif #endif
#ifdef JUNGFRAUD
int setDetectorPosition(int pos[]);
#endif
// very detector specific // very detector specific

View File

@ -3408,6 +3408,10 @@ int configure_mac(int file_des) {
char arg[6][50]; char arg[6][50];
memset(arg,0,sizeof(arg)); memset(arg,0,sizeof(arg));
n = receiveData(file_des,arg,sizeof(arg),OTHER); n = receiveData(file_des,arg,sizeof(arg),OTHER);
#ifdef JUNGFRAUD
int pos[3]={0,0,0};
n = receiveData(file_des,pos,sizeof(pos),INT32);
#endif
if (n < 0) return printSocketReadError(); if (n < 0) return printSocketReadError();
uint32_t ipad; uint32_t ipad;
@ -3456,6 +3460,10 @@ int configure_mac(int file_des) {
printf("udp port2:0x%x\n",udpport2); printf("udp port2:0x%x\n",udpport2);
printf("\n"); printf("\n");
printf("Configuring MAC of module %d at port %x\n", imod, udpport); printf("Configuring MAC of module %d at port %x\n", imod, udpport);
#ifdef JUNGFRAUD
printf("Position: [%d,%d,%d]\n", pos[0],pos[1],pos[2]);
#endif
#endif #endif
if(getRunStatus() == RUNNING){ if(getRunStatus() == RUNNING){
ret = stopStateMachine(); ret = stopStateMachine();
@ -3471,8 +3479,16 @@ int configure_mac(int file_des) {
sprintf(mess,"Configure Mac failed\n"); sprintf(mess,"Configure Mac failed\n");
cprintf(RED, "Warning: %s", mess); cprintf(RED, "Warning: %s", mess);
} }
else else {
printf("Configure MAC successful\n"); printf("Configure MAC successful\n");
#ifdef JUNGFRAUD
ret = setDetectorPosition(pos);
if (ret == FAIL) {
sprintf(mess,"could not set detector position\n");
cprintf(RED, "Warning: %s", mess);
}
#endif
}
#ifdef VERBOSE #ifdef VERBOSE
printf("Configured MAC with retval %d\n", retval); printf("Configured MAC with retval %d\n", retval);
#endif #endif