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

Generated on 28 May 2018 for CAFE by  doxygen 1.6.1