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
00034
00035
00036
00037
00038
00039 public:
00040
00041 epicsTimeStamp ts;
00042 bool hasTS;
00043
00044
00045
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;}
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
00120
00121
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
00135
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
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
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
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