Files
cpp/src/cafeCache.cpp
T

2489 lines
84 KiB
C++

///
/// \file cafeCache.cpp
/// \author Jan Chrin, PSI
/// \date Release: February 2015
/// \version CAFE 1.0.0
///
#include <cafe.h>
using namespace std;
/**
* \fn int CAFE::getCache(const unsigned int *handleArray, unsigned int nelem, long long * val,
* int *statusArray, dbr_short_t *alarmStatus, dbr_short_t *alarmSeverity, epicsTimeStamp *ts)
* \brief Retrieves data (long long) from cache
* \param handleArray input: Array of handles to Conduit object
* \param nelem input: No. of array elements
* \param val output: Array of long longs containing cached data
* \param statusArray output: Array of status'
* \param alarmStatus output: Alarm Status
* \param alarmSeverity output: Corresponding severity of alarm
* \param ts output: epics timestamp struct
* \return overallStatus: ICAFE_NORMAL if all OK else first ECAFE error encountered
*/
int CAFE::getCache(const unsigned int *handleArray, unsigned int nelem, long long * val,
int *statusArray, dbr_short_t *alarmStatus, dbr_short_t *alarmSeverity, epicsTimeStamp *ts)
{
#define __METHOD__ \
"CAFE::getCache(*handleArray, nelem, * val, *statusArray, *alarmStatus, *alarmSeverity, *ts"
unsigned int * nelemPrevious = new unsigned int [nelem];
for (unsigned int i=0; i < nelem; ++i)
{
nelemPrevious[i] =CAFE::setNelemToRetrieveFromCacheToOne(handleArray[i]);
}
//Whatever is already there!
//find biggest data type
//what is the highest native type?
chtype chtMax=DBF_CHAR;
ChannelRegalia channelInfo;
unsigned short nbyteChType=1;
unsigned short nbyteMax=nbyteChType;
for (unsigned int i=0; i<nelem; ++i)
{
CAFE::getChannelInfo(handleArray[i], channelInfo);
switch (channelInfo.getDataType())
{
case DBF_CHAR:
nbyteChType=sizeof(dbr_char_t);
break;
case DBF_SHORT:
nbyteChType=sizeof(dbr_short_t);
break;
case DBF_ENUM:
nbyteChType=sizeof(dbr_enum_t);
break;
case DBF_LONG:
nbyteChType=sizeof(dbr_long_t);
break;
case DBF_FLOAT:
nbyteChType=sizeof(dbr_float_t);
break;
case DBF_DOUBLE:
nbyteChType=sizeof(dbr_double_t);
break;
case DBF_STRING:
nbyteChType=sizeof(dbr_string_t);
break;
default:
nbyteChType=1;
}
if ( channelInfo.getCafeConnectionState() != ICAFE_CS_NEVER_CONN && channelInfo.getCafeConnectionState() != ICAFE_CS_CLOSED)
{
if (channelInfo.getDataType()==DBF_STRING)
{
chtMax=DBR_STRING;
break;
}
if(nbyteChType>nbyteMax && channelInfo.getDataType()< CAFE_NO_ACCESS)
{
chtMax=channelInfo.getDataType();
nbyteMax=4;
}
}
}
switch (chtMax)
{
case DBR_STRING:
{
dbr_string_t * _sVal = new dbr_string_t[nelem];
status=cafeSoluble.getCache(handleArray, nelem, DBR_TIME_STRING, _sVal, statusArray,
alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
istringstream ss;
for (unsigned int i=0; i < nelem; ++i)
{
long long l=0;
ss.clear();
ss.str(_sVal[i]);
ss>>l;
if ( !ss.fail())
{
val[i] = (long long) l;
std::string strInput=_sVal[i];
std::stringstream ssOut;
ssOut << l;
std::string strOutput=ssOut.str();
if (strInput!=strOutput)
{
cout << __METHOD__ << "//" << __LINE__ << endl;
cout << "***WARNING*** STRING TO LONG LONG CONVERSION REPORTS: " << endl;
cout << "STRING VALUE: " << strInput << " CONVERTED TO: " << strOutput << endl;
}
}
else
{
cout << __METHOD__ << "//" << __LINE__ << endl;
cout << "***WARNING*** NO STRING TO LONG LONG CONVERSION for ELEMENT " << i \
<< " of " << nelem << " !! " << endl;
cout << "***WARNING*** COULD NOT CONVERT: ";
cout << _sVal[i];
cout << " TO LONG LONG ; CONVERSION NOT MADE!" << endl;
cout << "Returning value 0 for element " << i << endl;
cout << "Status value is ECAFE_NO_CONVERT for element " << i << endl;
val[i]=0;
statusArray[i]=ECAFE_NO_CONVERT;
}
}
}
delete [] _sVal;
break;
}
case DBR_DOUBLE:
{
dbr_double_t * _dVal = new dbr_double_t[nelem];
status=cafeDoppio.getCache(handleArray, nelem, DBR_TIME_DOUBLE, _dVal, statusArray,
alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
for (unsigned int i=0; i < nelem; ++i)
{
val[i] = (long long) _dVal[i];
}
}
delete [] _dVal;
break;
}
case DBR_FLOAT:
{
dbr_float_t * _fVal = new dbr_float_t[nelem];
status=cafeFrappuccino.getCache(handleArray, nelem, DBR_TIME_FLOAT, _fVal, statusArray,
alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
for (unsigned int i=0; i < nelem; ++i)
{
val[i] = (long long) _fVal[i];
}
}
delete [] _fVal;
break;
}
case DBR_LONG:
{
dbr_long_t * _lVal = new dbr_long_t[nelem];
//std::cout << __METHOD__ << std::endl;
status=cafeLatte.getCache(handleArray, nelem, DBR_TIME_LONG, _lVal, statusArray,
alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
for (unsigned int i=0; i < nelem; ++i)
{
val[i] = (long long) _lVal[i];
}
}
//(std::cout << __METHOD__ << val[0] << std::endl;
delete [] _lVal;
break;
}
}//switch
for (unsigned int i=0; i < nelem; ++i)
{
CAFE::setNelemToRetrieveFromCacheToPrevious(handleArray[i],nelemPrevious[i]);
}
return status;
#undef __METHOD__
};
/** \fn int CAFE::getCache(const unsigned int *handleArray, unsigned int nelem, long long * val,
* int *statusArray, dbr_short_t *alarmStatus, dbr_short_t *alarmSeverity)
* \brief Retrieves data (long long) from cache
* \param handleArray input: Array of handles to Conduit object
* \param nelem input: No. of array elements
* \param val output: Array of long longs containing cached data
* \param statusArray output: Array of status'
* \param alarmStatus output: Alarm Status
* \param alarmSeverity output: Corresponding severity of alarm
* \return overallStatus: ICAFE_NORMAL if all OK else first ECAFE error encountered
*/
int CAFE::getCache(const unsigned int *handleArray, unsigned int nelem, long long * val,
int *statusArray, dbr_short_t *alarmStatus, dbr_short_t *alarmSeverity)
{
epicsTimeStamp *ts = new epicsTimeStamp[nelem];
status=CAFE::getCache(handleArray, nelem, val, statusArray, alarmStatus, alarmSeverity, ts);
delete [] ts;
return status;
};
/**
* \brief Retrieves data (long long) from cache
* \param handleArray input: Array of handles to Conduit object
* \param nelem input: No of array elements
* \param val output: Array of long longs containing cached data
* \param statusArray output: Array of status'
* \return overallStatus: ICAFE_NORMAL if all OK else first ECAFE error encountered
*/
int CAFE::getCache (const unsigned int *handleArray, unsigned int nelem, long long * val,
int *statusArray)
{
dbr_short_t *alarmStatus;
dbr_short_t *alarmSeverity;
epicsTimeStamp *ts;
ts = new epicsTimeStamp[nelem];
alarmStatus = new dbr_short_t[nelem];
alarmSeverity = new dbr_short_t[nelem];
status=CAFE::getCache(handleArray, nelem, val, statusArray, alarmStatus, alarmSeverity, ts);
delete [] ts;
delete [] alarmStatus;
delete [] alarmSeverity;
return status;
}
/**
* \brief Retrieves data (long long) from cache
* \param handle input: Handle Conduit object
* \param _val output: Array of long longs containing cached data
* \param alarmStatus output: Alarm Status
* \param alarmSeverity output: Corresponding severity of alarm
* \param ts output: epics timestamp struct
* \return overallStatus: ICAFE_NORMAL if all OK else first ECAFE error encountered
*/
//5+ long long getCache
int CAFE::getCache(const unsigned int handle, long long * _val, \
dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
#define __METHOD__ \
"CAFE::getCache(const unsigned int handle, long long * _val, \
dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity, epicsTimeStamp &ts)"
ChannelRegalia channelInfo;
CAFE::getChannelInfo(handle, channelInfo);
if ( channelInfo.getCafeConnectionState() == ICAFE_CS_NEVER_CONN)
{
return ICAFE_CS_NEVER_CONN;
}
else if ( channelInfo.getCafeConnectionState()==ICAFE_CS_CLOSED)
{
return ICAFE_CS_CLOSED;
}
int _status=ICAFE_NORMAL;
unsigned int nn=handleHelper.getNelemRequest(handle);
if ( channelInfo.getDataType() == DBR_STRING)
{
dbr_string_t * _sVal = new dbr_string_t[nn];
_status=cafeSoluble.getCache (handle, DBR_TIME_STRING, _sVal, alarmStatus, alarmSeverity, ts);
if (_status!=ICAFE_NORMAL)
{
delete [] _sVal;
return _status;
}
istringstream ss;
for (unsigned short i=0; i<nn; ++i)
{
long long l=0;
ss.clear();
ss.str(_sVal[i]);
ss>>l;
if ( !ss.fail())
{
_val[i] = (long long) l;
std::string strInput=_sVal[i];
std::stringstream ssOut;
ssOut << l;
std::string strOutput=ssOut.str();
if (strInput!=strOutput)
{
cout << __METHOD__ << "//" << __LINE__ << endl;
cout << "***WARNING*** STRING TO LONG LONG CONVERSION REPORTS: " << endl;
cout << "STRING VALUE: " << strInput << " CONVERTED TO: " << strOutput << endl;
}
}
else
{
cout << __METHOD__ << "//" << __LINE__ << endl;
cout << "***WARNING*** NO STRING TO LONG LONG CONVERSION for ELEMENT " << i \
<< " of " << nn << " !! " << endl;
cout << "***WARNING*** COULD NOT CONVERT: ";
cout << _sVal[i];
cout << " TO LONG LONG ; CONVERSION NOT MADE!" << endl;
cout << "Returning value 0 for element " << i << endl;
_val[i]=0;
}
}
delete [] _sVal;
}
else if ( channelInfo.getDataType() == DBR_DOUBLE)
{
dbr_double_t * _dVal = new dbr_double_t[nn];
_status=cafeDoppio.getCache (handle, DBR_TIME_DOUBLE, _dVal, alarmStatus, alarmSeverity, ts);
for (unsigned int i=0; i < handleHelper.getNelemRequest(handle); ++i)
{
_val[i] = (long long) _dVal[i];
}
delete [] _dVal;
}
else if ( channelInfo.getDataType() == DBR_FLOAT)
{
dbr_float_t * _fVal = new dbr_float_t[nn];
_status=cafeFrappuccino.getCache (handle, DBR_TIME_FLOAT, _fVal, alarmStatus, alarmSeverity, ts);
for (unsigned int i=0; i < handleHelper.getNelemRequest(handle); ++i)
{
_val[i] = (long long) _fVal[i];
}
delete [] _fVal;
}
else
{
dbr_long_t * _lVal = new dbr_long_t[nn];
_status=cafeLatte.getCache (handle, DBR_TIME_LONG, _lVal, alarmStatus, alarmSeverity, ts);
for (unsigned int i=0; i < handleHelper.getNelemRequest(handle); ++i)
{
_val[i] = (long long) _lVal[i];
}
delete [] _lVal;
}
return _status;
#undef __METHOD__
};
/**
* \brief Retrieves data (long long) from cache
* \param handle input: Handle Conduit object
* \param _val output: Array of long longs containing cached data
* \param alarmStatus output: Alarm Status
* \param alarmSeverity output: Corresponding severity of alarm
* \return overallStatus: ICAFE_NORMAL if all OK else first ECAFE error encountered
*/
int CAFE::getCache(const unsigned int handle, long long * _val, \
dbr_short_t &alarmStatus, dbr_short_t &alarmSeverity)
{
#define __METHOD__ \
"CAFE::getCache(const unsigned int handle, long long * _val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)"
ChannelRegalia channelInfo;
CAFE::getChannelInfo(handle, channelInfo);
if ( channelInfo.getCafeConnectionState() == ICAFE_CS_NEVER_CONN)
{
return ICAFE_CS_NEVER_CONN;
}
else if ( channelInfo.getCafeConnectionState()==ICAFE_CS_CLOSED)
{
return ICAFE_CS_CLOSED;
}
int _status=ICAFE_NORMAL;
unsigned int nn=handleHelper.getNelemRequest(handle);
if ( channelInfo.getDataType() == DBR_STRING)
{
dbr_string_t * _sVal = new dbr_string_t[nn];
_status=cafeSoluble.getCache (handle, DBR_STS_STRING, _sVal, alarmStatus, alarmSeverity);
if (_status!=ICAFE_NORMAL)
{
delete [] _sVal;
return _status;
}
istringstream ss;
for (unsigned short i=0; i<nn; ++i)
{
long long l=0;
ss.clear();
ss.str(_sVal[i]);
ss>>l;
if ( !ss.fail())
{
_val[i] = (long long) l;
std::string strInput=_sVal[i];
std::stringstream ssOut;
ssOut << l;
std::string strOutput=ssOut.str();
if (strInput!=strOutput)
{
cout << __METHOD__ << "//" << __LINE__ << endl;
cout << "***WARNING*** STRING TO LONG LONG CONVERSION REPORTS: " << endl;
cout << "STRING VALUE: " << strInput << " CONVERTED TO: " << strOutput << endl;
}
}
else
{
cout << __METHOD__ << "//" << __LINE__ << endl;
cout << "***WARNING*** NO STRING TO LONG LONG CONVERSION for ELEMENT " << i \
<< " of " << nn << " !! " << endl;
cout << "***WARNING*** COULD NOT CONVERT: ";
cout << _sVal[i];
cout << " TO LONG LONG ; CONVERSION NOT MADE!" << endl;
cout << "Returning value 0 for element " << i << endl;
_val[i]=0;
}
}
delete [] _sVal;
}
else if ( channelInfo.getDataType() == DBR_DOUBLE)
{
dbr_double_t * _dVal = new dbr_double_t[nn];
_status=cafeDoppio.getCache(handle, DBR_STS_DOUBLE, _dVal, alarmStatus, alarmSeverity);
for (unsigned int i=0; i < handleHelper.getNelemRequest(handle); ++i)
{
_val[i] = (long long) _dVal[i];
}
delete [] _dVal;
}
else if ( channelInfo.getDataType() == DBR_FLOAT)
{
dbr_float_t * _fVal = new dbr_float_t[nn];
_status=cafeFrappuccino.getCache (handle, DBR_STS_FLOAT, _fVal, alarmStatus, alarmSeverity);
for (unsigned int i=0; i < handleHelper.getNelemRequest(handle); ++i)
{
_val[i] = (long long) _fVal[i];
}
delete [] _fVal;
}
else
{
dbr_long_t * _lVal = new dbr_long_t[nn];
_status=cafeLatte.getCache (handle, DBR_STS_LONG, _lVal, alarmStatus, alarmSeverity);
for (unsigned int i=0; i < handleHelper.getNelemRequest(handle); ++i)
{
_val[i] = (long long) _lVal[i];
}
delete [] _lVal;
}
return _status;
#undef __METHOD__
};
/**
* \brief Retrieves data (long long) from cache
* \param handle input: Handle Conduit object
* \param _val output: Array of long longs containing cached data
* \return overallStatus: ICAFE_NORMAL if all OK else first ECAFE error encountered
*/
int CAFE::getCache(const unsigned int handle, long long * _val)
{
#define __METHOD__ \
"CAFE::get(const unsigned int handle, long long * _val)"
ChannelRegalia channelInfo;
CAFE::getChannelInfo(handle, channelInfo);
if ( channelInfo.getCafeConnectionState() == ICAFE_CS_NEVER_CONN)
{
return ICAFE_CS_NEVER_CONN;
}
else if ( channelInfo.getCafeConnectionState()==ICAFE_CS_CLOSED)
{
return ICAFE_CS_CLOSED;
}
int _status=ICAFE_NORMAL;
unsigned int nn=handleHelper.getNelemRequest(handle);
if ( channelInfo.getDataType() == DBR_STRING)
{
dbr_string_t * _sVal = new dbr_string_t[nn];
_status=cafeSoluble.getCache (handle, DBR_STRING, _sVal);
if (_status!=ICAFE_NORMAL)
{
delete [] _sVal;
return _status;
}
istringstream ss;
for (unsigned short i=0; i<nn; ++i)
{
long long l=0;
ss.clear();
ss.str(_sVal[i]);
ss>>l;
if ( !ss.fail())
{
_val[i] = (long long) l;
std::string strInput=_sVal[i];
std::stringstream ssOut;
ssOut << l;
std::string strOutput=ssOut.str();
if (strInput!=strOutput)
{
cout << __METHOD__ << "//" << __LINE__ << endl;
cout << "***WARNING*** STRING TO LONG LONG CONVERSION REPORTS: " << endl;
cout << "STRING VALUE: " << strInput << " CONVERTED TO: " << strOutput << endl;
}
}
else
{
cout << __METHOD__ << "//" << __LINE__ << endl;
cout << "***WARNING*** NO STRING TO LONG LONG CONVERSION for ELEMENT " << i \
<< " of " << nn << " !! " << endl;
cout << "***WARNING*** COULD NOT CONVERT: ";
cout << _sVal[i];
cout << " TO LONG LONG ; CONVERSION NOT MADE!" << endl;
cout << "Returning value 0 for element " << i << endl;
_val[i]=0;
}
}
delete [] _sVal;
}
else if ( channelInfo.getDataType() == DBR_DOUBLE)
{
dbr_double_t * _dVal = new dbr_double_t[nn];
_status=cafeDoppio.getCache (handle, DBR_DOUBLE, _dVal);
if (_status!=ICAFE_NORMAL)
{
delete [] _dVal;
return _status;
}
for (unsigned int i=0; i < handleHelper.getNelemRequest(handle); ++i)
{
_val[i] = (long long) _dVal[i];
}
delete [] _dVal;
}
else if ( channelInfo.getDataType() == DBR_FLOAT)
{
dbr_float_t * _fVal = new dbr_float_t[nn];
_status=cafeFrappuccino.getCache (handle, DBR_FLOAT, _fVal);
if (_status!=ICAFE_NORMAL)
{
delete [] _fVal;
return _status;
}
for (unsigned int i=0; i < handleHelper.getNelemRequest(handle); ++i)
{
_val[i] = (long long) _fVal[i];
}
delete [] _fVal;
}
else
{
dbr_long_t * _lVal = new dbr_long_t[nn];
_status=cafeLatte.getCache (handle, DBR_LONG, _lVal);
if (_status!=ICAFE_NORMAL)
{
delete [] _lVal;
return _status;
}
for (unsigned int i=0; i < handleHelper.getNelemRequest(handle); ++i)
{
_val[i] = (long long) _lVal[i];
}
delete [] _lVal;
}
return _status;
#undef __METHOD__
};
/**
* \brief Retrieves data from cache, packaged into the PVDataHolder class
* \param handleArray input: Array of handles to Conduit object
* \param nelem input: No of array elements
* \param pvdArray outout: Array of PVDataHolder containing cached data
* \return overallStatus: ICAFE_NORMAL if all OK else first ECAFE error encountered
*/
int CAFE::getCache(const unsigned int * handleArray, unsigned int nelem, PVDataHolder * pvdArray)
{
#define __METHOD__ \
"CAFE::getCache(unsigned int * handleArray, unsigned int nelem, PVDataHolder * pvdArray)"
int overallStatus=ICAFE_NORMAL;
bool isGood=true;
for (unsigned int i=0; i<nelem; ++i)
{
status=getCache(handleArray[i], pvdArray [i]);
//if ( (status != ICAFE_NORMAL) && isGood) {
if ( (pvdArray[i].status != ICAFE_NORMAL) && isGood)
{
overallStatus=pvdArray[i].status;
isGood=false;
}
}
return overallStatus;
#undef __METHOD__
};
/**
* \brief Retrieves data from cache, packaged into the PVDataHolder class
* \param handle input: handle to Conduit object
* \param pvd outout: PVDataHolder containing cached data
* \return ICAFE_NORMAL if all OK else ICAFE_WAITING_FOR_PREV_CALLBACK;
*/
int CAFE::getCache(const unsigned int handle, PVDataHolder & pvd)
{
#define __METHOD__ "CAFE::getCache(unsigned int handle, PVDataHolder & pvd)"
status=ICAFE_NORMAL;
cafeConduit_set_by_handle & handle_index = cs.get<by_handle> ();
cafeConduit_set_by_handle::iterator it_handle;
it_handle = handle_index.find(handle);
// std::cout << __FILE__ << " " << __METHOD__ << std::endl;
if (it_handle != handle_index.end())
{
//Reset any possible put error that preceded call to getCache
if ( (*it_handle).getStatus() == ECAFE_NOWTACCESS ||
(*it_handle).getStatus() == ECA_PUTFAIL ||
(*it_handle).getStatus() == ECA_PUTCBINPROG) {
if(MUTEX)
{
cafeMutex.lock();
}; //lock
//std::cout << "getStatus - before:" << (*it_handle).getStatus() << std::endl;
handle_index.modify(it_handle, change_status(ICAFE_NORMAL));
pvd.status = ICAFE_NORMAL;
//std::cout << "getStatus - after:" << (*it_handle).getStatus() << std::endl;
if(MUTEX)
{
cafeMutex.unlock();
}; //unlock
}
//meant for use in callbacks in monitors!
if ( (*it_handle).getChannelGetCacheWaitPolicy().getWaitKind() == CAFENUM::GET_CACHE_NO_CHECK)
{
(*it_handle).getPVDataHolder(pvd);
//pvd.status = ICAFE_NORMAL;
//return status;
return pvd.status;
}
//std::cout << "=============================================================================" << std::endl;
//std::cout << __METHOD__ << " PV= " << (*it_handle).getPV() << std::endl;
//std::cout << (*it_handle).getChannelRegalia().getCafeConnectionState() << std::endl;
//std::cout << (*it_handle).isConnected() << std::endl;
//Newly added!!
//ifNeverConnected - return error
if ( (*it_handle).getChannelRegalia().getCafeConnectionState() == ICAFE_CS_NEVER_CONN)
{
pvd.status= ICAFE_CS_NEVER_CONN;
return ICAFE_CS_NEVER_CONN;
}
else if ( (*it_handle).getChannelRegalia().getCafeConnectionState()==ICAFE_CS_CLOSED)
{
pvd.status= ICAFE_CS_CLOSED;
return ICAFE_CS_CLOSED;
}
else if ( (*it_handle).getChannelRegalia().getCafeConnectionState()==ICAFE_CS_DISCONN)
{
pvd.status= ICAFE_CS_DISCONN;
return ICAFE_CS_DISCONN;
}
//Whatever is already there!
chtype dbrtype= (*it_handle).getChannelRequestMetaData().getDbrDataType();
//Find Native DataType
if ( (status=cafeGranules.channelVerifyGet(handle, dbrtype)) != ICAFE_NORMAL)
{
(*it_handle).getPVDataHolder(pvd);
pvd.status = status;
return status;
}
//Add CAFENUM::WITH_CALLBACK_USER_SUPPLIED
if ((*it_handle).getChannelRequestStatusGet().getCallbackProgressKind() == CAFENUM::PENDING
&& handleHelper.getNmonitorData(handle)==0
&& (*it_handle).getChannelRequestPolicyGet().getMethodKind()
!= CAFENUM::WITH_CALLBACK_USER_SUPPLIED
&& (*it_handle).getChannelGetCacheWaitPolicy().getWaitKind() == CAFENUM::GET_CACHE_WAIT
&& (*it_handle).isConnected() )
{
ChannelTimeoutPolicy channelTimeoutPolicyGet = (*it_handle).getChannelTimeoutPolicyGet();
ca_poll();
status=cafeGranules.waitForGetEvent(handle,
channelTimeoutPolicyGet.getTimeout() );
if (status==ECAFE_TIMEOUT && channelTimeoutPolicyGet.getSelfGoverningTimeout())
{
unsigned short ntries=0;
while (status==ECAFE_TIMEOUT && ntries<channelTimeoutPolicyGet.getNtries())
{
status=cafeGranules.waitForGetEvent(handle, channelTimeoutPolicyGet.getTimeout() +
channelTimeoutPolicyGet.getDeltaTimeout()*(++ntries));
}
if ((*it_handle).isConnected())
{
std::cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << std::endl;
std::cout << "No of additional ca_pend_io tries=" << ntries << std::endl;
if (status==ECA_TIMEOUT)
{
std::cout << "is the MAXIMUM allowed as configured through TimeoutPolicy! " << std::endl;
std::cout << "TURNING OFF SELF-GOVERNING TIMEOUT FOR GET OPERATIONS FOR THIS CHANNEL" << std::endl;
channelTimeoutPolicyGet.setSelfGoverningTimeout(false);
channelTimeoutPolicyGet.setTimeout( channelTimeoutPolicyGet.getTimeout() );
std::cout << "AND TIMEOUT RESTORED TO START VALUE OF " << channelTimeoutPolicyGet.getTimeout() << endl;
}
else
{
std::cout << "Changing timeout for handle/pv "
<< handle << "/" << (*it_handle).getPV() << " to: " <<
(channelTimeoutPolicyGet.getTimeout() +
channelTimeoutPolicyGet.getDeltaTimeout()*ntries) << endl;
//modify timeout for handle
channelTimeoutPolicyGet.setTimeout( (channelTimeoutPolicyGet.getTimeout() +
channelTimeoutPolicyGet.getDeltaTimeout()*ntries));
}
if(MUTEX)
{
cafeMutex.lock(); //lock
}
handle_index.modify(it_handle, change_channelTimeoutPolicyGet(channelTimeoutPolicyGet));
if(MUTEX)
{
cafeMutex.unlock(); //unlock
}
}
}
if (!(*it_handle).isConnected() || status != ICAFE_NORMAL)
{
if(MUTEX)
{
cafeMutex.lock(); //lock
}
ChannelRequestStatus channelRequestStatusGet = (*it_handle).getChannelRequestStatusGet();
channelRequestStatusGet.setCallbackStatus (status);
channelRequestStatusGet.setCallbackKind(false, false); // NOT_INITIATED NOT_TRIGGERED
handle_index.modify(it_handle,
change_channelRequestStatusGet(channelRequestStatusGet));
if (!(*it_handle).isConnected())
{
handle_index.modify(it_handle, change_status(ICAFE_CS_DISCONN));
if(MUTEX)
{
cafeMutex.unlock();
}//unlock
(*it_handle).getPVDataHolder(pvd);
return ICAFE_CS_DISCONN;
}
else
{
handle_index.modify(it_handle, change_status(status));
if(MUTEX)
{
cafeMutex.unlock(); //unlock
}
}
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
cafeStatus.report(status);
//cout << "Method returning ICAFE_WAITING_FOR_PREV_CALLBACK " << endl;
(*it_handle).getPVDataHolder(pvd);
pvd.status = status;
return ICAFE_WAITING_FOR_PREV_CALLBACK;
}
}
//For Monitors
(*it_handle).getPVDataHolder(pvd);
pvd.status = ICAFE_NORMAL;
}
else
{
if (printErrorPolicy.getInvalidHandle())
{
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
cafeStatus.report(ECAFE_INVALID_HANDLE);
}
pvd.status=ECAFE_INVALID_HANDLE;
return ECAFE_INVALID_HANDLE;
}
if(MUTEX)
{
cafeMutex.lock();
}; //lock
handle_index.modify(it_handle, change_status(status));
if(MUTEX)
{
cafeMutex.unlock();
}; //unlock
return status;
#undef __METHOD__
};
/**
* \brief Retrieves data from cache, packaged into the PVDataHolder class, for a given pulseID
* \param handle input: handle to Conduit object
* \param globalPulseID input: pulse id
* \param pvd outout: PVDataHolder containing cached data
* \return ICAFE_NORMAL if all OK else ICAFE_WAITING_FOR_PREV_CALLBACK;
*/
int CAFE::getCacheFromPulseID (const unsigned int handle, const unsigned long long globalPulseID, PVDataHolder & pvd)
{
#define __METHOD__ "CAFE::getCacheFromPulseID (const unsigned int handle, const unsigned long long globalPulseID, PVDataHolder & pvd)"
status=ICAFE_NORMAL;
cafeConduit_set_by_handle & handle_index = cs.get<by_handle> ();
cafeConduit_set_by_handle::iterator it_handle;
it_handle = handle_index.find(handle);
//std::cout << __METHOD__ << " " << std::endl;
if (it_handle != handle_index.end())
{
std::deque<PVDataHolder> mapPulseID;
try
{
if(MUTEX)
{
cafeMutex.lock();
}
mapPulseID=(*it_handle).getPulsePVData();
//std::cout << __METHOD__ << " " << std::endl;
//std::cout << " Size =====================================>>>> " << mapPulseID.size() << " handle=" << handle << std::endl;
//std::cout << " Handle " << handle << " " << handleHelper.getPVFromHandle(handle) << std::endl;
if(MUTEX)
{
cafeMutex.unlock();
}
if (mapPulseID.size()==0)
{
//std::cout << "Map Size is zero " << std::endl;
(*it_handle).getPVDataHolder(pvd);
//pvd.print();
return ICAFE_NORMAL;
//This case can happen if the monitored event is the pulseID PV itself!
}
}
catch (std::bad_alloc &e)
{
//Would eventually happen if there were no mutex for getPulsePVDataMap which accesses a dynamic map
std::cout << __FILE__ << "//" << __METHOD__ << " Force exit!! " << std::endl;
std::cout << e.what() << std:: endl;
exit(1);
}
//using namespace boost::posix_time;
//double timeElapsed=0;
//ptime timeStart(microsec_clock::local_time());
pvd=mapPulseID[mapPulseID.size()-1];
if ( pvd.getPulseID() > globalPulseID )
{
if (SF_WITH_PULSE_ID)
{
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
std::cout << (*it_handle).getPV() << " " << (*it_handle).getHandle() << std::endl;
std::cout << "WARNING: mapPulseIDBufferSize is too shallow to match data to pulseID. " << std::endl;
std::cout << "WARNING: Current IDBufferSize= " << (*it_handle).getMapPulseIDBufferSize() << " and can be expanded by user if required. " << std::endl;
std::cout << "key: pulseID " << pvd.getPulseID() << " is > global pid " << globalPulseID << std::endl;
//" in loop idx:" << mpos << std::endl;
}
return ICAFE_NORMAL;
}
for (unsigned int mpos=0; mpos < mapPulseID.size(); ++mpos)
{
//cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
//std::cout << (*it_handle).getPV() << " " << (*it_handle).getHandle() << std::endl;
//std::cout << "WARNING: Current Value= " << (*it_handle).getMapPulseIDBufferSize() << " can be expanded by user if required. " << std::endl;
//std::cout << "key: pulseID " << mapPulseID[mpos].getPulseID() << " and gobal pid " << globalPulseID << " in loop idx:" << mpos << std::endl;
if ( mapPulseID[mpos].getPulseID() == globalPulseID)
{
std::cout << "key: EQUAL" << mapPulseID[mpos].getPulseID() << " pid " << globalPulseID << " " << mpos << std::endl;
pvd=mapPulseID[mpos];
return ICAFE_NORMAL;
}
else if ( mapPulseID[mpos].getPulseID() > globalPulseID)
{
//Missed the event; get event before
pvd=mapPulseID[mpos-1];
return ICAFE_NORMAL;
}
//else
//{
// std::cout << "key: LT " << mapPulseID[mpos].getPulseID() << " pid " << globalPulseID << " " << mpos << std::endl;
// //pvd=mapPulseID[mpos];
//}
}
//ptime timeEnd(microsec_clock::local_time());
//time_duration duration(timeEnd-timeStart);
//timeElapsed= (double) duration.total_microseconds()/1000000.0;
//std::cout << "time for getPulsePVDataMap = " << timeElapsed << std::endl;
}
else
{
if (printErrorPolicy.getInvalidHandle())
{
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
cafeStatus.report(ECAFE_INVALID_HANDLE);
}
return ECAFE_INVALID_HANDLE;
}
return status;
#undef __METHOD__
}
/**
* \brief reset callback for set operation to NOT_INITIATED / NOT_TRIGGERED
* \param handle input: handle to Conduit object
* \return ICAFE_NORMAL if all OK else ECAFE_INVALID_HANDLE
*/
int CAFE::resetCallbackPut(const unsigned int handle)
{
#define __METHOD__ "CAFE::resetCallbackPut(unsigned int)"
status=ICAFE_NORMAL;
cafeConduit_set_by_handle & handle_index = cs.get<by_handle> ();
cafeConduit_set_by_handle::iterator it_handle;
it_handle = handle_index.find(handle);
if (it_handle != handle_index.end())
{
if(MUTEX)
{
cafeMutex.lock(); //lock
}
ChannelRequestStatus channelRequestStatusPut = (*it_handle).getChannelRequestStatusPut();
channelRequestStatusPut.setCallbackStatus (status);
channelRequestStatusPut.setCallbackKind(false, false); // NOT_INITIATED NOT_TRIGGERED
handle_index.modify(it_handle,
change_channelRequestStatusPut(channelRequestStatusPut));
if(MUTEX)
{
cafeMutex.unlock(); //unlock
}
}
else
{
if (printErrorPolicy.getInvalidHandle())
{
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
cafeStatus.report(ECAFE_INVALID_HANDLE);
}
return ECAFE_INVALID_HANDLE;
}
return status;
#undef __METHOD__
}
/**
* \brief reset callback for get operation to NOT_INITIATED / NOT_TRIGGERED
* \param handle input: handle to Conduit object
* \return ICAFE_NORMAL if all OK else ECAFE_INVALID_HANDLE
*/
int CAFE::resetCallbackGet(const unsigned int handle)
{
#define __METHOD__ "CAFE::resetCallbackGet(unsigned int)"
status=ICAFE_NORMAL;
cafeConduit_set_by_handle & handle_index = cs.get<by_handle> ();
cafeConduit_set_by_handle::iterator it_handle;
it_handle = handle_index.find(handle);
if (it_handle != handle_index.end())
{
if(MUTEX)
{
cafeMutex.lock(); //lock
}
ChannelRequestStatus channelRequestStatusGet = (*it_handle).getChannelRequestStatusGet();
channelRequestStatusGet.setCallbackStatus (status);
channelRequestStatusGet.setCallbackKind(false, false); // NOT_INITIATED NOT_TRIGGERED
handle_index.modify(it_handle,
change_channelRequestStatusGet(channelRequestStatusGet));
if(MUTEX)
{
cafeMutex.unlock(); //unlock
}
}
else
{
if (printErrorPolicy.getInvalidHandle())
{
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
cafeStatus.report(ECAFE_INVALID_HANDLE);
}
return ECAFE_INVALID_HANDLE;
}
return status;
#undef __METHOD__
}
/**
* \brief Retrieves data from cache, packaged into the PVDataHolder class
* \param handle input: handle to Conduit object
* \param pvd outout: PVDataHolder containing cached data
* \return ICAFE_NORMAL if all OK
*/
int CAFE::getCacheNoWait(const unsigned int handle, PVDataHolder & pvd)
{
#define __METHOD__ "CAFE::getCacheNoWait(unsigned int handle, PVDataHolder & pvd)"
//status=ICAFE_NORMAL;
cafeConduit_set_by_handle & handle_index = cs.get<by_handle> ();
cafeConduit_set_by_handle::iterator it_handle;
it_handle = handle_index.find(handle);
int local_status = ICAFE_NORMAL;
if (it_handle != handle_index.end())
{
//std::cout << __METHOD__ << " pvd.getStatus() start STATUS ===> " << pvd.getStatus() << endl;
//Whatever is already there!
chtype dbrtype= (*it_handle).getChannelRequestMetaData().getDbrDataType();
//Find Native DataType
if ( (status=cafeGranules.channelVerifyGet(handle, dbrtype)) != ICAFE_NORMAL)
{
(*it_handle).getPVDataHolder(pvd);
//std::cout << __METHOD__ << status << " is status of VerifyGet" << std::endl;
pvd.status = status;
return status;
}
if (!(*it_handle).isConnected() )
{
if(MUTEX)
{
cafeMutex.lock(); //lock
}
ChannelRequestStatus channelRequestStatusGet = (*it_handle).getChannelRequestStatusGet();
channelRequestStatusGet.setCallbackStatus (status);
channelRequestStatusGet.setCallbackKind(false, false); // NOT_INITIATED NOT_TRIGGERED
handle_index.modify(it_handle,
change_channelRequestStatusGet(channelRequestStatusGet));
handle_index.modify(it_handle, change_status(ICAFE_CS_DISCONN));
if(MUTEX)
{
cafeMutex.unlock(); //unlock
}
(*it_handle).getPVDataHolder(pvd);
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
cafeStatus.report(ICAFE_CS_DISCONN);
return ICAFE_CS_DISCONN;
}
(*it_handle).getPVDataHolder(pvd);
pvd.status = local_status;
//cout << __METHOD__ << " pvd.getStatus() STATUS ===> " << pvd.getStatus() << endl;
}
else
{
if (printErrorPolicy.getInvalidHandle())
{
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
cafeStatus.report(ECAFE_INVALID_HANDLE);
}
pvd.status=ECAFE_INVALID_HANDLE;
return ECAFE_INVALID_HANDLE;
}
if(MUTEX)
{
cafeMutex.lock();
}; //lock
handle_index.modify(it_handle, change_status(status));
if(MUTEX)
{
cafeMutex.unlock();
}; //unlock
return pvd.getStatus();
#undef __METHOD__
};
/**
* \brief Retrieves PV DBR_CTRL data from cache, packaged into the PVCtrlHolder class
* \param handleArray input: Array of handles to Conduit object
* \param nelem input: No of array elements
* \param pvcArray outout: Array of PVCtrlHolder containing cached data
* \return overallStatus: ICAFE_NORMAL if all OK else first ECAFE error encountered
*/
int CAFE::getCtrlCache(const unsigned int * handleArray, unsigned int nelem, PVCtrlHolder * pvcArray)
{
#define __METHOD__ \
"CAFE::getCtrlCache(unsigned int * handleArray, unsigned int nelem, PVCtrlHolder * pvcArray)"
int overallStatus=ICAFE_NORMAL;
bool isGood=true;
for (unsigned int i=0; i<nelem; ++i)
{
status=getCtrlCache(handleArray[i], pvcArray [i]);
if ( (status != ICAFE_NORMAL) && isGood)
{
overallStatus=status;
isGood=false;
}
}
return overallStatus;
#undef __METHOD__
};
/**
* \brief Retrieves DBR_CTRL data from cache, packaged into the PVCtrlHolder class
* \param handle input: handle to Conduit object
* \param pvc outout: PVCtrlHolder containing cached data
* \return ICAFE_NORMAL if all OK else ICAFE_WAITING_FOR_PREV_CALLBACK;
*/
int CAFE::getCtrlCache(const unsigned int handle, PVCtrlHolder & pvc)
{
#define __METHOD__ "CAFE::getCtrlCache(unsigned int handle, PVCtrlHolder & pvc)"
status=ICAFE_NORMAL;
cafeConduit_set_by_handle & handle_index = cs.get<by_handle> ();
cafeConduit_set_by_handle::iterator it_handle;
it_handle = handle_index.find(handle);
if (it_handle != handle_index.end())
{
//Whatever is already there!
chtype dbrtype= (*it_handle).getChannelRequestMetaData().getDbrDataType();
//Use Native DataType
if ( (status=cafeGranules.channelVerifyGetCtrl(handle, dbrtype)) != ICAFE_NORMAL)
{
(*it_handle).getPVCtrlHolder(pvc);
pvc.status=status;
return status;
}
if ((*it_handle).getChannelRequestStatusGetCtrl().getCallbackProgressKind() == CAFENUM::PENDING
&& handleHelper.getNmonitorCtrl(handle)==0
&& (*it_handle).getChannelRequestPolicyGetCtrl().getMethodKind()
!= CAFENUM::WITH_CALLBACK_USER_SUPPLIED
&& (*it_handle).getChannelGetCacheWaitPolicy().getWaitKind() == CAFENUM::GET_CACHE_WAIT
&& (*it_handle).isConnected() )
{
ChannelTimeoutPolicy channelTimeoutPolicyGet=(*it_handle).getChannelTimeoutPolicyGet();
ca_poll();
status=cafeGranules.waitForGetCtrlEvent(handle,
channelTimeoutPolicyGet.getTimeout() );
if (status==ECAFE_TIMEOUT && channelTimeoutPolicyGet.getSelfGoverningTimeout()
&& (*it_handle).isConnected() )
{
unsigned short ntries=0;
while (status==ECAFE_TIMEOUT && ntries<channelTimeoutPolicyGet.getNtries())
{
status=cafeGranules.waitForGetCtrlEvent(handle,
channelTimeoutPolicyGet.getTimeout() +
channelTimeoutPolicyGet.getDeltaTimeout()*(++ntries));
}
if ((*it_handle).isConnected())
{
std::cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << std::endl;
std::cout << "No of waitForGetCtrlEvent tries=" << ntries << std::endl;
if (status==ECAFE_TIMEOUT)
{
std::cout <<
"is the MAXIMUM allowed as configured through TimeoutPolicy! "
<< std::endl;
}
std::cout << "Changing timeout for handle/pv "
<< handle << "/" << (*it_handle).getPV() << " to: " <<
(channelTimeoutPolicyGet.getTimeout() +
channelTimeoutPolicyGet.getDeltaTimeout()*ntries) << " seconds" <<endl;
//modify timeout for handle
channelTimeoutPolicyGet.setTimeout( (channelTimeoutPolicyGet.getTimeout() +
channelTimeoutPolicyGet.getDeltaTimeout()*ntries));
if(MUTEX)
{
cafeMutex.lock(); //lock
}
handle_index.modify(it_handle,
change_channelTimeoutPolicyGet(channelTimeoutPolicyGet));
if(MUTEX)
{
cafeMutex.unlock(); //unlock
}
}//isConnected
}
if (!(*it_handle).isConnected() || status != ICAFE_NORMAL)
{
if(MUTEX)
{
cafeMutex.lock(); //lock
}
channelRequestStatusGetCtrl = (*it_handle).getChannelRequestStatusGetCtrl();
channelRequestStatusGetCtrl.setCallbackStatus (status);
channelRequestStatusGetCtrl.setCallbackKind(false, false); // NOT_INITIATED NOT_TRIGGERED
handle_index.modify(it_handle,
change_channelRequestStatusGetCtrl(channelRequestStatusGetCtrl));
if (!(*it_handle).isConnected())
{
handle_index.modify(it_handle, change_status(ICAFE_CS_DISCONN));
if(MUTEX)
{
cafeMutex.unlock(); //unlock
}
return ICAFE_CS_DISCONN;
}
else
{
handle_index.modify(it_handle, change_status(status));
if(MUTEX)
{
cafeMutex.unlock(); //unlock
}
}
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
cafeStatus.report(status);
cout << "Method returning ICAFE_WAITING_FOR_PREV_CALLBACK " << endl;
return ICAFE_WAITING_FOR_PREV_CALLBACK;
}
}
(*it_handle).getPVCtrlHolder(pvc);
}
else
{
if (printErrorPolicy.getInvalidHandle())
{
cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << endl;
cafeStatus.report(ECAFE_INVALID_HANDLE);
}
pvc.status=ECAFE_INVALID_HANDLE;
return ECAFE_INVALID_HANDLE;
}
if(MUTEX)
{
cafeMutex.lock();
}; //lock
handle_index.modify(it_handle, change_status(status));
if(MUTEX)
{
cafeMutex.unlock();
}; //unlock
return status;
#undef __METHOD__
};
//Cache single value
//0
/**
* \brief Get dbr_string_t from Cache (DBR_STRING)
* \param handle input: handle
* \param _val output: dbr_string
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(unsigned int handle, dbr_string_t &_val)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_string_t val[1]= {""};
status=cafeSoluble.getCache(handle, DBR_STRING, val);
if (status==ICAFE_NORMAL)
{
sprintf(_val, val[0]);
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_string_t from Cache (DBR_STS_STRING)
* \param handle input: handle
* \param _val output: dbr_string_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(unsigned int handle, dbr_string_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_string_t val[1]= {""};
status=cafeSoluble.getCache(handle, DBR_STS_STRING, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
sprintf(_val, val[0]);
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_string_t from Cache (DBR_TIME_STRING)
* \param handle input: const unsigned int
* \param _val output: dbr_string_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_string_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_string_t val[1]= {""};
status=cafeSoluble.getCache(handle, DBR_TIME_STRING, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
sprintf(_val, val[0]);
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//1
/**
* \brief Get short from Cache (DBR_SHORT)
* \param handle input: const unsigned int
* \param _val output: short
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_short_t &_val)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_short_t val[1]= {0};
status=cafeSchale.getCache(handle, DBR_SHORT, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get short from Cache (DBR_STS_SHORT)
* \param handle input: const unsigned int
* \param _val output: double
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_short_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_short_t val[1]= {0};
status=cafeSchale.getCache(handle, DBR_STS_SHORT, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get short from Cache (DBR_TIME_SHORT)
* \param handle input: const unsigned int
* \param _val output: short
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_short_t &_val, dbr_short_t &alarmStatus,\
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_short_t val[1]= {0};
status=cafeSchale.getCache(handle, DBR_TIME_SHORT, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//2
/**
* \brief Get float from Cache (DBR_FLOAT)
* \param handle input: const unsigned int
* \param _val output: float
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_float_t &_val)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_float_t val[1]= {0};
status=cafeFrappuccino.getCache(handle, DBR_FLOAT, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get float from Cache (DBR_STS_FLOAT)
* \param handle input: const unsigned int
* \param _val output: float
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_float_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_float_t val[1]= {0};
status=cafeFrappuccino.getCache(handle, DBR_STS_FLOAT, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get float from Cache (DBR_TIME_FLOAT)
* \param handle input: const unsigned int
* \param _val output: float
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_float_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_float_t val[1]= {0};
status=cafeFrappuccino.getCache(handle, DBR_TIME_FLOAT, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//3
/**
* \brief Get dbr_enum_t from Cache (DBR_ENUM)
* \param handle input: const unsigned int
* \param _val output: dbr_enum_t
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_enum_t &_val)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_enum_t val[1]= {0};
status=cafeEspresso.getCache(handle, DBR_ENUM, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_enum_t from Cache (DBR_STS_ENUM)
* \param handle input: const unsigned int
* \param _val output: dbr_enum_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_enum_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_enum_t val[1]= {0};
status=cafeEspresso.getCache(handle, DBR_STS_ENUM, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_enum_t from Cache (DBR_TIME_ENUM)
* \param handle input: const unsigned int
* \param _val output: dbr_enum_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_enum_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_enum_t val[1]= {0};
status=cafeEspresso.getCache(handle, DBR_TIME_ENUM, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//4
/**
* \brief Get dbr_char_t from Cache (DBR_CHAR)
* \param handle input: const unsigned int
* \param _val output: dbr_char_t
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_char_t &_val)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_char_t val[1]= {0};
status=cafeCappuccino.getCache(handle, DBR_CHAR, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_char_t from Cache (DBR_STS_CHAR)
* \param handle input: const unsigned int
* \param _val output: dbr_char_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_char_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_char_t val[1]= {0};
status=cafeCappuccino.getCache(handle, DBR_STS_CHAR, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_char_t from Cache (DBR_TIME_CHAR)
* \param handle input: const unsigned int
* \param _val output: dbr_char_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_char_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_char_t val[1]= {0};
status=cafeCappuccino.getCache(handle, DBR_TIME_CHAR, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//5
/**
* \brief Get dbr_long_t from Cache (DBR_LONG)
* \param handle input: const unsigned int
* \param _val output: dbr_long_t
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_long_t &_val)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_long_t val[1]= {0};
status=cafeLatte.getCache(handle, DBR_LONG, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_long_t from Cache (DBR_STS_LONG)
* \param handle input: const unsigned int
* \param _val output: dbr_long_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_long_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_long_t val[1]= {0};
status=cafeLatte.getCache(handle, DBR_STS_LONG, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_long_t from Cache (DBR_TIME_LONG)
* \param handle input: const unsigned int
* \param _val output: dbr_long_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_long_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_long_t val[1]= {0};
status=cafeLatte.getCache(handle, DBR_TIME_LONG, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//5++
/**
* \brief Get long long from Cache (long long)
* \param handle input: const unsigned int
* \param val output: long long
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, long long &val)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
status=CAFE::getCache(handle, &val);
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get long long from Cache
* \param handle input: const unsigned int
* \param val output: long long
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, long long &val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
status=CAFE::getCache(handle, &val, alarmStatus, alarmSeverity);
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get long long from Cache
* \param handle input: const unsigned int
* \param val output: long long
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, long long &val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
status=CAFE::getCache(handle, &val, alarmStatus, alarmSeverity, ts);
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//6
/**
* \brief Get double from Cache (DBR_DOUBLE)
* \param handle input: const unsigned int
* \param _val output: double
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_double_t &_val)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_double_t val[1]= {0};
status=cafeDoppio.getCache(handle, DBR_DOUBLE, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get double from Cache (DBR_STS_DOUBLE)
* \param handle input: const unsigned int
* \param _val output: double
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_double_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_double_t val[1]= {0};
status=cafeDoppio.getCache(handle, DBR_STS_DOUBLE, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get double from Cache (DBR_TIME_DOUBLE)
* \param handle input: const unsigned int
* \param _val output: double
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const unsigned int handle, dbr_double_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_double_t val[1]= {0};
status=cafeDoppio.getCache(handle, DBR_TIME_DOUBLE, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
////////////////////////////////////////////// by Name ////////////////////////////////
//Cache single value
//0+
/**
* \brief Get string from Cache
* \param pv input: pv name
* \param valStr output: string
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, std::string &valStr)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_string_t val[1]= {""};
status=cafeSoluble.getCache(handle, DBR_STRING, val);
if (status==ICAFE_NORMAL)
{
valStr = val[0];
}
else
{
valStr="";
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get string from Cache
* \param pv input: pv name
* \param valStr output: string
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, std::string &valStr, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_string_t val[1]= {""};
status=cafeSoluble.getCache(handle, DBR_STS_STRING, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
valStr= val[0];
}
else
{
valStr="";
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get string from Cache
* \param pv input: pv name
* \param valStr output: string
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, std::string &valStr, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_string_t val[1]= {""};
status=cafeSoluble.getCache(handle, DBR_TIME_STRING, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
valStr= val[0];
}
else
{
valStr="";
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//0
/**
* \brief Get dbr_string_t from Cache (DBR_STRING)
* \param pv input: pv name
* \param _val output: dbr_string
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_string_t &_val)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_string_t val[1]= {""};
status=cafeSoluble.getCache(handle, DBR_STRING, val);
if (status==ICAFE_NORMAL)
{
sprintf(_val, val[0]);
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_string_t from Cache (DBR_STS_STRING)
* \param pv input: pv name
* \param _val output: dbr_string_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_string_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_string_t val[1]= {""};
status=cafeSoluble.getCache(handle, DBR_STS_STRING, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
sprintf(_val, val[0]);
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_string_t from Cache (DBR_TIME_STRING)
* \param pv input: pv name
* \param _val output: dbr_string_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_string_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_string_t val[1]= {""};
status=cafeSoluble.getCache(handle, DBR_TIME_STRING, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
sprintf(_val, val[0]);
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//1
/**
* \brief Get short from Cache (DBR_SHORT)
* \param pv input: pv name
* \param _val output: short
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_short_t &_val)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_short_t val[1]= {0};
status=cafeSchale.getCache(handle, DBR_SHORT, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get short from Cache (DBR_STS_SHORT)
* \param pv input: pv name
* \param _val output: double
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_short_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_short_t val[1]= {0};
status=cafeSchale.getCache(handle, DBR_STS_SHORT, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get short from Cache (DBR_TIME_SHORT)
* \param pv input: pv name
* \param _val output: short
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_short_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_short_t val[1]= {0};
status=cafeSchale.getCache(handle, DBR_TIME_SHORT, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//2
/**
* \brief Get float from Cache (DBR_FLOAT)
* \param pv input: pv name
* \param _val output: float
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_float_t &_val)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_float_t val[1]= {0};
status=cafeFrappuccino.getCache(handle, DBR_FLOAT, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get float from Cache (DBR_STS_FLOAT)
* \param pv input: pv name
* \param _val output: float
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_float_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_float_t val[1]= {0};
status=cafeFrappuccino.getCache(handle, DBR_STS_FLOAT, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get float from Cache (DBR_TIME_FLOAT)
* \param pv input: pv name
* \param _val output: float
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_float_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_float_t val[1]= {0};
status=cafeFrappuccino.getCache(handle, DBR_TIME_FLOAT, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//3
/**
* \brief Get dbr_enum_t from Cache (DBR_ENUM)
* \param pv input: pv name
* \param _val output: dbr_enum_t
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_enum_t &_val)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_enum_t val[1]= {0};
status=cafeEspresso.getCache(handle, DBR_ENUM, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_enum_t from Cache (DBR_STS_ENUM)
* \param pv input: pv name
* \param _val output: dbr_enum_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_enum_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_enum_t val[1]= {0};
status=cafeEspresso.getCache(handle, DBR_STS_ENUM, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_enum_t from Cache (DBR_TIME_ENUM)
* \param pv input: pv name
* \param _val output: dbr_enum_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_enum_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_enum_t val[1]= {0};
status=cafeEspresso.getCache(handle, DBR_TIME_ENUM, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//4
/**
* \brief Get dbr_char_t from Cache (DBR_CHAR)
* \param pv input: pv name
* \param _val output: dbr_char_t
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_char_t &_val)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_char_t val[1]= {0};
status=cafeCappuccino.getCache(handle, DBR_CHAR, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_char_t from Cache (DBR_STS_CHAR)
* \param pv input: pv name
* \param _val output: dbr_char_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_char_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_char_t val[1]= {0};
status=cafeCappuccino.getCache(handle, DBR_STS_CHAR, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_char_t from Cache (DBR_TIME_CHAR)
* \param pv input: pv name
* \param _val output: dbr_char_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_char_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_char_t val[1]= {0};
status=cafeCappuccino.getCache(handle, DBR_TIME_CHAR, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//5
/**
* \brief Get dbr_long_t from Cache (DBR_LONG)
* \param pv input: pv name
* \param _val output: dbr_long_t
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_long_t &_val)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_long_t val[1]= {0};
status=cafeLatte.getCache(handle, DBR_LONG, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_long_t from Cache (DBR_STS_LONG)
* \param pv input: pv name
* \param _val output: dbr_long_t
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_long_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_long_t val[1]= {0};
status=cafeLatte.getCache(handle, DBR_STS_LONG, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get dbr_long_t from Cache (DBR_TIME_LONG)
* \param pv input: pv name
* \param _val output: double
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_long_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_long_t val[1]= {0};
status=cafeLatte.getCache(handle, DBR_TIME_LONG, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
//Cache single value
//6
/**
* \brief Get double from Cache (DBR_DOUBLE)
* \param pv input: pv name
* \param _val output: double
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_double_t &_val)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_double_t val[1]= {0};
status=cafeDoppio.getCache(handle, DBR_DOUBLE, val);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get double from Cache (DBR_STS_DOUBLE)
* \param pv input: pv name
* \param _val output: double
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_double_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_double_t val[1]= {0};
status=cafeDoppio.getCache(handle, DBR_STS_DOUBLE, val, alarmStatus, alarmSeverity);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}
/**
* \brief Get double from Cache (DBR_TIME_DOUBLE)
* \param pv input: pv name
* \param _val output: double
* \param alarmStatus output: alarm Status
* \param alarmSeverity output: alarm Severity
* \param ts output: epicsTimeStamp
* \return ECA_NORMAL if all OK else ECAFE error
*/
int CAFE::getCache(const char * pv, dbr_double_t &_val, dbr_short_t &alarmStatus, \
dbr_short_t &alarmSeverity, epicsTimeStamp &ts)
{
unsigned int handle=getHandleHelper().getHandleFromPV(pv);
unsigned int nelemPrevious=CAFE::setNelemToRetrieveFromCacheToOne(handle);
dbr_double_t val[1]= {0};
status=cafeDoppio.getCache(handle, DBR_TIME_DOUBLE, val, alarmStatus, alarmSeverity, ts);
if (status==ICAFE_NORMAL)
{
_val= val[0];
}
//Switch back to previous value
CAFE::setNelemToRetrieveFromCacheToPrevious(handle, nelemPrevious);
return status;
}