00001
00002
00003
00004
00005
00006
00007
00008 #ifndef HANDLEHELPER_H
00009 #define HANDLEHELPER_H
00010
00011 #include <cadef.h>
00012 #include <helper.h>
00013 #include <defines.h>
00014 #include <hashConduit.h>
00015 #include <conduitFriends.h>
00016 #include <hashConduitGroup.h>
00017 #include <cafeDataType.h>
00018 #include <defines.h>
00019
00020
00021 class HandleHelper : public Helper {
00022
00023 private:
00024 CAFEStatus cafeStatus;
00025 cafeConduit_set::iterator itcs;
00026
00027 cafeGroup_set::iterator itgs;
00028
00029 ChannelRequestMetaDataClient channelRequestMetaDataClient;
00030 ChannelRequestMetaData channelRequestMetaData;
00031
00032 ChannelRequestMetaDataClient channelRequestMetaCtrlClient;
00033 ChannelRequestMetaData channelRequestMetaCtrl;
00034
00035 ChannelDeviceAttribute channelDeviceAttribute;
00036 CAFEDataTypeCode cafeDataTypeCode;
00037
00038 PrintErrorPolicy printErrorPolicy;
00039
00040
00041
00042
00043
00044
00045
00046 public:
00047
00048 HandleHelper(){};
00049 ~HandleHelper(){};
00050
00051
00052 int setSTS(unsigned int _handle, dbr_short_t a, dbr_short_t s, epicsTimeStamp ets);
00053
00054
00055 etsNorm _etsNorm;
00056 etsDate _etsDate;
00057
00058 int checkConsistency();
00059 int checkConsistency(unsigned int _handle);
00060
00061 int setChannelDeviceAttribute(std::string deliminator);
00062 int setChannelDeviceAttribute(unsigned int _handle, std::string deliminator);
00063
00064 int getChannelDevice(unsigned int _handle, std::string & device);
00065 int getChannelAttribute(unsigned int _handle, std::string & attribute);
00066
00067 int getChannelRegalia(unsigned int _handle, ChannelRegalia & channelInfo);
00068
00069 int getChannelRequestStatusGetClassName(unsigned int _handle, ChannelRequestStatus &crsClassName);
00070 int getChannelRequestStatusGetSTSACK (unsigned int _handle, ChannelRequestStatus &crsSTSACK);
00071 int getChannelRequestStatusGetCtrl (unsigned int _handle, ChannelRequestStatus &crsCtrl);
00072 int getChannelRequestStatusGet (unsigned int _handle, ChannelRequestStatus &crs);
00073
00074
00075
00076 ca_client_context * getContextFromPV (const char * _pv);
00077 ca_client_context * getContextFromHandle (unsigned int _handle);
00078
00079 const char * getPVFromHandle (unsigned int _handle);
00080 const char * getPVFromHandle (unsigned int _handle, ca_client_context * ccc);
00081
00082
00083 const char * getPV (unsigned int _handle) {return getPVFromHandle(_handle);}
00084 const char * getPVAlias (unsigned int _handle);
00085 const char * getPVAlias (unsigned int _handle, ca_client_context * ccc);
00086
00087 unsigned int getHandleFromPV (const char * _pv);
00088 unsigned int getHandleFromPV (const char * _pv, ca_client_context * ccc);
00089 unsigned int getHandleFromPVAlias(const char * _pv);
00090 unsigned int getHandleFromPVAlias(const char * _pv, ca_client_context * ccc);
00091
00092 std::vector<unsigned int> getHandlesFromPVs(std::vector<std::string> pvV, ca_client_context * ccc);
00093 std::vector<unsigned int> getHandlesFromPVs(std::vector<std::string> pvV);
00094
00095 std::vector<unsigned int> getDisconnectedHandlesFromWithinGroupV(unsigned int gh);
00096
00097 std::vector<unsigned int> getHandlesFromWithinGroupV(unsigned int gh);
00098 unsigned int * getHandlesFromWithinGroup(unsigned int gh);
00099
00100 unsigned int getHandleFromPVWithinGroup(const char * _pv, unsigned int gh);
00101 unsigned int getHandleFromPVWithinGroup(const char * _pv,
00102 ca_client_context * ccc, unsigned int gh);
00103
00104 int getStatus (unsigned int h);
00105 int getTimeStamp(unsigned int h, epicsTimeStamp &ts);
00106
00107
00108 etsNorm getEpicsTimeStampAsUInt32(unsigned int h) {
00109 epicsTimeStamp ts;
00110 getTimeStamp(h, ts);
00111 _etsNorm.secPastEpoch=ts.secPastEpoch; _etsNorm.nsec=ts.nsec;
00112 return _etsNorm;};
00113
00114 etsDate getEpicsTimeStampAsDate(unsigned int h) {
00115 epicsTimeStamp ts;
00116
00117 getTimeStamp(h, ts);
00118
00119 epicsTime time(ts);
00120
00121 local_tm_nano_sec local = (local_tm_nano_sec) time;
00122 _etsDate.year = local.ansi_tm.tm_year + 1900;
00123 _etsDate.mon = local.ansi_tm.tm_mon + 1;
00124 _etsDate.day = local.ansi_tm.tm_mday;
00125 _etsDate.hour = local.ansi_tm.tm_hour;
00126 _etsDate.min = local.ansi_tm.tm_min;
00127 _etsDate.sec = local.ansi_tm.tm_sec;
00128
00129 _etsDate.nsec = (unsigned long) ts.nsec;
00130
00131 return _etsDate;
00132 }
00133
00134 etsDate epicsTimeStampToDate(epicsTimeStamp ts) {
00135 epicsTime time(ts);
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
00148 etsDate etsNormToDate(etsNorm ts) {
00149 epicsTimeStamp ets;
00150 ets.secPastEpoch=ts.secPastEpoch;
00151 ets.nsec=ts.nsec;
00152 epicsTime time(ets);
00153 local_tm_nano_sec local = (local_tm_nano_sec) time;
00154 _etsDate.year = local.ansi_tm.tm_year + 1900;
00155 _etsDate.mon = local.ansi_tm.tm_mon + 1;
00156 _etsDate.day = local.ansi_tm.tm_mday;
00157 _etsDate.hour = local.ansi_tm.tm_hour;
00158 _etsDate.min = local.ansi_tm.tm_min;
00159 _etsDate.sec = local.ansi_tm.tm_sec;
00160 _etsDate.nsec = (unsigned long) ts.nsec;
00161 return _etsDate;
00162 }
00163
00164
00165 etsDate unixTimeToDate(etsNorm ts) {
00166 time_t t= ts.secPastEpoch;
00167
00168 struct tm * local;
00169 local=localtime(&t);
00170
00171 _etsDate.year = local->tm_year +1900;
00172 _etsDate.mon = local->tm_mon + 1;
00173 _etsDate.day = local->tm_mday;
00174 _etsDate.hour = local->tm_hour;
00175 _etsDate.min = local->tm_min;
00176 _etsDate.sec = local->tm_sec;
00177 _etsDate.nsec = (unsigned long) ts.nsec;
00178 return _etsDate;
00179 }
00180
00181
00182 int getPulseID(unsigned int h, unsigned int &pulseID) {
00183 epicsTimeStamp ts;
00184 int status=getTimeStamp(h, ts);
00185 if (status==ICAFE_NORMAL){
00186 std::string nsS = static_cast<std::ostringstream*>( &(std::ostringstream() << ts.nsec) )->str();
00187 int l=nsS.length();
00188 int startPos=std::max(l-6,0);
00189 std::string pidS = nsS.substr(startPos,std::min(6,l));
00190 if ( ! (std::istringstream(pidS) >> pulseID) ) pulseID = 0;
00191 }
00192 return status;
00193 }
00194
00195 unsigned int getPulseIDFromTS(epicsTimeStamp ts) {
00196 unsigned int pulseID;
00197 std::string nsS = static_cast<std::ostringstream*>( &(std::ostringstream() << ts.nsec) )->str();
00198 int l=nsS.length();
00199 int startPos=std::max(l-6,0);
00200 std::string pidS = nsS.substr(startPos,std::min(6,l));
00201 if ( ! (std::istringstream(pidS) >> pulseID) ) pulseID = 0;
00202 return pulseID;
00203 }
00204
00205 int getAlarmStatusSeverity(unsigned int h, dbr_short_t as[2]);
00206 int getAlarmStatusSeverityAsString(unsigned int h, std::string asas[2]);
00207 unsigned int getNoHandles();
00208 unsigned int getNextFreeHandle();
00209
00210 bool isChannelConnected(unsigned int handle);
00211 bool allChannelsConnected();
00212 bool allChannelsWithinGroupConnected();
00213 bool allChannelsWithinGroupConnectedV(std::vector<unsigned int>);
00214
00215 int printHandle (unsigned int h);
00216 int printHandlesV(std::vector<unsigned int> handleV);
00217 int printHandles(unsigned int * handleArray, unsigned int nHandles);
00218 unsigned int printHandles();
00219 unsigned int printChannels(){return printHandles();};
00220 unsigned int printDisconnectedHandles();
00221 unsigned int printDisconnectedChannels(){return printDisconnectedChannels();};
00222 unsigned int getDisconnectedHandles(std::vector<unsigned int> &, std::vector<std::string> &);
00223 unsigned int getConnectedHandles(std::vector<unsigned int> &, std::vector<std::string> &);
00224 unsigned int getHandles(std::vector<unsigned int> &, std::vector<std::string> &);
00225 unsigned int getHandleStates(std::vector<unsigned int> &, std::vector<std::string> &, std::vector<unsigned short> &);
00226 unsigned int printMonitors();
00227
00228 std::vector<unsigned int> getHandlesWithMonitors();
00229 int getMonitorHandlesAndActions(std::vector<unsigned int> & handleV, std::vector<std::string> & actionV);
00230
00231 int setCafeDbrTypeV(std::vector<unsigned int> _handleV, CAFENUM::DBR_TYPE cdt);
00232 int setCafeDbrType(unsigned int _handle, CAFENUM::DBR_TYPE cdt);
00233 int getCafeDbrType(unsigned int _handle, CAFENUM::DBR_TYPE &cdt);
00234
00235 bool isEnum(unsigned int _handle);
00236 short getEnumFromString(unsigned int _handle, std::string enumStringValue);
00237 std::string getStringFromEnum(unsigned int _handle, unsigned short enumValue);
00238
00239 int getDataTypeNative (unsigned int _handle, chtype &ndt);
00240 int getDataTypeRequest(unsigned int _handle, chtype &rdt);
00241
00242 int eraseMonitorAction(unsigned int _handle);
00243 int clearMonitorAction(unsigned int _handle);
00244
00245 int clearMonitorAction();
00246
00247 int addMonitorAction(unsigned int _handle, std::string mAction);
00248 int getMonitorAction(unsigned int _handle, std::vector<std::string> &msV);
00249 std::vector<std::string> getMonitorAction(bool onlyIfNewData);
00250
00251 int getMonitorPolicyVector(unsigned int _handle, std::vector<MonitorPolicy> &mpV);
00252 int getMonitorPolicyInWaitingVector(unsigned int _handle, std::vector<MonitorPolicy> &mpV);
00253 int getNmonitor(unsigned int _handle);
00254 int getNmonitorData(unsigned int _handle);
00255 int getNmonitorCtrl(unsigned int _handle);
00256 std::vector<unsigned int> getMonitorIDs(unsigned int _handle);
00257 std::vector<unsigned int> getMonitorIDsInWaiting(unsigned int _handle);
00258
00259 unsigned int getUsrArgsAsUInt(unsigned int _handle);
00260 chtype getDataTypeCB(unsigned int _handle);
00261 chtype getDbrDataTypeCB(unsigned int _handle);
00262 CAFENUM::DBR_TYPE getCafeDbrTypeCB(unsigned int _handle);
00263
00264
00265 int setNelem ();
00266 unsigned int setNelem (unsigned int _handle);
00267 unsigned int setNelemToNative (unsigned int _handle){return setNelem(_handle);};
00268 unsigned int setNelem (unsigned int _handle, unsigned int _nelem);
00269
00270 unsigned int setNelemToRetrieveFromCache (unsigned int _handle);
00271 unsigned int setNelemToRetrieveFromCache (unsigned int _handle, unsigned int _nelem);
00272 unsigned int setNelemToRetrieveFromCtrlCache (unsigned int _handle);
00273 unsigned int setNelemToRetrieveFromCtrlCache (unsigned int _handle, unsigned int _nelem);
00274 unsigned int getNelemToRetrieveFromCache (unsigned int _handle);
00275 unsigned int getNelemToRetrieveFromCtrlCache (unsigned int _handle);
00276
00277 unsigned int getNelemClient (unsigned int _handle);
00278 unsigned int getNelemNative (unsigned int _handle);
00279 unsigned int getNelemRequest (unsigned int _handle);
00280
00281 int getNelem(unsigned int _handle, unsigned int &c, unsigned int &n, unsigned int &r);
00282
00283
00284 unsigned int setNelemCtrl (unsigned int _handle, unsigned int _nelem);
00285 unsigned int getNelemRequestCtrl (unsigned int _handle);
00286 unsigned int getNelemClientCtrl (unsigned int _handle);
00287
00288 unsigned int setOffset(unsigned int _handle, unsigned int _offset);
00289 unsigned int getOffset(unsigned int _handle);
00290 unsigned int getOffsetLast(unsigned int _handle);
00291
00292 void setFirstAndLastArrayElements(unsigned int _handle,
00293 unsigned int _start, unsigned int _last){
00294 if (_last > _start ) { setOffset(_handle, _start); setNelem(_handle, _last);}
00295 else {std::cout << " offset must be less than the nelements" <<std::endl; };
00296 };
00297
00298
00299
00300
00301
00302 int setMapPulseIDBufferSize(unsigned int _handle, unsigned short _bufferSize);
00303 int setMapPulseIDBufferSizeAll(unsigned short _bufferSize);
00304
00305
00306 unsigned int getGroupHandleFromGroupName(const char * _groupName){
00307 ca_client_context * ccc= ca_current_context();
00308 return getGroupHandleFromGroupName(_groupName, ccc);
00309 }
00310
00311 unsigned int getGroupHandleFromGroupName(const char * _groupName, ca_client_context * ccc);
00312 std::string getGroupNameFromGroupHandle(unsigned int groupHandle);
00313
00314 unsigned int getGroupNPV(unsigned int gHandle);
00315 unsigned int getGroupNPV(const char * _groupName, ca_client_context * ccc);
00316 unsigned int getGroupNPV(const char * _groupName){
00317 ca_client_context * ccc= ca_current_context();
00318 return getGroupNPV(_groupName, ccc);
00319 }
00320
00321 };
00322 #endif