conduit.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 #ifndef CONDUIT_H
00009 #define CONDUIT_H
00010 
00011 #include <iostream>
00012 #include <vector>
00013 #include <config.h>
00014 #include <cadef.h>
00015 
00016 
00017 #include <channelRegalia.h>
00018 #include <PVDataHolder.h>
00019 #include <PVCtrlHolder.h>
00020 #include <policies.h>
00021 #include <deque>
00022 
00023 #if HAVE_PYTHON_H
00024 
00025   #if HAVE_PYCAFE_EXT
00026         #include <Python.h> //required for PyCafe.h
00027         #include <PyCafe.h>
00028   #else         
00029         #include <PyCafe_api.h>
00030   #endif  
00031 
00032 #endif
00033 
00034 
00040 class Conduit
00041 {
00042 public:
00043                 friend struct change_alarmStatus;
00044                 friend struct change_alarmSeverity;
00045                 friend struct change_epicsTimeStamp;
00046 
00047     friend struct change_accessRightsHandlerArgs;
00048     friend struct change_accessRead;
00049     friend struct change_accessWrite;
00050                 
00051                 friend struct change_beamEventNo;
00052                 
00053     friend struct change_channelDeviceAttribute;
00054     friend struct change_channelID;
00055     friend struct change_channelRegalia;
00056 
00057           friend struct change_channelGetCacheWaitPolicy;
00058           friend struct change_channelGetActionWhenMonitorPolicy;
00059                 
00060     friend struct change_channelRequestDataTypePolicy;
00061  
00062     friend struct change_channelRequestMetaCtrl;
00063     friend struct change_channelRequestMetaCtrlClient;
00064 
00065     friend struct change_channelRequestMetaData;
00066     friend struct change_channelRequestMetaDataClient;
00067 
00068     friend struct change_channelRequestMetaPrimitive;
00069 
00070     friend struct change_channelRequestPolicyPut;
00071     friend struct change_channelRequestStatusPut;
00072 
00073     friend struct change_channelRequestPolicyGet;
00074     friend struct change_channelRequestStatusGet;
00075 
00076     friend struct change_channelRequestPolicyGetCtrl;
00077     friend struct change_channelRequestStatusGetCtrl;
00078 
00079     friend struct change_channelRequestStatusGetSTSACK;
00080     friend struct change_channelRequestStatusGetClassName;
00081 
00082     friend struct change_channelTimeoutPolicyGet;
00083     friend struct change_channelTimeoutPolicyPut;
00084 
00085     friend struct change_connectionHandlerArgs;
00086   
00087     friend struct change_dataBufferSize_PRIMITIVE;
00088     friend struct change_dataBufferSize_TIME;
00089     friend struct change_dataBufferSize_CTRL;
00090     friend struct change_dataBufferSize_STSACK;
00091 
00092     //friend struct change_dataBufferPVCtrlHolder;
00093     //friend struct change_dataBufferPVDataHolder;
00094 
00095     friend struct change_eventHandlerArgs;
00096     friend struct change_hasNewData;
00097     friend struct change_dequePulseID;
00098     friend struct change_mapPulseID;
00099     friend struct change_mapPulseIDBufferSize;
00100     friend struct change_monitorAction;
00101     friend struct change_monitorActionClear;
00102     friend struct change_monitorActionErase;
00103     friend struct change_monitorPolicyErase;
00104     friend struct change_monitorPolicyInsert;
00105 
00106     friend struct change_monitorPolicyInWaitingErase;
00107     friend struct change_monitorPolicyInWaitingInsert;
00108 
00109     //friend struct change_rule;
00110 
00111     friend struct change_pvAlias;
00112     friend struct change_status;
00113 
00114     friend struct change_usrArgs;
00115 
00116     friend struct free_dataBuffers;
00117 
00118     friend class  Connect;
00119     friend class  CAFE;
00120     friend class  Granules;
00121     friend class  ChannelCreatePolicy;
00122     friend class  ConduitGroup;
00123     friend class  MonitorPolicy;
00124                                  
00125                 //friend void CAFE_CALLBACK::PyHandlerPut;
00126           //friend void CAFE_CALLBACK::PyHandlerGet;                    
00127                 //friend struct change_pyCafeFlag;
00128 
00129 private:
00130     //from alarmString.h        
00131           const char * epicsAlarmSeverityStrings[ALARM_SEVERITY_STRING_LENGTH];
00132     const char * epicsAlarmConditionStrings[ALARM_STATUS_STRING_LENGTH];
00133                                  
00134     static unsigned int  handleNext;
00135 
00136     ca_client_context * ccc;
00137            
00138     union db_access_val * dataBuffer;    
00139     union db_access_val * ctrlBuffer;
00140     union db_access_val * putBuffer;
00141     union db_access_val * stsackBuffer; 
00142         
00143     short alarmStatus;
00144     short alarmSeverity;
00145     epicsTimeStamp ts;
00146                                 
00147                 void * usrArgs; //Filled in conduitEventHandlerArgs.h; used by getUsrArgsAsUInt in CyCafe       
00148                 
00149                 chtype dataType;
00150                 chtype dbrDataType;
00151                 CAFENUM::DBR_TYPE cafeDbrType;
00152                 
00153     //Reserved
00154     unsigned long long  beamEventNo;
00155                         
00156     std:: deque<PVDataHolder> dequePulseID;
00157 
00158     std::map<unsigned long long, PVDataHolder> mapPulseID;
00159     std::map<unsigned long long, PVDataHolder>::iterator mpos;
00160              unsigned short mapPulseIDBufferSize;
00161                 
00162     //bool rule;
00163                 bool pyCafeFlag;
00164 
00165     std::string deviceAttributeDeliminator;
00166     ChannelDeviceAttribute channelDeviceAttribute;
00167 
00168     //PVCtrlHolder pvc;
00169     //PVDataHolder pvd;
00170 
00171     ChannelEnumStrings  channelEnumStrings;
00172 
00173     //ChannelPolicies
00174 
00175           ChannelGetCacheWaitPolicy channelGetCacheWaitPolicy;
00176     ChannelGetActionWhenMonitorPolicy channelGetActionWhenMonitorPolicy;
00177 
00178     ChannelRequestDataTypePolicy    channelRequestDataTypePolicy;
00179 
00180     ChannelRequestPolicy      channelRequestPolicyPut;
00181     ChannelRequestStatus      channelRequestStatusPut;
00182 
00183     ChannelRequestPolicy      channelRequestPolicyGet;       //DATA
00184     ChannelRequestStatus      channelRequestStatusGet;       //DATA
00185 
00186     ChannelRequestPolicy      channelRequestPolicyGetCtrl;   //CTRL
00187     ChannelRequestStatus      channelRequestStatusGetCtrl;   //CTRL
00188 
00189     ChannelRequestStatus      channelRequestStatusGetSTSACK;   //STSACK
00190     ChannelRequestStatus      channelRequestStatusGetClassName;//ClassName
00191 
00192           ChannelTimeoutPolicy      channelTimeoutPolicyGet;
00193           ChannelTimeoutPolicy      channelTimeoutPolicyPut;
00194 
00195     ChannelRegalia                   channelRegalia;
00196 
00197     ChannelRequestMetaData           channelRequestMetaData; //0 container for actual send
00198     ChannelRequestMetaDataClient     channelRequestMetaDataClient; //-1 //DATA
00199     //ChannelRequestMetaDataRepository channelRequestMetaDataRepository;  //  (CAFENUM::DBR_TYPE DBR_TIME) ; //1
00200     
00201     ChannelRequestMetaData           channelRequestMetaCtrl; //0 container for actual send
00202     ChannelRequestMetaDataClient     channelRequestMetaCtrlClient; //-1 //CTRL  
00203     //ChannelRequestMetaDataRepository channelRequestMetaCtrlRepository;  //   (CAFENUM::DBR_TYPE DBR_CTRL);  //1
00204      
00205     ChannelRequestMetaData  channelRequestMetaSTSACK;//  (CAFENUM::DBR_TYPE DBR_STSACK);//1
00206     ChannelRequestMetaData  channelRequestMetaPrimitive; //Put operations
00207 
00208                 #if HAVE_PYTHON_H               
00209                 void * PyEventHandler() const;
00210                 void * PyEventHandler(unsigned int) const;              
00211                 void * PyDataEventHandler() const;
00212                 void * PyCtrlEventHandler() const;      
00213                 #endif
00214 
00215     int  putWithCallback(pCallback callbackHandlerPut) const;
00216 
00217     int  put(void) const;
00218     int  get(void) const;
00219     int  getWithCallback(pCallback) const;
00220     int  getCtrl(void) const;
00221     int  getCtrlWithCallback(pCallback) const;
00222     int  getSTSACKWithCallback(pCallback) const;
00223     int  getClassNameWithCallback(pCallback) const;
00224 
00225     //Monitor Policies
00226     //map<evid,MonitorPolicy> emp;
00227     //map<evid,MonitorPolicy>::iterator iemp;
00228     //map<unsigned long,MonitorPolicy> lump;
00229     //map<unsigned long,MonitorPolicy>::iterator ilump;
00230 
00232     std::vector<MonitorPolicy> mpV;
00233     std::vector<MonitorPolicy> mpInWaitingV;
00234 
00235     int  monitorStart(MonitorPolicy &mp) const;
00236     int  monitorStop(evid eventID) const;
00237 
00238     std::vector<std::string> monitorAction;
00239 
00240     bool hasNewData; // used by HandleHelper.getMonitorAction();
00241 
00242 public:
00243                 #if HAVE_PYTHON_H               
00244                 void * PyGetHandler() const;
00245                 void * PyPutHandler() const;
00246                 #endif
00247                                 
00248     Conduit(void );
00249                                 
00250                 Conduit(const char  * _pv, ca_client_context *_ccc, 
00251                 ChannelRequestPolicy _channelRequestPolicyPut, ChannelRequestPolicy _channelRequestPolicyGet,
00252                 ChannelGetActionWhenMonitorPolicy _channelGetActionWhenMonitorPolicy, bool _pyCafeFlag);
00253                 
00254     //Conduit(const char  * _pv, ca_client_context *_ccc, bool _pyCafeFlag);
00255     //Conduit(const char  * _pv, ca_client_context *_ccc);
00256     virtual ~Conduit();
00257     unsigned int  groupHandle;  // Group handle this pv handle belongs to!!
00258     unsigned int  handle;
00259          
00260     chid channelID;
00261     //evid eventID;
00262 
00263     std::string pv;
00264     std::string pvAlias;         
00265 
00266     int  status;
00267         
00268 
00269                 
00270     friend std::ostream& operator<<(std::ostream& os, const Conduit& e)
00271     {
00272         os<< "handle="  << e.handle<<" pv=" << e.pv<<  std::endl;
00273         return os;
00274     };
00275                         
00276           bool getPyCafe() const {return pyCafeFlag;};
00277                 
00278                 
00279 
00280     bool operator<(const Conduit& c)const{return handle<c.handle;};
00281         
00282     const char * getDevice(void) const {return channelDeviceAttribute.getDevice();};
00283     const char * getAttribute(void) const {return channelDeviceAttribute.getAttribute();};
00284 
00285     const char * getHostName(void) const {return channelRegalia.hostName;};
00286     bool isConnected(void) const {return channelRegalia.connectFlag;};
00287 
00288     epicsTimeStamp getTimeStamp(void) const{return ts;}
00289     short getAlarmStatus(void) const{return alarmStatus;}
00290     short getAlarmSeverity(void) const{return alarmSeverity;}
00291                 
00292                 std::string getAlarmStatusAsString(void) const{ 
00293                         if (alarmStatus>-1 && alarmStatus<ALARM_STATUS_STRING_LENGTH) {
00294                                         return (std::string) epicsAlarmConditionStrings[alarmStatus];}
00295                         else {
00296                                         std::cout << "alarmStatusValue=" << alarmStatus << " is not within the valid range of 0-3!" << std::endl; 
00297                             return (std::string) "ALARM_UNKNOWN";       
00298                         }
00299                 }       
00300                 std::string getAlarmSeverityAsString(void) const{ 
00301                         if (alarmSeverity>-1 && alarmSeverity<ALARM_SEVERITY_STRING_LENGTH) {
00302                                         return (std::string) epicsAlarmSeverityStrings[alarmSeverity];}
00303                         else {
00304                             std::cout << "alarmStatusSeverity=" << alarmSeverity << " is not within the valid range of 0-21!" << std::endl; 
00305                             return (std::string) "SEVERITY_UNKNOWN"; 
00306                         }
00307                 }       
00308                 
00309 
00310     unsigned short getAccessRead(void) const{return channelRegalia.accessRead;};
00311     unsigned short getAccessWrite(void) const{return channelRegalia.accessWrite;};
00312     //Reserved
00313     unsigned long long getBeamEventNo(void) const {return beamEventNo;};
00314                 unsigned long long getPulseID(void) const {return beamEventNo;};
00315                  
00316                 /* 
00317                 PVDataHolder getPVDataFromPulseID(unsigned long long globalPulseID) const {
00318                 PVDataHolder pvd;
00319                 std::map<unsigned long long, PVDataHolder>::iterator mpos;
00320                         
00321                 mpos=mapPulseID.find(globalPulseID);
00322         
00323                         if (mpos != mapPulseID.end() ) {
00324                                 pvd = (mpos->second);
00325                                 //std::cout << "key: EXACT MATCH FOUND " << mpos->first << " pid  " << globalPulseID << std::endl;
00326                                 return pvd;
00327                         }
00328                         else {getPVDataHolder(pvd); 
00329                         return pvd; 
00330                         }       
00331                 } 
00332                 */ 
00333                  
00334           std::map<unsigned long long, PVDataHolder> getPulsePVDataMap() const{                 
00335                  //std::map<unsigned long long, PVDataHolder> a; return a;};
00336                 return mapPulseID;};
00337                 unsigned short getMapPulseIDBufferSize() const{return mapPulseIDBufferSize;};
00338 
00339                 std::deque<PVDataHolder> getPulsePVData() const {
00340                   return dequePulseID;
00341                 }
00342 
00343                 
00344     chid getChannelID(void) const {return channelRegalia.channelID;};
00345     ChannelRegalia getChannelRegalia(void) const {return channelRegalia;};
00346     ca_client_context * getClientContext(void) const {return ccc;};
00347     unsigned int  getGroupHandle(void) const {return groupHandle;};
00348     unsigned int  getHandle(void)  const {return handle;};
00349     const char * getPV(void) const {return pv.c_str();};
00350                 std::string  getPVAsString(void) const {return pv;};
00351     const char * getPVAlias(void) const {return pvAlias.c_str();};
00352                 std::string  getPVAliasAsString(void) const {return pvAlias;};
00353                 
00354     int  getStatus(void) const {return status;};
00355 
00356     void * getUsrArgs(void) const {return usrArgs;};
00357                 chtype getDataType(void) const {return dataType;};
00358           chtype getDbrDataType(void) const {return dbrDataType;};
00359                 CAFENUM::DBR_TYPE getCafeDbrType(void) const {return cafeDbrType;};
00360                 
00361     db_access_val * getCtrlBuffer(void) const {return ctrlBuffer;};
00362     db_access_val * getDataBuffer(void) const {return dataBuffer;};
00363     db_access_val * getPutBuffer(void) const {return putBuffer;};
00364 
00365     int  getPVDataHolder(PVDataHolder &) const ;
00366     int  getPVCtrlHolder(PVCtrlHolder &) const ;
00367 
00368         //bool getRule(void) const {return rule;};
00369 
00370     //RequestPolicy   
00371           ChannelGetCacheWaitPolicy getChannelGetCacheWaitPolicy(void) const { return channelGetCacheWaitPolicy;};
00372           ChannelGetActionWhenMonitorPolicy getChannelGetActionWhenMonitorPolicy(void) const { return channelGetActionWhenMonitorPolicy;}
00373                         
00374     ChannelTimeoutPolicy getChannelTimeoutPolicyGet (void) const {return channelTimeoutPolicyGet;};
00375     ChannelRequestPolicy getChannelRequestPolicyGet (void) const {return channelRequestPolicyGet;};
00376     ChannelRequestStatus getChannelRequestStatusGet (void) const {return channelRequestStatusGet;};
00377     ChannelRequestPolicy getChannelRequestPolicyGetCtrl (void) const {return channelRequestPolicyGetCtrl;};
00378     ChannelRequestStatus getChannelRequestStatusGetCtrl (void) const {return channelRequestStatusGetCtrl;};
00379 
00380     ChannelRequestStatus getChannelRequestStatusGetSTSACK (void) const {return channelRequestStatusGetSTSACK;};
00381     ChannelRequestStatus getChannelRequestStatusGetClassName (void) const {return channelRequestStatusGetClassName;};
00382 
00383     ChannelTimeoutPolicy getChannelTimeoutPolicyPut (void) const {return channelTimeoutPolicyPut;};
00384     ChannelRequestPolicy getChannelRequestPolicyPut (void) const {return channelRequestPolicyPut;};
00385     ChannelRequestStatus getChannelRequestStatusPut (void) const {return channelRequestStatusPut;};
00386 
00387     ChannelRequestDataTypePolicy getChannelRequestDataTypePolicy(void) const { return channelRequestDataTypePolicy;};
00388 
00389     ChannelRequestMetaData       getChannelRequestMetaData(void) const {return channelRequestMetaData;};   //0
00390     ChannelRequestMetaDataClient getChannelRequestMetaDataClient(void) const {return channelRequestMetaDataClient;}; //-1
00391     ChannelRequestMetaData       getChannelRequestMetaCtrl(void) const {return channelRequestMetaCtrl;};   //0
00392     ChannelRequestMetaDataClient getChannelRequestMetaCtrlClient(void) const {return channelRequestMetaCtrlClient;}; //-1
00393 
00394     ChannelRequestMetaData       getChannelRequestMetaPrimitive(void) const {return channelRequestMetaPrimitive;};   //0
00395 
00396     //ChannelRequestMetaDataRepository       getChannelRequestMetaDataRepository  (void) const {return channelRequestMetaDataRepository;};   //1
00397     //ChannelRequestMetaDataRepository       getChannelRequestMetaCtrlRepository  (void) const {return channelRequestMetaCtrlRepository;};   //1
00398     //ChannelRequestMetaDataRepository       getChannelRequestMetaSTSACKRepository(void) const {return channelRequestMetaSTSACKRepository;}; //1
00399     //ChannelRequestMetaDataRepository       getChannelRequestMetaPrimitiveRepository(void) const {return channelRequestMetaPrimitiveRepository;}; //1
00400 
00402     std::vector<MonitorPolicy> getMonitorPolicyVector(void) const {return mpV;};
00403     std::vector<MonitorPolicy> getMonitorPolicyInWaitingVector(void) const {return mpInWaitingV;};
00404 
00405     std::vector<std::string> getMonitorAction(void) const {return monitorAction;};
00406     bool getHasNewData(void) const {return hasNewData;};
00407 };
00408 
00409 #endif // CONDUIT_H

Generated on 28 May 2018 for CAFE by  doxygen 1.6.1