/// /// \file channelRegalia.h /// /// Classes are: /// ChannelRegalia /// ChannelRequestMetaData /// ChannelRequestMetaDataClient /// ChannelRequestMetaDataRepository /// ChannelRequestStatus /// /// \author Jan Chrin, PSI /// \date Release: February 2015 /// \version CAFE 1.0.0 /// #ifndef CHANNELINFO_H #define CHANNELINFO_H #include #include #include #include //required for channelDataStore #include #include /** * Struct defining channel properties and connection status for use in Conduit container * */ class ChannelRegalia { private: CAFEStatus cafeStatus; public: friend struct change_accessRightsHandlerArgs; friend struct change_accessRead; friend struct change_accessWrite; friend struct change_channelID; friend struct change_connectionHandlerArgs; friend struct change_eventHandlerArgs; //friend struct change_channelRegalia; friend class Connect; friend class HandleHelper; friend class Conduit; friend class ConduitGroup; protected: chid channelID; // bool connectFlag; const char * hostName; unsigned int nelem; //native chtype dataType; //native unsigned short accessRead; //0 or 1 unsigned short accessWrite; //0 or 1 dbr_class_name_t className; //dbr_string_t //connectionState as given by connection_handler args: CA_OP_CONN_UP or CA_OP_CONN_DOWN int connectionState; //as given by CA_OP_ int cafeConnectionState; //as given by cafe_cs_state in statusCodes //void setChannelID (chid id) {channelID=id;}; void setConnectFlag (bool c) { connectFlag=c; }; void setHostName (const char * h) { hostName=h; }; void setDataType (chtype d) { dataType=d; }; void setAccessRead (unsigned short r) { accessRead=r; }; void setAccessWrite(unsigned short w) { accessWrite=w; }; void setReadAccess (unsigned short r) { accessRead=r; }; void setWriteAccess(unsigned short w) { accessWrite=w; }; void setNelem (unsigned int n) { nelem=n; }; void setConnectionState (int cs) { connectionState=cs; }; void setCafeConnectionState (int ccs) { cafeConnectionState=ccs; }; public: chid getChannelID() const { return channelID; }; bool getConnectFlag()const { return connectFlag; }; const char * getHostName() const { return hostName; }; std::string getHostNameAsString() { std::string h= hostName; return h; }; chtype getDataType() const { return dataType; }; const char * getClassName() const { return className; }; std::string getClassNameAsString() { std::string c=className; return c; }; unsigned short getAccessRead() const { return accessRead; }; unsigned short getAccessWrite()const { return accessWrite; }; unsigned short getReadAccess() const { return accessRead; }; unsigned short getWriteAccess()const { return accessWrite; }; unsigned int getNelem() const { return nelem; }; int getConnectionState() const { return connectionState; }; int getCafeConnectionState() const { return cafeConnectionState; }; std::string getConnectionStateAsString() { if(connectionState==CA_OP_CONN_UP) { return "CA_OP_CONN_UP"; } else if(connectionState==CA_OP_CONN_DOWN) { return "CA_OP_CONN_DOWN"; } else { return "CA_OP_CONN is UNKNOWN: THIS SHOULD NEVER APPEAR!"; } }; std::string getCafeConnectionStateAsString() { return cafeStatus.csc.message(cafeConnectionState); }; ChannelRegalia():channelID((chid) NULL), connectFlag(false), nelem((unsigned int) 1), dataType(chtype((int)CAFE_TYPENOTCONN)), accessRead((unsigned short) 0), accessWrite((unsigned short) 0), connectionState((int) CA_OP_CONN_DOWN), cafeConnectionState((int) ICAFE_CS_NEVER_CONN) { strcpy(className, ""); hostName=""; }; ~ChannelRegalia() {}; }; /** * Struct defining channel properties and connection status for use in displays * */ class ChannelDataStore { public: std::string description; ChannelRegalia info; PVDataHolder pvd; PVCtrlHolder pvc; ChannelDataStore() { }; ~ChannelDataStore() {}; }; /** * Stores strings for Enum datatypes * */ class ChannelEnumStrings { public: friend struct change_eventHandlerArgs; private: char options [MAX_ENUM_STATES][MAX_ENUM_STRING_SIZE]; short noOptions; public: ChannelEnumStrings():noOptions( (short) 0) {}; short getNoOptions() const { return noOptions; }; std::vector getOptions() const { std::vector optionsV; optionsV.reserve(noOptions); for ( short i=0; i 0 ? n : 1; //nelemCache= nelem > nelemCache ? nelemCache : nelem; }; // byteSize=dbr_size_n(dbrDataType,nelem); }; void setNelemCache(unsigned int n) { nelemCache= n > 0 ? n : 1; } void setUsrArg(void * u) { usrArg=u; }; void setDataType(chtype d) { dataType=d; }; void setDbrDataType(chtype dbr) { dbrDataType=dbr; }; //byteSize=dbr_size_n(dbrDataType,nelem);}; void setCafeDbrType(CAFENUM::DBR_TYPE cd) { cafeDbrType=cd; }; void setDbrTypesFromCafeDbrType(CAFENUM::DBR_TYPE cd) { cafeDbrType=cd; switch(cafeDbrType) { case CAFENUM::DBR_TIME: dbrDataType = dbf_type_to_DBR_TIME(dataType); break; case CAFENUM::DBR_STS: dbrDataType = dbf_type_to_DBR_STS(dataType); break; case CAFENUM::DBR_PRIMITIVE: dbrDataType = dbf_type_to_DBR(dataType); break; default: //Print Warning Message? dbrDataType = dbf_type_to_DBR_TIME(dataType); cafeDbrType = CAFENUM::DBR_TIME; break; } }; void setByteSize(unsigned int b) { byteSize=b; }; unsigned int getNelem() const { return nelem; }; unsigned int getNelemCache() const { return nelemCache; }; void * getUsrArg() const { return usrArg; }; chtype getDataType() const { return dataType; }; chtype getDbrDataType() const { return dbrDataType; }; CAFENUM::DBR_TYPE getCafeDbrType() const { return cafeDbrType; }; unsigned int getByteSize() const { return byteSize; }; void setOffset(unsigned int o) { offset=o; }; unsigned int getOffset() const { return offset; }; //Constructors ChannelRequestMetaData():channelID((chid) NULL), nelem((unsigned int) 1), nelemCache((unsigned int) 1), dataType((chtype) DBF_NO_ACCESS), dbrDataType((chtype) TYPENOTCONN), // cafeDbrType( (CAFENUM::DBR_TYPE) NULL), usrArg((void *) NULL), byteSize((unsigned int) 0), offset((unsigned int) 0) { }; //CAStatus((long) ECA_NORMAL){}; ~ChannelRequestMetaData() {}; }; /** * -1. Struct defining channel datatype/nelem requested by client for use in Conduit container * */ class ChannelRequestMetaDataClient: public ChannelRequestMetaData { public: //protected: //unsigned int offset; public: //void setOffset(unsigned int o) {offset=o;}; //unsigned int getOffset() const {return offset;}; //Constructors ChannelRequestMetaDataClient() {}; //:offset((unsigned int) 0){}; ~ChannelRequestMetaDataClient() {}; }; /** * Gives status of the Request message \n * messageStatus = requestStatus if requestStatus != ECA_NORMAL else \n * messageStatus = requestStatus or messageStatus=callbackStatus (if policy WITH_CALLBACK) * */ class ChannelRequestStatus { private: int preRequestStatus; // current status of channel int requestStatus; // from get/put operation int pendStatus; // from pend_io operation int callbackStatus; // used by CAFE::waitForEvent() to record status of callback int messageStatus; // overall status CAFENUM::StatusMessageKind messageKind; // statusMessageKind indicating method status occuping overall messageStatus bool hasCallbackInitiated; bool hasCallbackTriggered; CAFENUM::CallbackProgressKind callbackProgressKind; public: int getPreRequestStatus() const { return preRequestStatus; }; int getRequestStatus() const { return requestStatus; }; int getPendStatus() const { return pendStatus; }; int getCallbackStatus() const { return callbackStatus; }; int getMessageStatus() const { return messageStatus; }; CAFENUM::StatusMessageKind getMessageKind() const { return messageKind; }; CAFENUM::CallbackProgressKind getCallbackProgressKind() const { return callbackProgressKind; }; void setPreRequestStatus (int s) { preRequestStatus=s; messageStatus=s; messageKind=(CAFENUM::StatusMessageKind) CAFENUM::PRE_REQUEST; }; void setRequestStatus (int r) { requestStatus = r; messageStatus=r; messageKind=(CAFENUM::StatusMessageKind) CAFENUM::FROM_REQUEST; }; void setPendStatus (int p) { pendStatus = p; messageStatus=p; messageKind=(CAFENUM::StatusMessageKind) CAFENUM::FROM_PEND; }; void setCallbackStatus (int c) { callbackStatus= c; messageStatus=c; messageKind=(CAFENUM::StatusMessageKind) CAFENUM::FROM_CALLBACK; }; void setCallbackKind (bool hasInit, bool hasTrig) { hasCallbackInitiated=hasInit; hasCallbackTriggered=hasTrig; if ( hasInit && !hasTrig) { callbackProgressKind=(CAFENUM::CallbackProgressKind) CAFENUM::PENDING; } else if (!hasInit && hasTrig) { callbackProgressKind=(CAFENUM::CallbackProgressKind) CAFENUM::COMPLETE; } else if (!hasInit && !hasTrig) { callbackProgressKind=(CAFENUM::CallbackProgressKind) CAFENUM::NOT_INITIATED; } else { std::cout << "CAFE INTERNAL POLICY ERROR" << std::endl; std::cout << "ChannelRequestStatus::setCallbackKind gives an INVALID callbackProgressKind" << std::endl; } }; //void setMessageStatus (long mstatus) {messageStatus = mstatus;}; // void setMessageKind (StatusMessageKind mkind) { if (mkind<=CAFENUM::FROM_CALLBACK && mkind >= CAFENUM::PRE_REQUEST) // {messageKind = mkind;} else {cout<< mkind << " is an invalid statusMessageKind!" << endl;}}; ChannelRequestStatus():preRequestStatus(ICAFE_CS_NEVER_CONN),requestStatus(ICAFE_CS_NEVER_CONN),pendStatus(ICAFE_CS_NEVER_CONN), callbackStatus(ICAFE_CS_NEVER_CONN),messageStatus(ICAFE_CS_NEVER_CONN),messageKind((CAFENUM::StatusMessageKind) CAFENUM::NO_MESSAGE), hasCallbackInitiated(false),hasCallbackTriggered(false),callbackProgressKind((CAFENUM::CallbackProgressKind) CAFENUM::NOT_INITIATED) {}; }; #endif // CHANNELINFO_H