SCTDdcRequest.cxx

00001 
00002 // This file contains definition of functions to produce 
00003 // DAQ request for DCS data single read (this is the DDC package DdcRequest class modified for SCT DAQ needs)
00004 //                  
00005 //  Created 21.05.2003
00006 //  by A. Abdesselam
00008 
00009 #include    <string>
00010 #include    <vector>
00011 #include    <algorithm>
00012 
00013 #include <ipc/partition.h>
00014 //IS stuff
00015 //#include <is/isinfoany.h>
00016 //#include <is/isnamedinfo.h>
00017 #include <is/info.h>
00018 #include <is/infodictionary.h>
00019 #include <is/infoiterator.h>
00020 #include <is/inforeceiver.h>
00021 #include <is/infoT.h>
00022 #include <unistd.h> // for usleep
00023 
00024 using namespace std;
00025 
00026 #include "sctddc/SCTDdcRequest.hxx" // includes ddc/DdcData.hxx which it probably picks up from /usr/local/atlas/tdaq/cmt/online-00-21-02/installed/include/ddc/DdcData.hxx which should define DDC_DAQ_REQUEST except that it doesn't, whereas /home/abdessel/DDC3/ddc/ddc-03-04-04/src/DdcData.hxx does ...
00027 
00028 SCTDdcRequest::SCTDdcRequest(IPCPartition& partition, string& isServer)
00029     : m_requestReady(false), m_partition(partition), m_requestServer(isServer)
00030 { 
00031   m_infoReceiver = new ISInfoReceiver(partition);
00032 }
00033 
00034 // initilizations related to request vector of float
00035 void SCTDdcRequest::requestReady_vec_init(unsigned int vecSize)
00036   {
00037     //reset the current index
00038     m_requestReady_vec_index = 0;
00039     //erase all previous if any (pehaps from previous call)
00040     m_requestReady_vec.erase(m_requestReady_vec.begin(), m_requestReady_vec.end());
00041     //initialize the vector to false 
00042     for(unsigned int i=0; i<vecSize; i++) 
00043       m_requestReady_vec.push_back(false);
00044     //initialise the local map (pehaps from previous call)
00045     m_floatVecRequestResponse.erase(m_floatVecRequestResponse.begin(), 
00046                     m_floatVecRequestResponse.end());
00047   }
00048 
00049 //test if all the responses came
00050 bool SCTDdcRequest::getRequestReady_vec()
00051   {
00052     bool allRequestReady = true;
00053     for(unsigned int i=0; i<m_requestReady_vec.size(); i++) 
00054       allRequestReady = allRequestReady && m_requestReady_vec[i];
00055     return  allRequestReady;
00056   }
00057 
00058 //tell that one response came:  request =true
00059 void SCTDdcRequest::setRequestReady_vec(bool request)
00060   {
00061     m_requestReady_vec[m_requestReady_vec_index] = request;
00062     m_requestReady_vec_index++;
00063   }
00064 //---------------------------------------------------------------------------------------------------------
00065 void requestCallback(ISCallbackInfo* isCallback)
00066 //---------------------------------------------------------------------------------------------------------
00067 {
00068   std::string value_str;
00069   OWLDate value_date;
00070   OWLTime value_time;
00071   //get the calling object (to modify its attributes)
00072   SCTDdcRequest* sctDdcRequest = (SCTDdcRequest*)(isCallback->parameter());
00073 
00074   //define ISInfoAny, we don't know appriori the type of the object in the IS
00075   ISInfoAny dcsData;
00076   if(isCallback->reason() != is::Deleted) 
00077     {
00078       string dpeName = isCallback->name();
00079       isCallback->value(dcsData);
00080     }
00081   // usaly the number of attribute is 2: time and value
00082   int N = dcsData.countAttributes( );
00083   
00084   //cout << "=============== type = " << dcsData.getType() << std::endl;
00085   for (int i=0; i<N; i++)
00086     {
00087       switch(dcsData.getAttributeType())
00088     {
00089     case ISType::Boolean:
00090       //bool
00091       bool value_bool;
00092       dcsData >> value_bool;
00093       sctDdcRequest->setIntRequestResponse(int(value_bool));
00094       sctDdcRequest->setFloatRequestResponse(float(value_bool));//just for protection
00095       sctDdcRequest->setRequestReady(true);
00096       break;
00097     case ISType::S8:
00098     case ISType::U8:
00099     case ISType::S16:
00100       //short
00101       short value_s;
00102       dcsData >> value_s;
00103       sctDdcRequest->setIntRequestResponse(int(value_s));
00104       sctDdcRequest->setFloatRequestResponse(float(value_s));//just for protection
00105       sctDdcRequest->setRequestReady(true);
00106       break;
00107     case ISType::U16:
00108       //unsigned short
00109       unsigned short value_us;
00110       dcsData >> value_us;
00111       sctDdcRequest->setIntRequestResponse(int(value_us));
00112       sctDdcRequest->setFloatRequestResponse(float(value_us));//just for protection
00113       sctDdcRequest->setRequestReady(true);
00114       break;
00115     case ISType::S32:
00116       //long
00117       long value_int;
00118       dcsData >> value_int;
00119       sctDdcRequest->setIntRequestResponse(value_int);
00120       sctDdcRequest->setFloatRequestResponse(float(value_int));//just for protection
00121       sctDdcRequest->setRequestReady(true);
00122       break;
00123     case ISType::U32:
00124       //unsigned lon
00125       unsigned long value_uint;
00126       dcsData >> value_uint;
00127       sctDdcRequest->setIntRequestResponse(value_uint);
00128       sctDdcRequest->setFloatRequestResponse(float(value_uint));//just for protection
00129       sctDdcRequest->setRequestReady(true);
00130       break;
00131     case ISType::Float:
00132       //float
00133       float value_float;
00134       dcsData >> value_float;
00135       sctDdcRequest->setFloatRequestResponse(value_float);
00136       sctDdcRequest->setIntRequestResponse(int(value_float));//just for protection
00137       sctDdcRequest->setRequestReady(true);
00138       break;
00139     case ISType::Double:
00140       //double
00141       double value_d;
00142       dcsData >> value_d;
00143       sctDdcRequest->setFloatRequestResponse(float(value_d));
00144       sctDdcRequest->setIntRequestResponse(int(value_d));//just for protection
00145       sctDdcRequest->setRequestReady(true);
00146       break;
00147     case ISType::String:
00148       //std::string
00149       dcsData >> value_str;
00150       sctDdcRequest->setStringRequestResponse(value_str);
00151       sctDdcRequest->setRequestReady(true);
00152       break;
00153 
00154     case ISType::Date:
00155       //OWLDate
00156       dcsData >> value_date;
00157       std::cerr<<"SCTDdcRequest::requestCallback() DDC_ERROR: variable from dcs is date, "
00158            <<"not implemented inddcRequest class"<< std::endl;
00159       break;
00160     case ISType::Time:
00161       //OWLTine
00162       dcsData >> value_time;
00163       //cerr<<"DDC_ERROR: variable from dcs is time, "
00164       //    <<"not implemented inddcRequest class"<< endl;
00165       break;
00166       
00167       
00168     default:
00169       cout << "SCTDdcRequest::requestCallback() DDC_ERROR: Invalid Type" 
00170            << (long)dcsData.getAttributeType() << std::endl;
00171     }
00172     }
00173 }
00174 
00175 //---------------------------------------------------------------------------------------------------------
00176 void floatArrayRequestCallback(ISCallbackInfo* isCallback)
00177 //---------------------------------------------------------------------------------------------------------
00178 {
00179   OWLTime value_time;
00180   //get the calling object (to modify its attributes)
00181   SCTDdcRequest* sctDdcRequest = (SCTDdcRequest*)(isCallback->parameter());
00182 
00183   //define ISInfoAny, we don't know appriori the type of the object in the IS
00184   ISInfoAny dcsData;
00185   if(isCallback->reason() != is::Deleted) 
00186     {
00187       string dpeName = isCallback->name();
00188       isCallback->value(dcsData);
00189     }
00190 
00191   //read the first item that is the time
00192   dcsData >> value_time;
00193 
00194   //read then the array of float
00195   float *float_array;
00196   size_t  array_size;
00197 
00198   dcsData.get(&float_array, array_size);
00199   sctDdcRequest->setFloatArrayRequestResponse(float_array, int(array_size));
00200   sctDdcRequest->setRequestReady(true);
00201   
00202   return;
00203 }
00204 
00205 //---------------------------------------------------------------------------------------------------------
00206 void requestFloatVecCallback(ISCallbackInfo* isCallback)
00207 //---------------------------------------------------------------------------------------------------------
00208 {
00209   std::string value_str;
00210   OWLDate value_date;
00211   OWLTime value_time;
00212   string dpeName;
00213 
00214   //get the calling object (to modify its attributes)
00215   SCTDdcRequest* sctDdcRequest = (SCTDdcRequest*)(isCallback->parameter());
00216 
00217   //define ISInfoAny, we don't know appriori the type of the object in the IS
00218   ISInfoAny dcsData;
00219   if(isCallback->reason() != is::Deleted) 
00220     {
00221       dpeName = isCallback->name();
00222       //get the name of the prameter; the fromat of dpeName is: ISserve.path.parameter.Recv (.Send)
00223       unsigned int position = dpeName.find(".Recv");
00224       if(position != string::npos) dpeName = dpeName.substr(0,position);
00225       position = dpeName.find(".Send");
00226       if(position != string::npos) dpeName = dpeName.substr(0,position);
00227       dpeName = dpeName.substr(dpeName.find_last_of(".")+1, dpeName.size());
00228       isCallback->value(dcsData);
00229     }
00230   // usaly the number of attribute is 2: time and value
00231   int N = dcsData.countAttributes( );
00232   
00233   //cout << "    " << N << " attribute(s):" << std::endl;
00234   for (int i=0; i<N; i++)
00235     {
00236       switch(dcsData.getAttributeType())
00237     {
00238     case ISType::Boolean:
00239       //bool
00240       bool value_bool;
00241       dcsData >> value_bool;
00242       sctDdcRequest->setfloatVecRequestResponse(dpeName, float(value_bool));
00243       sctDdcRequest->setRequestReady_vec(true);
00244       break;
00245     case ISType::S8:
00246     case ISType::U8:
00247     case ISType::S16:
00248       //short
00249       short value_s;
00250       dcsData >> value_s;
00251       sctDdcRequest->setfloatVecRequestResponse(dpeName, float(value_s));
00252       sctDdcRequest->setRequestReady_vec(true);
00253       break;
00254     case ISType::U16:
00255       //unsigned short
00256       unsigned short value_us;
00257       dcsData >> value_us;
00258       sctDdcRequest->setfloatVecRequestResponse(dpeName, float(value_us));
00259       sctDdcRequest->setRequestReady_vec(true);
00260       break;
00261     case ISType::S32:
00262       //long
00263       long value_int;
00264       dcsData >> value_int;
00265       sctDdcRequest->setfloatVecRequestResponse(dpeName, float(value_int));
00266       sctDdcRequest->setRequestReady_vec(true);
00267       break;
00268     case ISType::U32:
00269       //unsigned lon
00270       unsigned long value_uint;
00271       dcsData >> value_uint;
00272       sctDdcRequest->setfloatVecRequestResponse(dpeName, float(value_uint));
00273       sctDdcRequest->setRequestReady_vec(true);
00274       break;
00275     case ISType::Float:
00276       //float
00277       float value_float;
00278       dcsData >> value_float;
00279       sctDdcRequest->setfloatVecRequestResponse(dpeName, value_float);
00280       sctDdcRequest->setRequestReady_vec(true);
00281       break;
00282     case ISType::Double:
00283       //double
00284       double value_d;
00285       dcsData >> value_d;
00286       sctDdcRequest->setfloatVecRequestResponse(dpeName, float(value_d));
00287       sctDdcRequest->setRequestReady_vec(true);
00288       break;
00289     case ISType::String:
00290       //std::string
00291       dcsData >> value_str;
00292       std::cerr
00293         <<"SCTDdcRequest::requestFloatVecCallback(..) DDC_ERROR: variable ("<<dpeName
00294            <<") is string, that is not supported in ddcRequest class"<< std::endl;
00295       break;
00296     case ISType::Date:
00297       //OWLDate
00298       dcsData >> value_date;
00299       std::cerr
00300         <<"SCTDdcRequest::requestFloatVecCallback(..) DDC_ERROR: variable ("<<dpeName
00301            <<") is date, that is not supported in ddcRequest class"<< std::endl;
00302       break;
00303     case ISType::Time:
00304       //OWLTine
00305       dcsData >> value_time;
00306       //cerr<<"DDC_ERROR: variable from dcs is time, "
00307       //    <<"not implemented inddcRequest class"<< endl;
00308       break;
00309       
00310     default:
00311       cout << "SCTDdcRequest::requestCallback() DDC_ERROR: Invalid Type" 
00312            << (long)dcsData.getAttributeType() << std::endl;
00313     }
00314     }
00315   //dcsData.reset();
00316 }
00317 
00318 //this method is to read int from DCS
00319 //---------------------------------------------------------------------------------------------------------
00320 void SCTDdcRequest::ddcSendRequest(string& dpeName, int& value, int timeout)
00321 //---------------------------------------------------------------------------------------------------------
00322 {
00323   
00324   ISInfo::Status rc;
00325   // IS server and PVSS DataPoint address
00326   string server_dpeName = m_requestServer + "." + dpeName;
00327 
00328   // first subscribe for the request repply 
00329   rc = m_infoReceiver->subscribe(server_dpeName.c_str(), requestCallback, (void*)this);
00330   if(rc != ISInfo::Success) 
00331     {
00332       cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: " << server_dpeName
00333        << " subscription fault " << rc << ". No IS server to send request" << endl;
00334     }
00335   
00336   time_t startRequestTime = time(&startRequestTime);
00337   // then send request
00338 
00339   //================================code from Slava
00340   ISInfo::Status exportResult = ISInfo::Success;
00341   string isObName;
00342   time_t currTime;
00343   
00344   isObName = m_requestServer + '.';
00345   isObName += DAQ_DATA_REQUEST;
00346   
00347   DcsSingleData<string>* ddcRequestForData 
00348     = new DcsSingleData<string>(time(&currTime), m_partition, (char*)isObName.c_str());
00349   ddcRequestForData->setValue(server_dpeName);
00350   exportResult = ddcRequestForData->checkin();
00351   if(exportResult == ISInfo::CommFailure) 
00352     {
00353       cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: " 
00354        << ctime((const time_t*)&currTime) << " IS server "
00355        << m_requestServer << " for DAQ's data requests in partition "
00356        << m_partition.name() << " does not run!" << endl;
00357     }
00358   //delete ddcRequestForData;
00359   //==================================end of code from Slava
00360   
00361   // wait for the request to be ready or the time to be out
00362   int deltaRequestTime = 0;
00363   while(!m_requestReady && deltaRequestTime< timeout)
00364     {
00365       usleep(10); // wait in micro seconds
00366       time_t timenow = time(&timenow);
00367       deltaRequestTime = timenow - startRequestTime;
00368     }
00369   // if time is out
00370   if(!m_requestReady)
00371     {
00372       cerr << "DDC_ERROR: request waiting time for "<<dpeName
00373        <<" is out!!, stupid value is returned!!"<<endl;
00374       m_infoReceiver->unsubscribe(server_dpeName.c_str());
00375       value = 9999999;
00376       delete ddcRequestForData;
00377       return;
00378     }
00379 
00380   //retune requested value
00381   value = m_intRequestResponse;
00382  //reset request to not ready (enable fro another request)
00383   m_requestReady = false;
00384 
00385   // Remove the request
00386   ddcRequestForData->remove();
00387   delete ddcRequestForData;
00388   m_infoReceiver->unsubscribe(server_dpeName.c_str());
00389 
00390 
00391   return;
00392 }
00393 
00394 //this method is to read array of float (dyn_Float) from DCS
00395 //---------------------------------------------------------------------------------------------------------
00396 void SCTDdcRequest::ddcSendRequest(string& dpeName, float* float_array, int& array_size, int timeout)
00397 //---------------------------------------------------------------------------------------------------------
00398 {
00399   
00400   ISInfo::Status rc;
00401   // IS server and PVSS DataPoint address
00402   string server_dpeName = m_requestServer + "." + dpeName;
00403 
00404   // first subscribe for the request repply 
00405   rc = m_infoReceiver->subscribe(server_dpeName.c_str(), 
00406                  floatArrayRequestCallback, (void*)this);
00407   if(rc != ISInfo::Success) 
00408     {
00409       cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: " << server_dpeName
00410        << " subscription fault " << rc << ". No IS server to send request" << endl;
00411     }
00412   
00413   time_t startRequestTime = time(&startRequestTime);
00414   // then send request
00415 
00416   //================================code from Slava
00417   ISInfo::Status exportResult = ISInfo::Success;
00418   string isObName;
00419   time_t currTime;
00420   
00421   isObName = m_requestServer + '.';
00422   isObName += DAQ_DATA_REQUEST;
00423   
00424   DcsSingleData<string>* ddcRequestForData 
00425     = new DcsSingleData<string>(time(&currTime), m_partition, (char*)isObName.c_str());
00426   ddcRequestForData->setValue(server_dpeName);
00427   exportResult = ddcRequestForData->checkin();
00428   if(exportResult == ISInfo::CommFailure) 
00429     {
00430       cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: " 
00431        << ctime((const time_t*)&currTime) << " IS server "
00432        << m_requestServer << " for DAQ's data requests in partition "
00433        << m_partition.name() << " does not run!" << endl;
00434     }
00435   //delete ddcRequestForData;
00436   //==================================end of code from Slava
00437   
00438   // wait for the request to be ready or the time to be out
00439   int deltaRequestTime = 0;
00440   while(!m_requestReady && deltaRequestTime< timeout)
00441     {
00442       usleep(10); // wait in micro seconds
00443       time_t timenow = time(&timenow);
00444       deltaRequestTime = timenow - startRequestTime;
00445     }
00446   // if time is out
00447   if(!m_requestReady)
00448     {
00449       cerr << "DDC_ERROR: request waiting time for "<<dpeName
00450        <<" is out!!, stupid value is returned!!"<<endl;
00451       m_infoReceiver->unsubscribe(server_dpeName.c_str());
00452       float_array = NULL;
00453       delete ddcRequestForData;
00454       return;
00455     }
00456 
00457   //retune requested array
00458   array_size = m_floatArraySizeRequestResponse;
00459   for(int i=0; i<array_size; i++)
00460     {
00461       float_array[i] = m_floatArrayRequestResponse[i];
00462     }
00463   //reset request to not ready (enable fro another request)
00464   m_requestReady = false;
00465 
00466   // Remove the request
00467   ddcRequestForData->remove();
00468   delete ddcRequestForData;
00469   m_infoReceiver->unsubscribe(server_dpeName.c_str());
00470 
00471   return;
00472 }
00473 
00474 //this method is to read float from DCS
00475 //---------------------------------------------------------------------------------------------------------
00476 void SCTDdcRequest::ddcSendRequest(string& dpeName, float& value, int timeout)
00477 //---------------------------------------------------------------------------------------------------------
00478 {
00479   
00480   ISInfo::Status rc;
00481   // IS server and PVSS DataPoint address
00482   string server_dpeName = m_requestServer + "." + dpeName;
00483 
00484   // first subscribe for the request repply 
00485   rc = m_infoReceiver->subscribe(server_dpeName.c_str(), requestCallback, (void*)this);
00486   if(rc != ISInfo::Success) 
00487     {
00488       cerr << "SCTDdcRequest::ddcSendRequest()  DDC_ERROR: " << server_dpeName
00489        << " subscription fault " << rc << ". No IS server to send request" << endl;
00490     }
00491   
00492   time_t startRequestTime = time(&startRequestTime);
00493   // then send request
00494 
00495   //==========code from Slava
00496   ISInfo::Status exportResult = ISInfo::Success;
00497   string isObName;
00498   time_t currTime;
00499   
00500   isObName = m_requestServer + '.';
00501   isObName += DAQ_DATA_REQUEST;
00502   
00503   DcsSingleData<string>* ddcRequestForData 
00504     = new DcsSingleData<string>(time(&currTime), m_partition, (char*)isObName.c_str());
00505   ddcRequestForData->setValue(server_dpeName);
00506   exportResult = ddcRequestForData->checkin();
00507   if(exportResult == ISInfo::CommFailure) {
00508     cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: " << ctime((const time_t*)&currTime) 
00509      << " IS server "
00510      << m_requestServer << " for DAQ's data requests in partition "
00511      << m_partition.name() << " does not run!" << endl;
00512   }
00513   //delete ddcRequestForData;
00514   //===========end of code from Slava
00515   
00516   // wait for the request to be ready or the time to be out
00517   int deltaRequestTime = 0;
00518   while(!m_requestReady && deltaRequestTime< timeout)
00519     {
00520       usleep(10); // wait in micro seconds
00521       time_t timenow = time(&timenow);
00522       deltaRequestTime = timenow - startRequestTime;
00523     }
00524   // if time is out
00525   if(!m_requestReady)
00526     {
00527       cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: request waiting time for "
00528        <<dpeName<<" is out!!"<<endl;
00529       m_infoReceiver->unsubscribe(server_dpeName.c_str());
00530       value = 9999999;
00531       delete ddcRequestForData;
00532       return;
00533     }
00534 
00535   //retune requested value
00536   value = m_floatRequestResponse;
00537  //reset request to not ready (enable fro another request)
00538   m_requestReady = false;
00539 
00540   // Remove the request
00541   ddcRequestForData->remove();
00542   delete ddcRequestForData;
00543   m_infoReceiver->unsubscribe(server_dpeName.c_str());
00544 
00545   return;
00546 }
00547 
00548 //this method is to read string from DCS
00549 //---------------------------------------------------------------------------------------------------------
00550 void SCTDdcRequest::ddcSendRequest(string& dpeName, string& value, int timeout)
00551 //---------------------------------------------------------------------------------------------------------
00552 {
00553   
00554   ISInfo::Status rc;
00555   // IS server and PVSS DataPoint address
00556   string server_dpeName = m_requestServer + "." + dpeName;
00557 
00558   // first subscribe for the request repply 
00559   rc = m_infoReceiver->subscribe(server_dpeName.c_str(), requestCallback, (void*)this);
00560   if(rc != ISInfo::Success) 
00561     {
00562       cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: " << server_dpeName
00563        << " subscription fault " << rc << ". No IS server to send request" << endl;
00564     }
00565   
00566   time_t startRequestTime = time(&startRequestTime);
00567   // then send request
00568 
00569   //==========code from Slava
00570   ISInfo::Status    exportResult = ISInfo::Success;
00571   string            isObName;
00572   time_t            currTime;
00573   
00574   isObName = m_requestServer + '.';
00575   isObName += DAQ_DATA_REQUEST;
00576   
00577   DcsSingleData<string>* ddcRequestForData 
00578     = new DcsSingleData<string>(time(&currTime), m_partition, (char*)isObName.c_str());
00579   ddcRequestForData->setValue(server_dpeName);
00580   exportResult = ddcRequestForData->checkin();
00581   if(exportResult == ISInfo::CommFailure) {
00582     cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: " 
00583      << ctime((const time_t*)&currTime) << " IS server "
00584      << m_requestServer << " for DAQ's data requests in partition "
00585      << m_partition.name() << " does not run!" << endl;
00586   }
00587   //delete ddcRequestForData;
00588   //==========end of code from Slava
00589   
00590   // wait for the request to be ready or the time to be out
00591   int deltaRequestTime = 0;
00592   while(!m_requestReady && deltaRequestTime< timeout)
00593     {
00594       usleep(10); // wait in micro seconds
00595       time_t timenow = time(&timenow);
00596       deltaRequestTime = timenow - startRequestTime;
00597     }
00598   // if time is out
00599   if(!m_requestReady)
00600     {
00601       cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: request waiting time for "
00602        <<dpeName<<" is out!!"<<endl;
00603       m_infoReceiver->unsubscribe(server_dpeName.c_str());
00604       value = 9999999;
00605       delete ddcRequestForData;
00606       return;
00607     }
00608 
00609   //retune requested value
00610   value = m_stringRequestResponse;
00611   //reset request to not ready (enable fro another request)
00612   m_requestReady = false;
00613 
00614   // Remove the request
00615   ddcRequestForData->remove();
00616   delete ddcRequestForData;
00617   m_infoReceiver->unsubscribe(server_dpeName.c_str());
00618 
00619   return;
00620 }
00621 
00622 //this method is to read several (vector) of float from DCS. Rq: intger are converted to float!
00623 //---------------------------------------------------------------------------------------------------------
00624 void SCTDdcRequest::ddcSendRequest(std::vector<string>& dpeName_vec, 
00625                    std::map<string, float>& values_map, int timeout)
00626 //---------------------------------------------------------------------------------------------------------
00627 {
00628   
00629   ISInfo::Status rc;
00630   //number of parameters (request) in the vector
00631   unsigned int numberOfRequest = dpeName_vec.size();
00632   // IS server and PVSS DataPoint address
00633   std::vector<string> server_dpeName;
00634   // first subscribe for the request repply for all the parameters (datapoint elements)
00635   for(unsigned int i_requ=0; i_requ<numberOfRequest; i_requ++)
00636     {
00637       //name for IS server must be of the form is_server.parameter_path
00638       server_dpeName.push_back(m_requestServer + "." + dpeName_vec[i_requ]);
00639       //subscribe
00640       rc = m_infoReceiver->subscribe(server_dpeName[i_requ].c_str(), requestFloatVecCallback, 
00641                      (void*)this);
00642       if(rc != ISInfo::Success) 
00643     {
00644       cerr << " SCTDdcRequest::ddcSendRequest() DDC_ERROR: " << server_dpeName[i_requ]
00645        << " subscription fault " << rc << ". No IS server to send request" << endl;
00646     }
00647     }
00648 
00649   // initilizations related to request vector of float
00650   requestReady_vec_init(numberOfRequest);
00651   //start sending request time
00652   time_t startRequestTime = time(&startRequestTime);
00653   // then send request
00654 
00655   //================================code from Slava
00656 
00657   ISInfo::Status exportResult = ISInfo::Success;
00658   string isObName;
00659   time_t currTime;
00660   
00661   isObName = m_requestServer + '.';
00662   isObName += DAQ_DATA_REQUEST;
00663   
00664   DcsDataArray<string>* ddcRequestForData 
00665     = new DcsDataArray<string>(time(&currTime), m_partition, (char*)isObName.c_str());
00666   for(unsigned int i_requ=0; i_requ<numberOfRequest; i_requ++)
00667     {
00668       ddcRequestForData->addValue(server_dpeName[i_requ]);
00669     } 
00670   
00671   exportResult = ddcRequestForData->checkin();
00672   
00673   if(exportResult == ISInfo::CommFailure) 
00674     {
00675       cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: " << ctime((const time_t*)&currTime) 
00676        << " IS server "
00677        << m_requestServer << " for DAQ's data requests in partition "
00678        << m_partition.name() << " does not run!" << endl;
00679     }
00680   //delete ddcRequestForData;
00681   //==================================end of code from Slava
00682   // wait for the request to be ready or the time to be out
00683   int deltaRequestTime = 0;
00684   while(!getRequestReady_vec() && deltaRequestTime< timeout)
00685     {
00686       usleep(10); // wait in micro seconds
00687       time_t timenow = time(&timenow);
00688       deltaRequestTime = timenow - startRequestTime;
00689     }
00690 
00691   // if time is out
00692   if(!getRequestReady_vec())
00693     {
00694       cerr << "SCTDdcRequest::ddcSendRequest() DDC_ERROR: request waiting time for vector"
00695        <<" of float is out, or may be just some of the requests didn't come!!"<<endl;
00696     }
00697 
00698   //retune requested value
00699   values_map = m_floatVecRequestResponse;
00700 
00701   // Remove the request
00702   ddcRequestForData->remove();
00703   delete ddcRequestForData;
00704 
00705   //unsubsribe
00706   for(unsigned int i_requ=0; i_requ<numberOfRequest; i_requ++)
00707     {
00708       //name for IS server must be of the form is_server.parameter_path
00709       string server_dpeName = m_requestServer + "." + dpeName_vec[i_requ];
00710       //unsubscribe
00711       m_infoReceiver->unsubscribe(server_dpeName.c_str());
00712     }
00713 
00714   return;
00715 }
00716 
00717 //---------------------------------------------------------------------------------------------------------
00718 void getCallback(ISCallbackInfo* isCallback)
00719 //---------------------------------------------------------------------------------------------------------
00720 {
00721   OWLTime value_time;
00722   //get the calling object (to modify its attributes)
00723   float *value = (float*)(isCallback->parameter());
00724 
00725   //define ISInfoAny, we don't know appriori the type of the object in the IS
00726   ISInfoAny dcsData;
00727 
00728   if(isCallback->reason() != is::Deleted) 
00729     {
00730       isCallback->value(dcsData);
00731     }
00732  
00733   // usaly the number of attribute is 2: time and value
00734   int N = dcsData.countAttributes( );
00735 
00736   for ( int i = 0; i < N; i++ )
00737     {
00738       switch ( dcsData.getAttributeType() )
00739     {
00740     case ISType::Float:
00741       //float
00742       dcsData >> *value;
00743       break;
00744       
00745     case ISType::Time:
00746       //OWLTine
00747       dcsData >> value_time;
00748       break;
00749       
00750     default:
00751       cout << " SCTDdcRequest::getCallback() ERROR: Invalid Type" 
00752            << (long)dcsData.getAttributeType() << std::endl;
00753     }
00754     }
00755   return;
00756 }
00757 
00758 //---------------------------------------------------------------------------------------------------------
00759 void SCTDdcRequest::readFromIS(string dpeName, float& value)
00760 //---------------------------------------------------------------------------------------------------------
00761 {
00762   
00763   ISInfo::Status rc;
00764   // IS server and PVSS DataPoint address
00765   string server_dpeName = "DDC_DT." + dpeName;
00766 
00767   // first subscribe for the request repply 
00768   rc = m_infoReceiver->subscribe(server_dpeName.c_str(), getCallback, (void*)(&value));
00769   if(rc != ISInfo::Success) 
00770     {
00771       cerr << "SCTDdcRequest::readFromIS() DDC_ERROR: " << server_dpeName
00772            << " subscription fault " << rc << ". No IS server to send request" << endl;
00773     }
00774   return;
00775 }
00776 

Generated on Mon Feb 6 14:01:29 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6