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              //std::cout <<  "alarmStatus    = "  << alarmStatus << " [" <<  acond.asString(alarmStatus)<< "]" << std::endl;
00228              //std::cout <<  "alarmSeverity  = "  << alarmSeverity << " [" << aseve.asString(alarmSeverity) << "]"<< std::endl;
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         if (dataType==CAFE_DOUBLE){
00237         std::cout <<  "RISC_Pad0      = "  << (dbr_short_t) RISC_pad.d << std::endl
00238                 // in dbr_ctrl_double this is a RISC_pad
00239         }
00240         else if (dataType==CAFE_CHAR) {
00241         std::cout <<  "RISC_Pad       = "  << (unsigned short) RISC_pad.ch << std::endl;
00242         }
00243         else if (dataType==CAFE_FLOAT) {
00244         std::cout <<  "RISC_Pad       = "  << (dbr_short_t) RISC_pad.f << std::endl;
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

Generated on 28 May 2018 for CAFE by  doxygen 1.6.1