00001
00002
00003
00004
00005
00006
00007
00008 #ifndef INSTANT_H
00009 #define INSTANT_H
00010
00011 #include <transpose.h>
00012 #include <granules.h>
00013 #include <cafeEnum.h>
00014
00015
00016 template <class CTYPE> class Instant {
00017
00018 private:
00019 Transpose<dbr_string_t> renderString;
00020 Transpose<dbr_short_t> renderShort;
00021 Transpose<dbr_float_t> renderFloat;
00022 Transpose<dbr_enum_t> renderEnum;
00023 Transpose<dbr_char_t> renderChar;
00024 Transpose<dbr_long_t> renderLong;
00025 Transpose<dbr_double_t> renderDouble;
00026
00027 CAFEStatus cafeStatus;
00028 Granules cafeGranules;
00029
00030 PolicyHelper policyHelper;
00031
00032 HandleHelper helper;
00033
00034 Conduit cc;
00035 ChannelTimeoutPolicy channelTimeoutPolicyGet;
00036 ChannelRequestPolicy channelRequestPolicyGet;
00037 ChannelRequestStatus channelRequestStatusGet;
00038 ChannelRequestDataTypePolicy channelRequestDataTypePolicy;
00039
00040 ChannelRequestMetaDataClient channelRequestMetaDataClient;
00041
00042 int status;
00043
00044 int clientRequests(const unsigned int _handle, const chtype dbrType, const CTYPE * _val);
00045
00046 int clientRequests(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
00047 dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity, epicsTimeStamp &ts,
00048 bool isCacheRequest);
00049 public:
00050
00051 Instant (){};
00052 ~Instant (){};
00053
00054 int set(const unsigned int *handleArray, const unsigned int nelem,
00055 const chtype _dbrType, const CTYPE * val, int *statusArray);
00056
00057 int set(const unsigned int _handle, const chtype dbrType, const CTYPE * _val);
00058
00059 int get(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
00060 dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity, epicsTimeStamp &ts);
00061
00062 int get(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
00063 dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity){
00064 epicsTimeStamp ts;
00065 return get(_handle, dbrType, _val, alarmStatus, alarmSeverity, ts);
00066 };
00067
00068 int get(const unsigned int _handle, const chtype dbrType, CTYPE * _val){
00069 dbr_short_t alarmStatus; dbr_short_t alarmSeverity; epicsTimeStamp ts;
00070 return get(_handle, dbrType, _val, alarmStatus, alarmSeverity, ts);
00071 };
00072
00073 int getCache(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
00074 dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity, epicsTimeStamp &ts);
00075
00076 int getCache(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
00077 dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity){
00078 epicsTimeStamp ts;
00079 return getCache(_handle, dbrType, _val, alarmStatus, alarmSeverity, ts);
00080 };
00081
00082 int getCache(const unsigned int _handle, const chtype dbrType, CTYPE * _val){
00083 dbr_short_t alarmStatus; dbr_short_t alarmSeverity; epicsTimeStamp ts;
00084 return getCache(_handle, dbrType, _val, alarmStatus, alarmSeverity, ts);
00085 };
00086
00087 int getCache(const unsigned int *handleArray, const unsigned int nelem,
00088 const chtype _dbrType, CTYPE * val, int *statusArray,
00089 dbr_short_t *alarmStatus, dbr_short_t *alarmSeverity, epicsTimeStamp *ts);
00090
00091 int getCache(const unsigned int *handleArray, const unsigned int nelem,
00092 const chtype _dbrType, CTYPE * val, int *statusArray,
00093 dbr_short_t *alarmStatus, dbr_short_t *alarmSeverity ) {
00094 epicsTimeStamp * ts;
00095 return getCache(handleArray, nelem, _dbrType, val, statusArray,
00096 alarmStatus, alarmSeverity, ts);
00097 };
00098 int getCache(const unsigned int *handleArray, const unsigned int nelem,
00099 const chtype _dbrType, CTYPE * val, int *statusArray) {
00100 dbr_short_t * alarmStatus; dbr_short_t * alarmSeverity; epicsTimeStamp * ts;
00101 return getCache(handleArray, nelem, _dbrType, val, statusArray,
00102 alarmStatus, alarmSeverity, ts);
00103 };
00104
00105 int setAndGet(const unsigned int handleSet, const chtype dbrType, CTYPE valSet, CTYPE &valGet);
00106 int setAndMatch(const unsigned int handleSet, const chtype dbrType, CTYPE valSet, const unsigned int handleMatch,
00107 CTYPE tolerance, double timeout, bool printFlag);
00108
00109 int setAndMatchMany(vector<unsigned int> handleSetV, const chtype dbrType, vector<CTYPE> valSet, vector<unsigned int> handleMatch,
00110 CTYPE tolerance, double timeout, bool printFlag);
00111
00112 int matchMany( const chtype dbrType, vector<CTYPE> valSet, vector<unsigned int> handleMatch,
00113 CTYPE tolerance, double timeout, bool printFlag);
00114
00115 int match( const chtype dbrType, CTYPE valSet, unsigned int handleMatch,
00116 CTYPE tolerance, double timeout, bool printFlag);
00117
00118
00126 int setAndGetString(const unsigned int handleSet, string valSet, string &valGet) {
00127 #define __METHOD__ "Instant<CTYPE>::setAndGetString(const unsigned int handleSet, string valSet, string &valGet"
00128
00129
00130 dbr_string_t valGetA[1]; dbr_string_t valSetA[1];
00131
00132 strcpy(valGetA[0],"0");
00133 valGet="0";
00134
00135 helper.removeLeadingAndTrailingSpaces(valSet.c_str(), valSetA[0]);
00136
00137 status=Instant::set(handleSet, DBR_STRING, valSetA);
00138 if (status==ICAFE_NORMAL) {
00139 status=Instant::get(handleSet, DBR_STRING, valGetA);
00140
00141 valGet=valGetA[0];
00142 }
00143 else {
00144 return status;
00145 }
00146
00147 if (strcmp(valSetA[0],valGetA[0])==0) {
00148 return ICAFE_NORMAL;
00149 }
00150
00151
00152 istringstream ins, ous;
00153 double oud=0;
00154 ous.clear();
00155 ous.str(valGetA[0]);
00156 ous>>oud;
00157 double ind=0;
00158 ins.clear();
00159 ins.str(valSetA[0]);
00160 ins>>ind;
00161
00162
00163 if ( !ous.fail() && !ins.fail()) {
00164 if (ind==oud) {return ICAFE_NORMAL;}
00165 }
00166
00167 else if (!ins.fail()) {
00168 short enumval=-1;
00169
00170 enumval=helper.getEnumFromString(handleSet, valGet);
00171
00172
00173
00174 stringstream ss;
00175 ss << enumval;
00176 valGet= ss.str();
00177 if ((short)ind==enumval) {
00178 return ICAFE_NORMAL;
00179 }
00180
00181 }
00182
00183
00184 cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
00185 cout << "Process Variable = " << helper.getPVFromHandle(handleSet) << endl;
00186 cout << "Set Value: " << valSetA[0] << " Get Value: " << valGet.c_str() << endl;
00187 return ICAFE_SET_AND_GET_MISMATCH;
00188 #undef __METHOD__
00189
00190 };
00191
00192
00200 int setAndGetDbrString(const unsigned int handleSet, dbr_string_t valSet, dbr_string_t &valGet) {
00201 #define __METHOD__ "Instant<CTYPE>::setAndGetDbrString(const unsigned int handleSet, dbr_string_tvalSet, dbr_string_t &valGet"
00202
00203
00204 dbr_string_t valGetA[1]; dbr_string_t valSetA[1];
00205
00206 strcpy(valGetA[0],"0");
00207 strcpy(valGet,"0");
00208
00209 helper.removeLeadingAndTrailingSpaces(valSet, valSetA[0]);
00210
00211 status=Instant::set(handleSet, DBR_STRING, valSetA);
00212 if (status==ICAFE_NORMAL) {
00213 status=Instant::get(handleSet, DBR_STRING, valGetA);
00214
00215 strcpy(valGet,valGetA[0]);
00216 }
00217 else {
00218 return status;
00219 }
00220
00221 if (strcmp(valSetA[0],valGetA[0])==0) {
00222 return ICAFE_NORMAL;
00223 }
00224
00225
00226
00227 istringstream ins, ous;
00228 double oud=0;
00229 ous.clear();
00230 ous.str(valGetA[0]);
00231 ous>>oud;
00232 double ind=0;
00233 ins.clear();
00234 ins.str(valSetA[0]);
00235 ins>>ind;
00236
00237 if ( !ous.fail() && !ins.fail()) {
00238 if (ind==oud) {return ICAFE_NORMAL;}
00239 }
00240
00241 else if (!ins.fail()) {
00242 short enumval=-1;
00243
00244 enumval=helper.getEnumFromString(handleSet, valGet);
00245
00246
00247 stringstream ss;
00248 ss << enumval;
00249 strcpy(valGet, ss.str().c_str());
00250
00251 if ((short) ind==enumval) {
00252 return ICAFE_NORMAL;
00253 }
00254
00255
00256 }
00257
00258
00259 cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
00260 cout << "Process Variable = " << helper.getPVFromHandle(handleSet) << endl;
00261 cout << "Set Value: " << valSetA[0] << " Get Value: " << valGet << endl;
00262 return ICAFE_SET_AND_GET_MISMATCH;
00263 #undef __METHOD__
00264
00265 };
00266
00267 };
00268
00269 #include "instant.cpp"
00270
00271 #endif // INSTANT_H
00272