PVDataHolder.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 #ifndef PVDATAHOLDER_H
00009 #define PVDATAHOLDER_H
00010 
00011 #include <PVHolder.h>
00012 
00018 class PVDataHolder : public PVHolder {
00019 
00020     friend class CAFE;
00021     friend class PVGroup;
00022     friend class Connect;
00023     friend class Conduit;
00024                 //if HAVE_LIBQTXML
00025     friend class loadCollectionXMLParser;
00026     friend class restorePVGroupXMLParser;
00027                 //endif
00028     friend struct change_dataBufferPVDataHolder;
00029     friend struct change_dataBufferSize_TIME;
00030     friend struct change_connectionHandlerArgs;
00031     friend struct change_pvAlias;
00032 
00033 //private:
00034     //epicsTimeStamp   ts;
00035           //bool hasTS;
00036 
00037         
00038 
00039 public:
00040 
00041                 epicsTimeStamp   ts;
00042           bool hasTS;
00043 
00044 
00045     //Derived class does not inherit constructors
00046     PVDataHolder(unsigned int  _sizeOfArray) {
00047 
00048         alarmStatus=-1; alarmSeverity=-1; status=ECAFE_NODATA;
00049         nelem= _sizeOfArray > 0 ? _sizeOfArray : 1;
00050         size = _sizeOfArray > 0 ? _sizeOfArray : 1;
00051 
00052         dataType=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00053         dataTypeNative=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00054         rule=true; beamEventNo=0; userNo=0; ts.nsec=0; ts.secPastEpoch=0;
00055                     hasAlarm=true; hasTS=true;
00056         strcpy(pv,""); strcpy(pvAlias,""); strcpy(device,""); strcpy(attrib,"");
00057 
00058         val.reset( new CAFE_DATATYPE_UNION[nelem] );
00059 
00060         for (unsigned int  i=0; i<nelem; ++i) {
00061             val[i].d=0.0;
00062         };
00063     };
00064 
00065     PVDataHolder(){
00066 
00067         alarmStatus=-1; alarmSeverity=-1; status=ECAFE_NODATA; nelem=1; size=1;
00068         dataType=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00069         dataTypeNative=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00070         rule=true; beamEventNo=0;  userNo=0; ts.nsec=0; ts.secPastEpoch =0;
00071                     hasAlarm=true; hasTS=true;
00072         strcpy(pv,""); strcpy(pvAlias,""); strcpy(device,""); strcpy(attrib,"");
00073 
00074         val.reset( new CAFE_DATATYPE_UNION[nelem] );
00075 
00076         val[0].d=0.00;
00077     };
00078                                         
00079     ~PVDataHolder() {
00080 
00081          val.reset();
00082     };
00083 
00084         void valReset() {
00085 
00086                 val.reset();
00087         }
00088 
00089 
00090         void setHasAlarm(bool a) {
00091                 hasAlarm=a;
00092                 return;
00093         };
00094 
00095         void setHasTS(bool t){
00096                 hasTS=t;
00097                 if (t) {hasAlarm=t;} //TS will also retrieve alarmStatus
00098                 return;
00099         }
00100 
00101         bool getHasTS(){
00102                 return hasTS;
00103         }
00104 
00105     unsigned int  setNelem (unsigned int  _nelem) {
00106 
00107         _nelem>0 ? nelem=_nelem : nelem=1;
00108 
00109                 if (nelem>size) {               
00110                         size=nelem;
00111             val.reset( new CAFE_DATATYPE_UNION[size] );         
00112         }
00113 
00114         return nelem;
00115     };
00116 
00117     epicsTimeStamp getEpicsTimeStamp() const {return ts;};
00118 
00119     //struct etsNorm{ unsigned int secPastEpoch; unsigned int nsec;} _etsNorm;
00120     //struct etsDate{ unsigned short year; unsigned short mon; unsigned short day;
00121     //                unsigned short hour; unsigned short min; unsigned short sec; unsigned int nsec;} _etsDate ;
00122                 etsNorm _etsNorm;
00123                 etsDate _etsDate;
00124 
00125     etsNorm  getEpicsTimeStampAsUInt32() {
00126         _etsNorm.secPastEpoch=ts.secPastEpoch;
00127         _etsNorm.nsec=(unsigned long) ts.nsec;
00128         return _etsNorm;};
00129 
00130     etsDate  getEpicsTimeStampAsDate() {
00131 
00132                 ts.nsec=(unsigned int) ts.nsec;
00133 
00134                 //This may happen in timeouts; epicsTime convertor will report overflow error
00135                 //However this possibility is now captured in conduitFriend.h and other
00136                 if(ts.nsec >= 1000000000) {
00137       std::cout << "OVERFLOW IN gets.nsec CORRECTED for epicsTime converter " << std::endl; ts.nsec=0;
00138                 }
00139 
00140         epicsTime time(ts);
00141 
00142         local_tm_nano_sec local = (local_tm_nano_sec) time;
00143         _etsDate.year = local.ansi_tm.tm_year + 1900;
00144         _etsDate.mon  = local.ansi_tm.tm_mon  + 1;
00145         _etsDate.day  = local.ansi_tm.tm_mday;
00146         _etsDate.hour = local.ansi_tm.tm_hour;
00147         _etsDate.min  = local.ansi_tm.tm_min;
00148         _etsDate.sec  = local.ansi_tm.tm_sec;
00149         _etsDate.nsec = (unsigned long) ts.nsec;
00150         return _etsDate;
00151     }
00152                 
00153                 
00154     etsDate getUnixTimeAsDate(etsNorm ets) {
00155                 
00156         time_t t= ets.secPastEpoch;
00157                                 
00158         struct tm * local;
00159         local=localtime(&t);
00160         //local_tm_nano_sec local = (local_tm_nano_sec) time;
00161         _etsDate.year = local->tm_year +1900;
00162         _etsDate.mon = local->tm_mon  + 1;
00163         _etsDate.day = local->tm_mday;
00164         _etsDate.hour = local->tm_hour;
00165         _etsDate.min = local->tm_min;
00166         _etsDate.sec = local->tm_sec;
00167         _etsDate.nsec = (unsigned long) ts.nsec;
00168         return _etsDate;
00169      }
00170 
00171                 
00172     void print() {
00173         print(nelem) ;
00174     }
00175                 
00176     void print(unsigned int  nelemToPrint) {
00177         nelemToPrint=std::min(nelemToPrint,nelem);
00178         if (strcmp(pv,"")==0) {
00179             std::cout <<  "Process Variable NOT ASSIGNED!" << std::endl;
00180             std::cout <<  "Variable has not been applied to a get operation!" << std::endl;
00181             return;
00182         }
00183        
00184         std::cout <<  "------------------------------------------" << std::endl;
00185         //std::cout <<  "PVDataHolder:" << std::endl;
00186 
00187 
00188         std::cout <<  "processVariable= "  << pv << std::endl;
00189         if (strcmp(pvAlias,pv) && strcmp(pvAlias,"")) {
00190             std::cout <<  "pvAlias        = "  << pvAlias << std::endl;
00191         }
00192         std::cout <<  "device         = "  << device << std::endl;
00193         std::cout <<  "attrib         = "  << attrib << std::endl;
00194         std::cout <<  "dataType       = "  << cafeDataTypeCode.message(dataType).c_str()
00195                 << " (" << dataType << ") "  << std::endl;
00196         std::cout <<  "dbrTypeRequest = "  << dbr_type_to_text(dbrDataType)
00197                   << " (" << dbrDataType << ") " << std::endl;
00198 
00199         //std::cout <<  "dataType = "  << CAFEDataTypeCode.message(dataType).c_str() << std::endl;
00200 
00201         if (dataType != CAFE_NO_ACCESS &&  dataType != CAFE_TYPENOTCONN) {
00202             std::cout <<  "nelem          = ";
00203         }
00204         else {
00205             std::cout <<  "nelem          = ";
00206         }
00207         std::cout << nelem; std::cout << std::endl;
00208         if(!rule) {
00209             std::cout <<  "rule (0=false) = "  << rule <<std::endl;
00210         }
00211 
00212         if (dbr_type_is_STS(dbrDataType) || dbr_type_is_TIME(dbrDataType) ) {
00213            
00214             std::cout <<  "alarmStatus    = " << acond.asString(alarmStatus)  << " ("  <<  alarmStatus <<  ")" << std::endl;
00215             std::cout <<  "alarmSeverity  = " << aseve.asString(alarmSeverity) << " (" <<alarmSeverity <<  ")" << std::endl;
00216 
00217             if (dbr_type_is_TIME(dbrDataType)) {
00218             std::cout <<  "timeStamp      = "  << ts.secPastEpoch << " sec. and " << ts.nsec << " nsec" << std::endl;
00219             }
00220         }
00221         if(beamEventNo!=0) {std::cout <<  "pulseID        = "  << beamEventNo << std::endl;};
00222         std::cout <<  "status         = "  << cafeStatusCode.message(status).c_str() << " (" << status << ") " << std::endl;
00223         std::cout <<  "value(s)       = "  ;
00224         
00225         switch (dataType) {
00226             case CAFE_STRING:
00227                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].str << " [" << i << "] " ;
00228             break;
00229             case CAFE_SHORT:
00230                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].s << " [" << i << "] " ;
00231             break;
00232             case CAFE_FLOAT:
00233                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].f << " [" << i << "] " ;
00234             break;
00235             case CAFE_ENUM:
00236             for (unsigned int  i=0; i <nelemToPrint; ++i ) { std::cout <<
00237                 getAsString(i) << " (" <<  val[i].us << ")"  << " [" << i << "] " ;}
00238             break;
00239             case CAFE_CHAR:
00240                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << (unsigned short) val[i].ch << " [" << i << "] " ;
00241             break;
00242             case CAFE_LONG:
00243                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].l << " [" << i << "] " ;
00244             break;
00245             case CAFE_DOUBLE:
00246                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].d << " [" << i << "] " ;
00247             break;
00248             case CAFE_NO_ACCESS:
00249                 std::cout << "DATA_TYPE NOT YET DEFINED " << std::endl;
00250             default:
00251             break;
00252 
00253         };
00254         std::cout << std::endl;
00255         std::cout <<  "------------------------------------------" << std::endl;
00256     };
00257 };
00258 
00259 
00260 #endif //PVDATAHOLDER_H

Generated on 28 May 2018 for CAFE by  doxygen 1.6.1