included lock receiver and update clients for receiver

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@284 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
l_maliakal_d 2012-10-03 15:12:33 +00:00
parent 980d7ecce0
commit e5c5b76236
8 changed files with 297 additions and 30 deletions

View File

@ -105,6 +105,9 @@ enum {
F_RESET_COUNTER_BLOCK, /**< resets the counter block memory for gotthard */
//receiver
F_SET_RECEIVER_FILE_NAME, /**< sets receiver file name */
F_SET_RECEIVER_FILE_DIR, /**< sets receiver file directory */
@ -117,7 +120,9 @@ enum {
F_GET_RECEIVER_STATUS, /**< gets the status of receiver listening mode */
F_GET_FRAMES_CAUGHT /**< gets the number of frames caught by receiver */
F_GET_FRAMES_CAUGHT, /**< gets the number of frames caught by receiver */
F_LOCK_RECEIVER, /**< locks receiver */
/* Always append functions hereafter!!! */

View File

@ -3736,3 +3736,50 @@ int multiSlsDetector::getFramesCaughtByReciver() {
int multiSlsDetector::lockReceiver(int lock) {
int ret=-100, ret1;
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
if (detectors[idet]) {
ret1=detectors[idet]->lockReceiver(lock);
if (ret==-100)
ret=ret1;
else if (ret!=ret1)
ret=-1;
}
}
return ret;
}
string multiSlsDetector::getReceiverLastClientIP() {
string s0="", s1="",s ;
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
if (detectors[idet]) {
s=detectors[idet]->getReceiverLastClientIP();
if (s0=="")
s0=s;
else
s0+=string("+")+s;
if (s1=="")
s1=s;
else if (s1!=s)
s1="bad";
}
}
if (s1=="bad")
return s0;
else
return s1;
}

View File

@ -1063,6 +1063,18 @@ class multiSlsDetector : public slsDetectorUtils {
*/
int getFramesCaughtByReciver();
/** Locks/Unlocks the connection to the receiver
/param lock sets (1), usets (0), gets (-1) the lock
/returns lock status of the receiver
*/
int lockReceiver(int lock=-1);
/**
Returns the IP of the last client connecting to the receiver
*/
string getReceiverLastClientIP();
protected:

View File

@ -5470,8 +5470,8 @@ string slsDetector::setReceiverFileName(string fileName) {
dataSocket->ReceiveDataOnly(retval,MAX_STR_LENGTH);
}
dataSocket->Disconnect();
/*if (ret==FORCE_UPDATE)
updateReceiver();*/
if (ret==FORCE_UPDATE)
updateReceiver();
}
}
@ -5507,8 +5507,8 @@ string slsDetector::setReceiverFileDir(string fileDir) {
dataSocket->ReceiveDataOnly(retval,MAX_STR_LENGTH);
}
dataSocket->Disconnect();
/*if (ret==FORCE_UPDATE)
updateReceiver();*/
if (ret==FORCE_UPDATE)
updateReceiver();
}
}
return string(retval);
@ -5542,8 +5542,8 @@ int slsDetector::setReceiverFileIndex(int fileIndex) {
dataSocket->ReceiveDataOnly(&retval,sizeof(retval));
}
dataSocket->Disconnect();
/*if (ret==FORCE_UPDATE)
updateReceiver();*/
if (ret==FORCE_UPDATE)
updateReceiver();
}
}
@ -5572,8 +5572,8 @@ int slsDetector::startReceiver(){
std::cout<< "Receiver returned error: " << mess << std::endl;
}
dataSocket->Disconnect();
/*if (ret==FORCE_UPDATE)
updateReceiver();*/
if (ret==FORCE_UPDATE)
updateReceiver();
}
}
}
@ -5603,8 +5603,8 @@ int slsDetector::stopReceiver(){
}
dataSocket->Disconnect();
/*if (ret==FORCE_UPDATE)
updateReceiver();*/
if (ret==FORCE_UPDATE)
updateReceiver();
}
}
}
@ -5636,6 +5636,8 @@ slsDetectorDefs::runStatus slsDetector::getReceiverStatus(){
dataSocket->ReceiveDataOnly(&retval,sizeof(retval));
dataSocket->Disconnect();
if (ret==FORCE_UPDATE)
updateReceiver();
}
}
}
@ -5652,7 +5654,7 @@ int slsDetector::getFramesCaughtByReciver(){
int retval=-1;
#ifdef VERBOSE
std::cout << "Starting Receiver " << std::endl;
std::cout << "Getting Frames Caught by Receiver " << std::endl;
#endif
if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) {
@ -5667,11 +5669,140 @@ int slsDetector::getFramesCaughtByReciver(){
std::cout<< "Receiver returned error: " << mess << std::endl;
}
dataSocket->Disconnect();
/*if (ret==FORCE_UPDATE)
updateReceiver();*/
if (ret==FORCE_UPDATE)
updateReceiver();
}
}
}
return retval;
}
int slsDetector::lockReceiver(int lock){
int fnum=F_LOCK_RECEIVER;
int ret = FAIL;
int retval=-1;
char mess[100];
int arg= lock;
#ifdef VERBOSE
std::cout << "Locking or Unlocking Receiver " << std::endl;
#endif
if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) {
if (dataSocket) {
if (dataSocket->Connect()>=0) {
dataSocket->SendDataOnly(&fnum,sizeof(fnum));
dataSocket->SendDataOnly(&arg,sizeof(arg));
dataSocket->ReceiveDataOnly(&ret,sizeof(ret));
if (ret!=FAIL)
dataSocket->ReceiveDataOnly(&retval,sizeof(retval));
else{
dataSocket->ReceiveDataOnly(mess,sizeof(mess));
std::cout<< "Receiver returned error: " << mess << std::endl;
}
dataSocket->Disconnect();
if (ret==FORCE_UPDATE)
updateReceiver();
}
}
}
return retval;
}
string slsDetector::getReceiverLastClientIP(){
int fnum=F_GET_LAST_CLIENT_IP;
int ret = FAIL;
char retval[INET_ADDRSTRLEN];
char mess[100];
#ifdef VERBOSE
std::cout << "Geting Last Client IP connected to Receiver " << std::endl;
#endif
if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) {
if (dataSocket) {
if (dataSocket->Connect()>=0) {
dataSocket->SendDataOnly(&fnum,sizeof(fnum));
dataSocket->ReceiveDataOnly(&ret,sizeof(ret));
if (ret!=FAIL)
dataSocket->ReceiveDataOnly(retval,sizeof(retval));
else{
dataSocket->ReceiveDataOnly(mess,sizeof(mess));
std::cout<< "Receiver returned error: " << mess << std::endl;
}
dataSocket->Disconnect();
if (ret==FORCE_UPDATE)
updateReceiver();
}
}
}
return string(retval);
}
int slsDetector::updateReceiverNoWait() {
int n,ind;
char path[MAX_STR_LENGTH];
char lastClientIP[INET_ADDRSTRLEN];
n = dataSocket->ReceiveDataOnly(lastClientIP,sizeof(lastClientIP));
#ifdef VERBOSE
cout << "Updating receiver last modified by " << lastClientIP << std::endl;
#endif
n = dataSocket->ReceiveDataOnly(&ind,sizeof(ind)); cout<<"index:"<<ind<<endl;
//thisDetector->xx=xx;update file index how?
n = dataSocket->ReceiveDataOnly(path,MAX_STR_LENGTH); cout<<"path:"<<path<<endl;
//thisDetector->xx=xx;update file index how?
n = dataSocket->ReceiveDataOnly(path,MAX_STR_LENGTH); cout<<"name:"<<path<<endl;
//thisDetector->xx=xx;update file index how?
return OK;
}
int slsDetector::updateReceiver() {
int fnum=F_UPDATE_CLIENT;
int ret=OK;
char mess[100];
if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) {
if (dataSocket) {
if (dataSocket->Connect()>=0) {
dataSocket->SendDataOnly(&fnum,sizeof(fnum));
dataSocket->ReceiveDataOnly(&ret,sizeof(ret));
if (ret!=FAIL)
updateReceiverNoWait();
else{
dataSocket->ReceiveDataOnly(mess,sizeof(mess));
std::cout<< "Receiver returned error: " << mess << std::endl;
}
dataSocket->Disconnect();
}
}
}
return ret;
}

View File

@ -1429,6 +1429,29 @@ typedef struct sharedSlsDetector {
*/
int getFramesCaughtByReciver();
/** Locks/Unlocks the connection to the receiver
/param lock sets (1), usets (0), gets (-1) the lock
/returns lock status of the receiver
*/
int lockReceiver(int lock=-1);
/**
Returns the IP of the last client connecting to the receiver
*/
string getReceiverLastClientIP();
/**
updates the shared memory receiving the data from the detector (without asking and closing the connection
/returns OK
*/
int updateReceiverNoWait();
/**
updates the shared memory receiving the data from the detector
/returns OK
*/
int updateReceiver();
protected:

View File

@ -477,6 +477,12 @@ int64_t setNumberOfCycles(int64_t t=-1){return setTimer(CYCLES_NUMBER,t);};
*/
virtual int getFramesCaughtByReciver()=0;
/** Locks/Unlocks the connection to the receiver
/param lock sets (1), usets (0), gets (-1) the lock
/returns lock status of the receiver
*/
virtual int lockReceiver(int lock=-1)=0;
/** returns detector type string from detector type index
\param t string can be Mythen, Pilatus, Eiger, Gotthard, Agipd, Unknown

View File

@ -655,6 +655,13 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) {
descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver;
i++;
descrToFuncMap[i].m_pFuncName="r_lock"; //
descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLock;
i++;
descrToFuncMap[i].m_pFuncName="r_lastclient"; //
descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLastClient;
i++;
numberOfCommands=i;
@ -2265,15 +2272,37 @@ string slsDetectorCommand::cmdLock(int narg, char *args[], int action) {
int val;//, ret;
char ans[1000];
myDet->setOnline(ONLINE_FLAG);
if (action==PUT_ACTION) {
if (sscanf(args[1],"%d",&val))
myDet->lockServer(val);
else
return string("could not lock status")+string(args[1]);
if(cmd=="lock"){
myDet->setOnline(ONLINE_FLAG);
if (action==PUT_ACTION) {
if (sscanf(args[1],"%d",&val))
myDet->lockServer(val);
else
return string("could not lock status")+string(args[1]);
}
sprintf(ans,"%d",myDet->lockServer());
}
sprintf(ans,"%d",myDet->lockServer());
else if(cmd=="r_lock"){
if(myDet->setReceiverOnline(ONLINE_FLAG)!=ONLINE_FLAG)
return string("could not connect to receiver");
if (action==PUT_ACTION) {
if (!sscanf(args[1],"%d",&val))
return string("could not decode lock status")+string(args[1]);
if(myDet->lockReceiver(val)!=val)
return string("could not lock/unlock receiver");
}
sprintf(ans,"%d",myDet->lockReceiver());
}
else
return string("could not decode command");
return string(ans);
}
@ -2285,10 +2314,11 @@ string slsDetectorCommand::helpLock(int narg, char *args[], int action) {
ostringstream os;
if (action==PUT_ACTION || action==HELP_ACTION) {
os << "lock i \n locks (1) or unlocks (0) the detector to communicate to this client"<< std::endl;
os << "r_lock i \n locks (1) or unlocks (0) the receiver to communicate to this client"<< std::endl;
}
if (action==GET_ACTION || action==HELP_ACTION) {
os << "lock \n returns the detector lock status"<< std::endl;
os << "r_lock \n returns the receiver lock status"<< std::endl;
}
return os.str();
@ -2301,13 +2331,21 @@ string slsDetectorCommand::cmdLastClient(int narg, char *args[], int action) {
if (action==HELP_ACTION)
return helpLastClient(narg,args,action);
myDet->setOnline(ONLINE_FLAG);
if (action==PUT_ACTION)
return string("cannot set");
return myDet->getLastClientIP();
return string("cannot set");
if(cmd=="lastclient"){
myDet->setOnline(ONLINE_FLAG);
return myDet->getLastClientIP();
}
else if(cmd=="r_lastclient"){
if(myDet->setReceiverOnline(ONLINE_FLAG)!=ONLINE_FLAG)
return string("could not connect to receiver");
return myDet->getReceiverLastClientIP();
}
}
string slsDetectorCommand::helpLastClient(int narg, char *args[], int action) {
@ -2316,6 +2354,7 @@ string slsDetectorCommand::helpLastClient(int narg, char *args[], int action) {
ostringstream os;
if (action==GET_ACTION || action==HELP_ACTION) {
os << "lastclient \n returns the last client communicating with the detector"<< std::endl;
os << "r_lastclient \n returns the last client communicating with the receiver"<< std::endl;
}
return os.str();

View File

@ -162,7 +162,7 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing {
/**
gets the network parameters (implemented for gotthard)
\param i network parameter type can be CLIENT_IP, CLIENT_MAC, SERVER_MAC
\param i network parameter type can be RECEIVER_IP, RECEIVER_MAC, SERVER_MAC
\returns parameter
*/
@ -170,7 +170,7 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing {
/**
sets the network parameters (implemented for gotthard)
\param i network parameter type can be CLIENT_IP, CLIENT_MAC, SERVER_MAC
\param i network parameter type can be RECEIVER_IP, RECEIVER_MAC, SERVER_MAC
\param s value to be set
\returns parameter
@ -581,6 +581,10 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing {
*/
virtual string checkReceiverOnline()=0;
/**
Returns the IP of the last client connecting to the receiver
*/
virtual string getReceiverLastClientIP()=0;
protected: