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