Initial commit
This commit is contained in:
272
include/instant.h
Normal file
272
include/instant.h
Normal file
@@ -0,0 +1,272 @@
|
||||
///
|
||||
/// \file instant.h
|
||||
/// \author Jan Chrin, PSI
|
||||
/// \date Release: February 2015
|
||||
/// \version CAFE 1.0.0
|
||||
///
|
||||
|
||||
#ifndef INSTANT_H
|
||||
#define INSTANT_H
|
||||
|
||||
#include <transpose.h>
|
||||
#include <granules.h>
|
||||
#include <cafeEnum.h>
|
||||
|
||||
|
||||
template <class CTYPE> class Instant {
|
||||
|
||||
private:
|
||||
Transpose<dbr_string_t> renderString; // 0
|
||||
Transpose<dbr_short_t> renderShort; // 1
|
||||
Transpose<dbr_float_t> renderFloat; // 2
|
||||
Transpose<dbr_enum_t> renderEnum; // 3
|
||||
Transpose<dbr_char_t> renderChar; // 4
|
||||
Transpose<dbr_long_t> renderLong; // 5
|
||||
Transpose<dbr_double_t> renderDouble; // 6
|
||||
|
||||
CAFEStatus cafeStatus;
|
||||
Granules cafeGranules;
|
||||
|
||||
PolicyHelper policyHelper;
|
||||
|
||||
HandleHelper helper;
|
||||
|
||||
Conduit cc;
|
||||
ChannelTimeoutPolicy channelTimeoutPolicyGet;
|
||||
ChannelRequestPolicy channelRequestPolicyGet;
|
||||
ChannelRequestStatus channelRequestStatusGet;
|
||||
ChannelRequestDataTypePolicy channelRequestDataTypePolicy;
|
||||
|
||||
ChannelRequestMetaDataClient channelRequestMetaDataClient; //-1
|
||||
|
||||
int status;
|
||||
|
||||
int clientRequests(const unsigned int _handle, const chtype dbrType, const CTYPE * _val);
|
||||
|
||||
int clientRequests(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
|
||||
dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity, epicsTimeStamp &ts,
|
||||
bool isCacheRequest);
|
||||
public:
|
||||
|
||||
Instant (){};
|
||||
~Instant (){};
|
||||
|
||||
int set(const unsigned int *handleArray, const unsigned int nelem,
|
||||
const chtype _dbrType, const CTYPE * val, int *statusArray);
|
||||
|
||||
int set(const unsigned int _handle, const chtype dbrType, const CTYPE * _val);
|
||||
|
||||
int get(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
|
||||
dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity, epicsTimeStamp &ts);
|
||||
|
||||
int get(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
|
||||
dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity){
|
||||
epicsTimeStamp ts;
|
||||
return get(_handle, dbrType, _val, alarmStatus, alarmSeverity, ts);
|
||||
};
|
||||
|
||||
int get(const unsigned int _handle, const chtype dbrType, CTYPE * _val){
|
||||
dbr_short_t alarmStatus; dbr_short_t alarmSeverity; epicsTimeStamp ts;
|
||||
return get(_handle, dbrType, _val, alarmStatus, alarmSeverity, ts);
|
||||
};
|
||||
|
||||
int getCache(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
|
||||
dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity, epicsTimeStamp &ts);
|
||||
|
||||
int getCache(const unsigned int _handle, const chtype dbrType, CTYPE * _val,
|
||||
dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity){
|
||||
epicsTimeStamp ts;
|
||||
return getCache(_handle, dbrType, _val, alarmStatus, alarmSeverity, ts);
|
||||
};
|
||||
|
||||
int getCache(const unsigned int _handle, const chtype dbrType, CTYPE * _val){
|
||||
dbr_short_t alarmStatus; dbr_short_t alarmSeverity; epicsTimeStamp ts;
|
||||
return getCache(_handle, dbrType, _val, alarmStatus, alarmSeverity, ts);
|
||||
};
|
||||
|
||||
int getCache(const unsigned int *handleArray, const unsigned int nelem,
|
||||
const chtype _dbrType, CTYPE * val, int *statusArray,
|
||||
dbr_short_t *alarmStatus, dbr_short_t *alarmSeverity, epicsTimeStamp *ts);
|
||||
|
||||
int getCache(const unsigned int *handleArray, const unsigned int nelem,
|
||||
const chtype _dbrType, CTYPE * val, int *statusArray,
|
||||
dbr_short_t *alarmStatus, dbr_short_t *alarmSeverity ) {
|
||||
epicsTimeStamp * ts;
|
||||
return getCache(handleArray, nelem, _dbrType, val, statusArray,
|
||||
alarmStatus, alarmSeverity, ts);
|
||||
};
|
||||
int getCache(const unsigned int *handleArray, const unsigned int nelem,
|
||||
const chtype _dbrType, CTYPE * val, int *statusArray) {
|
||||
dbr_short_t * alarmStatus; dbr_short_t * alarmSeverity; epicsTimeStamp * ts;
|
||||
return getCache(handleArray, nelem, _dbrType, val, statusArray,
|
||||
alarmStatus, alarmSeverity, ts);
|
||||
};
|
||||
|
||||
int setAndGet(const unsigned int handleSet, const chtype dbrType, CTYPE valSet, CTYPE &valGet);
|
||||
int setAndMatch(const unsigned int handleSet, const chtype dbrType, CTYPE valSet, const unsigned int handleMatch,
|
||||
CTYPE tolerance, double timeout, bool printFlag);
|
||||
|
||||
int setAndMatchMany(vector<unsigned int> handleSetV, const chtype dbrType, vector<CTYPE> valSet, vector<unsigned int> handleMatch,
|
||||
CTYPE tolerance, double timeout, bool printFlag);
|
||||
|
||||
int matchMany( const chtype dbrType, vector<CTYPE> valSet, vector<unsigned int> handleMatch,
|
||||
CTYPE tolerance, double timeout, bool printFlag);
|
||||
|
||||
int match( const chtype dbrType, CTYPE valSet, unsigned int handleMatch,
|
||||
CTYPE tolerance, double timeout, bool printFlag);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Set followed by an immediate get
|
||||
* \param handleSet input: handle
|
||||
* \param valSet input: string value to set
|
||||
* \param valGet output: string value to get
|
||||
* \return ECA_NORMAL if all OK else first ECAFE error encountered, else ICAFE_SET_AND_GET_MISMATCH;
|
||||
*/
|
||||
int setAndGetString(const unsigned int handleSet, string valSet, string &valGet) {
|
||||
#define __METHOD__ "Instant<CTYPE>::setAndGetString(const unsigned int handleSet, string valSet, string &valGet"
|
||||
//CheckPolicy
|
||||
|
||||
dbr_string_t valGetA[1]; dbr_string_t valSetA[1];
|
||||
|
||||
strcpy(valGetA[0],"0");
|
||||
valGet="0";
|
||||
|
||||
helper.removeLeadingAndTrailingSpaces(valSet.c_str(), valSetA[0]);
|
||||
|
||||
status=Instant::set(handleSet, DBR_STRING, valSetA);
|
||||
if (status==ICAFE_NORMAL) {
|
||||
status=Instant::get(handleSet, DBR_STRING, valGetA);
|
||||
|
||||
valGet=valGetA[0];
|
||||
}
|
||||
else {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (strcmp(valSetA[0],valGetA[0])==0) {
|
||||
return ICAFE_NORMAL;
|
||||
}
|
||||
|
||||
//Check if number
|
||||
istringstream ins, ous;
|
||||
double oud=0;
|
||||
ous.clear();
|
||||
ous.str(valGetA[0]);
|
||||
ous>>oud;
|
||||
double ind=0;
|
||||
ins.clear();
|
||||
ins.str(valSetA[0]);
|
||||
ins>>ind;
|
||||
|
||||
|
||||
if ( !ous.fail() && !ins.fail()) {
|
||||
if (ind==oud) {return ICAFE_NORMAL;}
|
||||
}
|
||||
//Cater for enums that are refered to by their integer values in string format
|
||||
else if (!ins.fail()) {
|
||||
short enumval=-1;
|
||||
|
||||
enumval=helper.getEnumFromString(handleSet, valGet);
|
||||
|
||||
//Convert integer to string
|
||||
|
||||
stringstream ss;
|
||||
ss << enumval;
|
||||
valGet= ss.str();
|
||||
if ((short)ind==enumval) {
|
||||
return ICAFE_NORMAL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
|
||||
cout << "Process Variable = " << helper.getPVFromHandle(handleSet) << endl;
|
||||
cout << "Set Value: " << valSetA[0] << " Get Value: " << valGet.c_str() << endl;
|
||||
return ICAFE_SET_AND_GET_MISMATCH;
|
||||
#undef __METHOD__
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* \brief Set followed by an immediate get
|
||||
* \param handleSet input: handle
|
||||
* \param valSet input: dbr_string_t value to set
|
||||
* \param valGet output: dbr_string_t value to get
|
||||
* \return ECA_NORMAL if all OK else first ECAFE error encountered, else ICAFE_SET_AND_GET_MISMATCH;
|
||||
*/
|
||||
int setAndGetDbrString(const unsigned int handleSet, dbr_string_t valSet, dbr_string_t &valGet) {
|
||||
#define __METHOD__ "Instant<CTYPE>::setAndGetDbrString(const unsigned int handleSet, dbr_string_tvalSet, dbr_string_t &valGet"
|
||||
//CheckPolicy
|
||||
|
||||
dbr_string_t valGetA[1]; dbr_string_t valSetA[1];
|
||||
|
||||
strcpy(valGetA[0],"0");
|
||||
strcpy(valGet,"0");
|
||||
|
||||
helper.removeLeadingAndTrailingSpaces(valSet, valSetA[0]);
|
||||
|
||||
status=Instant::set(handleSet, DBR_STRING, valSetA);
|
||||
if (status==ICAFE_NORMAL) {
|
||||
status=Instant::get(handleSet, DBR_STRING, valGetA);
|
||||
|
||||
strcpy(valGet,valGetA[0]);
|
||||
}
|
||||
else {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (strcmp(valSetA[0],valGetA[0])==0) {
|
||||
return ICAFE_NORMAL;
|
||||
}
|
||||
|
||||
//Check if number
|
||||
//Check if number
|
||||
istringstream ins, ous;
|
||||
double oud=0;
|
||||
ous.clear();
|
||||
ous.str(valGetA[0]);
|
||||
ous>>oud;
|
||||
double ind=0;
|
||||
ins.clear();
|
||||
ins.str(valSetA[0]);
|
||||
ins>>ind;
|
||||
|
||||
if ( !ous.fail() && !ins.fail()) {
|
||||
if (ind==oud) {return ICAFE_NORMAL;}
|
||||
}
|
||||
//Cater for enums that are refered to by their integer values in string format
|
||||
else if (!ins.fail()) {
|
||||
short enumval=-1;
|
||||
|
||||
enumval=helper.getEnumFromString(handleSet, valGet);
|
||||
|
||||
//Convert integer to string
|
||||
stringstream ss;
|
||||
ss << enumval;
|
||||
strcpy(valGet, ss.str().c_str());
|
||||
|
||||
if ((short) ind==enumval) {
|
||||
return ICAFE_NORMAL;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
|
||||
cout << "Process Variable = " << helper.getPVFromHandle(handleSet) << endl;
|
||||
cout << "Set Value: " << valSetA[0] << " Get Value: " << valGet << endl;
|
||||
return ICAFE_SET_AND_GET_MISMATCH;
|
||||
#undef __METHOD__
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
#include "instant.cpp"
|
||||
|
||||
#endif // INSTANT_H
|
||||
|
||||
Reference in New Issue
Block a user