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