Initial commit

This commit is contained in:
2017-09-19 08:27:10 +02:00
commit 3b2e49f7b7
138 changed files with 199299 additions and 0 deletions

594
include/connect.h Normal file
View File

@@ -0,0 +1,594 @@
///
/// \file connect.h
/// \author Jan Chrin, PSI
/// \date Release February: 2015
/// \version CAFE 1.0.0
///
#ifndef CONNECT_H
#define CONNECT_H
// generated by autotools
#include <config.h>
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <climits>
#include <global.h>
#include <exceptionsHelper.h>
#include <handleHelper.h>
#include <policyHelper.h>
#include <hashConduitGroup.h>
#if HAVE_BOOST_THREAD
#include <boost/thread/thread_only.hpp>
#include <boost/chrono.hpp>
#endif
class Connect
{
protected:
int status;
CAFEStatus cafeStatus;
CAFEStatusSeverity cafeStatusSeverity;
cafeConduit_set::iterator itcs;
cafeGroup_set::iterator itgs;
CAFEDataTypeCode cafeDataTypeCode;
ExceptionsHelper exceptionsHelper;
ChannelCreatePolicy channelCreatePolicy;
PolicyHelper policyHelper;
HandleHelper handleHelper;
Helper helper;
std::string deviceAttributeDeliminator;
bool pyCafeFlag;
//connectCallbacks.cc
static void callbackHandlerAccessRights(struct access_rights_handler_args args);
static void callbackHandlerException (struct exception_handler_args args);
//connect.cpp
int createChannel(unsigned int handle, const char * pv, chid &pCh);
int createHandle(const char * pv, ca_client_context * ccc, unsigned int &handle)
//int createHandle(const char * pv, ca_client_context * ccc, ChannelRequestPolicy channelRequestPolicyPut, unsigned int &handle)
throw (CAFEException_pv);
int contextDestroy();
int contextDestroy(ca_client_context * cctLocal);
unsigned short epicsVersion(unsigned short & major, unsigned short & minor, unsigned short & patch);
//group functions
int createChannelWithinGroup(unsigned int handle, const char * pv, chid &pCh);
int createHandleWithinGroup(const char * pv, ca_client_context * ccc, unsigned int & _handle)
throw (CAFEException_pv);
public:
Connect(){
channelMonitorPolicy.setPolicy(
(ChannelWhenToFlushSendBufferPolicyKind) CAFENUM::FLUSH_AFTER_EACH_CHANNEL_SUBSCRIPTION,
CAFENUM::WITH_FLUSH_IO, DEFAULT_TIMEOUT_PEND_IO);
channelOpenGroupPolicy.setPolicy(
CAFENUM::FLUSH_AFTER_EACH_GROUP_CREATION,
CAFENUM::WITH_PEND_EVENT, DEFAULT_TIMEOUT_SG_PEND_EVENT);
channelOpenPolicy.setPolicy(
CAFENUM::FLUSH_AFTER_EACH_CHANNEL_CREATION,
CAFENUM::WITH_PEND_EVENT, DEFAULT_TIMEOUT_PEND_EVENT);
deviceAttributeDeliminator=DEFAULT_DEVICE_ATTRIBUTE_DELIMINATOR;
#if HAVE_PYTHON_H
pyCafeFlag=true;
#else
pyCafeFlag=false;
#endif
};
//these need to be public
PrintErrorPolicy printErrorPolicy;
ChannelOpenPolicy channelOpenPolicy;
ChannelOpenPolicy channelClosePolicy; //can also use for close
ChannelOpenPolicy channelMonitorPolicy;
ChannelOpenPolicy channelOpenGroupPolicy;
//28 May 2017
ChannelRequestPolicy channelRequestPolicyMasterPut;
ChannelRequestPolicy channelRequestPolicyMasterGet;
ChannelRequestPolicy channelRequestPolicyMasterGetCtrl;
ChannelGetActionWhenMonitorPolicy channelGetActionWhenMonitorPolicyMaster;
//ChannelOpenPolicy getChannelOpenPolicy(){return channelOpenPolicy;}
//ChannelOpenPolicy getChannelClosePolicy(){return channelClosePolicy;}
//ChannelOpenPolicy getChannelMonitorPolicy(){return channelMonitorPolicy;}
//ChannelOpenPolicy getChannelOpenGroupPolicy(){return channelOpenGroupPolicy;}
HandleHelper getHandleHelper() {return handleHelper;}
HandleHelper getInfo() {return handleHelper;}
PolicyHelper getPolicyHelper() {return policyHelper;}
PolicyHelper getPolicy() {return policyHelper;}
unsigned int getNelemClient(unsigned int h){ return handleHelper.getNelemClient(h);}
unsigned int getNelemNative(unsigned int h){ return handleHelper.getNelemNative(h);}
unsigned int getNelemRequest(unsigned int h){ return handleHelper.getNelemRequest(h);}
int getStatus() {return status;}
CAFEStatus getCafeStatus() {return cafeStatus;}
CAFEStatusSeverity getCafeStatusSeverity() {return cafeStatusSeverity;}
int flushNow() {return ca_flush_io();}
int _ca_flush_io(){return ca_flush_io();}
int _ca_poll(){return ca_poll();}
int _ca_pend_io(double t){return ca_pend_io(t);}
int _ca_pend_event(double t){return ca_pend_event(t);}
//connect.cc
bool setPyCafe(bool b){return pyCafeFlag=b;};
bool getPyCafe(){return pyCafeFlag;} ;
int init() throw (CAFEException_init);
int init(ca_preemptive_callback_select select) throw (CAFEException_init);
//std::string
int open(const string pvS, unsigned int &handle) throw (CAFEException_open){
try { open (pvS.c_str(), handle);} catch(CAFEException_open &e) {throw e;};
}
int open(const string pvS, const std::string pvAliasS, unsigned int &handle)
throw (CAFEException_open){
try { open (pvS.c_str(), pvAliasS.c_str(), handle);} catch(CAFEException_open &e) {throw e;};
}
int open(const string *pvArrayS, unsigned int *handleArray, const unsigned int nHandles)
throw (CAFEException_open);
//const char *pv
int open(const char *pv, unsigned int &handle) throw (CAFEException_open);
int open(const char *pv, const char *pvAlias, unsigned int &handle)
throw (CAFEException_open);
int open(const char **pvArray, unsigned int *handleArray, const unsigned int nHandles)
throw (CAFEException_open);
int open(vector<const char *>, vector<unsigned int> &) throw (CAFEException_open);
int open(vector<string>, vector<unsigned int> &) throw (CAFEException_open);
int openV(vector<string> s, vector<unsigned int> &i) throw (CAFEException_open)
{return open(s,i); };
//################################################################################
void openGroupPrepare(){
channelOpenGroupPolicy.setFlushSendBufferKind(WITH_PEND_EVENT);
channelOpenGroupPolicy.setWhenToFlushSendBuffer(FLUSH_DESIGNATED_TO_CLIENT);
return;
}
void openMonitorPrepare(){
channelMonitorPolicy.setFlushSendBufferKind(WITH_FLUSH_IO);
channelMonitorPolicy.setWhenToFlushSendBuffer(FLUSH_DESIGNATED_TO_CLIENT);
return;
}
double setOpenDefaultPendTime(double _timeout){
return channelOpenPolicy.setDefaultTimeout(_timeout);
}
double getOpenDefaultPendTime(){
return channelOpenPolicy.getDefaultTimeout();
}
void openGroupNowAndWait(double _timeout){
double dto = channelOpenGroupPolicy.getTimeout();
channelOpenGroupPolicy.setTimeout(_timeout);
channelOpenGroupPolicy.flushSendBufferNow();
//
//reset
channelOpenGroupPolicy.setWhenToFlushSendBuffer(FLUSH_NOW);
channelOpenGroupPolicy.setFlushSendBufferKind(WITH_PEND_EVENT);
//channelOpenGroupPolicy.setTimeoutToDefault();
channelOpenGroupPolicy.setTimeout(dto);
return;
}
void openMonitorNow(){
channelMonitorPolicy.flushSendBufferNow();
//reset
channelMonitorPolicy.setWhenToFlushSendBuffer(FLUSH_NOW);
channelMonitorPolicy.setFlushSendBufferKind(WITH_FLUSH_IO);
return;
}
void openMonitorNowAndWait(double _timeout){
channelMonitorPolicy.setTimeout(_timeout);
channelMonitorPolicy.flushSendBufferNow();
//reset
channelMonitorPolicy.setWhenToFlushSendBuffer(FLUSH_NOW);
channelMonitorPolicy.setFlushSendBufferKind(WITH_FLUSH_IO);
return;
}
void openPrepare() {
channelOpenPolicy.setFlushSendBufferKind(WITH_PEND_EVENT);
channelOpenPolicy.setWhenToFlushSendBuffer(FLUSH_DESIGNATED_TO_CLIENT);
return;
}
void openNowAndWait(double _timeout) {
double dto = channelOpenPolicy.getTimeout();
channelOpenPolicy.setTimeout(_timeout);
channelOpenPolicy.flushSendBufferNow();
//reset
channelOpenPolicy.setWhenToFlushSendBuffer(FLUSH_NOW);
channelOpenPolicy.setFlushSendBufferKind(WITH_PEND_EVENT);
//channelOpenPolicy.setTimeoutToDefault();
channelOpenPolicy.setTimeout(dto);
return;
}
void openNow() {
channelOpenPolicy.flushSendBufferNow();
channelOpenPolicy.setWhenToFlushSendBuffer(FLUSH_NOW);
channelOpenPolicy.setFlushSendBufferKind(WITH_PEND_EVENT);
return;
}
void openNoWait(){
channelOpenPolicy.setFlushSendBufferKind(WITH_PEND_EVENT);
channelOpenPolicy.setWhenToFlushSendBuffer(FLUSH_DESIGNATED_TO_CLIENT);
return;
}
bool initCallbackComplete(vector<unsigned int> hV) {
return initCallbackComplete(&hV[0], hV.size());
}
bool initCallbackComplete(unsigned int * hArray, unsigned int nelem);
//#################################################################################
unsigned int printHandle(unsigned int h){return handleHelper.printHandle(h);};
unsigned int printHandles(void){return handleHelper.printHandles();};
unsigned int printDisconnectedHandles(void){return handleHelper.printDisconnectedHandles();};
unsigned int getDisconnectedHandles(vector<unsigned int> &dhV, vector<string> &pvV)
{return handleHelper.getDisconnectedHandles(dhV, pvV);};
void printCAFEException_pv(CAFEException_pv & e){exceptionsHelper.printCAFEException_pv(e);};
//closeChannel(s) only close within a context
int closeChannels(unsigned int * handleArray, unsigned int nHandles);
int closeChannels(vector<unsigned int> v){
//unsigned int * handleArray = new unsigned int[v.size()];
//int status= closeChannels(handleArray, v.size());
//delete [] handleArray;
//return status;
return closeChannels(&v[0], v.size());
};
int closeChannelsV(vector<unsigned int> v){
//unsigned int * handleArray = new unsigned int[v.size()];
//int status= closeChannels(handleArray, v.size());
//delete [] handleArray;
//return status;
return closeChannels(&v[0], v.size());
};
int close(unsigned int handle);
int closeChannel(unsigned int handle){return close(handle);};
int closeChannels();
int closeChannels(ca_client_context * cctLocal);
int close(){return closeChannels();};
//closeHandle(s) close regardless of context
int closeHandlesV(vector<unsigned int> v){ return closeHandles(&v[0], v.size());}
int closeHandles (vector<unsigned int> v){ return closeHandles(&v[0], v.size());}
int closeHandles(unsigned int * handleArray, unsigned int nHandles);
int closeHandle(unsigned int handle);
int closeHandles();
// Monitors
int monitorStart(unsigned int handle, MonitorPolicy &mp);
int monitorStart(unsigned int handle, unsigned int & monitorID);
int monitorStart(unsigned int handle) {
unsigned int monitorID; return monitorStart(handle, monitorID);
}
int monitorStop (unsigned int handle, MonitorPolicy mp);
int monitorStop (unsigned int handle, unsigned int monitorID);
int monitorStopWithID (unsigned int handle, unsigned int monitorID){
return monitorStop(handle, monitorID);}
int monitorStop (unsigned int handle); //stop all monitors for this handle
int monitorStop ();
int monitorStopAll (){return monitorStop();};
int monitorStop (ca_client_context * ccc);
// Monitors for arrays and vectors
int monitorStart(unsigned int * handleArray, unsigned int nelem) {
int * statusArray = new int[nelem];
MonitorPolicy * mpV = new MonitorPolicy[nelem];
status = monitorStart (handleArray, nelem, statusArray, mpV);
delete [] statusArray; delete [] mpV;
return status;
}
int monitorStart(unsigned int * handleArray, unsigned int nelem, int *statusArray,
MonitorPolicy * mpV);
int monitorStart(unsigned int * handleArray, unsigned int nelem, int *statusArray,
unsigned int * monitorIDArray);
int monitorStart(vector<unsigned int> handleV, vector<int> &statusV,
vector<MonitorPolicy> &mpV);
int monitorStart(vector<unsigned int> handleV, vector<int> &statusV,
vector<unsigned int> &monitorIDV);
int monitorStop (unsigned int * handleArray, unsigned int nelem, int *statusArray);
int monitorStop (vector<unsigned int> handleV, vector<int> &statusV);
int monitorStop(unsigned int * handleArray, unsigned int nelem) {
int * statusArray = new int[nelem];
status = monitorStop (handleArray, nelem, statusArray);
delete [] statusArray;
return status;
}
MonitorPolicy * createMonitorPolicyArray(const unsigned int nmp) {
MonitorPolicy * mpArray = new MonitorPolicy[nmp];
return mpArray;
}
int terminate();
int terminate(ca_client_context * cctLocal);
unsigned int getHandleFromPV(const char * pv) {return handleHelper.getHandleFromPV(pv); }
const char * getPVFromHandle(unsigned int handle){
return handleHelper.getPVFromHandle(handle);
}
unsigned int getHandleFromPVWithinGroup(const char * pv, unsigned int grh) {
return handleHelper.getHandleFromPVWithinGroup(pv, grh); }
bool isEnum(unsigned int handle) {return handleHelper.isEnum(handle);}
bool isValid(unsigned int handle) { for (itcs = cs.begin(); itcs != cs.end(); ++itcs)
{if ((*itcs).getHandle()==handle) {return true;}} return false;}
bool allChannelsConnected() { for (itcs = cs.begin(); itcs != cs.end(); ++itcs)
{if (!(*itcs).isConnected()) {return false;}} return true;}
bool isConnected(unsigned int handle) {
return isChannelConnected(handle);
}
bool isChannelConnected(unsigned int handle){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()) {return (*it_handle).isConnected();}
else {std::cout<< "Input handle " << handle << " does not exists! " << std::endl; return false;}}
int getChannelInfo(unsigned int handle, ChannelRegalia & channelInfo){
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()) {channelInfo=(*it_handle).getChannelRegalia(); return ICAFE_NORMAL;}
else {return ECAFE_INVALID_HANDLE;}
};
chid getChannelID(unsigned int handle){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()) {return (*it_handle).getChannelID();}
else {std::cout<< "Input handle " << handle << " does not exists! " << std::endl; return NULL;}}
ca_client_context * getClientContext(const char * pvname){
return handleHelper.getContextFromPV(pvname);
}
ca_client_context * getClientContext(unsigned int handle){
return handleHelper.getContextFromHandle(handle);
}
int attachContext(ca_client_context *ccc){
if (ccc != NULL) {
return ca_attach_context(ccc);
} else { return ECAFE_NULLCONTEXT;}
}
int attachContextByPVName(const char * pvname){
ca_client_context * ccc=getClientContext(pvname);
if (ccc != NULL) {
return ca_attach_context(ccc);
} else { return ECAFE_NULLCONTEXT;}
}
int attachContextByHandle(unsigned int handle){
ca_client_context * ccc=getClientContext(handle);
if (ccc != NULL) {
return ca_attach_context(ccc);
} else { return ECAFE_NULLCONTEXT;}
}
//Add these methods for QCafe
int updateAccessRead(unsigned int handle, int ar) {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 ( (*it_handle).getAccessRead() != ar ) {
if(MUTEX){cafeMutex.lock();}
handle_index.modify(it_handle, change_accessRead(ar));
if(MUTEX){cafeMutex.unlock();}
}
return ICAFE_NORMAL;}
else {std::cout<< "Input handle " << handle << " does not exists! " << std::endl;
return ECAFE_INVALID_HANDLE;}
}
int updateAccessWrite(unsigned int handle, int aw) {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 ( (*it_handle).getAccessWrite() != aw ) {
if(MUTEX){cafeMutex.lock();}
handle_index.modify(it_handle, change_accessWrite(aw));
if(MUTEX){cafeMutex.unlock();}
}
return ICAFE_NORMAL;}
else {std::cout<< "Input handle " << handle << " does not exists! " << std::endl;
return ECAFE_INVALID_HANDLE;}
}
bool getReadAccess(unsigned int handle){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()) {return (bool) (*it_handle).getAccessRead();}
else {std::cout<< "Input handle " << handle << " does not exists! " << std::endl; return false;}}
bool getWriteAccess(unsigned int handle){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()) {return (bool) (*it_handle).getAccessWrite();}
else {std::cout<< "Input handle " << handle << " does not exists! " << std::endl; return false;}}
void printStatusMessage(int status) {
string s = getCafeStatus().csi.message(status);
string c = getCafeStatus().csc.message(status);
printf("%s\n",c.c_str());
printf("%s\n",s.c_str());
}
int printStatus(unsigned int handle, int status);
int printStatusIfError(unsigned int handle, int status);
int printStatus(unsigned int * handleArray, unsigned int nelem, int * statusArray);
int printStatusIfError(unsigned int * handleArray, unsigned int nelem, int * statusArray);
int printStatus(vector<unsigned int> handleV, vector<int> statusV);
int printStatusIfError(vector<unsigned int> handleV, vector<int> statusV);
int setPVAlias(unsigned int handle, const char * pv) throw (CAFEException_open);
// GROUP FUNCTIONS
PVDataHolder * getPVData(vector <unsigned int> handleArray);
int collectionDefine(const char * collectionName, vector<string> deviceV);
int collectionDefine(const char * collectionName, vector<const char *> deviceV);
int collectionDefine(const char * collectionName, pv_string_t * deviceArray, unsigned int deviceLength);
int collectionFetch(const char * collectionName, vector<string> &deviceListV);
int collectionFetch(const char * collectionName, vector<const char *> &deviceListV);
int collectionFetch(const char * collectionName,deviceCollection &dC);
vector<deviceCollection> getCollections() const {return deviceCollectionV;};
//To do: Add shared_ptr for this method to ensure memory release
int collectionMemberList(const char * collectionName, boost::shared_ptr<pv_string_t []> &list, unsigned int &listLength);
//int collectionMemberList(const char * collectionName, dbr_string_t * &list, unsigned int &listLength);
//To do: Add shared_ptr for this method to ensure memory release
int collectionList (boost::shared_ptr<pv_string_t []> &clist, unsigned int &listLength);
//int collectionList (dbr_string_t * &clist, unsigned int &listLength);
int collectionMemberList(const char * collectionName, vector<string> &list);
int collectionList (vector<string> &clist);
int devicePositionOrderedMultiMap(const char * collectionName, std::multimap<float, string> &posDev);
int devicePositionMap(const char * collectionName, std::map<float, string> &posDev);
int devicePositionV(const char * collectionName, std::vector<string> &dev, std::vector<float> &pos);
int fetchIndexOfCollectionMember(const char *collectionName, const char * deviceName);
bool isGroup(const char *);
bool isCollection(const char *);
int groupOpen(const char *pv, unsigned int &groupHandle) throw (CAFEException_groupOpen);
int groupOpen(PVGroup &pvgroup, unsigned int &groupHandle) throw (CAFEException_groupOpen);
int groupClose(unsigned int groupHandle);
int groupClose();
int groupCloseAll(){return groupClose(); };
int groupHandleErase();
int groupHandleErase(ca_client_context *ccc);
int groupCombine(const char * newGroupName, const char * groupName1,
const char * groupName2); // PVGroup &pvGroup);
int groupCombine(const char * newGroupName, vector<char *> groupName);// PVGroup &pvGroup);
vector<string> generateChannelList(vector<string> inputStringV) {
return getFromGlobalChannelList(inputStringV);
}
vector<string> getFromGlobalChannelList(vector<string>);
int groupDefine (const char * groupName, const char * collectionName, vector<string> attributeV);
int groupDefine (const char * groupName, const char * collectionName, vector<const char*> attributeV);
int groupDefine (const char * groupName, const char * collectionName,
pv_string_t * attributeArray, unsigned short attributeLength);
int groupDefine (const char * groupName, const char * collectionName, pv_string_t attribute){
pv_string_t aA[1]; strcpy(aA[0], attribute);
return groupDefine(groupName, collectionName, aA, 1);
}
int groupDefine (const char * groupName, vector<string> deviceV, vector<string> attributeV);// PVGroup &pvGroup);
int groupDefine (const char * groupName, vector<const char *> deviceV, vector<const char*> attributeV);
//PVGroup &pvGroup);
int groupDefine (const char * groupName, pv_string_t * deviceArray, unsigned int deviceLength,
pv_string_t * attributeArray, unsigned short attributeLength); //
int groupDefine (const char * groupName, vector<string> pvArrayV); // PVGroup &pvGroup);
int groupDefine (const char * groupName, vector<const char *> pvArrayV); // PVGroup &pvGroup);
int groupDefine (const char * groupName, pv_string_t * pvArray, unsigned int pvArrayLength);
//PVGroup &pvGroup);
//To do: Add shared_ptr for this method to ensure memory release
int groupMemberList(const char * groupName, boost::shared_ptr<pv_string_t []> &list, unsigned int &listLength);
//int groupMemberList(const char * groupName, dbr_string_t * &list, unsigned int &listLength);
int groupList (boost::shared_ptr<pv_string_t []> &glist, unsigned int &listLength);
//int groupList (dbr_string_t * &glist, unsigned int &listLength);
int groupMemberList(const char * groupName, vector<string> &list);
int groupList (vector<string> &glist);
int fetchIndexOfGroupMember(const char *groupName, const char * pv);
void setDeviceAttributeDeliminator(std::string d) {deviceAttributeDeliminator=d;};
std::string getDeviceAttributeDeliminator() const {return deviceAttributeDeliminator;};
};
#endif // CONNECT_H