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
00041
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;
00050 chtype dataType;
00051 unsigned short accessRead;
00052 unsigned short accessWrite;
00053 dbr_class_name_t className;
00054
00055 int connectionState;
00056 int cafeConnectionState;
00057
00058
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;
00183 unsigned int nelem;
00184 unsigned int nelemCache;
00185 chtype dataType;
00186 chtype dbrDataType;
00187 CAFENUM::DBR_TYPE cafeDbrType;
00188 void * usrArg;
00189 unsigned int byteSize;
00190 unsigned int offset;
00191
00192 public:
00193 void setNelem(unsigned int n){nelem= n > 0 ? n : 1;
00194
00195 };
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; };
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
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
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 };
00244
00245 ~ChannelRequestMetaData(){};
00246 };
00247
00248
00253 class ChannelRequestMetaDataClient: public ChannelRequestMetaData{
00254 public:
00255
00256
00257
00258 public:
00259
00260
00261
00262
00263 ChannelRequestMetaDataClient(){};
00264 ~ChannelRequestMetaDataClient(){};
00265 };
00266
00267
00274 class ChannelRequestStatus{
00275
00276 private:
00277 int preRequestStatus;
00278 int requestStatus;
00279 int pendStatus;
00280 int callbackStatus;
00281 int messageStatus;
00282 CAFENUM::StatusMessageKind messageKind;
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
00310
00311
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