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
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;
00048 chtype dataType;
00049 unsigned short accessRead;
00050 unsigned short accessWrite;
00051 dbr_class_name_t className;
00052
00053 int connectionState;
00054 int cafeConnectionState;
00055
00056
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;
00186 unsigned int nelem;
00187 unsigned int nelemCache;
00188 chtype dataType;
00189 chtype dbrDataType;
00190 CAFENUM::DBR_TYPE cafeDbrType;
00191 void * usrArg;
00192 unsigned int byteSize;
00193 unsigned int offset;
00194
00195 public:
00196 void setNelem(unsigned int n){nelem= n > 0 ? n : 1;
00197
00198 };
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; };
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
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
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 };
00247
00248 ~ChannelRequestMetaData(){};
00249 };
00250
00251
00256 class ChannelRequestMetaDataClient: public ChannelRequestMetaData{
00257 public:
00258
00259
00260
00261 public:
00262
00263
00264
00265
00266 ChannelRequestMetaDataClient(){};
00267 ~ChannelRequestMetaDataClient(){};
00268 };
00269
00270
00277 class ChannelRequestStatus{
00278
00279 private:
00280 int preRequestStatus;
00281 int requestStatus;
00282 int pendStatus;
00283 int callbackStatus;
00284 int messageStatus;
00285 CAFENUM::StatusMessageKind messageKind;
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
00313
00314
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