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

Generated on 3 May 2017 for CAFE by  doxygen 1.6.1