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
00025 friend class loadCollectionXMLParser;
00026 friend class restorePVGroupXMLParser;
00027
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
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;}
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
00129
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
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
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