channelRegalia.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 #ifndef CHANNELINFO_H
00017 #define CHANNELINFO_H
00018 
00019 #include <cstring>
00020 #include <statusCodes.h>
00021 #include <defines.h>
00022 #include <cafeEnum.h>
00023 
00024 using namespace std;
00025 
00030 class ChannelRegalia{
00031 private:
00032         CAFEStatus cafeStatus;
00033 public:
00034     friend struct change_accessRightsHandlerArgs;
00035     friend struct change_accessRead;
00036     friend struct change_accessWrite;
00037     friend struct change_channelID;
00038     friend struct change_connectionHandlerArgs; 
00039     friend struct change_eventHandlerArgs;
00040     //friend struct change_channelRegalia;
00041     //friend class  Connect;
00042     friend class  HandleHelper;
00043     friend class  Conduit;
00044     friend class  ConduitGroup;
00045 protected:
00046     chid                channelID;              //
00047     bool                connectFlag;
00048     const char *              hostName;
00049     unsigned int        nelem;                  //native
00050     chtype              dataType;               //native
00051     unsigned short      accessRead;             //0 or 1
00052     unsigned short      accessWrite;            //0 or 1
00053     dbr_class_name_t    className;              //dbr_string_t
00054     //connectionState as given by connection_handler args: CA_OP_CONN_UP or CA_OP_CONN_DOWN
00055     int                 connectionState;       //as given by CA_OP_
00056     int                 cafeConnectionState;   //as given by cafe_cs_state in statusCodes
00057 
00058     //void                setChannelID    (chid id)       {channelID=id;};
00059     void                setConnectFlag  (bool c)        {connectFlag=c;};
00060     void                setHostName     (const char * h)      {hostName=h;};
00061     void                setDataType     (chtype d)      {dataType=d;};
00062     void                setAccessRead (unsigned short r){accessRead=r;};
00063     void                setAccessWrite(unsigned short w){accessWrite=w;};
00064     void                setReadAccess (unsigned short r){accessRead=r;};
00065     void                setWriteAccess(unsigned short w){accessWrite=w;};
00066     void                setNelem      (unsigned int  n) {nelem=n;};
00067     void                setConnectionState     (long cs)   {connectionState=cs;};
00068     void                setCafeConnectionState (long ccs)  {cafeConnectionState=ccs;};
00069 
00070 public:
00071     chid                getChannelID()  const   {return channelID;};
00072     bool                getConnectFlag()const   {return connectFlag;};
00073     const char *        getHostName()   const   {return hostName;};
00074     string              getHostNameAsString()   {string h= hostName; return h;};
00075     chtype              getDataType()   const   {return dataType;};
00076     const char *        getClassName()  const   {return className;};
00077     string              getClassNameAsString()  {string c=className; return c;};
00078     unsigned short      getAccessRead() const   {return accessRead;};
00079     unsigned short      getAccessWrite()const   {return accessWrite;};
00080     unsigned short      getReadAccess() const   {return accessRead;};
00081     unsigned short      getWriteAccess()const   {return accessWrite;};
00082     unsigned int        getNelem()      const   {return nelem;};
00083     int                 getConnectionState()       const {return connectionState;};
00084     int                 getCafeConnectionState()   const {return cafeConnectionState;};
00085           string              getConnectionStateAsString()       {
00086                 if(connectionState==CA_OP_CONN_UP){return "CA_OP_CONN_UP";}
00087                 else if(connectionState==CA_OP_CONN_DOWN){return "CA_OP_CONN_DOWN"; }           
00088                 else {return "CA_OP_CONN is UNKNOWN: THIS SHOULD NEVER APPEAR!";}};
00089 
00090         string              getCafeConnectionStateAsString()    {
00091                 return cafeStatus.csc.message(cafeConnectionState);};
00092 
00093     ChannelRegalia():channelID((chid) NULL), connectFlag(false), nelem((unsigned int) 1),
00094         dataType((chtype) CAFE_TYPENOTCONN),
00095     accessRead((unsigned short) 0), accessWrite((unsigned short) 0),
00096     connectionState((int) CA_OP_CONN_DOWN), cafeConnectionState((int) ICAFE_CS_NEVER_CONN)
00097     {strcpy(className, ""); hostName="";};
00098 
00099     ~ChannelRegalia(){};
00100 
00101 
00102 
00103 };
00104 
00109 class ChannelEnumStrings{
00110 public:
00111     friend struct change_eventHandlerArgs;
00112 private:
00113     char  options [MAX_ENUM_STATES][MAX_ENUM_STRING_SIZE];
00114     short noOptions;
00115 public:
00116     ChannelEnumStrings():noOptions( (short) 0){};
00117     short getNoOptions() const {return noOptions;};
00118     char  getOptions() const {return options[MAX_ENUM_STATES][MAX_ENUM_STRING_SIZE];};
00119 };
00120 
00121 
00126 class ChannelDeviceAttribute{
00127 private:
00128     std::string pv;
00129     std::string device;
00130     std::string attribute;
00131     std::string deliminator;
00132 public:
00133     ChannelDeviceAttribute(){};
00134     ~ChannelDeviceAttribute(){};
00135 
00136     int  init(std::string _pv, std::string _deliminator)
00137     {
00138         pv=_pv;
00139         deliminator=_deliminator;
00140         short posOfSeparator=pv.find_first_of(deliminator);
00141         if (posOfSeparator<0){
00142             device="";
00143             attribute="";
00144             return ECAFE_DEVICE_ATTRIB_NOT_FOUND;
00145         }
00146         else {
00147             device= pv.substr(0,posOfSeparator);
00148             attribute=pv.substr(posOfSeparator+1,pv.size());
00149         }
00150         return ICAFE_NORMAL;
00151     };
00152 
00153     const char * getDeliminator() const {return deliminator.c_str();};
00154     const char * getDevice()    const  {return device.c_str();};
00155     const char * getAttribute() const  {return attribute.c_str();};
00156     const char * getAttrib() const  {return attribute.c_str();};
00157     std::string getDeliminatorAsString() const {return deliminator;};
00158     std::string getDeviceAsString() const {return device;};
00159     std::string getAttributeAsString() const{return attribute;};
00160 };
00161 
00162 
00167 class ChannelRequestMetaData{
00168 public:
00169     friend struct change_connectionHandlerArgs;
00170     friend struct change_dataBufferSize_CTRL;
00171     friend struct change_dataBufferSize_TIME;
00172     friend struct change_dataBufferSize_PRIMITIVE;
00173     friend struct change_dataBufferSize_STSACK;
00174     friend struct change_eventHandlerArgs;
00175 
00176     friend struct copy_channelRequestMetaDataToChannelRequestMetaDataRepository;
00177 
00178     friend class  Conduit;
00179     friend class  ConduitGroup;
00180     
00181 protected:
00182     chid                channelID;              //of requested item
00183     unsigned int        nelem;                  //depends on Policy
00184     unsigned int        nelemCache;             //nelem To Retrieve From Cache
00185     chtype              dataType;               //depends on Policy
00186     chtype              dbrDataType;            //depends on Policy
00187     CAFENUM::DBR_TYPE   cafeDbrType;
00188     void *              usrArg;                 //from Conduit.usrArg
00189     unsigned int        byteSize;               //data buffer (bytes) must be large enough to store data
00190     unsigned int        offset;
00191 
00192 public:
00193         void setNelem(unsigned int  n){nelem= n > 0 ? n : 1;
00194                 //nelemCache= nelem > nelemCache ? nelemCache : nelem;
00195         }; // byteSize=dbr_size_n(dbrDataType,nelem); };
00196     void setNelemCache(unsigned int  n){nelemCache= n > 0 ? n : 1;}
00197     void setUsrArg(void * u){usrArg=u;};
00198     void setDataType(chtype d){dataType=d;};
00199     void setDbrDataType(chtype dbr){dbrDataType=dbr; }; //byteSize=dbr_size_n(dbrDataType,nelem);};
00200     void setCafeDbrType(CAFENUM::DBR_TYPE cd){cafeDbrType=cd;};
00201     void setDbrTypesFromCafeDbrType(CAFENUM::DBR_TYPE cd){
00202         cafeDbrType=cd;
00203         switch(cafeDbrType)
00204         {
00205             case CAFENUM::DBR_TIME:
00206                 dbrDataType = dbf_type_to_DBR_TIME(dataType);
00207                 break;
00208             case CAFENUM::DBR_STS:
00209                 dbrDataType = dbf_type_to_DBR_STS(dataType);
00210                 break;
00211             case CAFENUM::DBR_PRIMITIVE:
00212                 dbrDataType = dbf_type_to_DBR(dataType);
00213                 break;
00214             default:
00215                                 //Print Warning Message?
00216                 dbrDataType = dbf_type_to_DBR_TIME(dataType);
00217                 cafeDbrType = CAFENUM::DBR_TIME;
00218                 break;
00219         }
00220     };
00221 
00222 
00223     void setByteSize(unsigned int  b){ byteSize=b;};
00224 
00225     unsigned int  getNelem() const{return nelem;};
00226     unsigned int  getNelemCache() const{return nelemCache;};
00227     void * getUsrArg() const{return usrArg;};
00228     chtype getDataType() const { return dataType;};
00229     chtype getDbrDataType() const { return dbrDataType;};
00230     CAFENUM::DBR_TYPE getCafeDbrType() const {return cafeDbrType;};
00231 
00232     unsigned int  getByteSize() const {return byteSize;};
00233 
00234     void setOffset(unsigned int o) {offset=o;};
00235     unsigned int getOffset() const {return offset;};
00236 
00237     //Constructors
00238     ChannelRequestMetaData():channelID((chid) NULL), nelem((unsigned int) 1), nelemCache((unsigned int) 1),
00239     dataType((chtype) DBF_NO_ACCESS), dbrDataType((chtype) TYPENOTCONN), //
00240     cafeDbrType( (CAFENUM::DBR_TYPE) NULL),
00241     usrArg((void *) NULL), byteSize((unsigned int) 0), offset((unsigned int) 0){
00242 
00243     }; //CAStatus((long) ECA_NORMAL){};
00244 
00245     ~ChannelRequestMetaData(){};
00246 };
00247 
00248 
00253 class ChannelRequestMetaDataClient: public ChannelRequestMetaData{
00254 public:
00255   
00256 //protected:
00257     //unsigned int        offset;
00258 public:    
00259     //void setOffset(unsigned int o) {offset=o;};
00260     //unsigned int getOffset() const {return offset;};
00261    
00262     //Constructors
00263     ChannelRequestMetaDataClient(){};//:offset((unsigned int) 0){};
00264     ~ChannelRequestMetaDataClient(){};
00265 };
00266 
00267 
00274 class ChannelRequestStatus{
00275 
00276 private:
00277     int  preRequestStatus;  // current status of channel
00278     int  requestStatus;     // from get/put operation
00279     int  pendStatus;        // from pend_io operation
00280     int  callbackStatus;    // used by CAFE::waitForEvent() to record status of callback
00281     int  messageStatus;     // overall status
00282     CAFENUM::StatusMessageKind messageKind;  // statusMessageKind indicating method status occuping overall messageStatus
00283 
00284     bool hasCallbackInitiated;
00285     bool hasCallbackTriggered;
00286     CAFENUM::CallbackProgressKind callbackProgressKind;
00287 
00288 public:
00289     int  getPreRequestStatus()  const {return preRequestStatus;};
00290     int  getRequestStatus()     const {return requestStatus;};
00291     int  getPendStatus()        const {return pendStatus;};
00292     int  getCallbackStatus()    const {return callbackStatus;};
00293     int  getMessageStatus()     const {return messageStatus;};
00294     CAFENUM::StatusMessageKind    getMessageKind()           const {return messageKind;};
00295     CAFENUM::CallbackProgressKind getCallbackProgressKind()  const {return callbackProgressKind;};
00296 
00297     void setPreRequestStatus (int s) {preRequestStatus=s; messageStatus=s; messageKind=(CAFENUM::StatusMessageKind) CAFENUM::PRE_REQUEST;};
00298     void setRequestStatus    (int r) {requestStatus = r;  messageStatus=r; messageKind=(CAFENUM::StatusMessageKind) CAFENUM::FROM_REQUEST;};
00299     void setPendStatus       (int p) {pendStatus    = p;  messageStatus=p; messageKind=(CAFENUM::StatusMessageKind) CAFENUM::FROM_PEND;};
00300     void setCallbackStatus   (int c) {callbackStatus= c;  messageStatus=c; messageKind=(CAFENUM::StatusMessageKind) CAFENUM::FROM_CALLBACK;};
00301     void setCallbackKind     (bool hasInit, bool hasTrig) {
00302         hasCallbackInitiated=hasInit;   hasCallbackTriggered=hasTrig;
00303         if      ( hasInit && !hasTrig) {callbackProgressKind=(CAFENUM::CallbackProgressKind) CAFENUM::PENDING;}
00304         else if (!hasInit &&  hasTrig) {callbackProgressKind=(CAFENUM::CallbackProgressKind) CAFENUM::COMPLETE;}
00305         else if (!hasInit && !hasTrig) {callbackProgressKind=(CAFENUM::CallbackProgressKind) CAFENUM::NOT_INITIATED;}
00306         else {std::cout << "CAFE INTERNAL POLICY ERROR" << std::endl;
00307               std::cout << "ChannelRequestStatus::setCallbackKind gives an INVALID callbackProgressKind" << endl;}
00308     };
00309     //void setMessageStatus    (long mstatus) {messageStatus = mstatus;};
00310     // void setMessageKind      (StatusMessageKind mkind) { if (mkind<=CAFENUM::FROM_CALLBACK && mkind >= CAFENUM::PRE_REQUEST)
00311     //   {messageKind = mkind;} else {cout<< mkind << " is an invalid statusMessageKind!" << endl;}};
00312 
00313     ChannelRequestStatus():preRequestStatus(ICAFE_CS_NEVER_CONN),requestStatus(ICAFE_CS_NEVER_CONN),pendStatus(ICAFE_CS_NEVER_CONN),
00314     callbackStatus(ICAFE_CS_NEVER_CONN),messageStatus(ICAFE_CS_NEVER_CONN),messageKind((CAFENUM::StatusMessageKind) CAFENUM::NO_MESSAGE),
00315     hasCallbackInitiated(false),hasCallbackTriggered(false),callbackProgressKind((CAFENUM::CallbackProgressKind) CAFENUM::NOT_INITIATED){};
00316 };
00317 
00318 #endif // CHANNELINFO_H

Generated on 3 May 2017 for CAFE by  doxygen 1.6.1