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

Generated on 3 May 2017 for CAFE by  doxygen 1.6.1