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     //Derived class does not inherit constructors
00042     PVDataHolder(unsigned int  _sizeOfArray) {
00043 
00044         alarmStatus=0; alarmSeverity=0; status=ECAFE_NODATA;
00045         nelem= _sizeOfArray > 0 ? _sizeOfArray : 1;
00046         size = _sizeOfArray > 0 ? _sizeOfArray : 1;
00047 
00048         dataType=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00049         dataTypeNative=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00050         rule=true; beamEventNo=0; userNo=0; ts.nsec=0; ts.secPastEpoch=0;
00051                     hasAlarm=true; hasTS=true;
00052         strcpy(pv,""); strcpy(pvAlias,""); strcpy(device,""); strcpy(attrib,"");
00053 
00054         val.reset( new CAFE_DATATYPE_UNION[nelem] );
00055 
00056         for (unsigned int  i=0; i<nelem; ++i) {
00057             val[i].d=0.0;
00058         };
00059     };
00060 
00061     PVDataHolder(){
00062 
00063         alarmStatus=0; alarmSeverity=0; status=ECAFE_NODATA; nelem=1; size=1;
00064         dataType=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00065         dataTypeNative=(CAFE_DATATYPE) CAFE_NO_ACCESS;
00066         rule=true; beamEventNo=0;  userNo=0; ts.nsec=0; ts.secPastEpoch =0;
00067                     hasAlarm=true; hasTS=true;
00068         strcpy(pv,""); strcpy(pvAlias,""); strcpy(device,""); strcpy(attrib,"");
00069 
00070         val.reset( new CAFE_DATATYPE_UNION[nelem] );
00071 
00072         val[0].d=0.00;
00073     };
00074                                         
00075     ~PVDataHolder() {
00076 
00077          val.reset();
00078     };
00079 
00080         void valReset() {
00081 
00082                 val.reset();
00083         }
00084 
00085 
00086         void setHasAlarm(bool a) {
00087                 hasAlarm=a;
00088                 return;
00089         };
00090 
00091         void setHasTS(bool t){
00092                 hasTS=t;
00093                 if (t) {hasAlarm=t;} //TS will also retrieve alarmStatus
00094                 return;
00095         }
00096 
00097         bool getHasTS(){
00098                 return hasTS;
00099         }
00100 
00101     unsigned int  setNelem (unsigned int  _nelem) {
00102 
00103         _nelem>0 ? nelem=_nelem : nelem=1;
00104 
00105                 if (nelem>size) {               
00106                         size=nelem;
00107             val.reset( new CAFE_DATATYPE_UNION[size] );         
00108         }
00109 
00110         return nelem;
00111     };
00112 
00113     epicsTimeStamp getEpicsTimeStamp() const {return ts;};
00114 
00115     struct etsNorm{ unsigned int secPastEpoch; unsigned int nsec;} _etsNorm;
00116     struct etsDate{ unsigned short year; unsigned short mon; unsigned short day;
00117                     unsigned short hour; unsigned short min; unsigned short sec; unsigned int nsec;} _etsDate ;
00118 
00119     etsNorm  getEpicsTimeStampAsUInt32() {
00120         _etsNorm.secPastEpoch=ts.secPastEpoch;
00121         _etsNorm.nsec=(unsigned long) ts.nsec;
00122         return _etsNorm;};
00123 
00124     etsDate  getEpicsTimeStampAsDate() {
00125 
00126                 ts.nsec=(unsigned int) ts.nsec;
00127 
00128                 //This may happen in timeouts; epicsTime convertor will report overflow error
00129                 //However this possibility is now captured in conduitFriend.h and other
00130                 if(ts.nsec >= 1000000000) {
00131                         cout << "OVERFLOW IN gets.nsec CORRECTED for epicsTime converter " << endl; ts.nsec=0;
00132                 }
00133 
00134         epicsTime time(ts);
00135 
00136         local_tm_nano_sec local = (local_tm_nano_sec) time;
00137         _etsDate.year = local.ansi_tm.tm_year + 1900;
00138         _etsDate.mon = local.ansi_tm.tm_mon  + 1;
00139         _etsDate.day = local.ansi_tm.tm_mday;
00140         _etsDate.hour = local.ansi_tm.tm_hour;
00141         _etsDate.min = local.ansi_tm.tm_min;
00142         _etsDate.sec = local.ansi_tm.tm_sec;
00143         _etsDate.nsec = (unsigned long) ts.nsec;
00144         return _etsDate;
00145     }
00146                 
00147     void print() {
00148         print(nelem) ;
00149     }
00150                 
00151     void print(unsigned int  nelemToPrint) {
00152         nelemToPrint=min(nelemToPrint,nelem);
00153         if (pv==NULL) {
00154             std::cout <<  "Process Variable NOT ASSIGNED!" << std::endl;
00155             std::cout <<  "Variable has not been applied to a get operation!" << std::endl;
00156             return;
00157         }
00158         std::cout <<  "------------------------------------------" << std::endl;
00159         //std::cout <<  "PVDataHolder:" << std::endl;
00160 
00161 
00162         std::cout <<  "processVariable= "  << pv << std::endl;
00163         if (strcmp(pvAlias,pv) && strcmp(pvAlias,"")) {
00164             std::cout <<  "pvAlias        = "  << pvAlias << std::endl;
00165         }
00166         std::cout <<  "device         = "  << device << std::endl;
00167         std::cout <<  "attrib         = "  << attrib << std::endl;
00168         std::cout <<  "dataType       = "  << cafeDataTypeCode.message(dataType).c_str()
00169                 << " (" << dataType << ") "  << std::endl;
00170         std::cout <<  "dbrTypeRequest = "  << dbr_type_to_text(dbrDataType)<< std::endl;
00171 
00172         //std::cout <<  "dataType = "  << CAFEDataTypeCode.message(dataType).c_str() << std::endl;
00173 
00174         if (dataType != CAFE_NO_ACCESS &&  dataType != CAFE_TYPENOTCONN) {
00175             std::cout <<  "nelem          = ";
00176         }
00177         else {
00178             std::cout <<  "nelem          = ";
00179         }
00180         std::cout << nelem; std::cout << std::endl;
00181         if(!rule) {
00182             std::cout <<  "rule (0=false) = "  << rule <<std::endl;
00183         }
00184 
00185         if (dbr_type_is_STS(dbrDataType) || dbr_type_is_TIME(dbrDataType) ) {
00186             std::cout <<  "alarmStatus    = "  << alarmStatus << std::endl;
00187             std::cout <<  "alarmSeverity  = "  << alarmSeverity << std::endl;
00188 
00189             if (dbr_type_is_TIME(dbrDataType)) {
00190             std::cout <<  "epicsTimeStamp = "  << ts.secPastEpoch << " sec. and " << ts.nsec << " nsec" << std::endl;
00191             }
00192         }
00193         if(beamEventNo!=0) {std::cout <<  "beamEventNo    = "  << beamEventNo << std::endl;};
00194         std::cout <<  "status         = "  << cafeStatusCode.message(status).c_str() << std::endl;
00195         std::cout <<  "value(s)       = "  ;
00196         
00197         switch (dataType) {
00198             case CAFE_STRING:
00199                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].str << " [" << i << "] " ;
00200             break;
00201             case CAFE_SHORT:
00202                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].s << " [" << i << "] " ;
00203             break;
00204             case CAFE_FLOAT:
00205                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].f << " [" << i << "] " ;
00206             break;
00207             case CAFE_ENUM:
00208             for (unsigned int  i=0; i <nelemToPrint; ++i ) { std::cout <<
00209                 getAsString(i) << " (" <<  val[i].us << ")"  << " [" << i << "] " ;}
00210             break;
00211             case CAFE_CHAR:
00212                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << (unsigned short) val[i].ch << " [" << i << "] " ;
00213             break;
00214             case CAFE_LONG:
00215                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].l << " [" << i << "] " ;
00216             break;
00217             case CAFE_DOUBLE:
00218                 for (unsigned int  i=0; i <nelemToPrint; ++i ) std::cout << val[i].d << " [" << i << "] " ;
00219             break;
00220             case CAFE_NO_ACCESS:
00221             std::cout << "DATA_TYPE NOT YET DEFINED " << endl;
00222             default:
00223             break;
00224 
00225         };
00226         std::cout << std::endl;
00227         std::cout <<  "------------------------------------------" << std::endl;
00228     };
00229 };
00230 
00231 
00232 #endif //PVDATAHOLDER_H

Generated on 3 May 2017 for CAFE by  doxygen 1.6.1