/// /// \file conduit.h /// \author Jan Chrin, PSI /// \date Release: February 2015 /// \version CAFE 1.0.0 /// #ifndef CONDUIT_H #define CONDUIT_H #include #include #include #include #include #include #include #include #if HAVE_PYTHON_H #if HAVE_PYCAFE_EXT #include //required for PyCafe.h #include #else #include #endif #endif /** * Principal constructor has:\n * \param _pv process variable * \param _ccc ca_client_context */ class Conduit { public: friend struct change_alarmStatus; friend struct change_alarmSeverity; friend struct change_epicsTimeStamp; friend struct change_accessRightsHandlerArgs; friend struct change_accessRead; friend struct change_accessWrite; friend struct change_channelDeviceAttribute; friend struct change_channelID; friend struct change_channelRegalia; friend struct change_channelGetCacheWaitPolicy; friend struct change_channelGetActionWhenMonitorPolicy; friend struct change_channelRequestDataTypePolicy; friend struct change_channelRequestMetaCtrl; friend struct change_channelRequestMetaCtrlClient; friend struct change_channelRequestMetaData; friend struct change_channelRequestMetaDataClient; friend struct change_channelRequestMetaPrimitive; friend struct change_channelRequestPolicyPut; friend struct change_channelRequestStatusPut; friend struct change_channelRequestPolicyGet; friend struct change_channelRequestStatusGet; friend struct change_channelRequestPolicyGetCtrl; friend struct change_channelRequestStatusGetCtrl; friend struct change_channelRequestStatusGetSTSACK; friend struct change_channelRequestStatusGetClassName; friend struct change_channelTimeoutPolicyGet; friend struct change_channelTimeoutPolicyPut; friend struct change_connectionHandlerArgs; friend struct change_dataBufferSize_PRIMITIVE; friend struct change_dataBufferSize_TIME; friend struct change_dataBufferSize_CTRL; friend struct change_dataBufferSize_STSACK; //friend struct change_dataBufferPVCtrlHolder; //friend struct change_dataBufferPVDataHolder; friend struct change_eventHandlerArgs; friend struct change_hasNewData; friend struct change_monitorAction; friend struct change_monitorActionClear; friend struct change_monitorActionErase; friend struct change_monitorPolicyErase; friend struct change_monitorPolicyInsert; friend struct change_monitorPolicyInWaitingErase; friend struct change_monitorPolicyInWaitingInsert; //friend struct change_rule; friend struct change_pvAlias; friend struct change_status; friend struct change_usrArgs; friend struct free_dataBuffers; friend class Connect; friend class CAFE; friend class Granules; friend class ChannelCreatePolicy; friend class ConduitGroup; friend class MonitorPolicy; //friend void CAFE_CALLBACK::PyHandlerPut; //friend void CAFE_CALLBACK::PyHandlerGet; //friend struct change_pyCafeFlag; private: //from alarmString.h const char * epicsAlarmSeverityStrings[ALARM_SEVERITY_STRING_LENGTH]; const char * epicsAlarmConditionStrings[ALARM_STATUS_STRING_LENGTH]; static unsigned int handleNext; ca_client_context * ccc; union db_access_val * dataBuffer; union db_access_val * ctrlBuffer; union db_access_val * putBuffer; union db_access_val * stsackBuffer; short alarmStatus; short alarmSeverity; epicsTimeStamp ts; void * usrArgs; //Filled in conduitEventHandlerArgs.h; used by getUsrArgsAsUInt in CyCafe chtype dataType; chtype dbrDataType; CAFENUM::DBR_TYPE cafeDbrType; //Reserved unsigned int beamEventNo; //bool rule; bool pyCafeFlag; std::string deviceAttributeDeliminator; ChannelDeviceAttribute channelDeviceAttribute; //PVCtrlHolder pvc; //PVDataHolder pvd; ChannelEnumStrings channelEnumStrings; //ChannelPolicies ChannelGetCacheWaitPolicy channelGetCacheWaitPolicy; ChannelGetActionWhenMonitorPolicy channelGetActionWhenMonitorPolicy; ChannelRequestDataTypePolicy channelRequestDataTypePolicy; ChannelRequestPolicy channelRequestPolicyPut; ChannelRequestStatus channelRequestStatusPut; ChannelRequestPolicy channelRequestPolicyGet; //DATA ChannelRequestStatus channelRequestStatusGet; //DATA ChannelRequestPolicy channelRequestPolicyGetCtrl; //CTRL ChannelRequestStatus channelRequestStatusGetCtrl; //CTRL ChannelRequestStatus channelRequestStatusGetSTSACK; //STSACK ChannelRequestStatus channelRequestStatusGetClassName;//ClassName ChannelTimeoutPolicy channelTimeoutPolicyGet; ChannelTimeoutPolicy channelTimeoutPolicyPut; ChannelRegalia channelRegalia; ChannelRequestMetaData channelRequestMetaData; //0 container for actual send ChannelRequestMetaDataClient channelRequestMetaDataClient; //-1 //DATA //ChannelRequestMetaDataRepository channelRequestMetaDataRepository; // (CAFENUM::DBR_TYPE DBR_TIME) ; //1 ChannelRequestMetaData channelRequestMetaCtrl; //0 container for actual send ChannelRequestMetaDataClient channelRequestMetaCtrlClient; //-1 //CTRL //ChannelRequestMetaDataRepository channelRequestMetaCtrlRepository; // (CAFENUM::DBR_TYPE DBR_CTRL); //1 ChannelRequestMetaData channelRequestMetaSTSACK;// (CAFENUM::DBR_TYPE DBR_STSACK);//1 ChannelRequestMetaData channelRequestMetaPrimitive; //Put operations #if HAVE_PYTHON_H void * PyEventHandler() const; void * PyEventHandler(unsigned int) const; void * PyDataEventHandler() const; void * PyCtrlEventHandler() const; #endif int putWithCallback(pCallback callbackHandlerPut) const; int put(void) const; int get(void) const; int getWithCallback(pCallback) const; int getCtrl(void) const; int getCtrlWithCallback(pCallback) const; int getSTSACKWithCallback(pCallback) const; int getClassNameWithCallback(pCallback) const; //Monitor Policies //map emp; //map::iterator iemp; //map lump; //map::iterator ilump; ////MonitorPolicy mpBase; vector mpV; vector mpInWaitingV; int monitorStart(MonitorPolicy &mp) const; int monitorStop(evid eventID) const; vector monitorAction; bool hasNewData; // used by HandleHelper.getMonitorAction(); public: #if HAVE_PYTHON_H void * PyGetHandler() const; void * PyPutHandler() const; #endif Conduit(void ); Conduit(const char * _pv, ca_client_context *_ccc, ChannelRequestPolicy _channelRequestPolicyPut, ChannelRequestPolicy _channelRequestPolicyGet, ChannelGetActionWhenMonitorPolicy _channelGetActionWhenMonitorPolicy, bool _pyCafeFlag); //Conduit(const char * _pv, ca_client_context *_ccc, bool _pyCafeFlag); //Conduit(const char * _pv, ca_client_context *_ccc); virtual ~Conduit(); unsigned int groupHandle; // Group handle this pv handle belongs to!! unsigned int handle; chid channelID; //evid eventID; std::string pv; std::string pvAlias; int status; friend std::ostream& operator<<(std::ostream& os, const Conduit& e) { os<< "handle=" << e.handle<<" pv=" << e.pv<< std::endl; return os; }; bool getPyCafe() const {return pyCafeFlag;}; bool operator<(const Conduit& c)const{return handle-1 && alarmStatus-1 && alarmSeverity getMonitorPolicyVector(void) const {return mpV;}; vector getMonitorPolicyInWaitingVector(void) const {return mpInWaitingV;}; vector getMonitorAction(void) const {return monitorAction;}; bool getHasNewData(void) const {return hasNewData;}; }; #endif // CONDUIT_H