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