PVCtrlHolder.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef PVCTRLHOLDER_H
00009 #define PVCTRLHOLDER_H
00010
00011 #include <PVHolder.h>
00012
00013
00019 class PVCtrlHolder : public PVHolder {
00020
00021 friend class CAFE;
00022 friend class Connect;
00023 friend class Conduit;
00024 friend struct change_dataBufferPVCtrlHolder;
00025 friend struct change_dataBufferSize_CTRL;
00026 friend struct change_connectionHandlerArgs;
00027 friend struct change_pvAlias;
00028
00029 private:
00030
00031 short precision;
00032 char units[MAX_UNITS_SIZE];
00033
00034 CAFE_DATATYPE_UNION RISC_pad;
00035 CAFE_DATATYPE_UNION upperDispLimit;
00036 CAFE_DATATYPE_UNION lowerDispLimit;
00037 CAFE_DATATYPE_UNION upperAlarmLimit;
00038 CAFE_DATATYPE_UNION upperWarningLimit;
00039 CAFE_DATATYPE_UNION lowerWarningLimit;
00040 CAFE_DATATYPE_UNION lowerAlarmLimit;
00041 CAFE_DATATYPE_UNION upperCtrlLimit;
00042 CAFE_DATATYPE_UNION lowerCtrlLimit;
00043
00044 Helper helper;
00045
00046
00047 public:
00048
00049 PVCtrlHolder(){
00050 alarmStatus=0; alarmSeverity=0; precision=0; status=ECA_NORMAL;
00051 nelem=1; size=1; rule=true; beamEventNo=0;
00052 hasAlarm=true;
00053 noStr=0; dataType=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00054 dataTypeNative=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00055 strcpy(pv,""); strcpy(pvAlias,"");strcpy(device,""); strcpy(attrib,""); strcpy(units,"");
00056
00057 val.reset( new CAFE_DATATYPE_UNION[nelem] );
00058 val[0].d=0.00;
00059 };
00060
00061 PVCtrlHolder(unsigned int _sizeOfArray) {
00062 alarmStatus=0; alarmSeverity=0; precision=0; status=ECA_NORMAL;
00063 nelem=_sizeOfArray; size=_sizeOfArray; rule=true; beamEventNo=0;
00064 hasAlarm=true;
00065 noStr=0; dataType=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00066 dataTypeNative=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00067 strcpy(pv,""); strcpy(pvAlias,"");strcpy(device,""); strcpy(attrib,""); strcpy(units,"");
00068
00069 val.reset( new CAFE_DATATYPE_UNION[nelem] );
00070
00071 for (unsigned int i=0; i<nelem; ++i) {
00072 val[i].d=0.0;
00073 };
00074 };
00075
00076 ~PVCtrlHolder() {val.reset();};
00077
00078 void setHasAlarm(bool a) {
00079 hasAlarm=a;
00080 return;
00081 };
00082
00083 unsigned int setNelem (unsigned int _nelem) {
00084 _nelem>0 ? nelem=_nelem : nelem=1;
00085
00086 if (_nelem>size) {
00087
00088 size=_nelem;
00089
00090 val.reset( new CAFE_DATATYPE_UNION[size] );
00091 }
00092
00093 return nelem;
00094 };
00095
00096 short getPrecision() const {return precision;}
00097
00098 const char * getUnits() const {return units;}
00099 std::string getUnitsAsString() const {return (std::string) units;}
00100 short getNoEnumStrings () const {return noStr;};
00101 char * getEnumString(short indx) const {return (char *) strs[indx];};
00102
00103
00104 std::vector<std::string> getEnumStrings() const {
00105
00106 std::vector<std::string> vEnumStrings;
00107
00108 vEnumStrings.reserve(noStr>0?noStr:1);
00109 for ( short i=0; i<noStr; ++i) {
00110 vEnumStrings.push_back(strs[i]);
00111 }
00112 return vEnumStrings;
00113 };
00114
00115
00116 short getEnumFromString(std::string enumString){
00117
00118 short returnValue=-1;
00119
00120 for ( short i=0; i<noStr; ++i) {
00121 if (strcmp(enumString.c_str(), strs[i])==0) {
00122 return i;
00123 }
00124 }
00125
00126
00127 char pvStripped[MAX_ENUM_STRING_SIZE];
00128 helper.removeLeadingAndTrailingSpaces((char *) enumString.c_str(), pvStripped);
00129
00130 for ( short i=0; i<noStr; ++i) {
00131 if (strcmp(pvStripped, strs[i])==0) {
00132 return i;
00133 }
00134 }
00135 std::cout << "*** WARNING FROM PvCtrlHolder.h ***" << std::endl;
00136 std::cout << "*** Method getEnumFromString(string enumString) ***" << std::endl;
00137 std::cout << "The given input string '" << enumString << "' was not recognized! " << std::endl;
00138 std::cout << "Valid values are: " << std::endl;
00139 for ( short i=0; i<noStr; ++i) {
00140 std::cout << i << ":" << strs[i] << std::endl;
00141 }
00142
00143
00144 return returnValue;
00145
00146 }
00147
00148 std::string getStringFromEnum(unsigned short enumValue) const{
00149
00150 std::string returnValue="";
00151
00152 if (enumValue<noStr) {
00153 return (std::string) strs[enumValue];
00154 }
00155 else {
00156 std::cout << "*** WARNING FROM PvCtrlHolder.h ***" << std::endl;
00157 std::cout << "*** Method getStringFromEnum(unsigned short enumValue) ***" << std::endl;
00158 std::cout << "The given input index " << enumValue << " exceeds the number of enum states " << noStr << std::endl;
00159 std::cout << "Valid values are: " << std::endl;
00160 for ( short i=0; i<noStr; ++i) {
00161 std::cout << i << ":" << strs[i] << std::endl;
00162 }
00163
00164 if (enumValue<MAX_ENUM_STATES) {
00165 return (std::string) strs[enumValue];
00166 }
00167 else {
00168 return returnValue;
00169 }
00170 }
00171 }
00172
00173
00174
00175 CafeDataTypeHelper getRISC_pad() {CafeDataTypeHelper cdth(RISC_pad, dataType); return cdth;}
00176 CafeDataTypeHelper getUpperDispLimit() {CafeDataTypeHelper cdth(upperDispLimit, dataType); return cdth;}
00177 CafeDataTypeHelper getLowerDispLimit() {CafeDataTypeHelper cdth(lowerDispLimit, dataType); return cdth;}
00178 CafeDataTypeHelper getUpperAlarmLimit() {CafeDataTypeHelper cdth(upperAlarmLimit, dataType); return cdth;}
00179 CafeDataTypeHelper getUpperWarningLimit() {CafeDataTypeHelper cdth(upperWarningLimit, dataType); return cdth;}
00180 CafeDataTypeHelper getLowerWarningLimit() {CafeDataTypeHelper cdth(lowerWarningLimit, dataType); return cdth;}
00181 CafeDataTypeHelper getLowerAlarmLimit() {CafeDataTypeHelper cdth(lowerAlarmLimit, dataType); return cdth;}
00182 CafeDataTypeHelper getUpperCtrlLimit() {CafeDataTypeHelper cdth(upperCtrlLimit, dataType); return cdth;}
00183 CafeDataTypeHelper getLowerCtrlLimit() {CafeDataTypeHelper cdth(lowerCtrlLimit, dataType); return cdth;}
00184
00185
00186
00187 std::string getUpperDispLimit_AsString() { return getAsString(upperDispLimit); }
00188 std::string getLowerDispLimit_AsString() { return getAsString(lowerDispLimit); }
00189 std::string getUpperAlarmLimit_AsString() { return getAsString(upperAlarmLimit); }
00190 std::string getUpperWarningLimit_AsString() { return getAsString(upperWarningLimit); }
00191 std::string getLowerWarningLimit_AsString() { return getAsString(lowerWarningLimit); }
00192 std::string getLowerAlarmLimit_AsString() { return getAsString(lowerAlarmLimit); }
00193 std::string getUpperCtrlLimit_AsString() { return getAsString(upperCtrlLimit); }
00194 std::string getLowerCtrlLimit_AsString() { return getAsString(lowerCtrlLimit); }
00195
00196 double getUpperDispLimit_AsDouble() { return getAsDouble(upperDispLimit); }
00197 double getLowerDispLimit_AsDouble() { return getAsDouble(lowerDispLimit); }
00198 double getUpperAlarmLimit_AsDouble() { return getAsDouble(upperAlarmLimit); }
00199 double getUpperWarningLimit_AsDouble() { return getAsDouble(upperWarningLimit); }
00200 double getLowerWarningLimit_AsDouble() { return getAsDouble(lowerWarningLimit); }
00201 double getLowerAlarmLimit_AsDouble() { return getAsDouble(lowerAlarmLimit); }
00202 double getUpperCtrlLimit_AsDouble() { return getAsDouble(upperCtrlLimit); }
00203 double getLowerCtrlLimit_AsDouble() { return getAsDouble(lowerCtrlLimit); }
00204
00205 void print() {
00206 print(nelem) ;
00207 }
00208
00209
00210 void print(unsigned int nelemToPrint) {
00211
00212 nelemToPrint=std::min(nelemToPrint,nelem);
00213 std::cout << "------------------------------------------" << std::endl;
00214 std::cout << "PVCtrlHolder:" << std::endl;
00215 std::cout << "processVariable= " << pv << std::endl;
00216 if (strcmp(pvAlias,pv)) {
00217 std::cout << "pvAlias = " << pvAlias << std::endl;
00218 }
00219 std::cout << "device = " << device << std::endl;
00220 std::cout << "attrib = " << attrib << std::endl;
00221 std::cout << "dataType = " << cafeDataTypeCode.message(dataType).c_str()
00222 << " (" << dataType << ") " << std::endl;
00223 std::cout << "dbrTypeRequest = " << dbr_type_to_text(dbrDataType)<< std::endl;
00224 if (dataType!=CAFE_NO_ACCESS || dataType != CAFE_TYPENOTCONN) {
00225 std::cout << "nelem = " << nelem << std::endl;
00226
00227
00228
00229 std::cout << "alarmStatus = " << acond.asString(alarmStatus) << " (" << alarmStatus << ")" << std::endl;
00230 std::cout << "alarmSeverity = " << aseve.asString(alarmSeverity) << " (" <<alarmSeverity << ")" << std::endl;
00231
00232
00233 std::cout << "precision = " << precision << std::endl;
00234 std::cout << "units = " << units << std::endl;
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 if (dataType!=CAFE_ENUM) {
00248 std::cout << "upperDispLimit = " << getAsString(upperDispLimit) << std::endl;
00249 std::cout << "lowerDispLimit = " << getAsString(lowerDispLimit) << std::endl;
00250 std::cout << "upperAlarmLimit= " << getAsString(upperAlarmLimit) << std::endl;
00251 std::cout << "upperWarnLimit = " << getAsString(upperWarningLimit) << std::endl;
00252 std::cout << "lowerWarnLimit = " << getAsString(lowerWarningLimit) << std::endl;
00253 std::cout << "lowerAlarmLimit= " << getAsString(lowerAlarmLimit) << std::endl;
00254 if(dbr_type_is_CTRL(dbrDataType)) {
00255 std::cout << "upperCtrlLimit = " << getAsString(upperCtrlLimit) << std::endl;
00256 std::cout << "lowerCtrlLimit = " << getAsString(lowerCtrlLimit) << std::endl;
00257 }
00258 }
00259 else {
00260 std::cout << "NoStr (ENUM) = " << noStr << std::endl;
00261 std::cout << "strs (ENUM) = " ;
00262 for (short i=0; i< noStr; ++i) {std::cout << "{" << strs[i] << "} " ;}
00263 std::cout <<std::endl;
00264 }
00265
00266 std::cout << "status = " << cafeStatusCode.message(status).c_str() << std::endl;
00267 if(nelem>0) {std::cout << "value(s) = " ;}
00268
00269 switch (dataType) {
00270 case CAFE_STRING:
00271 for (unsigned int i=0; i <nelemToPrint; ++i ) {std::cout << val[i].str << " [" << i << "] " ;}
00272 break;
00273 case CAFE_SHORT:
00274 for (unsigned int i=0; i <nelemToPrint; ++i ) {std::cout << val[i].s << " [" << i << "] " ;}
00275 break;
00276 case CAFE_FLOAT:
00277 for (unsigned int i=0; i <nelemToPrint; ++i ) {std::cout << val[i].f << " [" << i << "] " ;}
00278 break;
00279 case CAFE_ENUM:
00280 for (unsigned int i=0; i <nelemToPrint; ++i ) {std::cout <<
00281 getAsString(i) << " (" << val[i].us << ")" << " [" << i << "] " ;}
00282 break;
00283 case CAFE_CHAR:
00284 for (unsigned int i=0; i <nelemToPrint; ++i ) {std::cout << (unsigned short) val[i].ch << " [" << i << "] " ;}
00285 break;
00286 case CAFE_LONG:
00287 for (unsigned int i=0; i <nelemToPrint; ++i ) {std::cout << val[i].l << " [" << i << "] " ;}
00288 break;
00289 case CAFE_DOUBLE:
00290 for (unsigned int i=0; i <nelemToPrint; ++i ) {std::cout << val[i].d << " [" << i << "] " ;}
00291 break;
00292 case CAFE_NO_ACCESS:
00293 default:
00294 std::cout << "DATA_TYPE NOT YET DEFINED " << std::endl;
00295 break;
00296
00297 }
00298 std::cout << std::endl;
00299 }
00300 std::cout << "------------------------------------------" << std::endl;
00301
00302 };
00303 };
00304
00305 #endif // PVCTRLHOLDER_H